X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_parser%2Fvpar_headers.c;h=c2589f5f96951b1fd37019345b5a619f64cc19f9;hb=647cca0ebb2e897a570018ba80483bb81a7d90c6;hp=299eb5eac6e6211264f1343f9bb70b74116ed446;hpb=423a3bcf9811ad1def58d439dc5f2595f62ab1e6;p=vlc diff --git a/src/video_parser/vpar_headers.c b/src/video_parser/vpar_headers.c index 299eb5eac6..c2589f5f96 100644 --- a/src/video_parser/vpar_headers.c +++ b/src/video_parser/vpar_headers.c @@ -2,7 +2,7 @@ * vpar_headers.c : headers parsing ***************************************************************************** * Copyright (C) 1999, 2000 VideoLAN - * $Id: vpar_headers.c,v 1.61 2000/12/21 17:19:54 massiot Exp $ + * $Id: vpar_headers.c,v 1.74 2001/01/18 05:13:23 sam Exp $ * * Authors: Christophe Massiot * Stéphane Borel @@ -28,8 +28,6 @@ #include "defs.h" #include /* free() */ -#include /* on BSD, uio.h needs types.h */ -#include /* "input.h" */ #include "config.h" #include "common.h" @@ -45,11 +43,11 @@ #include "video.h" #include "video_output.h" +#include "video_decoder.h" +#include "vdec_motion.h" #include "../video_decoder/vdec_idct.h" -#include "../video_decoder/video_decoder.h" -#include "../video_decoder/vdec_motion.h" -#include "../video_decoder/vpar_blocks.h" +#include "vpar_blocks.h" #include "../video_decoder/vpar_headers.h" #include "../video_decoder/vpar_synchro.h" #include "../video_decoder/video_parser.h" @@ -78,8 +76,7 @@ static void CopyrightExtension( vpar_thread_t * p_vpar ); /***************************************************************************** * pi_default_intra_quant : default quantization matrix *****************************************************************************/ -#ifndef VDEC_DFT -int pi_default_intra_quant[] = +u8 pi_default_intra_quant[] = { 8, 16, 19, 22, 26, 27, 29, 34, 16, 16, 22, 24, 27, 29, 34, 37, @@ -90,25 +87,11 @@ int pi_default_intra_quant[] = 26, 27, 29, 34, 38, 46, 56, 69, 27, 29, 35, 38, 46, 56, 69, 83 }; -#else -int pi_default_intra_quant[] = -{ - 2048, 5681, 6355, 6623, 6656, 5431, 4018, 2401, - 5681, 7880, 10207, 10021, 9587, 8091, 6534, 3625, - 6355, 10207, 11363, 10619, 9700, 8935, 6155, 3507, - 6623, 9186, 10226, 9557, 8730, 8041, 6028, 3322, - 5632, 9232, 9031, 8730, 8192, 7040, 5542, 3390, - 5230, 7533, 7621, 7568, 7040, 6321, 5225, 3219, - 3602, 5189, 5250, 5539, 5265, 5007, 4199, 2638, - 1907, 2841, 3230, 3156, 3249, 3108, 2638, 1617 -}; -#endif /***************************************************************************** * pi_default_nonintra_quant : default quantization matrix *****************************************************************************/ -#ifndef VDEC_DFT -int pi_default_nonintra_quant[] = +u8 pi_default_nonintra_quant[] = { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, @@ -119,19 +102,6 @@ int pi_default_nonintra_quant[] = 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; -#else -int pi_default_nonintra_quanit[] = -{ - 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136, - 5680, 7888, 7424, 6688, 5680, 4464, 3072, 1568, - 5344, 7424, 6992, 6288, 5344, 4208, 2896, 1472, - 4816, 6688, 6288, 5664, 4816, 3792, 2608, 1328, - 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136, - 3216, 4464, 4208, 3792, 3216, 2528, 1744, 880, - 2224, 3072, 2896, 2608, 2224, 1744, 1200, 608, - 1136, 1568, 1472, 1328, 1136, 880, 608, 304 -}; -#endif /***************************************************************************** * pi_scan : zig-zag and alternate scan patterns @@ -213,16 +183,17 @@ static void __inline__ ReferenceReplace( vpar_thread_t * p_vpar, /***************************************************************************** * LoadMatrix : Load a quantization matrix *****************************************************************************/ -static __inline__ void LoadMatrix( vpar_thread_t * p_vpar, quant_matrix_t * p_matrix ) +static __inline__ void LoadMatrix( vpar_thread_t * p_vpar, + quant_matrix_t * p_matrix ) { int i_dummy; if( !p_matrix->b_allocated ) { /* Allocate a piece of memory to load the matrix. */ - if( (p_matrix->pi_matrix = (int *)malloc( 64*sizeof(int) )) == NULL ) + if( (p_matrix->pi_matrix = (u8 *)malloc( 64*sizeof(u8) )) == NULL ) { - intf_ErrMsg( "vpar error: allocation error in LoadMatrix()\n" ); + intf_ErrMsg( "vpar error: allocation error in LoadMatrix()" ); p_vpar->p_fifo->b_error = 1; return; } @@ -231,7 +202,7 @@ static __inline__ void LoadMatrix( vpar_thread_t * p_vpar, quant_matrix_t * p_ma for( i_dummy = 0; i_dummy < 64; i_dummy++ ) { - p_matrix->pi_matrix[pi_scan[SCAN_ZIGZAG][i_dummy]] + p_matrix->pi_matrix[p_vpar->ppi_scan[SCAN_ZIGZAG][i_dummy]] = GetBits( &p_vpar->bit_stream, 8 ); } @@ -245,7 +216,7 @@ static __inline__ void LoadMatrix( vpar_thread_t * p_vpar, quant_matrix_t * p_ma /***************************************************************************** * LinkMatrix : Link a quantization matrix to another *****************************************************************************/ -static __inline__ void LinkMatrix( quant_matrix_t * p_matrix, int * pi_array ) +static __inline__ void LinkMatrix( quant_matrix_t * p_matrix, u8 * pi_array ) { if( p_matrix->b_allocated ) { @@ -307,7 +278,7 @@ int vpar_ParseHeader( vpar_thread_t * p_vpar ) break; case SEQUENCE_END_CODE: - intf_DbgMsg("vpar debug: sequence end code received\n"); + intf_DbgMsg("vpar debug: sequence end code received"); return 1; break; @@ -368,7 +339,8 @@ static void SequenceHeader( vpar_thread_t * p_vpar ) else { /* Use default matrix. */ - LinkMatrix( &p_vpar->sequence.intra_quant, pi_default_intra_quant ); + LinkMatrix( &p_vpar->sequence.intra_quant, + p_vpar->pi_default_intra_quant ); } if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_non_intra_quantizer_matrix */ @@ -378,7 +350,8 @@ static void SequenceHeader( vpar_thread_t * p_vpar ) else { /* Use default matrix. */ - LinkMatrix( &p_vpar->sequence.nonintra_quant, pi_default_nonintra_quant ); + LinkMatrix( &p_vpar->sequence.nonintra_quant, + p_vpar->pi_default_nonintra_quant ); } /* Unless later overwritten by a matrix extension, we have the same @@ -544,11 +517,9 @@ static void PictureHeader( vpar_thread_t * p_vpar ) p_vpar->picture.b_intra_vlc_format = GetBits( &p_vpar->bit_stream, 1 ); p_vpar->picture.b_alternate_scan = GetBits( &p_vpar->bit_stream, 1 ); p_vpar->picture.b_repeat_first_field = GetBits( &p_vpar->bit_stream, 1 ); - /* repeat_first_field (ISO/IEC 13818-2 6.3.10 is necessary to know - * the length of the picture_display_extension structure. - * chroma_420_type (obsolete) */ + /* chroma_420_type (obsolete) */ RemoveBits( &p_vpar->bit_stream, 1 ); - p_vpar->picture.b_progressive_frame = GetBits( &p_vpar->bit_stream, 1 ); + p_vpar->picture.b_progressive = GetBits( &p_vpar->bit_stream, 1 ); /* composite_display_flag */ if( GetBits( &p_vpar->bit_stream, 1 ) ) @@ -563,17 +534,19 @@ static void PictureHeader( vpar_thread_t * p_vpar ) /* MPEG-1 compatibility flags */ p_vpar->picture.i_intra_dc_precision = 0; /* 8 bits */ i_structure = FRAME_STRUCTURE; + p_vpar->picture.b_top_field_first = 0; p_vpar->picture.b_frame_pred_frame_dct = 1; p_vpar->picture.b_concealment_mv = 0; p_vpar->picture.b_q_scale_type = 0; p_vpar->picture.b_intra_vlc_format = 0; p_vpar->picture.b_alternate_scan = 0; /* zigzag */ - p_vpar->picture.b_repeat_first_field = 0; - p_vpar->picture.b_progressive_frame = 1; + p_vpar->picture.b_repeat_first_field = 1; /* FIXME! this contradicts + * ISO/IEC */ + p_vpar->picture.b_progressive = 1; } #ifdef STATS - p_vpar->pc_pictures[p_vpar->picture.i_coding_type]++; + p_vpar->pc_pictures[p_vpar->picture.i_coding_type]++; #endif if( p_vpar->picture.i_current_structure && @@ -599,7 +572,7 @@ static void PictureHeader( vpar_thread_t * p_vpar ) p_vpar->picture.i_current_structure = 0; - intf_DbgMsg("vpar debug: odd number of field picture.\n"); + intf_DbgMsg("vpar debug: odd number of field picture."); } /* Do we have the reference pictures ? */ @@ -610,15 +583,43 @@ static void PictureHeader( vpar_thread_t * p_vpar ) (p_vpar->sequence.p_forward == NULL || p_vpar->sequence.p_backward == NULL))); - if( b_parsable ) + if( p_vpar->picture.i_current_structure ) { - if( p_vpar->picture.i_current_structure ) + /* Second field of a frame. We will decode it if, and only if we + * have decoded the first field. */ + if( b_parsable ) { - /* Second field of a frame. We will decode it if, and only if we - * have decoded the first field. */ b_parsable = (p_vpar->picture.p_picture != NULL); } + } + else + { + int i_repeat_field; + + /* Compute the number of times the frame will be emitted by the + * decoder (number of periods). */ + if( p_vpar->sequence.b_progressive ) + { + i_repeat_field = 1 + p_vpar->picture.b_repeat_first_field + + p_vpar->picture.b_top_field_first; + } else + { + if( p_vpar->picture.b_progressive ) + { + i_repeat_field = 2 + p_vpar->picture.b_repeat_first_field; + } + else + { + i_repeat_field = 2; + } + } + + /* Warn synchro we have a new picture (updates pictures index). */ + vpar_SynchroNewPicture( p_vpar, p_vpar->picture.i_coding_type, + i_repeat_field ); + + if( b_parsable ) { /* Does synchro say we have enough time to decode it ? */ b_parsable = vpar_SynchroChoose( p_vpar, @@ -643,6 +644,7 @@ static void PictureHeader( vpar_thread_t * p_vpar ) { /* The frame is complete. */ p_vpar->picture.i_current_structure = i_structure; + vpar_SynchroTrash( p_vpar, p_vpar->picture.i_coding_type, i_structure ); } } @@ -674,7 +676,7 @@ static void PictureHeader( vpar_thread_t * p_vpar ) p_vpar->sequence.i_height ) ) == NULL ) { - intf_DbgMsg("vpar debug: allocation error in vout_CreatePicture, delaying\n"); + intf_DbgMsg("vpar debug: allocation error in vout_CreatePicture, delaying"); if( p_vpar->p_fifo->b_die || p_vpar->p_fifo->b_error ) { return; @@ -692,7 +694,6 @@ static void PictureHeader( vpar_thread_t * p_vpar ) << ( 1 - p_vpar->picture.b_frame_structure )); P_picture->i_deccount = p_vpar->sequence.i_mb_size; - vlc_mutex_init( &p_vpar->picture.p_picture->lock_deccount ); #ifdef VDEC_SMP memset( p_vpar->picture.pp_mb, 0, MAX_MB*sizeof(macroblock_t *) ); #endif @@ -746,7 +747,6 @@ static void PictureHeader( vpar_thread_t * p_vpar ) if( p_vpar->picture.b_error ) { /* Trash picture. */ -//fprintf(stderr, "Image trashee\n"); #ifdef VDEC_SMP for( i_mb = 1; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ ) { @@ -773,7 +773,6 @@ static void PictureHeader( vpar_thread_t * p_vpar ) } else if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE ) { -//fprintf(stderr, "Image parsee (%d)\n", p_vpar->picture.i_coding_type); /* Frame completely parsed. */ #ifdef VDEC_SMP for( i_mb = 1; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ ) @@ -881,7 +880,7 @@ static void QuantMatrixExtension( vpar_thread_t * p_vpar ) { /* Use the default matrix. */ LinkMatrix( &p_vpar->sequence.intra_quant, - pi_default_intra_quant ); + p_vpar->pi_default_intra_quant ); } if( GetBits( &p_vpar->bit_stream, 1 ) ) { @@ -892,7 +891,7 @@ static void QuantMatrixExtension( vpar_thread_t * p_vpar ) { /* Use the default matrix. */ LinkMatrix( &p_vpar->sequence.nonintra_quant, - pi_default_nonintra_quant ); + p_vpar->pi_default_nonintra_quant ); } if( GetBits( &p_vpar->bit_stream, 1 ) ) {