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

📄 block.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
                            {                                change_qscale( blk[i], new_blk[i],                                               i_qscale, i_guessed_qscale,                                               intra );                                if ( new_blk[i]->level )                                    i_new_cbp |= (1 << (5 - i));                            }                        }                    }                }                break;            }        }    }    tr->new_quantizer_scale = i_guessed_qscale;#if 0    /* Now see if we can drop coeffs */    for ( i = 0; i < 6; i++ )    {        if ( i_new_cbp & (1 << (5 - i)) )        {            for ( ; ; )            {                RunLevel *last_blk = new_blk[i];                uint8_t old_level;                while ( last_blk[1].level )                    last_blk++;                if ( last_blk == new_blk[i] )                    break;                old_level = last_blk->level;                last_blk->level = 0;                i_error = get_score( blk[i], new_blk[i],                                     i_qscale, i_guessed_qscale );                if ( i_error > tr->i_admissible_error )                {                    last_blk->level = old_level;                    break;                }            }        }    }#endif    return i_new_cbp;}void get_intra_block_B14( transrate_t *tr, RunLevel *blk ){    bs_transrate_t *bs = &tr->bs;    int i, li;    int val;    const DCTtab * tab;    li = i = 0;    for( ;; )    {        if (bs->i_bit_in_cache >= 0x28000000)        {            tab = DCT_B14AC_5 + (UBITS (bs->i_bit_in_cache, 5) - 5);            i += tab->run;            if (i >= 64) break; /* end of block */    normal_code:            bs_flush( bs, tab->len );            val = tab->level;            val = (val ^ SBITS (bs->i_bit_in_cache, 1)) - SBITS (bs->i_bit_in_cache, 1);            blk->level = val;            blk->run = i - li - 1;            li = i;            blk++;            bs_flush( bs, 1 );            continue;        }        else if (bs->i_bit_in_cache >= 0x04000000)        {            tab = DCT_B14_8 + (UBITS (bs->i_bit_in_cache, 8) - 4);            i += tab->run;            if (i < 64) goto normal_code;            /* escape code */            i += (UBITS (bs->i_bit_in_cache, 12) & 0x3F) - 64;            if (i >= 64) break; /* illegal, check needed to avoid buffer overflow */            bs_flush( bs, 12 );            val = SBITS (bs->i_bit_in_cache, 12);            blk->level = val;            blk->run = i - li - 1;            li = i;            blk++;            bs_flush( bs, 12 );            continue;        }        else if (bs->i_bit_in_cache >= 0x02000000)        {            tab = DCT_B14_10 + (UBITS (bs->i_bit_in_cache, 10) - 8);            i += tab->run;            if (i < 64 ) goto normal_code;        }        else if (bs->i_bit_in_cache >= 0x00800000)        {            tab = DCT_13 + (UBITS (bs->i_bit_in_cache, 13) - 16);            i += tab->run;            if (i < 64 ) goto normal_code;        }        else if (bs->i_bit_in_cache >= 0x00200000)        {            tab = DCT_15 + (UBITS (bs->i_bit_in_cache, 15) - 16);            i += tab->run;            if (i < 64 ) goto normal_code;        }        else        {            tab = DCT_16 + UBITS (bs->i_bit_in_cache, 16);            bs_flush( bs, 16 );            i += tab->run;            if (i < 64 ) goto normal_code;        }        fprintf(stderr, "Err in B14\n");    tr->b_error = 1;        break;  /* illegal, check needed to avoid buffer overflow */    }    bs_flush( bs, 2 );    /* dump end of block code */    blk->level = 0;    if ( tr->mpeg4_matrix )        quantize_block( tr, blk, 1 );}void get_intra_block_B15( transrate_t *tr, RunLevel *blk ){    bs_transrate_t *bs = &tr->bs;    int i, li;    int val;    const DCTtab * tab;    li = i = 0;    for( ;; )    {        if (bs->i_bit_in_cache >= 0x04000000)        {            tab = DCT_B15_8 + (UBITS (bs->i_bit_in_cache, 8) - 4);            i += tab->run;            if (i < 64)            {    normal_code:                bs_flush( bs, tab->len );                val = tab->level;                val = (val ^ SBITS (bs->i_bit_in_cache, 1)) - SBITS (bs->i_bit_in_cache, 1);                blk->level = val;                blk->run = i - li - 1;                li = i;                blk++;                bs_flush( bs, 1 );                continue;            }            else            {                i += (UBITS (bs->i_bit_in_cache, 12) & 0x3F) - 64;                if (i >= 64) break; /* illegal, check against buffer overflow */                bs_flush( bs, 12 );                val = SBITS (bs->i_bit_in_cache, 12);                blk->level = val;                blk->run = i - li - 1;                li = i;                blk++;                bs_flush( bs, 12 );                continue;            }        }        else if (bs->i_bit_in_cache >= 0x02000000)        {            tab = DCT_B15_10 + (UBITS (bs->i_bit_in_cache, 10) - 8);            i += tab->run;            if (i < 64) goto normal_code;        }        else if (bs->i_bit_in_cache >= 0x00800000)        {            tab = DCT_13 + (UBITS (bs->i_bit_in_cache, 13) - 16);            i += tab->run;            if (i < 64) goto normal_code;        }        else if (bs->i_bit_in_cache >= 0x00200000)        {            tab = DCT_15 + (UBITS (bs->i_bit_in_cache, 15) - 16);            i += tab->run;            if (i < 64) goto normal_code;        }        else        {            tab = DCT_16 + UBITS (bs->i_bit_in_cache, 16);            bs_flush( bs, 16 );            i += tab->run;            if (i < 64) goto normal_code;        }        fprintf(stderr, "Err in B15\n");    tr->b_error = 1;        break;  /* illegal, check needed to avoid buffer overflow */    }    bs_flush( bs, 4 );    /* dump end of block code */    blk->level = 0;    if ( tr->mpeg4_matrix )        quantize_block( tr, blk, 1 );}int get_non_intra_block( transrate_t *tr, RunLevel *blk ){    bs_transrate_t *bs = &tr->bs;    int i, li;    int val;    const DCTtab * tab;    li = i = -1;    if (bs->i_bit_in_cache >= 0x28000000)    {        tab = DCT_B14DC_5 + (UBITS (bs->i_bit_in_cache, 5) - 5);        goto entry_1;    }    else goto entry_2;    for( ;; )    {        if (bs->i_bit_in_cache >= 0x28000000)        {            tab = DCT_B14AC_5 + (UBITS (bs->i_bit_in_cache, 5) - 5);    entry_1:            i += tab->run;            if (i >= 64)            break;  /* end of block */    normal_code:            bs_flush( bs, tab->len );            val = tab->level;            val = (val ^ SBITS (bs->i_bit_in_cache, 1)) - SBITS (bs->i_bit_in_cache, 1);            blk->level = val;            blk->run = i - li - 1;            li = i;            blk++;            //if ( ((val) && (tab->level < tst)) || ((!val) && (tab->level >= tst)) )            //  LOGF("level: %i val: %i tst : %i q: %i nq : %i\n", tab->level, val, tst, q, nq);            bs_flush( bs, 1 );            continue;        }    entry_2:        if (bs->i_bit_in_cache >= 0x04000000)        {            tab = DCT_B14_8 + (UBITS (bs->i_bit_in_cache, 8) - 4);            i += tab->run;            if (i < 64) goto normal_code;            /* escape code */            i += (UBITS (bs->i_bit_in_cache, 12) & 0x3F) - 64;            if (i >= 64) break; /* illegal, check needed to avoid buffer overflow */            bs_flush( bs, 12 );            val = SBITS (bs->i_bit_in_cache, 12);            blk->level = val;            blk->run = i - li - 1;            li = i;            blk++;            bs_flush( bs, 12 );            continue;        }        else if (bs->i_bit_in_cache >= 0x02000000)        {            tab = DCT_B14_10 + (UBITS (bs->i_bit_in_cache, 10) - 8);            i += tab->run;            if (i < 64) goto normal_code;        }        else if (bs->i_bit_in_cache >= 0x00800000)        {            tab = DCT_13 + (UBITS (bs->i_bit_in_cache, 13) - 16);            i += tab->run;            if (i < 64) goto normal_code;        }        else if (bs->i_bit_in_cache >= 0x00200000)        {            tab = DCT_15 + (UBITS (bs->i_bit_in_cache, 15) - 16);            i += tab->run;            if (i < 64) goto normal_code;        }        else        {            tab = DCT_16 + UBITS (bs->i_bit_in_cache, 16);            bs_flush( bs, 16 );            i += tab->run;            if (i < 64) goto normal_code;        }        fprintf(stderr, "Err in non-intra\n");    tr->b_error = 1;        break;  /* illegal, check needed to avoid buffer overflow */    }    bs_flush( bs, 2 );    /* dump end of block code */    blk->level = 0;    if ( tr->mpeg4_matrix )        quantize_block( tr, blk, 0 );    return i;}static inline void putAC( bs_transrate_t *bs, int run, int signed_level, int vlcformat){    int level, len;    const VLCtable *ptab = NULL;    level = (signed_level<0) ? -signed_level : signed_level; /* abs(signed_level) */    assert(!(run<0 || run>63 || level==0 || level>2047));    len = 0;    if (run<2 && level<41)    {        if (vlcformat)  ptab = &dct_code_tab1a[run][level-1];        else ptab = &dct_code_tab1[run][level-1];        len = ptab->len;    }    else if (run<32 && level<6)    {        if (vlcformat) ptab = &dct_code_tab2a[run-2][level-1];        else ptab = &dct_code_tab2[run-2][level-1];        len = ptab->len;    }    if (len) /* a VLC code exists */    {        bs_write( bs, ptab->code, len);        bs_write( bs, signed_level<0, 1); /* sign */    }    else    {        bs_write( bs, 1l, 6); /* Escape */        bs_write( bs, run, 6); /* 6 bit code for run */        bs_write( bs, ((unsigned int)signed_level) & 0xFFF, 12);    }}static inline void putACfirst( bs_transrate_t *bs, int run, int val){    if (run==0 && (val==1 || val==-1)) bs_write( bs, 2|(val<0), 2 );    else putAC( bs, run, val, 0);}void putnonintrablk( bs_transrate_t *bs, RunLevel *blk){    assert(blk->level);    putACfirst( bs, blk->run, blk->level );    blk++;    while (blk->level)    {        putAC( bs, blk->run, blk->level, 0 );        blk++;    }    bs_write( bs, 2, 2 );}void putintrablk( bs_transrate_t *bs, RunLevel *blk, int vlcformat){    while (blk->level)    {        putAC( bs, blk->run, blk->level, vlcformat );        blk++;    }    if (vlcformat)        bs_write( bs, 6, 4 );    else        bs_write( bs, 2, 2 );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -