📄 macroblock.c
字号:
if( !IS_SKIP( h->mb.type[i_mb_t] ) ) { mvc[i][0] = mvr[i_mb_t][0]; mvc[i][1] = mvr[i_mb_t][1]; i++; } if( h->mb.i_mb_x > 0 && !IS_SKIP( h->mb.type[i_mb_t - 1] ) ) { mvc[i][0] = mvr[i_mb_t - 1][0]; mvc[i][1] = mvr[i_mb_t - 1][1]; i++; } if( h->mb.i_mb_x < h->mb.i_mb_stride - 1 && !IS_SKIP( h->mb.type[i_mb_t + 1] ) ) { mvc[i][0] = mvr[i_mb_t + 1][0]; mvc[i][1] = mvr[i_mb_t + 1][1]; i++; } } *i_mvc = i;}#endifstatic inline void x264_mb_mc_01xywh( x264_t *h, int x, int y, int width, int height ){ const int i8 = x264_scan8[0]+x+8*y; const int i_ref1 = h->mb.cache.ref[1][i8]; const int mvx1 = h->mb.cache.mv[1][i8][0];//x264_clip3( h->mb.cache.mv[1][i8][0], h->mb.mv_min[0], h->mb.mv_max[0] ); const int mvy1 = h->mb.cache.mv[1][i8][1];//x264_clip3( h->mb.cache.mv[1][i8][1], h->mb.mv_min[1], h->mb.mv_max[1] ); DECLARE_ALIGNED( uint8_t, tmp[16*16], 16 ); int i_mode = x264_size2pixel[height][width]; x264_mb_mc_0xywh( h, x, y, width, height ); weight_pred_init( h, 16, i_ref1 ); h->mc.mc_luma( h->mb.pic.p_fref[1][i_ref1], h->mb.pic.i_stride[0], tmp, 16, mvx1 + 4*4*x, mvy1 + 4*4*y, 4*width, 4*height ); if( h->sh.pps->b_weighted_bipred ) { unsigned char *L=&(h->mb.pic.p_fdec[0][4*y*h->mb.pic.i_stride[0]+4*x]); uint8_t *Cb=&(h->mb.pic.p_fdec[1][2*y*h->mb.pic.i_stride[1]+2*x]); uint8_t *Cr=&(h->mb.pic.p_fdec[2][2*y*h->mb.pic.i_stride[2]+2*x]); int i=0; int j=0; for(j=0; j<4*height; j++) { for(i=0; i<4*width; i++) { L[i]=clip_uint8((( L[i]*weight_pred_para.w0_L+tmp[i+j*h->mb.pic.i_stride[0]]*weight_pred_para.w1_L+2*weight_pred_para.logWD_L)>>(weight_pred_para.logWD_L+1)+(weight_pred_para.o0_L+weight_pred_para.o1_L+1)>>1)); } L+=h->mb.pic.i_stride[0]; } h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref1][4][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1], tmp, 16, mvx1, mvy1, 2*width, 2*height ); /* Cb weight pred*/ for(j=0; j<2*height; j++) { for(i=0;i<2*width;i++) { Cb[i]=clip_uint8(((Cb[i]*weight_pred_para.w0_C+tmp[i+j*h->mb.pic.i_stride[0]]*weight_pred_para.w1_C+2*weight_pred_para.logWD_C)>>(weight_pred_para.logWD_C+1)+(weight_pred_para.o0_C+weight_pred_para.o1_C+1)>>1)); } Cb+=h->mb.pic.i_stride[1]; } h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref1][5][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2], tmp, 16, mvx1, mvy1, 2*width, 2*height ); for(j=0; j<2*height; j++) { for(i=0;i<2*width;i++) { Cr[i]=clip_uint8(((Cr[i]*weight_pred_para.w0_C+tmp[i+j*h->mb.pic.i_stride[0]]*weight_pred_para.w1_C+2*weight_pred_para.logWD_C)>>(weight_pred_para.logWD_C+1))+((weight_pred_para.o0_C+weight_pred_para.o1_C+1)>>1)); } Cr+=h->mb.pic.i_stride[2]; } }else { h->pixf.avg[i_mode]( &h->mb.pic.p_fdec[0][4*y *h->mb.pic.i_stride[0]+4*x], h->mb.pic.i_stride[0], tmp, 16 ); h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref1][4][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1], tmp, 16, mvx1, mvy1, 2*width, 2*height ); h->pixf.avg[i_mode+3]( &h->mb.pic.p_fdec[1][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1], tmp, 16 ); h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref1][5][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2], tmp, 16, mvx1, mvy1, 2*width, 2*height ); h->pixf.avg[i_mode+3]( &h->mb.pic.p_fdec[2][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2], tmp, 16 ); } }static inline void x264_mb_mc_0xywh( x264_t *h, int x, int y, int width, int height ){ const int i8 = x264_scan8[0]+x+8*y; const int i_ref = h->mb.cache.ref[0][i8]; const int mvx = h->mb.cache.mv[0][i8][0];//x264_clip3( h->mb.cache.mv[0][i8][0], h->mb.mv_min[0], h->mb.mv_max[0] ); const int mvy = h->mb.cache.mv[0][i8][1];//x264_clip3( h->mb.cache.mv[0][i8][1], h->mb.mv_min[1], h->mb.mv_max[1] ); weight_pred_init( h, i_ref, 16 ); h->mc.mc_luma( h->mb.pic.p_fref[0][i_ref], h->mb.pic.i_stride[0], &h->mb.pic.p_fdec[0][4*y * h->mb.pic.i_stride[0]+4*x], h->mb.pic.i_stride[0], mvx + 4*4*x, mvy + 4*4*y, 4*width, 4*height ); h->mc.mc_chroma( &h->mb.pic.p_fref[0][i_ref][4][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1], &h->mb.pic.p_fdec[1][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1], mvx, mvy, 2*width, 2*height ); h->mc.mc_chroma( &h->mb.pic.p_fref[0][i_ref][5][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2], &h->mb.pic.p_fdec[2][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2], mvx, mvy, 2*width, 2*height ); if((h->sh.pps->b_weighted_pred) && (!h->sh.pps->b_weighted_bipred)) { uint8_t *L=&h->mb.pic.p_fdec[0][4*y * h->mb.pic.i_stride[0]+4*x]; uint8_t *Cb=&h->mb.pic.p_fdec[1][2*y*h->mb.pic.i_stride[1]+2*x]; uint8_t *Cr=&h->mb.pic.p_fdec[2][2*y*h->mb.pic.i_stride[2]+2*x]; int i=0; int j=0; /* Luma weight pred */ for(j=0; j<4*height;j++) { for(i=0;i<4*width;i++) { if(weight_pred_para.logWD_L>1) L[i]=clip_uint8((L[i]*weight_pred_para.w1_L+2*weight_pred_para.logWD_L-1)>>weight_pred_para.logWD_L+weight_pred_para.o1_L); else L[i]=clip_uint8((L[i]*weight_pred_para.w1_L+weight_pred_para.o1_L)); } L+=h->mb.pic.i_stride[0]; } /* Cb weight pred*/ for(j=0; j<2*height; j++) { for(i=0;i<2*width;i++) { if(weight_pred_para.logWD_C>1) Cb[i]=clip_uint8((Cb[i]*weight_pred_para.w1_C+2*weight_pred_para.logWD_C-1)>>weight_pred_para.logWD_C+weight_pred_para.o1_C); else Cb[i]=clip_uint8((Cb[i]*weight_pred_para.w1_C+weight_pred_para.o1_C)); } Cb+=h->mb.pic.i_stride[1]; } /* Cr weight pred*/ for(j=0; j<2*height; j++) { for(i=0;i<2*width;i++) { if(weight_pred_para.logWD_C>1) Cr[i]=clip_uint8((Cr[i]*weight_pred_para.w1_C+2*weight_pred_para.logWD_C-1)>>weight_pred_para.logWD_C+weight_pred_para.o1_C); else Cr[i]=clip_uint8((Cr[i]*weight_pred_para.w1_C+weight_pred_para.o1_C)); } Cr+=h->mb.pic.i_stride[2]; } }}static inline void x264_mb_mc_1xywh( x264_t *h, int x, int y, int width, int height ){ const int i8 = x264_scan8[0]+x+8*y; const int i_ref = h->mb.cache.ref[1][i8]; const int mvx = h->mb.cache.mv[1][i8][0];//x264_clip3( h->mb.cache.mv[1][i8][0], h->mb.mv_min[0], h->mb.mv_max[0] ); const int mvy = h->mb.cache.mv[1][i8][1];//x264_clip3( h->mb.cache.mv[1][i8][1], h->mb.mv_min[1], h->mb.mv_max[1] ); weight_pred_init( h, 16, i_ref ); h->mc.mc_luma( h->mb.pic.p_fref[1][i_ref], h->mb.pic.i_stride[0], &h->mb.pic.p_fdec[0][4*y *h->mb.pic.i_stride[0]+4*x], h->mb.pic.i_stride[0], mvx + 4*4*x, mvy + 4*4*y, 4*width, 4*height ); h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref][4][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1], &h->mb.pic.p_fdec[1][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1], mvx, mvy, 2*width, 2*height ); h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref][5][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2], &h->mb.pic.p_fdec[2][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2], mvx, mvy, 2*width, 2*height); if((h->sh.pps->b_weighted_pred) && (!h->sh.pps->b_weighted_bipred)) { uint8_t *L=&h->mb.pic.p_fdec[0][4*y * h->mb.pic.i_stride[0]+4*x]; uint8_t *Cb=&h->mb.pic.p_fdec[1][2*y*h->mb.pic.i_stride[1]+2*x]; uint8_t *Cr=&h->mb.pic.p_fdec[2][2*y*h->mb.pic.i_stride[2]+2*x]; int i=0; int j=0; /* Luma weight pred */ for(j=0; j<4*height;j++) { for(i=0;i<4*width;i++) { if(weight_pred_para.logWD_L>1) L[i]=clip_uint8(((L[i]*weight_pred_para.w1_L+2*weight_pred_para.logWD_L-1)>>weight_pred_para.logWD_L)+weight_pred_para.o1_L); else L[i]=clip_uint8((L[i]*weight_pred_para.w1_L+weight_pred_para.o1_L)); } L+=h->mb.pic.i_stride[0]; } /* Cb weight pred*/ for(j=0; j<2*height; j++) { for(i=0;i<2*width;i++) { if(weight_pred_para.logWD_C>1) Cb[i]=clip_uint8(((Cb[i]*weight_pred_para.w1_C+2*weight_pred_para.logWD_C-1)>>weight_pred_para.logWD_C)+weight_pred_para.o1_C); else Cb[i]=clip_uint8((Cb[i]*weight_pred_para.w1_C+weight_pred_para.o1_C)); } Cb+=h->mb.pic.i_stride[1]; } /* Cr weight pred*/ for(j=0; j<2*height; j++) { for(i=0;i<2*width;i++) { if(weight_pred_para.logWD_C>1) Cr[i]=clip_uint8((Cr[i]*weight_pred_para.w1_C+2*weight_pred_para.logWD_C-1)>>weight_pred_para.logWD_C+weight_pred_para.o1_C); else Cr[i]=clip_uint8((Cr[i]*weight_pred_para.w1_C+weight_pred_para.o1_C)); } Cr+=h->mb.pic.i_stride[2]; } }}static void x264_mb_mc_direct8x8( x264_t *h, int x, int y ){ const int i8 = x264_scan8[0] + x + 8*y; /* FIXME: optimize based on current block size, not global settings? */ if( h->sps->b_direct8x8_inference ) { if( h->mb.cache.ref[0][i8] >= 0 ) if( h->mb.cache.ref[1][i8] >= 0 ) x264_mb_mc_01xywh( h, x, y, 2, 2 ); else x264_mb_mc_0xywh( h, x, y, 2, 2 ); else x264_mb_mc_1xywh( h, x, y, 2, 2 ); } else { if( h->mb.cache.ref[0][i8] >= 0 ) { if( h->mb.cache.ref[1][i8] >= 0 ) { x264_mb_mc_01xywh( h, x+0, y+0, 1, 1 ); x264_mb_mc_01xywh( h, x+1, y+0, 1, 1 ); x264_mb_mc_01xywh( h, x+0, y+1, 1, 1 ); x264_mb_mc_01xywh( h, x+1, y+1, 1, 1 ); } else { x264_mb_mc_0xywh( h, x+0, y+0, 1, 1 ); x264_mb_mc_0xywh( h, x+1, y+0, 1, 1 ); x264_mb_mc_0xywh( h, x+0, y+1, 1, 1 ); x264_mb_mc_0xywh( h, x+1, y+1, 1, 1 ); } } else { x264_mb_mc_1xywh( h, x+0, y+0, 1, 1 ); x264_mb_mc_1xywh( h, x+1, y+0, 1, 1 ); x264_mb_mc_1xywh( h, x+0, y+1, 1, 1 ); x264_mb_mc_1xywh( h, x+1, y+1, 1, 1 ); } }}void weight_pred_init(x264_t *h, int i_ref0, int i_ref1){ int refIdxL0=0; int refIdxL1=0; int i=0; if((h->sh.i_type==SLICE_TYPE_P && h->sh.pps->b_weighted_pred) || (h->sh.i_type==SLICE_TYPE_B && h->sh.pps->b_weighted_bipred)) { if(h->sh.b_field_pic=1) { weight_pred_para.refIdxL0WP=refIdxL0>>1; weight_pred_para.refIdxL1WP=refIdxL1>>1; } else { weight_pred_para.refIdxL0WP=refIdxL0; weight_pred_para.refIdxL1WP=refIdxL1; } weight_pred_para.logWD_L=h->sh.pred_weight_table.luma_log2_weight_denom; weight_pred_para.logWD_C=h->sh.pred_weight_table.chroma_log2_weight_denom; if(refIdxL0<16) { weight_pred_para.w0_L=h->sh.pred_weight_table.luma_weight_l0[weight_pred_para.refIdxL0WP]; weight_pred_para.o0_L=h->sh.pred_weight_table.luma_offset_l0[weight_pred_para.refIdxL0WP]; for(i=0;i<2;i++) { weight_pred_para.w0_C=h->sh.pred_weight_table.chroma_weight_l0[weight_pred_para.refIdxL0WP][i]; weight_pred_para.o0_C=h->sh.pred_weight_table.chroma_offset_l0[weight_pred_para.refIdxL0WP][i]; } } if(refIdxL1<16) { weight_pred_para.w1_L=h->sh.pred_weight_table.luma_weight_l1[weight_pred_para.refIdxL1WP]; weight_pred_para.o1_L=h->sh.pred_weight_table.luma_offset_l1[weight_pred_para.refIdxL0WP]; for(i=0;i<2;i++) { weight_pred_para.w1_C=h->sh.pred_weight_table.chroma_weight_l1[weight_pred_para.refIdxL1WP][i]; weight_pred_para.o1_C=h->sh.pred_weight_table.chroma_offset_l1[weight_pred_para.refIdxL0WP][i]; } } } }void x264_mb_mc( x264_t *h ){ if( h->mb.i_type == P_L0 ) { if( h->mb.i_partition == D_16x16 ) { x264_mb_mc_0xywh( h, 0, 0, 4, 4 ); } else if( h->mb.i_partition == D_16x8 ) { x264_mb_mc_0xywh( h, 0, 0, 4, 2 ); x264_mb_mc_0xywh( h, 0, 2, 4, 2 ); } else if( h->mb.i_partition == D_8x16 ) { x264_mb_mc_0xywh( h, 0, 0, 2, 4 ); x264_mb_mc_0xywh( h, 2, 0, 2, 4 ); } } else if( h->mb.i_type == P_8x8 || h->mb.i_type == B_8x8 ) { int i; for( i = 0; i < 4; i++ ) { const int x = 2*(i%2); const int y = 2*(i/2); switch( h->mb.i_sub_partition[i] ) { case D_L0_8x8: x264_mb_mc_0xywh( h, x, y, 2, 2 ); break; case D_L0_8x4: x264_mb_mc_0xywh( h, x, y+0, 2, 1 ); x264_mb_mc_0xywh( h, x, y+1, 2, 1 ); break; case D_L0_4x8: x264_mb_mc_0xywh( h, x+0, y, 1, 2 ); x264_mb_mc_0xywh( h, x+1, y, 1, 2 ); break; case D_L0_4x4: x264_mb_mc_0xywh( h, x+0, y+0, 1, 1 ); x264_mb_mc_0xywh( h, x+1, y+0, 1, 1 ); x264_mb_mc_0xywh( h, x+0, y+1, 1, 1 ); x264_mb_mc_0xywh( h, x+1, y+1, 1, 1 ); break; case D_L1_8x8: x264_mb_mc_1xywh( h, x, y, 2, 2 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -