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

📄 pixel.c

📁 linux下编译已经通过
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************** * pixel_sad_x4 ****************************************************************************/#define SAD_X( size ) \static void x264_pixel_sad_x3_##size( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, int i_stride, int scores[3] )\{\    scores[0] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix0, i_stride );\    scores[1] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix1, i_stride );\    scores[2] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix2, i_stride );\}\static void x264_pixel_sad_x4_##size( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, uint8_t *pix3, int i_stride, int scores[4] )\{\    scores[0] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix0, i_stride );\    scores[1] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix1, i_stride );\    scores[2] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix2, i_stride );\    scores[3] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix3, i_stride );\}SAD_X( 16x16 )SAD_X( 16x8 )SAD_X( 8x16 )SAD_X( 8x8 )SAD_X( 8x4 )SAD_X( 4x8 )SAD_X( 4x4 )#ifdef ARCH_UltraSparcSAD_X( 16x16_vis )SAD_X( 16x8_vis )SAD_X( 8x16_vis )SAD_X( 8x8_vis )#endif/**************************************************************************** * structural similarity metric ****************************************************************************/static void ssim_4x4x2_core( const uint8_t *pix1, int stride1,                             const uint8_t *pix2, int stride2,                             int sums[2][4]){    int x, y, z;    for(z=0; z<2; z++)    {        uint32_t s1=0, s2=0, ss=0, s12=0;        for(y=0; y<4; y++)            for(x=0; x<4; x++)            {                int a = pix1[x+y*stride1];                int b = pix2[x+y*stride2];                s1  += a;                s2  += b;                ss  += a*a;                ss  += b*b;                s12 += a*b;            }        sums[z][0] = s1;        sums[z][1] = s2;        sums[z][2] = ss;        sums[z][3] = s12;        pix1 += 4;        pix2 += 4;    }}static float ssim_end1( int s1, int s2, int ss, int s12 ){    static const int ssim_c1 = (int)(.01*.01*255*255*64 + .5);    static const int ssim_c2 = (int)(.03*.03*255*255*64*63 + .5);    int vars = ss*64 - s1*s1 - s2*s2;    int covar = s12*64 - s1*s2;    return (float)(2*s1*s2 + ssim_c1) * (float)(2*covar + ssim_c2)\           / ((float)(s1*s1 + s2*s2 + ssim_c1) * (float)(vars + ssim_c2));}static float ssim_end4( int sum0[5][4], int sum1[5][4], int width ){    int i;    float ssim = 0.0;    for( i = 0; i < width; i++ )        ssim += ssim_end1( sum0[i][0] + sum0[i+1][0] + sum1[i][0] + sum1[i+1][0],                           sum0[i][1] + sum0[i+1][1] + sum1[i][1] + sum1[i+1][1],                           sum0[i][2] + sum0[i+1][2] + sum1[i][2] + sum1[i+1][2],                           sum0[i][3] + sum0[i+1][3] + sum1[i][3] + sum1[i+1][3] );    return ssim;}float x264_pixel_ssim_wxh( x264_pixel_function_t *pf,                           uint8_t *pix1, int stride1,                           uint8_t *pix2, int stride2,                           int width, int height ){    int x, y, z;    float ssim = 0.0;    int (*sum0)[4] = x264_malloc(4 * (width/4+3) * sizeof(int));    int (*sum1)[4] = x264_malloc(4 * (width/4+3) * sizeof(int));    width >>= 2;    height >>= 2;    z = 0;    for( y = 1; y < height; y++ )    {        for( ; z <= y; z++ )        {            XCHG( void*, sum0, sum1 );            for( x = 0; x < width; x+=2 )                pf->ssim_4x4x2_core( &pix1[4*(x+z*stride1)], stride1, &pix2[4*(x+z*stride2)], stride2, &sum0[x] );        }        for( x = 0; x < width-1; x += 4 )            ssim += pf->ssim_end4( sum0+x, sum1+x, X264_MIN(4,width-x-1) );    }    x264_free(sum0);    x264_free(sum1);    return ssim / ((width-1) * (height-1));}/**************************************************************************** * successive elimination ****************************************************************************/static void pixel_ads4( int enc_dc[4], uint16_t *sums, int delta,                        uint16_t *res, int width ){    int i;    for( i=0; i<width; i++, sums++ )        res[i] = abs( enc_dc[0] - sums[0] )               + abs( enc_dc[1] - sums[8] )               + abs( enc_dc[2] - sums[delta] )               + abs( enc_dc[3] - sums[delta+8] );}static void pixel_ads2( int enc_dc[2], uint16_t *sums, int delta,                        uint16_t *res, int width ){    int i;    for( i=0; i<width; i++, sums++ )        res[i] = abs( enc_dc[0] - sums[0] )               + abs( enc_dc[1] - sums[delta] );}static void pixel_ads1( int enc_dc[1], uint16_t *sums, int delta,                        uint16_t *res, int width ){    int i;    for( i=0; i<width; i++, sums++ )        res[i] = abs( enc_dc[0] - sums[0] );}/**************************************************************************** * x264_pixel_init: ****************************************************************************/void x264_pixel_init( int cpu, x264_pixel_function_t *pixf ){    memset( pixf, 0, sizeof(*pixf) );#define INIT( name, cpu ) \    pixf->name[PIXEL_16x16] = x264_pixel_##name##_16x16##cpu;\    pixf->name[PIXEL_16x8]  = x264_pixel_##name##_16x8##cpu;\    pixf->name[PIXEL_8x16]  = x264_pixel_##name##_8x16##cpu;\    pixf->name[PIXEL_8x8]   = x264_pixel_##name##_8x8##cpu;\    pixf->name[PIXEL_8x4]   = x264_pixel_##name##_8x4##cpu;\    pixf->name[PIXEL_4x8]   = x264_pixel_##name##_4x8##cpu;\    pixf->name[PIXEL_4x4]   = x264_pixel_##name##_4x4##cpu;    INIT( sad, );    INIT( sad_x3, );    INIT( sad_x4, );    INIT( ssd, );    INIT( satd, );    pixf->sa8d[PIXEL_16x16]= x264_pixel_sa8d_16x16;    pixf->sa8d[PIXEL_16x8] = x264_pixel_sa8d_16x8;    pixf->sa8d[PIXEL_8x16] = x264_pixel_sa8d_8x16;    pixf->sa8d[PIXEL_8x8]  = x264_pixel_sa8d_8x8;    pixf->ssim_4x4x2_core = ssim_4x4x2_core;    pixf->ssim_end4 = ssim_end4;    pixf->ads[PIXEL_16x16] = pixel_ads4;    pixf->ads[PIXEL_16x8] = pixel_ads2;    pixf->ads[PIXEL_8x8] = pixel_ads1;#ifdef HAVE_MMX    if( cpu&X264_CPU_MMX )    {        INIT( ssd, _mmx );    }    if( cpu&X264_CPU_MMXEXT )    {        INIT( sad, _mmxext );        INIT( sad_x3, _mmxext );        INIT( sad_x4, _mmxext );        INIT( satd, _mmxext );        pixf->sad_pde[PIXEL_16x16] = x264_pixel_sad_pde_16x16_mmxext;        pixf->sad_pde[PIXEL_16x8 ] = x264_pixel_sad_pde_16x8_mmxext;        pixf->sad_pde[PIXEL_8x16 ] = x264_pixel_sad_pde_8x16_mmxext;        pixf->ads[PIXEL_16x16] = x264_pixel_ads4_mmxext;        pixf->ads[PIXEL_16x8 ] = x264_pixel_ads2_mmxext;        pixf->ads[PIXEL_8x8  ] = x264_pixel_ads1_mmxext;#ifdef ARCH_X86        pixf->sa8d[PIXEL_16x16] = x264_pixel_sa8d_16x16_mmxext;        pixf->sa8d[PIXEL_8x8]   = x264_pixel_sa8d_8x8_mmxext;        pixf->intra_sa8d_x3_8x8 = x264_intra_sa8d_x3_8x8_mmxext;        pixf->ssim_4x4x2_core  = x264_pixel_ssim_4x4x2_core_mmxext;#endif        pixf->intra_satd_x3_16x16 = x264_intra_satd_x3_16x16_mmxext;        pixf->intra_satd_x3_8x8c  = x264_intra_satd_x3_8x8c_mmxext;        pixf->intra_satd_x3_4x4   = x264_intra_satd_x3_4x4_mmxext;    }    // disable on AMD processors since it is slower    if( (cpu&X264_CPU_SSE2) && !(cpu&X264_CPU_3DNOW) )    {        pixf->sad[PIXEL_16x16] = x264_pixel_sad_16x16_sse2;        pixf->sad[PIXEL_16x8 ] = x264_pixel_sad_16x8_sse2;        pixf->satd[PIXEL_16x16]= x264_pixel_satd_16x16_sse2;        pixf->satd[PIXEL_16x8] = x264_pixel_satd_16x8_sse2;        pixf->satd[PIXEL_8x16] = x264_pixel_satd_8x16_sse2;        pixf->satd[PIXEL_8x8]  = x264_pixel_satd_8x8_sse2;        pixf->satd[PIXEL_8x4]  = x264_pixel_satd_8x4_sse2;        pixf->sad_x3[PIXEL_16x16] = x264_pixel_sad_x3_16x16_sse2;        pixf->sad_x3[PIXEL_16x8 ] = x264_pixel_sad_x3_16x8_sse2;        pixf->sad_x4[PIXEL_16x16] = x264_pixel_sad_x4_16x16_sse2;        pixf->sad_x4[PIXEL_16x8 ] = x264_pixel_sad_x4_16x8_sse2;    }    // these are faster on both Intel and AMD    if( cpu&X264_CPU_SSE2 )    {        pixf->ssd[PIXEL_16x16] = x264_pixel_ssd_16x16_sse2;        pixf->ssd[PIXEL_16x8]  = x264_pixel_ssd_16x8_sse2;        pixf->ssim_4x4x2_core  = x264_pixel_ssim_4x4x2_core_sse2;        pixf->ssim_end4        = x264_pixel_ssim_end4_sse2;#ifdef ARCH_X86_64        pixf->sa8d[PIXEL_16x16] = x264_pixel_sa8d_16x16_sse2;        pixf->sa8d[PIXEL_8x8]   = x264_pixel_sa8d_8x8_sse2;        pixf->intra_sa8d_x3_8x8 = x264_intra_sa8d_x3_8x8_sse2;#endif    }    if( cpu&X264_CPU_SSSE3 )    {#ifdef HAVE_SSE3        pixf->satd[PIXEL_16x16]= x264_pixel_satd_16x16_ssse3;        pixf->satd[PIXEL_16x8] = x264_pixel_satd_16x8_ssse3;        pixf->satd[PIXEL_8x16] = x264_pixel_satd_8x16_ssse3;        pixf->satd[PIXEL_8x8]  = x264_pixel_satd_8x8_ssse3;        pixf->satd[PIXEL_8x4]  = x264_pixel_satd_8x4_ssse3;#ifdef ARCH_X86_64        pixf->sa8d[PIXEL_16x16]= x264_pixel_sa8d_16x16_ssse3;        pixf->sa8d[PIXEL_8x8]  = x264_pixel_sa8d_8x8_ssse3;#endif#endif    }#endif //HAVE_MMX#ifdef ARCH_PPC    if( cpu&X264_CPU_ALTIVEC )    {        x264_pixel_altivec_init( pixf );    }#endif#ifdef ARCH_UltraSparc    pixf->sad[PIXEL_8x8]   = x264_pixel_sad_8x8_vis;    pixf->sad[PIXEL_8x16]  = x264_pixel_sad_8x16_vis;    pixf->sad[PIXEL_16x8]  = x264_pixel_sad_16x8_vis;    pixf->sad[PIXEL_16x16] = x264_pixel_sad_16x16_vis;    pixf->sad_x3[PIXEL_8x8]   = x264_pixel_sad_x3_8x8_vis;    pixf->sad_x3[PIXEL_8x16]  = x264_pixel_sad_x3_8x16_vis;    pixf->sad_x3[PIXEL_16x8]  = x264_pixel_sad_x3_16x8_vis;    pixf->sad_x3[PIXEL_16x16] = x264_pixel_sad_x3_16x16_vis;    pixf->sad_x4[PIXEL_8x8]   = x264_pixel_sad_x4_8x8_vis;    pixf->sad_x4[PIXEL_8x16]  = x264_pixel_sad_x4_8x16_vis;    pixf->sad_x4[PIXEL_16x8]  = x264_pixel_sad_x4_16x8_vis;    pixf->sad_x4[PIXEL_16x16] = x264_pixel_sad_x4_16x16_vis;#endif    pixf->ads[PIXEL_8x16] =    pixf->ads[PIXEL_8x4] =    pixf->ads[PIXEL_4x8] = pixf->ads[PIXEL_16x8];    pixf->ads[PIXEL_4x4] = pixf->ads[PIXEL_8x8];}

⌨️ 快捷键说明

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