📄 vpar_blocks.c
字号:
* codes 000000010000 ... 000000011111 */static dct_lookup_t pl_DCT_tab2[16] = { {0,11,12}, {8,2,12}, {4,3,12}, {0,10,12}, {2,4,12}, {7,2,12}, {21,1,12}, {20,1,12}, {0,9,12}, {19,1,12}, {18,1,12}, {1,5,12}, {3,3,12}, {0,8,12}, {6,2,12}, {17,1,12} }; /* Table B-14/15, DCT coefficients table zero / one, * codes 0000000010000 ... 0000000011111 */static dct_lookup_t pl_DCT_tab3[16] = { {10,2,13}, {9,2,13}, {5,3,13}, {3,4,13}, {2,5,13}, {1,7,13}, {1,6,13}, {0,15,13}, {0,14,13}, {0,13,13}, {0,12,13}, {26,1,13}, {25,1,13}, {24,1,13}, {23,1,13}, {22,1,13} }; /* Table B-14/15, DCT coefficients table zero / one, * codes 00000000010000 ... 00000000011111 */static dct_lookup_t pl_DCT_tab4[16] = { {0,31,14}, {0,30,14}, {0,29,14}, {0,28,14}, {0,27,14}, {0,26,14}, {0,25,14}, {0,24,14}, {0,23,14}, {0,22,14}, {0,21,14}, {0,20,14}, {0,19,14}, {0,18,14}, {0,17,14}, {0,16,14} }; /* Table B-14/15, DCT coefficients table zero / one, * codes 000000000010000 ... 000000000011111 */static dct_lookup_t pl_DCT_tab5[16] = { {0,40,15}, {0,39,15}, {0,38,15}, {0,37,15}, {0,36,15}, {0,35,15}, {0,34,15}, {0,33,15}, {0,32,15}, {1,14,15}, {1,13,15}, {1,12,15}, {1,11,15}, {1,10,15}, {1,9,15}, {1,8,15} }; /* Table B-14/15, DCT coefficients table zero / one, * codes 0000000000010000 ... 0000000000011111 */static dct_lookup_t pl_DCT_tab6[16] = { {1,18,16}, {1,17,16}, {1,16,16}, {1,15,16}, {6,3,16}, {16,2,16}, {15,2,16}, {14,2,16}, {13,2,16}, {12,2,16}, {11,2,16}, {31,1,16}, {30,1,16}, {29,1,16}, {28,1,16}, {27,1,16} }; /* Pointers on tables of dct coefficients */static dct_lookup_t * ppl_dct_tab1[2] = { pl_DCT_tab_ac, pl_DCT_tab0a };static dct_lookup_t * ppl_dct_tab2[2] = { pl_DCT_tab_ac, pl_DCT_tab_dc }; /* Lookup Table for the chromatic component */static int pi_cc_index[12] = { 0, 0, 0, 0, 1, 2, 1, 2, 1, 2 };/* * Initialization of lookup tables *//***************************************************************************** * vpar_InitCrop : Initialize the crop table for saturation * (ISO/IEC 13818-2 section 7.4.3) *****************************************************************************/#if defined(MPEG2_COMPLIANT) && !defined(VDEC_DFT)void vpar_InitCrop( vpar_thread_t * p_vpar ){ int i_dummy; p_vpar->pi_crop = p_vpar->pi_crop_buf + 4096; for( i_dummy = -4096; i_dummy < -2048; i_dummy++ ) { p_vpar->pi_crop[i_dummy] = -2048; } for( ; i_dummy < 2047; i_dummy++ ) { p_vpar->pi_crop[i_dummy] = i_dummy; } for( ; i_dummy < 4095; i_dummy++ ) { p_vpar->pi_crop[i_dummy] = 2047; }}#endif/***************************************************************************** * vpar_InitMbAddrInc : Initialize the lookup table for mb_addr_inc *****************************************************************************//* Function for filling up the lookup table for mb_addr_inc */static void FillMbAddrIncTable( vpar_thread_t * p_vpar, int i_start, int i_end, int i_step, int * pi_value, int i_length ){ int i_pos, i_offset; for( i_pos = i_start ; i_pos < i_end ; i_pos += i_step ) { for( i_offset = 0 ; i_offset < i_step ; i_offset ++ ) { p_vpar->pl_mb_addr_inc[i_pos + i_offset].i_value = * pi_value; p_vpar->pl_mb_addr_inc[i_pos + i_offset].i_length = i_length; } (*pi_value)--; }}/* Function that initialize the table using the last one */void vpar_InitMbAddrInc( vpar_thread_t * p_vpar ){ int i_dummy; int i_value; for( i_dummy = 0 ; i_dummy < 8 ; i_dummy++ ) { p_vpar->pl_mb_addr_inc[i_dummy].i_value = MB_ERROR; p_vpar->pl_mb_addr_inc[i_dummy].i_length = 0; } p_vpar->pl_mb_addr_inc[8].i_value = MB_ADDRINC_ESCAPE; p_vpar->pl_mb_addr_inc[8].i_length = 11; for( i_dummy = 9 ; i_dummy < 15 ; i_dummy ++ ) { p_vpar->pl_mb_addr_inc[i_dummy].i_value = MB_ERROR; p_vpar->pl_mb_addr_inc[i_dummy].i_length = 0; } p_vpar->pl_mb_addr_inc[15].i_value = MB_ADDRINC_STUFFING; p_vpar->pl_mb_addr_inc[15].i_length = 11; for( i_dummy = 16; i_dummy < 24; i_dummy++ ) { p_vpar->pl_mb_addr_inc[i_dummy].i_value = MB_ERROR; p_vpar->pl_mb_addr_inc[i_dummy].i_length = 0; } i_value = 33; FillMbAddrIncTable( p_vpar, 24, 36, 1, &i_value, 11 ); FillMbAddrIncTable( p_vpar, 36, 48, 2, &i_value, 10 ); FillMbAddrIncTable( p_vpar, 48, 96, 8, &i_value, 8 ); FillMbAddrIncTable( p_vpar, 96, 128, 16, &i_value, 7 ); FillMbAddrIncTable( p_vpar, 128, 256, 64, &i_value, 5 ); FillMbAddrIncTable( p_vpar, 256, 512, 128, &i_value, 4 ); FillMbAddrIncTable( p_vpar, 512, 1024, 256, &i_value, 3 ); FillMbAddrIncTable( p_vpar, 1024, 2048, 1024, &i_value, 1 );}/***************************************************************************** * vpar_Init*MBType : Initialize lookup table for the Macroblock type *****************************************************************************//* Fonction for filling up the tables */static void FillMBType( vpar_thread_t * p_vpar, int i_mb_type, int i_start, int i_end, int i_value, int i_length ){ int i_dummy; for( i_dummy = i_start ; i_dummy < i_end ; i_dummy++ ) { p_vpar->ppl_mb_type[i_mb_type][i_dummy].i_value = i_value; p_vpar->ppl_mb_type[i_mb_type][i_dummy].i_length = i_length; }}/* Fonction that fills the table for P MB_Type */void vpar_InitPMBType( vpar_thread_t * p_vpar ){ FillMBType( p_vpar, 0, 32, 64, MB_MOTION_FORWARD|MB_PATTERN, 1 ); FillMBType( p_vpar, 0, 16, 32, MB_PATTERN, 2 ); FillMBType( p_vpar, 0, 8, 16, MB_MOTION_FORWARD, 3 ); FillMBType( p_vpar, 0, 6, 8, MB_INTRA, 5 ); FillMBType( p_vpar, 0, 4, 6, MB_QUANT|MB_MOTION_FORWARD|MB_PATTERN, 5 ); FillMBType( p_vpar, 0, 2, 4, MB_QUANT|MB_PATTERN, 5 ); p_vpar->ppl_mb_type[0][1].i_value = MB_QUANT|MB_INTRA; p_vpar->ppl_mb_type[0][1].i_length = 6; p_vpar->ppl_mb_type[0][0].i_value = MB_ERROR; p_vpar->ppl_mb_type[0][0].i_length = 0;}/* Fonction that fills the table for B MB_Type */void vpar_InitBMBType( vpar_thread_t * p_vpar ){ FillMBType( p_vpar, 1, 48, 64, MB_MOTION_FORWARD |MB_MOTION_BACKWARD|MB_PATTERN, 2 ); FillMBType( p_vpar, 1, 32, 48, MB_MOTION_FORWARD|MB_MOTION_BACKWARD, 2 ); FillMBType( p_vpar, 1, 24, 32, MB_MOTION_BACKWARD|MB_PATTERN, 3 ); FillMBType( p_vpar, 1, 16, 24, MB_MOTION_BACKWARD, 3 ); FillMBType( p_vpar, 1, 12, 16, MB_MOTION_FORWARD|MB_PATTERN, 4 ); FillMBType( p_vpar, 1, 8, 12, MB_MOTION_FORWARD, 4 ); FillMBType( p_vpar, 1, 6, 8, MB_INTRA, 5 ); FillMBType( p_vpar, 1, 4, 6, MB_QUANT|MB_MOTION_FORWARD |MB_MOTION_BACKWARD|MB_PATTERN, 5 ); p_vpar->ppl_mb_type[1][3].i_value = MB_QUANT|MB_MOTION_FORWARD|MB_PATTERN; p_vpar->ppl_mb_type[1][3].i_length = 6; p_vpar->ppl_mb_type[1][2].i_value = MB_QUANT|MB_MOTION_BACKWARD|MB_PATTERN; p_vpar->ppl_mb_type[1][2].i_length = 6; p_vpar->ppl_mb_type[1][1].i_value = MB_QUANT|MB_INTRA; p_vpar->ppl_mb_type[1][1].i_length = 6; p_vpar->ppl_mb_type[1][0].i_value =MB_ERROR; p_vpar->ppl_mb_type[1][0].i_length = 0;}/***************************************************************************** * vpar_InitDCTTables : Initialize tables giving the length of the dct * coefficient from the vlc code *****************************************************************************//* First fonction for filling the table */static void FillDCTTable( dct_lookup_t * p_tab_dest, dct_lookup_t * p_tab_src, int i_step, int i_nb_elem, int i_offset ){ int i_dummy, i_dummy2; for( i_dummy=0 ; i_dummy < i_nb_elem ; i_dummy++ ) { for( i_dummy2=0 ; i_dummy2 < i_step ; i_dummy2++ ) { p_tab_dest[(i_dummy+i_offset)*i_step+i_dummy2] = p_tab_src[i_dummy]; } }}/* Fonction that actually fills the table or create the pointers */void vpar_InitDCTTables( vpar_thread_t * p_vpar ){ /* Tables are cut in two parts to reduce memory occupation */ p_vpar->pppl_dct_dc_size[0][0] = pl_dct_dc_lum_init_table_1; p_vpar->pppl_dct_dc_size[0][1] = pl_dct_dc_lum_init_table_2; p_vpar->pppl_dct_dc_size[1][0] = pl_dct_dc_chrom_init_table_1; p_vpar->pppl_dct_dc_size[1][1] = pl_dct_dc_chrom_init_table_2; /* XXX?? MB_ERROR is replaced by 0 because if we use -1 we * can block in DecodeMPEG2Intra and others */ memset( p_vpar->ppl_dct_coef[0], 0, 16 ); memset( p_vpar->ppl_dct_coef[1], 0, 16 ); /* For table B14 & B15, we have a pointer to tables */ /* We fill the table thanks to the fonction defined above */ FillDCTTable( p_vpar->ppl_dct_coef[0], pl_DCT_tab0, 256, 60, 4 ); FillDCTTable( p_vpar->ppl_dct_coef[0], pl_DCT_tab1, 64, 8, 8 ); FillDCTTable( p_vpar->ppl_dct_coef[0], pl_DCT_tab2, 16, 16, 16 ); FillDCTTable( p_vpar->ppl_dct_coef[0], pl_DCT_tab3, 8, 16, 16 ); FillDCTTable( p_vpar->ppl_dct_coef[0], pl_DCT_tab4, 4, 16, 16 ); FillDCTTable( p_vpar->ppl_dct_coef[0], pl_DCT_tab5, 2, 16, 16 ); FillDCTTable( p_vpar->ppl_dct_coef[0], pl_DCT_tab6, 1, 16, 16 ); FillDCTTable( p_vpar->ppl_dct_coef[1], pl_DCT_tab0a, 256, 60, 4 ); FillDCTTable( p_vpar->ppl_dct_coef[1], pl_DCT_tab1a, 64, 8, 8 ); FillDCTTable( p_vpar->ppl_dct_coef[1], pl_DCT_tab2, 16, 16, 16 ); FillDCTTable( p_vpar->ppl_dct_coef[1], pl_DCT_tab3, 8, 16, 16 ); FillDCTTable( p_vpar->ppl_dct_coef[1], pl_DCT_tab4, 4, 16, 16 ); FillDCTTable( p_vpar->ppl_dct_coef[1], pl_DCT_tab5, 2, 16, 16 ); FillDCTTable( p_vpar->ppl_dct_coef[1], pl_DCT_tab6, 1, 16, 16 );}/* * Block parsing *//***************************************************************************** * DecodeMPEG1NonIntra : decode MPEG-1 non-intra blocks *****************************************************************************/static void DecodeMPEG1NonIntra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b, int i_chroma_format ){ int i_parse; int i_nc; int i_cc; int i_coef; int i_code; int i_length; int i_pos; int i_run; int i_level; boolean_t b_dc; boolean_t b_sign; boolean_t b_chroma; /* Give the chromatic component (0, 1, 2) */ i_cc = pi_cc_index[i_b]; /* Determine whether it is luminance or not (chrominance) */ b_chroma = ( i_cc + 1 ) >> 1; /* There should be no D picture in non-intra blocks */ if( p_vpar->picture.i_coding_type == D_CODING_TYPE ) intf_ErrMsg("vpar error : D-picture in non intra block\n"); /* Decoding of the AC coefficients */ i_nc = 0; i_coef = 0; b_sign = 0; for( i_parse = 0; !p_vpar->b_die; i_parse++ ) { i_code = ShowBits( &p_vpar->bit_stream, 16 ); if( i_code >= 16384 ) { b_dc = !((i_parse + 62)/63); i_run = ppl_dct_tab2[b_dc][(i_code>>12)-4].i_run; i_level = ppl_dct_tab2[b_dc][(i_code>>12)-4].i_level; i_length = ppl_dct_tab2[b_dc][(i_code>>12)-4].i_length; } else { i_run = p_vpar->ppl_dct_coef[0][i_code].i_run; i_length = p_vpar->ppl_dct_coef[0][i_code].i_length; i_level = p_vpar->ppl_dct_coef[0][i_code].i_level; } RemoveBits( &p_vpar->bit_stream, i_length ); switch( i_run ) { case DCT_ESCAPE: i_run = GetBits( &p_vpar->bit_stream, 6 ); i_level = GetBits( &p_vpar->bit_stream, 8 ); if (i_level == 0) i_level = GetBits( &p_vpar->bit_stream, 8 ); else if (i_level == 128) i_level = GetBits( &p_vpar->bit_stream, 8 ) - 256; else if (i_level > 128)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -