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 + -
显示快捷键?