transrate.c

来自「VLC媒体播放程序」· C语言 代码 · 共 2,148 行 · 第 1/5 页

C
2,148
字号
        {            bs_copy( bs, tab->len);            //dc_diff = UBITS (bs->i_bit_in_cache, size) - UBITS (SBITS (~bs->i_bit_in_cache, 1), size);            dc_diff = UBITS (bs->i_bit_in_cache, size);            if (!(dc_diff >> (size - 1))) dc_diff = (dc_diff + 1) - (1 << size);            bs_copy( bs, size);            return dc_diff;        } else        {            bs_copy( bs, 2);            return 0;        }    }    else    {        tab = DC_long + (UBITS (bs->i_bit_in_cache, 10) - 0x3e0);        size = tab->size;        bs_copy( bs, tab->len + 1);        //dc_diff = UBITS (bs->i_bit_in_cache, size) - UBITS (SBITS (~bs->i_bit_in_cache, 1), size);        dc_diff = UBITS (bs->i_bit_in_cache, size);        if (!(dc_diff >> (size - 1))) dc_diff = (dc_diff + 1) - (1 << size);        bs_copy( bs, size);        return dc_diff;    }}static void get_intra_block_B14( bs_transrate_t *bs, const int i_qscale, const int i_qscale_new ){    int tst;    int i, li;    int val;    const DCTtab * tab;    /* Basic sanity check --Meuuh */    if( i_qscale == 0 )    {        return;    }    tst = i_qscale_new/i_qscale + ((i_qscale_new%i_qscale) ? 1 : 0);    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;            if (val >= tst)            {                val = (val ^ SBITS (bs->i_bit_in_cache, 1)) - SBITS (bs->i_bit_in_cache, 1);                putAC( bs, i - li - 1, (val * i_qscale) / i_qscale_new, 0);                li = i;            }            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);            if (abs(val) >= tst)            {                putAC( bs, i - li - 1, (val * i_qscale) / i_qscale_new, 0);                li = i;            }            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;        }        break;  /* illegal, check needed to avoid buffer overflow */    }    bs_copy( bs, 2);    /* end of block code */}static void get_intra_block_B15( bs_transrate_t *bs,  const int i_qscale, int const i_qscale_new ){    int tst;    int i, li;    int val;    const DCTtab * tab;    /* Basic sanity check --Meuuh */    if( i_qscale == 0 )    {        return;    }    tst = i_qscale_new/i_qscale + ((i_qscale_new%i_qscale) ? 1 : 0);    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;                if (val >= tst)                {                    val = (val ^ SBITS (bs->i_bit_in_cache, 1)) - SBITS (bs->i_bit_in_cache, 1);                    putAC( bs, i - li - 1, (val * i_qscale) / i_qscale_new, 1);                    li = i;                }                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);                if (abs(val) >= tst)                {                    putAC( bs, i - li - 1, (val * i_qscale) / i_qscale_new, 1);                    li = i;                }                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;        }        break;  /* illegal, check needed to avoid buffer overflow */    }    bs_copy( bs, 4);    /* end of block code */}static int get_non_intra_block_drop( transrate_t *tr, RunLevel *blk){    bs_transrate_t *bs = &tr->bs;    int i, li;    int val;    const DCTtab * tab;    RunLevel *sblk = blk + 1;    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); /* if (bitstream_get (1)) val = -val; */            blk->level = val;            blk->run = i - li - 1;            li = i;            blk++;            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;        }        break;  /* illegal, check needed to avoid buffer overflow */    }    bs_flush( bs, 2 ); /* dump end of block code */    // remove last coeff    if (blk != sblk)    {        blk--;    }    // remove more coeffs if very late    if (tr->level_p >= 4 && (blk != sblk))    {        blk--;        if (tr->level_p >= 5 && (blk != sblk))        {            blk--;            if (tr->level_p >= 6 && (blk != sblk))            {                blk--;                if (tr->level_p >= 7 && (blk != sblk))                    blk--;            }        }    }    blk->level = 0;    return i;}static int get_non_intra_block_rq( bs_transrate_t *bs, RunLevel *blk,  const int i_qscale, const int i_qscale_new ){    int tst;    int i, li;    int val;    const DCTtab * tab;    /* Basic sanity check --Meuuh */    if( i_qscale == 0 )    {        return 0;    }    tst = i_qscale_new/i_qscale + ((i_qscale_new%i_qscale) ? 1 : 0);    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;            if (val >= tst)            {                val = (val ^ SBITS (bs->i_bit_in_cache, 1)) - SBITS (bs->i_bit_in_cache, 1);                blk->level = (val * i_qscale) / i_qscale_new;                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);            if (abs(val) >= tst)            {                blk->level = (val * i_qscale) / i_qscale_new;                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)        {

⌨️ 快捷键说明

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