📄 macroblock.c
字号:
/* h->mb.cache.ref[i_list][x264_scan8[5 ]+1] = h->mb.cache.ref[i_list][x264_scan8[7 ]+1] = h->mb.cache.ref[i_list][x264_scan8[13]+1] = -2; */ if( i_top_left_xy >= 0 ) { const int i8 = x264_scan8[0] - 1 - 1*8; const int ir = i_mb_8x8 - s8x8 - 1; const int iv = i_mb_4x4 - s4x4 - 1; h->mb.cache.ref[i_list][i8] = h->mb.ref[i_list][ir]; h->mb.cache.mv[i_list][i8][0] = h->mb.mv[i_list][iv][0]; h->mb.cache.mv[i_list][i8][1] = h->mb.mv[i_list][iv][1]; } else { const int i8 = x264_scan8[0] - 1 - 1*8; h->mb.cache.ref[i_list][i8] = -2; h->mb.cache.mv[i_list][i8][0] = 0; h->mb.cache.mv[i_list][i8][1] = 0; } if( i_top_xy >= 0 ) { const int i8 = x264_scan8[0] - 8; const int ir = i_mb_8x8 - s8x8; const int iv = i_mb_4x4 - s4x4; h->mb.cache.ref[i_list][i8+0] = h->mb.cache.ref[i_list][i8+1] = h->mb.ref[i_list][ir + 0]; h->mb.cache.ref[i_list][i8+2] = h->mb.cache.ref[i_list][i8+3] = h->mb.ref[i_list][ir + 1]; for( i = 0; i < 4; i++ ) { h->mb.cache.mv[i_list][i8+i][0] = h->mb.mv[i_list][iv + i][0]; h->mb.cache.mv[i_list][i8+i][1] = h->mb.mv[i_list][iv + i][1]; } } else { const int i8 = x264_scan8[0] - 8; for( i = 0; i < 4; i++ ) { h->mb.cache.ref[i_list][i8+i] = -2; h->mb.cache.mv[i_list][i8+i][0] = h->mb.cache.mv[i_list][i8+i][1] = 0; } } if( i_top_right_xy >= 0 ) { const int i8 = x264_scan8[0] + 4 - 1*8; const int ir = i_mb_8x8 - s8x8 + 2; const int iv = i_mb_4x4 - s4x4 + 4; h->mb.cache.ref[i_list][i8] = h->mb.ref[i_list][ir]; h->mb.cache.mv[i_list][i8][0] = h->mb.mv[i_list][iv][0]; h->mb.cache.mv[i_list][i8][1] = h->mb.mv[i_list][iv][1]; } else { const int i8 = x264_scan8[0] + 4 - 1*8; h->mb.cache.ref[i_list][i8] = -2; h->mb.cache.mv[i_list][i8][0] = 0; h->mb.cache.mv[i_list][i8][1] = 0; } if( i_left_xy >= 0 ) { const int i8 = x264_scan8[0] - 1; const int ir = i_mb_8x8 - 1; const int iv = i_mb_4x4 - 1; h->mb.cache.ref[i_list][i8+0*8] = h->mb.cache.ref[i_list][i8+1*8] = h->mb.ref[i_list][ir + 0*s8x8]; h->mb.cache.ref[i_list][i8+2*8] = h->mb.cache.ref[i_list][i8+3*8] = h->mb.ref[i_list][ir + 1*s8x8]; for( i = 0; i < 4; i++ ) { h->mb.cache.mv[i_list][i8+i*8][0] = h->mb.mv[i_list][iv + i*s4x4][0]; h->mb.cache.mv[i_list][i8+i*8][1] = h->mb.mv[i_list][iv + i*s4x4][1]; } } else { const int i8 = x264_scan8[0] - 1; for( i = 0; i < 4; i++ ) { h->mb.cache.ref[i_list][i8+i*8] = -2; h->mb.cache.mv[i_list][i8+i*8][0] = h->mb.cache.mv[i_list][i8+i*8][1] = 0; } } if( h->param.b_cabac ) { if( i_top_xy >= 0 ) { const int i8 = x264_scan8[0] - 8; const int iv = i_mb_4x4 - s4x4; for( i = 0; i < 4; i++ ) { h->mb.cache.mvd[i_list][i8+i][0] = h->mb.mvd[i_list][iv + i][0]; h->mb.cache.mvd[i_list][i8+i][1] = h->mb.mvd[i_list][iv + i][1]; } } else { const int i8 = x264_scan8[0] - 8; for( i = 0; i < 4; i++ ) { h->mb.cache.mvd[i_list][i8+i][0] = h->mb.cache.mvd[i_list][i8+i][1] = 0; } } if( i_left_xy >= 0 ) { const int i8 = x264_scan8[0] - 1; const int iv = i_mb_4x4 - 1; for( i = 0; i < 4; i++ ) { h->mb.cache.mvd[i_list][i8+i*8][0] = h->mb.mvd[i_list][iv + i*s4x4][0]; h->mb.cache.mvd[i_list][i8+i*8][1] = h->mb.mvd[i_list][iv + i*s4x4][1]; } } else { const int i8 = x264_scan8[0] - 1; for( i = 0; i < 4; i++ ) { h->mb.cache.mvd[i_list][i8+i*8][0] = h->mb.cache.mvd[i_list][i8+i*8][1] = 0; } } } } /* load skip */ if( h->param.b_cabac ) { if( h->sh.i_type == SLICE_TYPE_B ) { memset( h->mb.cache.skip, 0, X264_SCAN8_SIZE * sizeof( int8_t ) ); if( i_left_xy >= 0 ) { h->mb.cache.skip[x264_scan8[0] - 1] = h->mb.skipbp[i_left_xy] & 0x2; h->mb.cache.skip[x264_scan8[8] - 1] = h->mb.skipbp[i_left_xy] & 0x8; } if( i_top_xy >= 0 ) { h->mb.cache.skip[x264_scan8[0] - 8] = h->mb.skipbp[i_top_xy] & 0x4; h->mb.cache.skip[x264_scan8[4] - 8] = h->mb.skipbp[i_top_xy] & 0x8; } } else if( h->mb.i_mb_xy == 0 && h->sh.i_type == SLICE_TYPE_P ) { memset( h->mb.cache.skip, 0, X264_SCAN8_SIZE * sizeof( int8_t ) ); } } }}void x264_macroblock_cache_save( x264_t *h ){ const int i_mb_xy = h->mb.i_mb_xy; const int i_mb_type = h->mb.i_type; const int s8x8 = h->mb.i_b8_stride; const int s4x4 = h->mb.i_b4_stride; const int i_mb_4x4 = h->mb.i_b4_xy; const int i_mb_8x8 = h->mb.i_b8_xy; int i; if( IS_SKIP( h->mb.i_type ) ) h->mb.qp[i_mb_xy] = h->mb.i_last_qp; h->mb.i_last_dqp = h->mb.qp[i_mb_xy] - h->mb.i_last_qp; h->mb.i_last_qp = h->mb.qp[i_mb_xy]; /* save intra4x4 */ if( i_mb_type == I_4x4 ) { h->mb.intra4x4_pred_mode[i_mb_xy][0] = h->mb.cache.intra4x4_pred_mode[x264_scan8[10] ]; h->mb.intra4x4_pred_mode[i_mb_xy][1] = h->mb.cache.intra4x4_pred_mode[x264_scan8[11] ]; h->mb.intra4x4_pred_mode[i_mb_xy][2] = h->mb.cache.intra4x4_pred_mode[x264_scan8[14] ]; h->mb.intra4x4_pred_mode[i_mb_xy][3] = h->mb.cache.intra4x4_pred_mode[x264_scan8[15] ]; h->mb.intra4x4_pred_mode[i_mb_xy][4] = h->mb.cache.intra4x4_pred_mode[x264_scan8[5] ]; h->mb.intra4x4_pred_mode[i_mb_xy][5] = h->mb.cache.intra4x4_pred_mode[x264_scan8[7] ]; h->mb.intra4x4_pred_mode[i_mb_xy][6] = h->mb.cache.intra4x4_pred_mode[x264_scan8[13] ]; } else { h->mb.intra4x4_pred_mode[i_mb_xy][0] = h->mb.intra4x4_pred_mode[i_mb_xy][1] = h->mb.intra4x4_pred_mode[i_mb_xy][2] = h->mb.intra4x4_pred_mode[i_mb_xy][3] = h->mb.intra4x4_pred_mode[i_mb_xy][4] = h->mb.intra4x4_pred_mode[i_mb_xy][5] = h->mb.intra4x4_pred_mode[i_mb_xy][6] = I_PRED_4x4_DC; } if( i_mb_type == I_PCM ) { h->mb.cbp[i_mb_xy] = 0x72f; /* all set */ for( i = 0; i < 16 + 2*4; i++ ) { h->mb.non_zero_count[i_mb_xy][i] = 16; } } else { /* save non zero count */ for( i = 0; i < 16 + 2*4; i++ ) { h->mb.non_zero_count[i_mb_xy][i] = h->mb.cache.non_zero_count[x264_scan8[i]]; } } if( !IS_INTRA( i_mb_type ) ) { int i_list; for( i_list = 0; i_list < (h->sh.i_type == SLICE_TYPE_B ? 2 : 1 ); i_list++ ) { int y,x; h->mb.ref[i_list][i_mb_8x8+0+0*s8x8] = h->mb.cache.ref[i_list][x264_scan8[0]]; h->mb.ref[i_list][i_mb_8x8+1+0*s8x8] = h->mb.cache.ref[i_list][x264_scan8[4]]; h->mb.ref[i_list][i_mb_8x8+0+1*s8x8] = h->mb.cache.ref[i_list][x264_scan8[8]]; h->mb.ref[i_list][i_mb_8x8+1+1*s8x8] = h->mb.cache.ref[i_list][x264_scan8[12]]; for( y = 0; y < 4; y++ ) { for( x = 0; x < 4; x++ ) { h->mb.mv[i_list][i_mb_4x4+x+y*s4x4][0] = h->mb.cache.mv[i_list][x264_scan8[0]+x+8*y][0]; h->mb.mv[i_list][i_mb_4x4+x+y*s4x4][1] = h->mb.cache.mv[i_list][x264_scan8[0]+x+8*y][1]; } } } } else { int i_list; for( i_list = 0; i_list < (h->sh.i_type == SLICE_TYPE_B ? 2 : 1 ); i_list++ ) { int y,x; h->mb.ref[i_list][i_mb_8x8+0+0*s8x8] = h->mb.ref[i_list][i_mb_8x8+1+0*s8x8] = h->mb.ref[i_list][i_mb_8x8+0+1*s8x8] = h->mb.ref[i_list][i_mb_8x8+1+1*s8x8] = -1; for( y = 0; y < 4; y++ ) { for( x = 0; x < 4; x++ ) { h->mb.mv[i_list][i_mb_4x4+x+y*s4x4][0] = 0; h->mb.mv[i_list][i_mb_4x4+x+y*s4x4][1] = 0; } } } } if( h->param.b_cabac ) { if( i_mb_type == I_4x4 || i_mb_type == I_16x16 ) h->mb.chroma_pred_mode[i_mb_xy] = h->mb.i_chroma_pred_mode; else h->mb.chroma_pred_mode[i_mb_xy] = I_PRED_CHROMA_DC; if( !IS_INTRA( i_mb_type ) && !IS_SKIP( i_mb_type ) && !IS_DIRECT( i_mb_type ) ) { int i_list; for( i_list = 0; i_list < 2; i_list++ ) { const int s4x4 = 4 * h->mb.i_mb_stride; int y,x; for( y = 0; y < 4; y++ ) { for( x = 0; x < 4; x++ ) { h->mb.mvd[i_list][i_mb_4x4+x+y*s4x4][0] = h->mb.cache.mvd[i_list][x264_scan8[0]+x+8*y][0]; h->mb.mvd[i_list][i_mb_4x4+x+y*s4x4][1] = h->mb.cache.mvd[i_list][x264_scan8[0]+x+8*y][1]; } } } } else { int i_list; for( i_list = 0; i_list < 2; i_list++ ) { const int s4x4 = 4 * h->mb.i_mb_stride; int y,x; for( y = 0; y < 4; y++ ) { for( x = 0; x < 4; x++ ) { h->mb.mvd[i_list][i_mb_4x4+x+y*s4x4][0] = 0; h->mb.mvd[i_list][i_mb_4x4+x+y*s4x4][1] = 0; } } } } if( h->sh.i_type == SLICE_TYPE_B ) { if( i_mb_type == B_SKIP || i_mb_type == B_DIRECT ) h->mb.skipbp[i_mb_xy] = 0xf; else if( i_mb_type == B_8x8 ) { int skipbp = 0; for( i = 0; i < 4; i++ ) skipbp |= ( h->mb.i_sub_partition[i] == D_DIRECT_8x8 ) << i; h->mb.skipbp[i_mb_xy] = skipbp; } else h->mb.skipbp[i_mb_xy] = 0; } }}void x264_macroblock_bipred_init( x264_t *h ){ int i_ref0, i_ref1; for( i_ref0 = 0; i_ref0 < h->i_ref0; i_ref0++ ) { int poc0 = h->fref0[i_ref0]->i_poc; for( i_ref1 = 0; i_ref1 < h->i_ref1; i_ref1++ ) { int dist_scale_factor; int poc1 = h->fref1[i_ref1]->i_poc; int td = x264_clip3( poc1 - poc0, -128, 127 ); if( td == 0 /* || pic0 is a long-term ref */ ) dist_scale_factor = 256; else { int tb = x264_clip3( h->fdec->i_poc - poc0, -128, 127 ); int tx = (16384 + (abs(td) >> 1)) / td; dist_scale_factor = x264_clip3( (tb * tx + 32) >> 6, -1024, 1023 ); } h->mb.dist_scale_factor[i_ref0][i_ref1] = dist_scale_factor; dist_scale_factor >>= 2; if( h->param.analyse.b_weighted_bipred && dist_scale_factor >= -64 && dist_scale_factor <= 128 ) h->mb.bipred_weight[i_ref0][i_ref1] = 64 - dist_scale_factor; else h->mb.bipred_weight[i_ref0][i_ref1] = 32; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -