@ -1655,6 +1655,7 @@ typedef struct Mpeg1Context {
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 @@ static void mpeg_decode_sequence_extension(MpegEncContext *s)
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 @@ static void mpeg_decode_extension(AVCodecContext *avctx,
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 @@ static int mpeg_decode_slice(AVCodecContext *avctx,
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 ) {