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

📄 mc.c

📁 另一个版本的x264的decoder
💻 C
📖 第 1 页 / 共 2 页
字号:
        { mc_hv,    mc_xy12,    mc_hc,      mc_xy32 },        { mc_xy03,  mc_xy13,    mc_xy23,    mc_xy33 },    };    src += (mvy >> 2) * i_src_stride + (mvx >> 2);    pf_mc[mvy&0x03][mvx&0x03]( src, i_src_stride, dst, i_dst_stride, i_width, i_height );}void mc_luma( uint8_t *src[4], int i_src_stride,              uint8_t *dst,    int i_dst_stride,              int mvx,int mvy,              int i_width, int i_height ){    uint8_t *src1, *src2;    /* todo : fixme... */    int correction = ((mvx&3) == 3 && (mvy&3) == 1 || (mvx&3) == 1 && (mvy&3) == 3) ? 1:0;    int hpel1x = mvx>>1;    int hpel1y = (mvy+1-correction)>>1;    int filter1 = (hpel1x & 1) + ( (hpel1y & 1) << 1 );    src1 = src[filter1] + (hpel1y >> 1) * i_src_stride + (hpel1x >> 1);    if ( (mvx|mvy) & 1 ) /* qpel interpolation needed */    {        int hpel2x = (mvx+1)>>1;        int hpel2y = (mvy+correction)>>1;        int filter2 = (hpel2x & 1) + ( (hpel2y & 1) <<1 );        src2 = src[filter2] + (hpel2y >> 1) * i_src_stride + (hpel2x >> 1);            pixel_avg( dst, i_dst_stride, src1, i_src_stride,                   src2, i_src_stride, i_width, i_height );    }    else    {        mc_copy( src1, i_src_stride, dst, i_dst_stride, i_width, i_height );    }}uint8_t *get_ref( uint8_t *src[4], int i_src_stride,                  uint8_t *dst,    int * i_dst_stride,                  int mvx,int mvy,                  int i_width, int i_height ){    uint8_t *src1, *src2;    /* todo : fixme... */    int correction = ((mvx&3) == 3 && (mvy&3) == 1 || (mvx&3) == 1 && (mvy&3) == 3) ? 1:0;    int hpel1x = mvx>>1;    int hpel1y = (mvy+1-correction)>>1;    int filter1 = (hpel1x & 1) + ( (hpel1y & 1) << 1 );    src1 = src[filter1] + (hpel1y >> 1) * i_src_stride + (hpel1x >> 1);    if ( (mvx|mvy) & 1 ) /* qpel interpolation needed */    {        int hpel2x = (mvx+1)>>1;        int hpel2y = (mvy+correction)>>1;        int filter2 = (hpel2x & 1) + ( (hpel2y & 1) <<1 );        src2 = src[filter2] + (hpel2y >> 1) * i_src_stride + (hpel2x >> 1);            pixel_avg( dst, *i_dst_stride, src1, i_src_stride,                   src2, i_src_stride, i_width, i_height );        return dst;    }    else    {        *i_dst_stride = i_src_stride;        return src1;    }}/* full chroma mc (ie until 1/8 pixel)*/static void motion_compensation_chroma( uint8_t *src, int i_src_stride,                                        uint8_t *dst, int i_dst_stride,                                        int mvx, int mvy,                                        int i_width, int i_height ){    uint8_t *srcp;    int x, y;    const int d8x = mvx&0x07;    const int d8y = mvy&0x07;    const int cA = (8-d8x)*(8-d8y);    const int cB = d8x    *(8-d8y);    const int cC = (8-d8x)*d8y;    const int cD = d8x    *d8y;    src  += (mvy >> 3) * i_src_stride + (mvx >> 3);    srcp = &src[i_src_stride];    for( y = 0; y < i_height; y++ )    {        for( x = 0; x < i_width; x++ )        {            dst[x] = ( cA*src[x]  + cB*src[x+1] +                       cC*srcp[x] + cD*srcp[x+1] + 32 ) >> 6;        }        dst  += i_dst_stride;        src   = srcp;        srcp += i_src_stride;    }}#ifdef HAVE_MMXEXTstatic void motion_compensation_chroma_sse( uint8_t *src, int i_src_stride,                                        uint8_t *dst, int i_dst_stride,                                        int mvx, int mvy,                                        int i_width, int i_height ){    if (i_width == 2) {        motion_compensation_chroma(src, i_src_stride, dst, i_dst_stride,                                   mvx, mvy, i_width, i_height);    } else {        const int d8x = mvx&0x07;        const int d8y = mvy&0x07;                src  += (mvy >> 3) * i_src_stride + (mvx >> 3);                x264_mc_chroma_sse(src, i_src_stride, dst, i_dst_stride,                              d8x, d8y, i_height, i_width);    }}#endifvoid x264_mc_init( int cpu, x264_mc_functions_t *pf ){    pf->mc_luma   = mc_luma;    pf->get_ref   = get_ref;    pf->mc_chroma = motion_compensation_chroma;#ifdef HAVE_MMXEXT    if( cpu&X264_CPU_MMXEXT ) {        x264_mc_mmxext_init( pf );        pf->mc_chroma = motion_compensation_chroma_sse;    }#endif#ifdef HAVE_SSE2    if( cpu&X264_CPU_SSE2 )        x264_mc_sse2_init( pf );#endif#ifdef ARCH_PPC    if( cpu&X264_CPU_ALTIVEC )        x264_mc_altivec_init( pf );#endif}void get_funcs_mmx(pf_mc_t*, pf_mc_t*, pf_mc_t*);void get_funcs_sse2(pf_mc_t*, pf_mc_t*, pf_mc_t*);extern void x264_horizontal_filter_mmxext( uint8_t *dst, int i_dst_stride,                                           uint8_t *src, int i_src_stride,                                           int i_width, int i_height );extern void x264_center_filter_mmxext( uint8_t *dst1, int i_dst1_stride,                                       uint8_t *dst2, int i_dst2_stride,                                       uint8_t *src, int i_src_stride,                                       int i_width, int i_height );void x264_frame_filter( int cpu, x264_frame_t *frame ){    const int x_inc = 16, y_inc = 16;    const int stride = frame->i_stride[0];    int x, y;    pf_mc_t int_h = mc_hh;    pf_mc_t int_v = mc_hv;    pf_mc_t int_hv = mc_hc;#if 0#ifdef HAVE_MMXEXT    if( cpu&X264_CPU_MMXEXT )        get_funcs_mmx(&int_h, &int_v, &int_hv);#endif#ifdef HAVE_SSE2    if( cpu&X264_CPU_SSE2 )        get_funcs_sse2(&int_h, &int_v, &int_hv);#endif#endif#ifdef HAVE_MMXEXT    if ( cpu & X264_CPU_MMXEXT )    {        x264_horizontal_filter_mmxext(frame->filtered[1] - 8 * stride - 8, stride,            frame->plane[0] - 8 * stride - 8, stride,            stride - 48, frame->i_lines[0] + 16);        x264_center_filter_mmxext(frame->filtered[2] - 8 * stride - 8, stride,            frame->filtered[3] - 8 * stride - 8, stride,            frame->plane[0] - 8 * stride - 8, stride,            stride - 48, frame->i_lines[0] + 16);    }    else    {#else    {#endif        for( y = -8; y < frame->i_lines[0]+8; y += y_inc )        {            uint8_t *p_in = frame->plane[0] + y * stride - 8;            uint8_t *p_h  = frame->filtered[1] + y * stride - 8;            uint8_t *p_v  = frame->filtered[2] + y * stride - 8;            uint8_t *p_hv = frame->filtered[3] + y * stride - 8;            for( x = -8; x < stride - 64 + 8; x += x_inc )            {                int_h(  p_in, stride, p_h,  stride, x_inc, y_inc );                int_v(  p_in, stride, p_v,  stride, x_inc, y_inc );                int_hv( p_in, stride, p_hv, stride, x_inc, y_inc );                p_h += x_inc;                p_v += x_inc;                p_hv += x_inc;                p_in += x_inc;            }        }    }}void x264_frame_init_lowres( int cpu, x264_frame_t *frame ){    // FIXME: tapfilter?    const int i_stride = frame->i_stride[0];    const int i_stride2 = frame->i_stride_lowres;    const int i_width2 = i_stride2 - 64;    int x, y, i;    for( y = 0; y < frame->i_lines_lowres - 1; y++ )    {        uint8_t *src0 = &frame->plane[0][2*y*i_stride];        uint8_t *src1 = src0+i_stride;        uint8_t *src2 = src1+i_stride;        uint8_t *dst0 = &frame->lowres[0][y*i_stride2];        uint8_t *dsth = &frame->lowres[1][y*i_stride2];        uint8_t *dstv = &frame->lowres[2][y*i_stride2];        uint8_t *dstc = &frame->lowres[3][y*i_stride2];        for( x = 0; x < i_width2 - 1; x++ )        {            dst0[x] = (src0[2*x  ] + src0[2*x+1] + src1[2*x  ] + src1[2*x+1] + 2) >> 2;            dsth[x] = (src0[2*x+1] + src0[2*x+2] + src1[2*x+1] + src1[2*x+2] + 2) >> 2;            dstv[x] = (src1[2*x  ] + src1[2*x+1] + src2[2*x  ] + src2[2*x+1] + 2) >> 2;            dstc[x] = (src1[2*x+1] + src1[2*x+2] + src2[2*x+1] + src2[2*x+2] + 2) >> 2;        }        dst0[x] = (src0[2*x  ] + src0[2*x+1] + src1[2*x  ] + src1[2*x+1] + 2) >> 2;        dstv[x] = (src1[2*x  ] + src1[2*x+1] + src2[2*x  ] + src2[2*x+1] + 2) >> 2;        dsth[x] = (src0[2*x+1] + src1[2*x+1] + 1) >> 1;        dstc[x] = (src1[2*x+1] + src2[2*x+1] + 1) >> 1;    }    for( i = 0; i < 4; i++ )        memcpy( &frame->lowres[i][y*i_stride2], &frame->lowres[i][(y-1)*i_stride2], i_width2 );    for( y = 0; y < 16; y++ )        for( x = 0; x < 16; x++ )            frame->i_cost_est[x][y] = -1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -