📄 macroblock.c
字号:
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 ?? */ } if( i_suffix_length == 0 ) { i_suffix_length++; } if( abs( level[i] ) > ( 3 << ( i_suffix_length - 1 ) ) && i_suffix_length < 6 ) { i_suffix_length++; } } if( i_total < i_count ) { if( i_idx == BLOCK_INDEX_CHROMA_DC ) { bs_write_vlc( s, x264_total_zeros_dc[i_total-1][i_total_zero] ); } else { bs_write_vlc( s, x264_total_zeros[i_total-1][i_total_zero] ); } } for( i = 0, i_zero_left = i_total_zero; i < i_total - 1; i++ ) { int i_zl; if( i_zero_left <= 0 ) { break; } i_zl = X264_MIN( i_zero_left - 1, 6 ); bs_write_vlc( s, x264_run_before[i_zl][run[i]] ); i_zero_left -= run[i]; }}/***************************************************************************** * x264_macroblock_write: *****************************************************************************/void x264_macroblock_write_cavlc( x264_t *h, bs_t *s, x264_macroblock_t *mb ){ int i_mb_i_offset; int i; switch( h->sh.i_type ) { case SLICE_TYPE_I: i_mb_i_offset = 0; break; case SLICE_TYPE_P: i_mb_i_offset = 5; break; case SLICE_TYPE_B: i_mb_i_offset = 23; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -