From 8a4a5f6ff756fdba44254015c714f173b2db6f64 Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Sun, 1 May 2011 14:10:20 +0200 Subject: [PATCH] lavc: add format field to AVFrame The format is a per-frame property, having it in AVFrame simplify the operation of extraction of that information, since avoids the need to access the codec/stream context. --- libavcodec/avcodec.h | 9 +++++++++ libavcodec/pthread.c | 1 + libavcodec/utils.c | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 0204af7..4f24f72 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1272,6 +1272,15 @@ typedef struct AVFrame { * - decoding: Read by user. */ int width, height; + + /** + * format of the frame, -1 if unknown or unset + * Values correspond to enum PixelFormat for video frames, + * enum AVSampleFormat for audio) + * - encoding: unused + * - decoding: Read by user. + */ + int format; } AVFrame; struct AVCodecInternal; diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c index 1ec2d1a..a44500b 100644 --- a/libavcodec/pthread.c +++ b/libavcodec/pthread.c @@ -602,6 +602,7 @@ int ff_thread_decode_frame(AVCodecContext *avctx, picture->sample_aspect_ratio = avctx->sample_aspect_ratio; picture->width = avctx->width; picture->height = avctx->height; + picture->format = avctx->pix_fmt; /* * A later call with avkpt->size == 0 may loop over all threads, diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 74932ed..a88d1a7 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -585,6 +585,7 @@ void avcodec_get_frame_defaults(AVFrame *pic){ pic->pts= AV_NOPTS_VALUE; pic->key_frame= 1; pic->sample_aspect_ratio = (AVRational){0, 1}; + pic->format = -1; /* unknown */ } AVFrame *avcodec_alloc_frame(void){ @@ -862,6 +863,7 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi picture->sample_aspect_ratio = avctx->sample_aspect_ratio; picture->width = avctx->width; picture->height = avctx->height; + picture->format = avctx->pix_fmt; } emms_c(); //needed to avoid an emms_c() call before every return; @@ -983,6 +985,8 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx, if (ret >= 0 && *got_frame_ptr) { avctx->frame_number++; frame->pkt_dts = avpkt->dts; + if (frame->format == AV_SAMPLE_FMT_NONE) + frame->format = avctx->sample_fmt; } } return ret; -- 2.7.4