diff options
author | Anton Khirnov <anton@khirnov.net> | 2015-07-06 21:53:13 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2015-07-12 18:15:39 +0200 |
commit | ab05ed4c322ed0488ac9b5d2ef5d4ffa55a946a7 (patch) | |
tree | 7c0cb67f7722448ef8326f6ddeffd4e09e516539 | |
parent | 9f4c7397a296e6d11b3c6c121a6896163577dc7c (diff) | |
download | ffmpeg-ab05ed4c322ed0488ac9b5d2ef5d4ffa55a946a7.tar.gz |
mpegvideo_parser: export pixel format and dimensions
-rw-r--r-- | libavcodec/mpegvideo_parser.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/libavcodec/mpegvideo_parser.c b/libavcodec/mpegvideo_parser.c index 620083f3ea..37808c6053 100644 --- a/libavcodec/mpegvideo_parser.c +++ b/libavcodec/mpegvideo_parser.c @@ -44,6 +44,8 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, int top_field_first, repeat_first_field, progressive_frame; int horiz_size_ext, vert_size_ext, bit_rate_ext; int did_set_size=0; + int chroma_format; + enum AVPixelFormat pix_fmt = AV_PIX_FMT_NONE; //FIXME replace the crap with get_bits() s->repeat_pict = 0; @@ -65,6 +67,7 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, ff_set_dimensions(avctx, pc->width, pc->height); did_set_size=1; } + pix_fmt = AV_PIX_FMT_YUV420P; frame_rate_index = buf[3] & 0xf; pc->frame_rate = avctx->framerate = ff_mpeg12_frame_rate_tab[frame_rate_index]; avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400; @@ -85,6 +88,13 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, pc->progressive_sequence = buf[1] & (1 << 3); avctx->has_b_frames= !(buf[5] >> 7); + chroma_format = (buf[1] >> 1) & 3; + switch (chroma_format) { + case 1: pix_fmt = AV_PIX_FMT_YUV420P; break; + case 2: pix_fmt = AV_PIX_FMT_YUV422P; break; + case 3: pix_fmt = AV_PIX_FMT_YUV444P; break; + } + pc->width |=(horiz_size_ext << 12); pc->height |=( vert_size_ext << 12); avctx->bit_rate += (bit_rate_ext << 18) * 400; @@ -138,6 +148,13 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, } } the_end: ; + + if (pix_fmt != AV_PIX_FMT_NONE) { + s->format = pix_fmt; + s->width = s->coded_width = pc->width; + s->height = s->coded_height = pc->height; + } + #if FF_API_AVCTX_TIMEBASE if (avctx->framerate.num) avctx->time_base = av_inv_q(avctx->framerate); |