/*
- * MPEG1/2 decoder
+ * MPEG-1/2 decoder
* Copyright (c) 2000,2001 Fabrice Bellard.
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
*
/**
* @file mpeg12.c
- * MPEG1/2 decoder
+ * MPEG-1/2 decoder
*/
//#define DEBUG
//#include <assert.h>
-#define DC_VLC_BITS 9
#define MV_VLC_BITS 9
#define MBINCR_VLC_BITS 9
#define MB_PAT_VLC_BITS 9
#define MB_PTYPE_VLC_BITS 6
#define MB_BTYPE_VLC_BITS 6
-#define TEX_VLC_BITS 9
static inline int mpeg1_decode_block_inter(MpegEncContext *s,
DCTELEM *block,
extern void XVMC_pack_pblocks(MpegEncContext *s,int cbp);
extern void XVMC_init_block(MpegEncContext *s);//set s->block
-static const enum PixelFormat pixfmt_yuv_420[]= {PIX_FMT_YUV420P,-1};
-static const enum PixelFormat pixfmt_yuv_422[]= {PIX_FMT_YUV422P,-1};
-static const enum PixelFormat pixfmt_yuv_444[]= {PIX_FMT_YUV444P,-1};
static const enum PixelFormat pixfmt_xvmc_mpg2_420[] = {
PIX_FMT_XVMC_MPEG2_IDCT,
PIX_FMT_XVMC_MPEG2_MC,
- -1};
+ PIX_FMT_NONE};
uint8_t ff_mpeg12_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
-static void init_2d_vlc_rl(RLTable *rl, int use_static)
-{
- int i;
- init_vlc(&rl->vlc, TEX_VLC_BITS, rl->n + 2,
- &rl->table_vlc[0][1], 4, 2,
- &rl->table_vlc[0][0], 4, 2, use_static);
+#define INIT_2D_VLC_RL(rl, static_size)\
+{\
+ static RL_VLC_ELEM rl_vlc_table[static_size];\
+ INIT_VLC_STATIC(&rl.vlc, TEX_VLC_BITS, rl.n + 2,\
+ &rl.table_vlc[0][1], 4, 2,\
+ &rl.table_vlc[0][0], 4, 2, static_size);\
+\
+ rl.rl_vlc[0]= rl_vlc_table;\
+ init_2d_vlc_rl(&rl);\
+}
- if(use_static)
- rl->rl_vlc[0]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
- else
- rl->rl_vlc[0]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
+static void init_2d_vlc_rl(RLTable *rl)
+{
+ int i;
for(i=0; i<rl->vlc.table_size; i++){
int code= rl->vlc.table[i][0];
/******************************************/
/* decoding */
-static VLC dc_lum_vlc;
-static VLC dc_chroma_vlc;
static VLC mv_vlc;
static VLC mbincr_vlc;
static VLC mb_ptype_vlc;
static VLC mb_btype_vlc;
static VLC mb_pat_vlc;
-static void init_vlcs(void)
+av_cold void ff_mpeg12_init_vlcs(void)
{
static int done = 0;
if (!done) {
done = 1;
- init_vlc(&dc_lum_vlc, DC_VLC_BITS, 12,
+ INIT_VLC_STATIC(&dc_lum_vlc, DC_VLC_BITS, 12,
ff_mpeg12_vlc_dc_lum_bits, 1, 1,
- ff_mpeg12_vlc_dc_lum_code, 2, 2, 1);
- init_vlc(&dc_chroma_vlc, DC_VLC_BITS, 12,
+ ff_mpeg12_vlc_dc_lum_code, 2, 2, 512);
+ INIT_VLC_STATIC(&dc_chroma_vlc, DC_VLC_BITS, 12,
ff_mpeg12_vlc_dc_chroma_bits, 1, 1,
- ff_mpeg12_vlc_dc_chroma_code, 2, 2, 1);
- init_vlc(&mv_vlc, MV_VLC_BITS, 17,
+ ff_mpeg12_vlc_dc_chroma_code, 2, 2, 514);
+ INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 17,
&ff_mpeg12_mbMotionVectorTable[0][1], 2, 1,
- &ff_mpeg12_mbMotionVectorTable[0][0], 2, 1, 1);
- init_vlc(&mbincr_vlc, MBINCR_VLC_BITS, 36,
+ &ff_mpeg12_mbMotionVectorTable[0][0], 2, 1, 518);
+ INIT_VLC_STATIC(&mbincr_vlc, MBINCR_VLC_BITS, 36,
&ff_mpeg12_mbAddrIncrTable[0][1], 2, 1,
- &ff_mpeg12_mbAddrIncrTable[0][0], 2, 1, 1);
- init_vlc(&mb_pat_vlc, MB_PAT_VLC_BITS, 64,
+ &ff_mpeg12_mbAddrIncrTable[0][0], 2, 1, 538);
+ INIT_VLC_STATIC(&mb_pat_vlc, MB_PAT_VLC_BITS, 64,
&ff_mpeg12_mbPatTable[0][1], 2, 1,
- &ff_mpeg12_mbPatTable[0][0], 2, 1, 1);
+ &ff_mpeg12_mbPatTable[0][0], 2, 1, 512);
- init_vlc(&mb_ptype_vlc, MB_PTYPE_VLC_BITS, 7,
+ INIT_VLC_STATIC(&mb_ptype_vlc, MB_PTYPE_VLC_BITS, 7,
&table_mb_ptype[0][1], 2, 1,
- &table_mb_ptype[0][0], 2, 1, 1);
- init_vlc(&mb_btype_vlc, MB_BTYPE_VLC_BITS, 11,
+ &table_mb_ptype[0][0], 2, 1, 64);
+ INIT_VLC_STATIC(&mb_btype_vlc, MB_BTYPE_VLC_BITS, 11,
&table_mb_btype[0][1], 2, 1,
- &table_mb_btype[0][0], 2, 1, 1);
+ &table_mb_btype[0][0], 2, 1, 64);
init_rl(&ff_rl_mpeg1, ff_mpeg12_static_rl_table_store[0]);
init_rl(&ff_rl_mpeg2, ff_mpeg12_static_rl_table_store[1]);
- init_2d_vlc_rl(&ff_rl_mpeg1, 1);
- init_2d_vlc_rl(&ff_rl_mpeg2, 1);
+ INIT_2D_VLC_RL(ff_rl_mpeg1, 680);
+ INIT_2D_VLC_RL(ff_rl_mpeg2, 674);
}
}
}
}
-/* motion type (for mpeg2) */
+/* motion type (for MPEG-2) */
#define MT_FIELD 1
#define MT_FRAME 2
#define MT_16X8 2
if(s->mb_x)
mb_type= s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1];
else
- mb_type= s->current_picture.mb_type[ s->mb_width + (s->mb_y-1)*s->mb_stride - 1]; // FIXME not sure if this is allowed in mpeg at all,
+ mb_type= s->current_picture.mb_type[ s->mb_width + (s->mb_y-1)*s->mb_stride - 1]; // FIXME not sure if this is allowed in MPEG at all
if(IS_INTRA(mb_type))
return -1;
s->dsp.clear_blocks(s->block[6]);
}
- /* compute dct type */
- if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var?
+ /* compute DCT type */
+ if (s->picture_structure == PICT_FRAME && //FIXME add an interlaced_dct coded var?
!s->frame_pred_frame_dct) {
s->interlaced_dct = get_bits1(&s->gb);
}
memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */
s->mb_intra = 1;
#ifdef HAVE_XVMC
- //one 1 we memcpy blocks in xvmcvideo
+ //if 1, we memcpy blocks in xvmcvideo
if(s->avctx->xvmc_acceleration > 1){
XVMC_pack_pblocks(s,-1);//inter are always full blocks
if(s->swap_uv){
mpeg_decode_motion(s, s->mpeg_f_code[i][0], s->last_mv[i][0][0]);
s->mv[i][0][1]= s->last_mv[i][0][1]= s->last_mv[i][1][1] =
mpeg_decode_motion(s, s->mpeg_f_code[i][1], s->last_mv[i][0][1]);
- /* full_pel: only for mpeg1 */
+ /* full_pel: only for MPEG-1 */
if (s->full_pel[i]){
s->mv[i][0][0] <<= 1;
s->mv[i][0][1] <<= 1;
}
#ifdef HAVE_XVMC
- //on 1 we memcpy blocks in xvmcvideo
+ //if 1, we memcpy blocks in xvmcvideo
if(s->avctx->xvmc_acceleration > 1){
XVMC_pack_pblocks(s,cbp);
if(s->swap_uv){
return 0;
}
-/* as h263, but only 17 codes */
+/* as H.263, but only 17 codes */
static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred)
{
int code, sign, val, l, shift;
return val;
}
-static inline int decode_dc(GetBitContext *gb, int component)
-{
- int code, diff;
-
- if (component == 0) {
- code = get_vlc2(gb, dc_lum_vlc.table, DC_VLC_BITS, 2);
- } else {
- code = get_vlc2(gb, dc_chroma_vlc.table, DC_VLC_BITS, 2);
- }
- if (code < 0){
- av_log(NULL, AV_LOG_ERROR, "invalid dc code at\n");
- return 0xffff;
- }
- if (code == 0) {
- diff = 0;
- } else {
- diff = get_xbits(gb, code);
- }
- return diff;
-}
-
static inline int mpeg1_decode_block_intra(MpegEncContext *s,
DCTELEM *block,
int n)
const uint16_t *quant_matrix= s->intra_matrix;
const int qscale= s->qscale;
- /* DC coef */
+ /* DC coefficient */
component = (n <= 3 ? 0 : n - 4 + 1);
diff = decode_dc(&s->gb, component);
if (diff >= 0xffff)
i = 0;
{
OPEN_READER(re, &s->gb);
- /* now quantify & encode AC coefs */
+ /* now quantify & encode AC coefficients */
for(;;) {
UPDATE_CACHE(re, &s->gb);
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
{
OPEN_READER(re, &s->gb);
i = -1;
- /* special case for the first coef. no need to add a second vlc table */
+ // special case for first coefficient, no need to add second VLC table
UPDATE_CACHE(re, &s->gb);
if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
level= (3*qscale*quant_matrix[0])>>5;
#if MIN_CACHE_BITS < 19
UPDATE_CACHE(re, &s->gb);
#endif
- /* now quantify & encode AC coefs */
+ /* now quantify & encode AC coefficients */
for(;;) {
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
{
OPEN_READER(re, &s->gb);
i = -1;
- /* special case for the first coef. no need to add a second vlc table */
+ // special case for first coefficient, no need to add second VLC table
UPDATE_CACHE(re, &s->gb);
if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
level= (3*qscale)>>1;
UPDATE_CACHE(re, &s->gb);
#endif
- /* now quantify & encode AC coefs */
+ /* now quantify & encode AC coefficients */
for(;;) {
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
else
quant_matrix = s->chroma_inter_matrix;
- /* special case for the first coef. no need to add a second vlc table */
+ // special case for first coefficient, no need to add second VLC table
UPDATE_CACHE(re, &s->gb);
if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
level= (3*qscale*quant_matrix[0])>>5;
UPDATE_CACHE(re, &s->gb);
#endif
- /* now quantify & encode AC coefs */
+ /* now quantify & encode AC coefficients */
for(;;) {
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
OPEN_READER(re, &s->gb);
i = -1;
- /* special case for the first coef. no need to add a second vlc table */
+ // special case for first coefficient, no need to add second VLC table
UPDATE_CACHE(re, &s->gb);
if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
level= (3*qscale)>>1;
UPDATE_CACHE(re, &s->gb);
#endif
- /* now quantify & encode AC coefs */
+ /* now quantify & encode AC coefficients */
for(;;) {
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
const int qscale= s->qscale;
int mismatch;
- /* DC coef */
+ /* DC coefficient */
if (n < 4){
quant_matrix = s->intra_matrix;
component = 0;
{
OPEN_READER(re, &s->gb);
- /* now quantify & encode AC coefs */
+ /* now quantify & encode AC coefficients */
for(;;) {
UPDATE_CACHE(re, &s->gb);
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
const uint16_t *quant_matrix;
const int qscale= s->qscale;
- /* DC coef */
+ /* DC coefficient */
if (n < 4){
quant_matrix = s->intra_matrix;
component = 0;
{
OPEN_READER(re, &s->gb);
- /* now quantify & encode AC coefs */
+ /* now quantify & encode AC coefficients */
for(;;) {
UPDATE_CACHE(re, &s->gb);
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
MpegEncContext *s2 = &s->mpeg_enc_ctx;
int i;
- //we need some parmutation to store
- //matrixes, until MPV_common_init()
- //set the real permutatuon
+ /* we need some permutation to store matrices,
+ * until MPV_common_init() sets the real permutation. */
for(i=0;i<64;i++)
s2->dsp.idct_permutation[i]=i;
s->mpeg_enc_ctx.flags= avctx->flags;
s->mpeg_enc_ctx.flags2= avctx->flags2;
ff_mpeg12_common_init(&s->mpeg_enc_ctx);
- init_vlcs();
+ ff_mpeg12_init_vlcs();
s->mpeg_enc_ctx_allocated = 0;
s->mpeg_enc_ctx.picture_number = 0;
}
}
-//Call this function when we know all parameters
-//it may be called in different places for mpeg1 and mpeg2
+/* Call this function when we know all parameters.
+ * It may be called in different places for MPEG-1 and MPEG-2. */
static int mpeg_decode_postinit(AVCodecContext *avctx){
Mpeg1Context *s1 = avctx->priv_data;
MpegEncContext *s = &s1->mpeg_enc_ctx;
s1->save_width = s->width;
s1->save_height = s->height;
- //low_delay may be forced, in this case we will have B frames
- //that behave like P frames
+ /* low_delay may be forced, in this case we will have B-frames
+ * that behave like P-frames. */
avctx->has_b_frames = !(s->low_delay);
if(avctx->sub_id==1){//s->codec_id==avctx->codec_id==CODEC_ID
- //mpeg1 fps
+ //MPEG-1 fps
avctx->time_base.den= ff_frame_rate_tab[s->frame_rate_index].num;
avctx->time_base.num= ff_frame_rate_tab[s->frame_rate_index].den;
- //mpeg1 aspect
+ //MPEG-1 aspect
avctx->sample_aspect_ratio= av_d2q(
1.0/ff_mpeg1_aspect[s->aspect_ratio_info], 255);
- }else{//mpeg2
- //mpeg2 fps
+ }else{//MPEG-2
+ //MPEG-2 fps
av_reduce(
&s->avctx->time_base.den,
&s->avctx->time_base.num,
ff_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num,
ff_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den,
1<<30);
- //mpeg2 aspect
+ //MPEG-2 aspect
if(s->aspect_ratio_info > 1){
- if( (s1->pan_scan.width == 0 )||(s1->pan_scan.height == 0) ){
+ //we ignore the spec here as reality does not match the spec, see for example
+ // res_change_ffmpeg_aspect.ts and sequence-display-aspect.mpg
+ if( (s1->pan_scan.width == 0 )||(s1->pan_scan.height == 0) || 1){
s->avctx->sample_aspect_ratio=
av_div_q(
ff_mpeg2_aspect[s->aspect_ratio_info],
s->avctx->sample_aspect_ratio=
ff_mpeg2_aspect[s->aspect_ratio_info];
}
- }//mpeg2
+ }//MPEG-2
if(avctx->xvmc_acceleration){
avctx->pix_fmt = avctx->get_format(avctx,pixfmt_xvmc_mpg2_420);
}else{
if(s->chroma_format < 2){
- avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_420);
+ avctx->pix_fmt = PIX_FMT_YUV420P;
}else
if(s->chroma_format == 2){
- avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_422);
+ avctx->pix_fmt = PIX_FMT_YUV422P;
}else
if(s->chroma_format > 2){
- avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_444);
+ avctx->pix_fmt = PIX_FMT_YUV444P;
}
}
//until then pix_fmt may be changed right after codec init
if( avctx->idct_algo == FF_IDCT_AUTO )
avctx->idct_algo = FF_IDCT_SIMPLE;
- //quantization matrixes may need reordering
- //if dct permutation is changed
+ /* Quantization matrices may need reordering
+ * if DCT permutation is changed. */
memcpy(old_permutation,s->dsp.idct_permutation,64*sizeof(uint8_t));
if (MPV_common_init(s) < 0)
if (s->pict_type == FF_P_TYPE || s->pict_type == FF_B_TYPE) {
s->full_pel[0] = get_bits1(&s->gb);
f_code = get_bits(&s->gb, 3);
- if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT)
+ if (f_code == 0 && avctx->error_recognition >= FF_ER_COMPLIANT)
return -1;
s->mpeg_f_code[0][0] = f_code;
s->mpeg_f_code[0][1] = f_code;
if (s->pict_type == FF_B_TYPE) {
s->full_pel[1] = get_bits1(&s->gb);
f_code = get_bits(&s->gb, 3);
- if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT)
+ if (f_code == 0 && avctx->error_recognition >= FF_ER_COMPLIANT)
return -1;
s->mpeg_f_code[1][0] = f_code;
s->mpeg_f_code[1][1] = f_code;
int horiz_size_ext, vert_size_ext;
int bit_rate_ext;
- skip_bits(&s->gb, 1); /* profil and level esc*/
+ skip_bits(&s->gb, 1); /* profile and level esc*/
s->avctx->profile= get_bits(&s->gb, 3);
s->avctx->level= get_bits(&s->gb, 4);
s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */
dprintf(s->avctx, "sequence extension\n");
s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO;
- s->avctx->sub_id = 2; /* indicates mpeg2 found */
+ s->avctx->sub_id = 2; /* indicates MPEG-2 found */
if(s->avctx->debug & FF_DEBUG_PICT_INFO)
av_log(s->avctx, AV_LOG_DEBUG, "profile: %d, level: %d vbv buffer: %d, bitrate:%d\n",
for(;;) {
#ifdef HAVE_XVMC
- //one 1 we memcpy blocks in xvmcvideo
+ //If 1, we memcpy blocks in xvmcvideo.
if(s->avctx->xvmc_acceleration > 1)
XVMC_init_block(s);//set s->block
#endif
&& s->progressive_frame == 0 /* vbv_delay == 0xBBB || 0xE10*/;
if(left < 0 || (left && show_bits(&s->gb, FFMIN(left, 23)) && !is_d10)
- || (avctx->error_resilience >= FF_ER_AGGRESSIVE && left>8)){
+ || (avctx->error_recognition >= FF_ER_AGGRESSIVE && left>8)){
av_log(avctx, AV_LOG_ERROR, "end mismatch left=%d %0X\n", left, show_bits(&s->gb, FFMIN(left, 23)));
return -1;
}else
/* skip mb handling */
if (s->mb_skip_run == -1) {
- /* read again increment */
+ /* read increment again */
s->mb_skip_run = 0;
for(;;) {
int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2);
}
/**
- * handles slice ends.
- * @return 1 if it seems to be the last slice of
+ * Handles slice ends.
+ * @return 1 if it seems to be the last slice
*/
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
{
ff_print_debug_info(s, pict);
} else {
s->picture_number++;
- /* latency of 1 frame for I and P frames */
+ /* latency of 1 frame for I- and P-frames */
/* XXX: use another variable than picture_number */
if (s->last_picture_ptr != NULL) {
*pict= *(AVFrame*)s->last_picture_ptr;
width = get_bits(&s->gb, 12);
height = get_bits(&s->gb, 12);
- if (width <= 0 || height <= 0 ||
- (width % 2) != 0 || (height % 2) != 0)
+ if (width <= 0 || height <= 0)
return -1;
s->aspect_ratio_info= get_bits(&s->gb, 4);
if (s->aspect_ratio_info == 0) {
av_log(avctx, AV_LOG_ERROR, "aspect ratio has forbidden 0 value\n");
- if (avctx->error_resilience >= FF_ER_COMPLIANT)
+ if (avctx->error_recognition >= FF_ER_COMPLIANT)
return -1;
}
s->frame_rate_index = get_bits(&s->gb, 4);
s->chroma_inter_matrix[j] = v;
}
#ifdef DEBUG
- dprintf(s->avctx, "non intra matrix present\n");
+ dprintf(s->avctx, "non-intra matrix present\n");
for(i=0;i<64;i++)
dprintf(s->avctx, " %d", s->inter_matrix[s->dsp.idct_permutation[i]]);
dprintf(s->avctx, "\n");
return -1;
}
- /* we set mpeg2 parameters so that it emulates mpeg1 */
+ /* we set MPEG-2 parameters so that it emulates MPEG-1 */
s->progressive_sequence = 1;
s->progressive_frame = 1;
s->picture_structure = PICT_FRAME;
s->frame_pred_frame_dct = 1;
s->chroma_format = 1;
s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG1VIDEO;
- avctx->sub_id = 1; /* indicates mpeg1 */
+ avctx->sub_id = 1; /* indicates MPEG-1 */
s->out_format = FMT_MPEG1;
- s->swap_uv = 0;//AFAIK VCR2 don't have SEQ_HEADER
+ s->swap_uv = 0;//AFAIK VCR2 does not have SEQ_HEADER
if(s->flags & CODEC_FLAG_LOW_DELAY) s->low_delay=1;
if(s->avctx->debug & FF_DEBUG_PICT_INFO)
MpegEncContext *s = &s1->mpeg_enc_ctx;
int i, v;
- /* start new mpeg1 context decoding */
+ /* start new MPEG-1 context decoding */
s->out_format = FMT_MPEG1;
if (s1->mpeg_enc_ctx_allocated) {
MPV_common_end(s);
if(avctx->xvmc_acceleration){
avctx->pix_fmt = avctx->get_format(avctx,pixfmt_xvmc_mpg2_420);
}else{
- avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_420);
+ avctx->pix_fmt = PIX_FMT_YUV420P;
}
if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT )
s->frame_pred_frame_dct = 1;
s->chroma_format = 1;
s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO;
- avctx->sub_id = 2; /* indicates mpeg2 */
+ avctx->sub_id = 2; /* indicates MPEG-2 */
return 0;
}
int drop_frame_flag;
int time_code_hours, time_code_minutes;
int time_code_seconds, time_code_pictures;
- int broken_link;
+ int closed_gop, broken_link;
init_get_bits(&s->gb, buf, buf_size*8);
time_code_seconds = get_bits(&s->gb,6);
time_code_pictures = get_bits(&s->gb,6);
+ closed_gop = get_bits1(&s->gb);
/*broken_link indicate that after editing the
reference frames of the first B-Frames after GOP I-Frame
are missing (open gop)*/
broken_link = get_bits1(&s->gb);
if(s->avctx->debug & FF_DEBUG_PICT_INFO)
- av_log(s->avctx, AV_LOG_DEBUG, "GOP (%2d:%02d:%02d.[%02d]) broken_link=%d\n",
+ av_log(s->avctx, AV_LOG_DEBUG, "GOP (%2d:%02d:%02d.[%02d]) closed_gop=%d broken_link=%d\n",
time_code_hours, time_code_minutes, time_code_seconds,
- time_code_pictures, broken_link);
+ time_code_pictures, closed_gop, broken_link);
}
/**
- * finds the end of the current frame in the bitstream.
+ * Finds the end of the current frame in the bitstream.
* @return the position of the first byte of the next frame, or -1
*/
int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size)
s->slice_count= 0;
+ if(avctx->extradata && !avctx->frame_number)
+ decode_chunks(avctx, picture, data_size, avctx->extradata, avctx->extradata_size);
+
return decode_chunks(avctx, picture, data_size, buf, buf_size);
}
int ret, input_size;
for(;;) {
- /* find start next code */
+ /* find next start code */
uint32_t start_code = -1;
buf_ptr = ff_find_start_code(buf_ptr,buf_end, &start_code);
if (start_code > 0x1ff){
break;
case PICTURE_START_CODE:
- /* we have a complete image : we try to decompress it */
+ /* we have a complete image: we try to decompress it */
mpeg1_decode_picture(avctx,
buf_ptr, input_size);
break;
if(s2->pict_type==FF_B_TYPE) break;
}
if(s2->next_picture_ptr==NULL){
- /* Skip P-frames if we do not have reference frame no valid header. */
+ /* Skip P-frames if we do not have a reference frame or we have an invalid header. */
if(s2->pict_type==FF_P_TYPE && (s2->first_field || s2->picture_structure==PICT_FRAME)) break;
}
/* Skip B-frames if we are in a hurry. */
init_get_bits(&thread_context->gb, buf_ptr, input_size*8);
s->slice_count++;
}
- buf_ptr += 2; //FIXME add minimum num of bytes per slice
+ buf_ptr += 2; //FIXME add minimum number of bytes per slice
}else{
ret = mpeg_decode_slice(s, mb_y, &buf_ptr, input_size);
emms_c();
mpeg_decode_frame,
CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
.flush= ff_mpeg_flush,
+ .long_name= NULL_IF_CONFIG_SMALL("MPEG-1 video"),
};
AVCodec mpeg2video_decoder = {
mpeg_decode_frame,
CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
.flush= ff_mpeg_flush,
+ .long_name= NULL_IF_CONFIG_SMALL("MPEG-2 video"),
};
//legacy decoder
mpeg_decode_frame,
CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
.flush= ff_mpeg_flush,
+ .long_name= NULL_IF_CONFIG_SMALL("MPEG-1 video"),
};
#ifdef HAVE_XVMC
mpeg_decode_frame,
CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED| CODEC_CAP_HWACCEL | CODEC_CAP_DELAY,
.flush= ff_mpeg_flush,
+ .long_name = NULL_IF_CONFIG_SMALL("MPEG-1 video XvMC (X-Video Motion Compensation)"),
};
#endif
-
-/* this is ugly i know, but the alternative is too make
- hundreds of vars global and prefix them with ff_mpeg1_
- which is far uglier. */
-#include "mdec.c"