⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macroblock.c

📁 另一个版本的x264的decoder
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -