summaryrefslogtreecommitdiff
path: root/libavcodec/mpegvideo_parser.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2015-07-06 21:53:13 +0200
committerAnton Khirnov <anton@khirnov.net>2015-07-12 18:15:39 +0200
commitab05ed4c322ed0488ac9b5d2ef5d4ffa55a946a7 (patch)
tree7c0cb67f7722448ef8326f6ddeffd4e09e516539 /libavcodec/mpegvideo_parser.c
parent9f4c7397a296e6d11b3c6c121a6896163577dc7c (diff)
mpegvideo_parser: export pixel format and dimensions
Diffstat (limited to 'libavcodec/mpegvideo_parser.c')
-rw-r--r--libavcodec/mpegvideo_parser.c17
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);