/*
- * MPEG1 / MPEG2 video parser
+ * MPEG-1 / MPEG-2 video parser
* Copyright (c) 2000,2001 Fabrice Bellard
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
*
*/
#include "parser.h"
-#include "mpegvideo.h"
+#include "mpeg12.h"
#include "internal.h"
struct MpvParseContext {
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;
pc->width = (buf[0] << 4) | (buf[1] >> 4);
pc->height = ((buf[1] & 0x0f) << 8) | buf[2];
if(!avctx->width || !avctx->height || !avctx->coded_width || !avctx->coded_height){
- avcodec_set_dimensions(avctx, pc->width, pc->height);
+ 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.den = avctx->time_base.den = ff_mpeg12_frame_rate_tab[frame_rate_index].num;
- pc->frame_rate.num = avctx->time_base.num = ff_mpeg12_frame_rate_tab[frame_rate_index].den;
+ 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;
avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
}
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;
if(did_set_size)
- avcodec_set_dimensions(avctx, pc->width, pc->height);
- avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1) * 2;
- avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1);
+ ff_set_dimensions(avctx, pc->width, pc->height);
+ avctx->framerate.num = pc->frame_rate.num * (frame_rate_ext_n + 1) * 2;
+ avctx->framerate.den = pc->frame_rate.den * (frame_rate_ext_d + 1);
avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
}
break;
s->repeat_pict = 2;
}
}
+
+ if (!pc->progressive_sequence) {
+ if (top_field_first)
+ s->field_order = AV_FIELD_TT;
+ else
+ s->field_order = AV_FIELD_BB;
+ } else
+ s->field_order = AV_FIELD_PROGRESSIVE;
}
break;
}
}
}
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);
+#endif
}
static int mpegvideo_parse(AVCodecParserContext *s,
to have the full timing information. The time take by this
function should be negligible for uncorrupted streams */
mpegvideo_extract_headers(s, avctx, buf, buf_size);
- av_dlog(NULL, "pict_type=%d frame_rate=%0.3f repeat_pict=%d\n",
+ ff_dlog(NULL, "pict_type=%d frame_rate=%0.3f repeat_pict=%d\n",
s->pict_type, (double)avctx->time_base.den / avctx->time_base.num, s->repeat_pict);
*poutbuf = buf;