📄 block.c
字号:
{ 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 + -