📄 macroblock-dz.c
字号:
for( ch = 0; ch < 2; ch++ ) { int16_t chroma[4][4][4]; int16_t dct2x2[2][2]; int16_t dct4x4[4][4][4]; p_src = ctx->p_img[1+ch]; i_src = ctx->i_img[1+ch]; p_dst = ctx->p_fdec[1+ch]; i_dst = ctx->i_fdec[1+ch]; /* calculate the diff */ h->pixf.sub8x8( chroma, p_src, i_src, p_dst, i_dst ); /* calculate dct coeffs */ for( i = 0; i < 4; i++ ) { h->dctf.dct4x4( dct4x4[i], chroma[i] ); /* copy dc coeff */ dct2x2[block_idx_y[i]][block_idx_x[i]] = dct4x4[i][0][0]; quant_4x4( dct4x4[i], i_qscale, b_inter ? 0 : 1 ); scan_zigzag_4x4( mb->block[16+i+ch*4].residual_ac, dct4x4[i] ); i_decimate_score += x264_mb_decimate_score( mb->block[16+i+ch*4].residual_ac, 15 ); } h->dctf.dct2x2dc( dct2x2, dct2x2 ); quant_2x2_dc( dct2x2, i_qscale, b_inter ? 0 : 1 ); scan_zigzag_2x2_dc( mb->chroma_dc[ch], dct2x2 ); if( i_decimate_score < 7 && b_inter ) { /* Near null chroma 8x8 block so make it null (bits saving) */ for( i = 0; i < 4; i++ ) { int x, y; for( x = 0; x < 15; x++ ) { mb->block[16+i+ch*4].residual_ac[x] = 0; } for( x = 0; x < 4; x++ ) { for( y = 0; y < 4; y++ ) { dct4x4[i][x][y] = 0; } } } } /* output samples to fdec */ h->dctf.idct2x2dc( dct2x2, dct2x2 ); x264_mb_dequant_2x2_dc( dct2x2, i_qscale ); /* XXX not inversed */ /* calculate dct coeffs */ for( i = 0; i < 4; i++ ) { x264_mb_dequant_4x4( dct4x4[i], i_qscale ); /* copy dc coeff */ dct4x4[i][0][0] = dct2x2[block_idx_y[i]][block_idx_x[i]]; h->dctf.idct4x4( chroma[i], dct4x4[i] ); } h->pixf.add8x8( p_dst, i_dst, chroma ); }}/***************************************************************************** * x264_macroblock_encode: *****************************************************************************/void x264_macroblock_encode( x264_t *h, x264_macroblock_t *mb ){ x264_mb_context_t *ctx = mb->context; int i; int i_qscale; /* quantification scale */ i_qscale = mb->i_qp; if( mb->i_type == I_16x16 ) { /* do the right prediction */ h->predict_16x16[mb->i_intra16x16_pred_mode]( ctx->p_fdec[0], ctx->i_fdec[0] ); /* encode the 16x16 macroblock */ x264_mb_encode_i16x16( h, mb, i_qscale ); /* fix the pred mode value */ mb->i_intra16x16_pred_mode = x264_mb_pred_mode16x16_fix[mb->i_intra16x16_pred_mode]; } else if( mb->i_type == I_4x4 ) { for( i = 0; i < 16; i++ ) { uint8_t *p_dst_by; /* Do the right prediction */ p_dst_by = ctx->p_fdec[0] + 4 * block_idx_x[i] + 4 * block_idx_y[i] * ctx->i_fdec[0]; h->predict_4x4[mb->block[i].i_intra4x4_pred_mode]( p_dst_by, ctx->i_fdec[0] ); /* encode one 4x4 block */ x264_mb_encode_i4x4( h, mb, i, i_qscale ); /* fix the pred mode value */ mb->block[i].i_intra4x4_pred_mode = x264_mb_pred_mode4x4_fix[mb->block[i].i_intra4x4_pred_mode]; } } else /* Inter MB */ { int16_t dct4x4[16][4][4]; int i8x8, i4x4, idx; int i_decimate_mb = 0; /* Motion compensation */ x264_mb_mc( h, mb ); for( i8x8 = 0; i8x8 < 4; i8x8++ ) { int16_t luma[4][4]; int i_decimate_8x8; /* encode one 4x4 block */ i_decimate_8x8 = 0; for( i4x4 = 0; i4x4 < 4; i4x4++ ) { uint8_t *p_src, *p_dst; idx = i8x8 * 4 + i4x4; p_src = ctx->p_img[0] + 4 * block_idx_x[idx] + 4 * block_idx_y[idx] * ctx->i_img[0]; p_dst = ctx->p_fdec[0] + 4 * block_idx_x[idx] + 4 * block_idx_y[idx] * ctx->i_fdec[0]; /* we calculate diff */ h->pixf.sub4x4( luma, p_src, ctx->i_img[0],p_dst, ctx->i_fdec[0] ); /* calculate dct coeffs */ h->dctf.dct4x4( dct4x4[idx], luma ); quant_4x4( dct4x4[idx], i_qscale, 0 ); scan_zigzag_4x4full( mb->block[idx].luma4x4, dct4x4[idx] ); i_decimate_8x8 += x264_mb_decimate_score( mb->block[idx].luma4x4, 16 ); } /* decimate this 8x8 block */ i_decimate_mb += i_decimate_8x8; if( i_decimate_8x8 < 4 ) { for( i4x4 = 0; i4x4 < 4; i4x4++ ) { int x, y; idx = i8x8 * 4 + i4x4; for( i = 0; i < 16; i++ ) { mb->block[idx].luma4x4[i] = 0; } for( x = 0; x < 4; x++ ) { for( y = 0; y < 4; y++ ) { dct4x4[idx][x][y] = 0; } } } } } if( i_decimate_mb < 6 ) { for( i8x8 = 0; i8x8 < 4; i8x8++ ) { for( i4x4 = 0; i4x4 < 4; i4x4++ ) { for( i = 0; i < 16; i++ ) { mb->block[i8x8 * 4 + i4x4].luma4x4[i] = 0; } } } } else { for( i8x8 = 0; i8x8 < 4; i8x8++ ) { int16_t luma[4][4]; /* TODO we could avoid it if we had decimate this 8x8 block */ /* output samples to fdec */ for( i4x4 = 0; i4x4 < 4; i4x4++ ) { uint8_t *p_dst; idx = i8x8 * 4 + i4x4; x264_mb_dequant_4x4( dct4x4[idx], i_qscale ); h->dctf.idct4x4( luma, dct4x4[idx] ); /* put pixel to fdec */ p_dst = ctx->p_fdec[0] + 4 * block_idx_x[idx] + 4 * block_idx_y[idx] * ctx->i_fdec[0]; h->pixf.add4x4( p_dst, ctx->i_fdec[0], luma ); } } } } /* encode chroma */ i_qscale = i_chroma_qp_table[x264_clip3( i_qscale + h->pps->i_chroma_qp_index_offset, 0, 51 )]; if( IS_INTRA( mb->i_type ) ) { /* do the right prediction */ h->predict_8x8[mb->i_chroma_pred_mode]( ctx->p_fdec[1], ctx->i_fdec[1] ); h->predict_8x8[mb->i_chroma_pred_mode]( ctx->p_fdec[2], ctx->i_fdec[2] ); } /* encode the 8x8 blocks */ x264_mb_encode_8x8( h, mb, !IS_INTRA( mb->i_type ), i_qscale ); /* fix the pred mode value */ if( IS_INTRA( mb->i_type ) ) { mb->i_chroma_pred_mode = x264_mb_pred_mode8x8_fix[mb->i_chroma_pred_mode]; } /* Calculate the Luma/Chroma patern and non_zero_count */ if( mb->i_type == I_16x16 ) { mb->i_cbp_luma = 0x00; for( i = 0; i < 16; i++ ) { mb->block[i].i_non_zero_count = array_non_zero_count( mb->block[i].residual_ac, 15 ); if( mb->block[i].i_non_zero_count > 0 ) { mb->i_cbp_luma = 0x0f; } } } else { mb->i_cbp_luma = 0x00; for( i = 0; i < 16; i++ ) { mb->block[i].i_non_zero_count = array_non_zero_count( mb->block[i].luma4x4, 16 ); if( mb->block[i].i_non_zero_count > 0 ) { mb->i_cbp_luma |= 1 << (i/4); } } } /* Calculate the chroma patern */ mb->i_cbp_chroma = 0x00; for( i = 0; i < 8; i++ ) { mb->block[16+i].i_non_zero_count = array_non_zero_count( mb->block[16+i].residual_ac, 15 ); if( mb->block[16+i].i_non_zero_count > 0 ) { mb->i_cbp_chroma = 0x02; /* dc+ac (we can't do only ac) */ } } if( mb->i_cbp_chroma == 0x00 && ( array_non_zero_count( mb->chroma_dc[0], 4 ) > 0 || array_non_zero_count( mb->chroma_dc[1], 4 ) ) > 0 ) { mb->i_cbp_chroma = 0x01; /* dc only */ } /* Check for P_SKIP * XXX: in the me perhaps we should take x264_mb_predict_mv_pskip into account * (if multiple mv give same result)*/ if( mb->i_type == P_L0 && mb->i_partition == D_16x16 && mb->i_cbp_luma == 0x00 && mb->i_cbp_chroma == 0x00 ) { int i_ref; int mvx, mvy; x264_mb_partition_get( mb, 0, 0, 0, &i_ref, &mvx, &mvy ); if( i_ref == 0 ) { int mvp[2]; x264_mb_predict_mv_pskip( mb, mvp ); if( mvp[0] == mvx && mvp[1] == mvy ) { mb->i_type = P_SKIP; } } }}#define BLOCK_INDEX_CHROMA_DC (-1)#define BLOCK_INDEX_LUMA_DC (-2)static inline void bs_write_vlc( bs_t *s, vlc_t v ){ bs_write( s, v.i_size, v.i_bits );}/**************************************************************************** * block_residual_write_cavlc: ****************************************************************************/static void block_residual_write_cavlc( x264_t *h, bs_t *s, x264_macroblock_t *mb, int i_idx, int *l, int i_count ){ int level[16], run[16]; int i_total, i_trailing; int i_total_zero; int i_last; unsigned int i_sign; int i; int i_zero_left; int i_suffix_length; /* first find i_last */ i_last = i_count - 1; while( i_last >= 0 && l[i_last] == 0 ) { i_last--; } i_sign = 0; i_total = 0; i_trailing = 0; i_total_zero = 0; if( i_last >= 0 ) { int b_trailing = 1; int idx = 0; /* level and run and total */ while( i_last >= 0 ) { level[idx] = l[i_last--]; run[idx] = 0; while( i_last >= 0 && l[i_last] == 0 ) { run[idx]++; i_last--; } i_total++; i_total_zero += run[idx]; if( b_trailing && abs( level[idx] ) == 1 && i_trailing < 3 ) { i_sign <<= 1; if( level[idx] < 0 ) { i_sign |= 0x01; } i_trailing++; } else { b_trailing = 0; } idx++; } } /* total/trailing */ if( i_idx == BLOCK_INDEX_CHROMA_DC ) { bs_write_vlc( s, x264_coeff_token[4][i_total*4+i_trailing] ); } else { /* x264_mb_predict_non_zero_code return 0 <-> (16+16+1)>>1 = 16 */ static const int ct_index[17] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3 }; int nC; if( i_idx == BLOCK_INDEX_LUMA_DC ) { nC = x264_mb_predict_non_zero_code( h, mb, 0 ); } else { nC = x264_mb_predict_non_zero_code( h, mb, i_idx ); } bs_write_vlc( s, x264_coeff_token[ct_index[nC]][i_total*4+i_trailing] ); } if( i_total <= 0 ) { return; } i_suffix_length = i_total > 10 && i_trailing < 3 ? 1 : 0; if( i_trailing > 0 ) { bs_write( s, i_trailing, i_sign ); } for( i = i_trailing; i < i_total; i++ ) { int i_level_code; /* calculate level code */ if( level[i] < 0 ) { i_level_code = -2*level[i] - 1; } else /* if( level[i] > 0 ) */ { i_level_code = 2 * level[i] - 2; } if( i == i_trailing && i_trailing < 3 ) { i_level_code -=2; /* as level[i] can't be 1 for the first one if i_trailing < 3 */ } if( ( i_level_code >> i_suffix_length ) < 14 ) { bs_write_vlc( s, x264_level_prefix[i_level_code >> i_suffix_length] ); if( i_suffix_length > 0 ) { bs_write( s, i_suffix_length, i_level_code ); } } else if( i_suffix_length == 0 && i_level_code < 30 ) { bs_write_vlc( s, x264_level_prefix[14] ); bs_write( s, 4, i_level_code - 14 ); } else if( i_suffix_length > 0 && ( i_level_code >> i_suffix_length ) == 14 ) { bs_write_vlc( s, x264_level_prefix[14] ); bs_write( s, i_suffix_length, i_level_code ); } else { bs_write_vlc( s, x264_level_prefix[15] ); i_level_code -= 15 << i_suffix_length; if( i_suffix_length == 0 ) { i_level_code -= 15; } if( i_level_code >= ( 1 << 12 ) || i_level_code < 0 ) { fprintf( stderr, "OVERFLOW levelcode=%d\n", i_level_code ); } bs_write( s, 12, i_level_code ); /* check overflow ?? */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -