⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vpar_blocks.c

📁 vlc stand 0.1.99 ist sehr einfach
💻 C
📖 第 1 页 / 共 5 页
字号:
     * 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 + -