📄 cabac.c
字号:
x264_cabac_encode_decision( &h->cabac, 60 + ctx, 1 ); if( ctx < 2 ) ctx = 2; else ctx = 3; val--; } x264_cabac_encode_decision( &h->cabac, 60 + ctx, 0 );}void x264_cabac_mb_skip( x264_t *h, int b_skip ){ int ctx = 0; if( h->mb.i_mb_x > 0 && !IS_SKIP( h->mb.type[h->mb.i_mb_xy -1]) ) { ctx++; } if( h->mb.i_mb_y > 0 && !IS_SKIP( h->mb.type[h->mb.i_mb_xy -h->mb.i_mb_stride]) ) { ctx++; } if( h->sh.i_type == SLICE_TYPE_P ) x264_cabac_encode_decision( &h->cabac, 11 + ctx, b_skip ? 1 : 0 ); else /* SLICE_TYPE_B */ x264_cabac_encode_decision( &h->cabac, 24 + ctx, b_skip ? 1 : 0 );}static inline void x264_cabac_mb_sub_p_partition( x264_t *h, int i_sub ){ if( i_sub == D_L0_8x8 ) { x264_cabac_encode_decision( &h->cabac, 21, 1 ); } else if( i_sub == D_L0_8x4 ) { x264_cabac_encode_decision( &h->cabac, 21, 0 ); x264_cabac_encode_decision( &h->cabac, 22, 0 ); } else if( i_sub == D_L0_4x8 ) { x264_cabac_encode_decision( &h->cabac, 21, 0 ); x264_cabac_encode_decision( &h->cabac, 22, 1 ); x264_cabac_encode_decision( &h->cabac, 23, 1 ); } else if( i_sub == D_L0_4x4 ) { x264_cabac_encode_decision( &h->cabac, 21, 0 ); x264_cabac_encode_decision( &h->cabac, 22, 1 ); x264_cabac_encode_decision( &h->cabac, 23, 0 ); }}static inline void x264_cabac_mb_sub_b_partition( x264_t *h, int i_sub ){ if( i_sub == D_DIRECT_8x8 ) { x264_cabac_encode_decision( &h->cabac, 36, 0 ); } else if( i_sub == D_L0_8x8 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); } else if( i_sub == D_L1_8x8 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); } else if( i_sub == D_BI_8x8 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 1 ); x264_cabac_encode_decision( &h->cabac, 38, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); } else if( i_sub == D_L0_8x4 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 1 ); x264_cabac_encode_decision( &h->cabac, 38, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); } else if( i_sub == D_L0_4x8 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 1 ); x264_cabac_encode_decision( &h->cabac, 38, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); } else if( i_sub == D_L1_8x4 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 1 ); x264_cabac_encode_decision( &h->cabac, 38, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); } else if( i_sub == D_L1_4x8 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 1 ); x264_cabac_encode_decision( &h->cabac, 38, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); } else if( i_sub == D_BI_8x4 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 1 ); x264_cabac_encode_decision( &h->cabac, 38, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); } else if( i_sub == D_BI_4x8 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 1 ); x264_cabac_encode_decision( &h->cabac, 38, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); } else if( i_sub == D_L0_4x4 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 1 ); x264_cabac_encode_decision( &h->cabac, 38, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); } else if( i_sub == D_L1_4x4 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 1 ); x264_cabac_encode_decision( &h->cabac, 38, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 0 ); } else if( i_sub == D_BI_4x4 ) { x264_cabac_encode_decision( &h->cabac, 36, 1 ); x264_cabac_encode_decision( &h->cabac, 37, 1 ); x264_cabac_encode_decision( &h->cabac, 38, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); x264_cabac_encode_decision( &h->cabac, 39, 1 ); }}static inline void x264_cabac_mb_ref( x264_t *h, int i_list, int idx ){ const int i8 = x264_scan8[idx]; const int i_refa = h->mb.cache.ref[i_list][i8 - 1]; const int i_refb = h->mb.cache.ref[i_list][i8 - 8]; int i_ref = h->mb.cache.ref[i_list][i8]; int ctx = 0; if( i_refa > 0 && !h->mb.cache.skip[i8 - 1]) ctx++; if( i_refb > 0 && !h->mb.cache.skip[i8 - 8]) ctx += 2; while( i_ref > 0 ) { x264_cabac_encode_decision( &h->cabac, 54 + ctx, 1 ); if( ctx < 4 ) ctx = 4; else ctx = 5; i_ref--; } x264_cabac_encode_decision( &h->cabac, 54 + ctx, 0 );}static inline void x264_cabac_mb_mvd_cpn( x264_t *h, int i_list, int idx, int l, int mvd ){ const int amvd = abs( h->mb.cache.mvd[i_list][x264_scan8[idx] - 1][l] ) + abs( h->mb.cache.mvd[i_list][x264_scan8[idx] - 8][l] ); const int i_abs = abs( mvd ); const int i_prefix = X264_MIN( i_abs, 9 ); const int ctxbase = (l == 0 ? 40 : 47); int ctx; int i; if( amvd < 3 ) ctx = 0; else if( amvd > 32 ) ctx = 2; else ctx = 1; for( i = 0; i < i_prefix; i++ ) { x264_cabac_encode_decision( &h->cabac, ctxbase + ctx, 1 ); if( ctx < 3 ) ctx = 3; else if( ctx < 6 ) ctx++; } if( i_prefix < 9 ) { x264_cabac_encode_decision( &h->cabac, ctxbase + ctx, 0 ); } if( i_prefix >= 9 ) { int i_suffix = i_abs - 9; int k = 3; while( i_suffix >= (1<<k) ) { x264_cabac_encode_bypass( &h->cabac, 1 ); i_suffix -= 1 << k; k++; } x264_cabac_encode_bypass( &h->cabac, 0 ); while( k-- ) { x264_cabac_encode_bypass( &h->cabac, (i_suffix >> k)&0x01 ); } } /* sign */ if( mvd > 0 ) x264_cabac_encode_bypass( &h->cabac, 0 ); else if( mvd < 0 ) x264_cabac_encode_bypass( &h->cabac, 1 );}static inline void x264_cabac_mb_mvd( x264_t *h, int i_list, int idx, int width, int height ){ int mvp[2]; int mdx, mdy; /* Calculate mvd */ x264_mb_predict_mv( h, i_list, idx, width, mvp ); mdx = h->mb.cache.mv[i_list][x264_scan8[idx]][0] - mvp[0]; mdy = h->mb.cache.mv[i_list][x264_scan8[idx]][1] - mvp[1]; /* encode */ x264_cabac_mb_mvd_cpn( h, i_list, idx, 0, mdx ); x264_cabac_mb_mvd_cpn( h, i_list, idx, 1, mdy ); /* save value */ x264_macroblock_cache_mvd( h, block_idx_x[idx], block_idx_y[idx], width, height, i_list, mdx, mdy );}static inline void x264_cabac_mb8x8_mvd( x264_t *h, int i_list ){ int i; for( i = 0; i < 4; i++ ) { if( !x264_mb_partition_listX_table[i_list][ h->mb.i_sub_partition[i] ] ) { continue; } switch( h->mb.i_sub_partition[i] ) { case D_L0_8x8: case D_L1_8x8: case D_BI_8x8: x264_cabac_mb_mvd( h, i_list, 4*i, 2, 2 ); break; case D_L0_8x4: case D_L1_8x4: case D_BI_8x4: x264_cabac_mb_mvd( h, i_list, 4*i+0, 2, 1 ); x264_cabac_mb_mvd( h, i_list, 4*i+2, 2, 1 ); break; case D_L0_4x8: case D_L1_4x8: case D_BI_4x8: x264_cabac_mb_mvd( h, i_list, 4*i+0, 1, 2 ); x264_cabac_mb_mvd( h, i_list, 4*i+1, 1, 2 ); break; case D_L0_4x4: case D_L1_4x4: case D_BI_4x4: x264_cabac_mb_mvd( h, i_list, 4*i+0, 1, 1 ); x264_cabac_mb_mvd( h, i_list, 4*i+1, 1, 1 ); x264_cabac_mb_mvd( h, i_list, 4*i+2, 1, 1 ); x264_cabac_mb_mvd( h, i_list, 4*i+3, 1, 1 ); break; } }}static int x264_cabac_mb_cbf_ctxidxinc( x264_t *h, int i_cat, int i_idx ){ /* TODO: clean up/optimize */ int i_mba_xy = -1; int i_mbb_xy = -1; int i_nza = -1; int i_nzb = -1; int ctx = 0; if( i_cat == 0 ) { if( h->mb.i_mb_x > 0 ) { i_mba_xy = h->mb.i_mb_xy -1; if( h->mb.type[i_mba_xy] == I_16x16 ) { i_nza = h->mb.cbp[i_mba_xy]&0x100; } } if( h->mb.i_mb_y > 0 ) { i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride; if( h->mb.type[i_mbb_xy] == I_16x16 ) { i_nzb = h->mb.cbp[i_mbb_xy]&0x100; } } } else if( i_cat == 1 || i_cat == 2 ) { int x = block_idx_x[i_idx]; int y = block_idx_y[i_idx]; if( x > 0 ) i_mba_xy = h->mb.i_mb_xy; else if( h->mb.i_mb_x > 0 ) i_mba_xy = h->mb.i_mb_xy -1; if( y > 0 ) i_mbb_xy = h->mb.i_mb_xy; else if( h->mb.i_mb_y > 0 ) i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride; /* no need to test for skip/pcm */ if( i_mba_xy >= 0 ) { const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4; if( (h->mb.cbp[i_mba_xy]&0x0f)>> i8x8a ) { i_nza = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 1]; } } if( i_mbb_xy >= 0 ) { const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4; if( (h->mb.cbp[i_mbb_xy]&0x0f)>> i8x8b ) { i_nzb = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 8]; } } } else if( i_cat == 3 ) { /* no need to test skip/pcm */ if( h->mb.i_mb_x > 0 ) { i_mba_xy = h->mb.i_mb_xy -1; if( h->mb.cbp[i_mba_xy]&0x30 ) { i_nza = h->mb.cbp[i_mba_xy]&( 0x02 << ( 8 + i_idx) ); } } if( h->mb.i_mb_y > 0 ) { i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride; if( h->mb.cbp[i_mbb_xy]&0x30 ) { i_nzb = h->mb.cbp[i_mbb_xy]&( 0x02 << ( 8 + i_idx) ); } } } else if( i_cat == 4 ) { int idxc = i_idx% 4; if( idxc == 1 || idxc == 3 ) i_mba_xy = h->mb.i_mb_xy; else if( h->mb.i_mb_x > 0 ) i_mba_xy = h->mb.i_mb_xy - 1; if( idxc == 2 || idxc == 3 ) i_mbb_xy = h->mb.i_mb_xy; else if( h->mb.i_mb_y > 0 ) i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride; /* no need to test skip/pcm */ if( i_mba_xy >= 0 && (h->mb.cbp[i_mba_xy]&0x30) == 0x20 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -