📄 macroblock.c
字号:
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( h->mb.i_neighbour & MB_TOP )
{
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( h->mb.i_neighbour & MB_TOPRIGHT )
{
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( h->mb.i_neighbour & MB_LEFT )
{
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_type >= 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_type >= 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->sh.i_type == SLICE_TYPE_B /*&& h->param.b_cabac*/ )
{
memset( h->mb.cache.skip, 0, X264_SCAN8_SIZE * sizeof( int8_t ) );
if( i_left_type >= 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_type >= 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;
}
}
}
h->mb.i_neighbour4[0] =
h->mb.i_neighbour8[0] = (h->mb.i_neighbour & (MB_TOP|MB_LEFT|MB_TOPLEFT))
| ((h->mb.i_neighbour & MB_TOP) ? MB_TOPRIGHT : 0);
h->mb.i_neighbour4[4] =
h->mb.i_neighbour4[1] = MB_LEFT | ((h->mb.i_neighbour & MB_TOP) ? (MB_TOP|MB_TOPLEFT|MB_TOPRIGHT) : 0);
h->mb.i_neighbour4[2] =
h->mb.i_neighbour4[8] =
h->mb.i_neighbour4[10] =
h->mb.i_neighbour8[2] = MB_TOP|MB_TOPRIGHT | ((h->mb.i_neighbour & MB_LEFT) ? (MB_LEFT|MB_TOPLEFT) : 0);
h->mb.i_neighbour4[3] =
h->mb.i_neighbour4[7] =
h->mb.i_neighbour4[11] =
h->mb.i_neighbour4[13] =
h->mb.i_neighbour4[15] =
h->mb.i_neighbour8[3] = MB_LEFT|MB_TOP|MB_TOPLEFT;
h->mb.i_neighbour4[5] =
h->mb.i_neighbour8[1] = MB_LEFT | (h->mb.i_neighbour & MB_TOPRIGHT)
| ((h->mb.i_neighbour & MB_TOP) ? MB_TOP|MB_TOPLEFT : 0);
h->mb.i_neighbour4[6] =
h->mb.i_neighbour4[9] =
h->mb.i_neighbour4[12] =
h->mb.i_neighbour4[14] = MB_LEFT|MB_TOP|MB_TOPLEFT|MB_TOPRIGHT;
}
void x264_macroblock_cache_save( x264_t *h )
{
const int i_mb_xy = h->mb.i_mb_xy;
const int i_mb_type = x264_mb_type_fix[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;
for( i = 0; i < 3; i++ )
{
int w = i ? 8 : 16;
h->mc.copy[i?PIXEL_8x8:PIXEL_16x16](
&h->fdec->plane[i][ w * (h->mb.i_mb_x + h->mb.i_mb_y * h->fdec->i_stride[i]) ],
h->fdec->i_stride[i],
h->mb.pic.p_fdec[i], FDEC_STRIDE, w );
}
h->mb.type[i_mb_xy] = i_mb_type;
if( h->mb.i_type != I_16x16 && h->mb.i_cbp_luma == 0 && h->mb.i_cbp_chroma == 0 )
h->mb.i_qp = h->mb.i_last_qp;
h->mb.qp[i_mb_xy] = h->mb.i_qp;
h->mb.i_last_dqp = h->mb.i_qp - h->mb.i_last_qp;
h->mb.i_last_qp = h->mb.i_qp;
/* 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( h->mb.i_cbp_luma == 0 && h->mb.i_type != I_8x8 )
h->mb.b_transform_8x8 = 0;
h->mb.mb_transform_size[i_mb_xy] = h->mb.b_transform_8x8;
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] = x264_mb_pred_mode8x8c_fix[ 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 + -