Mercurial > libavcodec.hg
diff mpeg12.c @ 1546:5d06823e2ee9 libavcodec
export mpeg2 active display area / pan scan
fix mpeg2 aspect_ratio for the rare case that active display area != AVCodecContext.width/height
decode sequence display extension & picture display extension
author | michael |
---|---|
date | Mon, 20 Oct 2003 09:52:02 +0000 |
parents | 3b31998fe22f |
children | dd544554ed42 |
line wrap: on
line diff
--- a/mpeg12.c Sun Oct 19 21:05:41 2003 +0000 +++ b/mpeg12.c Mon Oct 20 09:52:02 2003 +0000 @@ -1655,6 +1655,7 @@ MpegEncContext mpeg_enc_ctx; int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ int repeat_field; /* true if we must repeat the field */ + AVPanScan pan_scan; /** some temporary storage for the panscan */ } Mpeg1Context; static int mpeg_decode_init(AVCodecContext *avctx) @@ -1781,6 +1782,53 @@ printf("profile: %d, level: %d \n", profile, level); } +static void mpeg_decode_sequence_display_extension(Mpeg1Context *s1) +{ + MpegEncContext *s= &s1->mpeg_enc_ctx; + int color_description, w, h; + + skip_bits(&s->gb, 3); /* video format */ + color_description= get_bits1(&s->gb); + if(color_description){ + skip_bits(&s->gb, 8); /* color primaries */ + skip_bits(&s->gb, 8); /* transfer_characteristics */ + skip_bits(&s->gb, 8); /* matrix_coefficients */ + } + w= get_bits(&s->gb, 14); + skip_bits(&s->gb, 1); //marker + h= get_bits(&s->gb, 14); + skip_bits(&s->gb, 1); //marker + + s1->pan_scan.width= 16*w; + s1->pan_scan.height=16*h; + + if(mpeg2_aspect[s->aspect_ratio_info] < 0.0) + s->avctx->aspect_ratio*= (s->width * h)/(float)(s->height * w); + + if(s->avctx->debug & FF_DEBUG_PICT_INFO) + printf("sde w:%d, h:%d\n", w, h); +} + +static void mpeg_decode_picture_display_extension(Mpeg1Context *s1) +{ + MpegEncContext *s= &s1->mpeg_enc_ctx; + int i; + + for(i=0; i<1; i++){ //FIXME count + s1->pan_scan.position[i][0]= get_sbits(&s->gb, 16); + skip_bits(&s->gb, 1); //marker + s1->pan_scan.position[i][1]= get_sbits(&s->gb, 16); + skip_bits(&s->gb, 1); //marker + } + + if(s->avctx->debug & FF_DEBUG_PICT_INFO) + printf("pde (%d,%d) (%d,%d) (%d,%d)\n", + s1->pan_scan.position[0][0], s1->pan_scan.position[0][1], + s1->pan_scan.position[1][0], s1->pan_scan.position[1][1], + s1->pan_scan.position[2][0], s1->pan_scan.position[2][1] + ); +} + static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) { int i, v, j; @@ -1881,15 +1929,18 @@ ext_type = get_bits(&s->gb, 4); switch(ext_type) { case 0x1: - /* sequence ext */ mpeg_decode_sequence_extension(s); break; + case 0x2: + mpeg_decode_sequence_display_extension(s1); + break; case 0x3: - /* quant matrix extension */ mpeg_decode_quant_matrix_extension(s); break; + case 0x7: + mpeg_decode_picture_display_extension(s1); + break; case 0x8: - /* picture extension */ mpeg_decode_picture_coding_extension(s); break; } @@ -1953,6 +2004,9 @@ s->current_picture_ptr->repeat_pict = 1; } } + + *s->current_picture_ptr->pan_scan= s1->pan_scan; + //printf("%d\n", s->current_picture_ptr->repeat_pict); if(s->avctx->debug&FF_DEBUG_PICT_INFO){