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

📄 pixel.c

📁 在dsp上实现h.264编解码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************** * SATD 8x16 **********************************************************************/static int pixel_satd_8x16_altivec( uint8_t *pix1, int i_pix1,                                    uint8_t *pix2, int i_pix2 ){    DECLARE_ALIGNED( int, i_satd, 16 );    PREP_DIFF;    vec_s16_t diff0v, diff1v, diff2v, diff3v,              diff4v, diff5v, diff6v, diff7v;    vec_s16_t temp0v, temp1v, temp2v, temp3v,              temp4v, temp5v, temp6v, temp7v;    vec_s32_t satdv;    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff4v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff5v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff6v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff7v );    VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,                     temp4v, temp5v, temp6v, temp7v,                     diff0v, diff1v, diff2v, diff3v,                     diff4v, diff5v, diff6v, diff7v );    VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_ADD_ABS( temp0v, zero_s32v, satdv );    VEC_ADD_ABS( temp1v, satdv,     satdv );    VEC_ADD_ABS( temp2v, satdv,     satdv );    VEC_ADD_ABS( temp3v, satdv,     satdv );    VEC_ADD_ABS( temp4v, satdv,     satdv );    VEC_ADD_ABS( temp5v, satdv,     satdv );    VEC_ADD_ABS( temp6v, satdv,     satdv );    VEC_ADD_ABS( temp7v, satdv,     satdv );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff4v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff5v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff6v );    VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff7v );    VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,                     temp4v, temp5v, temp6v, temp7v,                     diff0v, diff1v, diff2v, diff3v,                     diff4v, diff5v, diff6v, diff7v );    VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_ADD_ABS( temp0v, satdv,     satdv );    VEC_ADD_ABS( temp1v, satdv,     satdv );    VEC_ADD_ABS( temp2v, satdv,     satdv );    VEC_ADD_ABS( temp3v, satdv,     satdv );    VEC_ADD_ABS( temp4v, satdv,     satdv );    VEC_ADD_ABS( temp5v, satdv,     satdv );    VEC_ADD_ABS( temp6v, satdv,     satdv );    VEC_ADD_ABS( temp7v, satdv,     satdv );    satdv = vec_sums( satdv, zero_s32v );    satdv = vec_splat( satdv, 3 );    vec_ste( satdv, 0, &i_satd );    return i_satd / 2;}/*********************************************************************** * SATD 16x8 **********************************************************************/static int pixel_satd_16x8_altivec( uint8_t *pix1, int i_pix1,                                    uint8_t *pix2, int i_pix2 ){    DECLARE_ALIGNED( int, i_satd, 16 );    LOAD_ZERO;    PREP_LOAD;    vec_s32_t satdv;    vec_s16_t pix1v, pix2v;    vec_s16_t diffh0v, diffh1v, diffh2v, diffh3v,              diffh4v, diffh5v, diffh6v, diffh7v;    vec_s16_t diffl0v, diffl1v, diffl2v, diffl3v,              diffl4v, diffl5v, diffl6v, diffl7v;    vec_s16_t temp0v, temp1v, temp2v, temp3v,              temp4v, temp5v, temp6v, temp7v;    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh0v, diffl0v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh1v, diffl1v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh2v, diffl2v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh3v, diffl3v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh4v, diffl4v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh5v, diffl5v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh6v, diffl6v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh7v, diffl7v );    VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,                     temp4v, temp5v, temp6v, temp7v,                     diffh0v, diffh1v, diffh2v, diffh3v,                     diffh4v, diffh5v, diffh6v, diffh7v );    VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_ADD_ABS( temp0v, zero_s32v, satdv );    VEC_ADD_ABS( temp1v, satdv,     satdv );    VEC_ADD_ABS( temp2v, satdv,     satdv );    VEC_ADD_ABS( temp3v, satdv,     satdv );    VEC_ADD_ABS( temp4v, satdv,     satdv );    VEC_ADD_ABS( temp5v, satdv,     satdv );    VEC_ADD_ABS( temp6v, satdv,     satdv );    VEC_ADD_ABS( temp7v, satdv,     satdv );    VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,                     temp4v, temp5v, temp6v, temp7v,                     diffl0v, diffl1v, diffl2v, diffl3v,                     diffl4v, diffl5v, diffl6v, diffl7v );    VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_ADD_ABS( temp0v, satdv,     satdv );    VEC_ADD_ABS( temp1v, satdv,     satdv );    VEC_ADD_ABS( temp2v, satdv,     satdv );    VEC_ADD_ABS( temp3v, satdv,     satdv );    VEC_ADD_ABS( temp4v, satdv,     satdv );    VEC_ADD_ABS( temp5v, satdv,     satdv );    VEC_ADD_ABS( temp6v, satdv,     satdv );    VEC_ADD_ABS( temp7v, satdv,     satdv );    satdv = vec_sums( satdv, zero_s32v );    satdv = vec_splat( satdv, 3 );    vec_ste( satdv, 0, &i_satd );    return i_satd / 2;}/*********************************************************************** * SATD 16x16 **********************************************************************/static int pixel_satd_16x16_altivec( uint8_t *pix1, int i_pix1,                                     uint8_t *pix2, int i_pix2 ){    DECLARE_ALIGNED( int, i_satd, 16 );    LOAD_ZERO;    PREP_LOAD;    vec_s32_t satdv;    vec_s16_t pix1v, pix2v;    vec_s16_t diffh0v, diffh1v, diffh2v, diffh3v,              diffh4v, diffh5v, diffh6v, diffh7v;    vec_s16_t diffl0v, diffl1v, diffl2v, diffl3v,              diffl4v, diffl5v, diffl6v, diffl7v;    vec_s16_t temp0v, temp1v, temp2v, temp3v,              temp4v, temp5v, temp6v, temp7v;    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh0v, diffl0v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh1v, diffl1v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh2v, diffl2v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh3v, diffl3v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh4v, diffl4v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh5v, diffl5v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh6v, diffl6v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh7v, diffl7v );    VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,                     temp4v, temp5v, temp6v, temp7v,                     diffh0v, diffh1v, diffh2v, diffh3v,                     diffh4v, diffh5v, diffh6v, diffh7v );    VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_ADD_ABS( temp0v, zero_s32v, satdv );    VEC_ADD_ABS( temp1v, satdv,     satdv );    VEC_ADD_ABS( temp2v, satdv,     satdv );    VEC_ADD_ABS( temp3v, satdv,     satdv );    VEC_ADD_ABS( temp4v, satdv,     satdv );    VEC_ADD_ABS( temp5v, satdv,     satdv );    VEC_ADD_ABS( temp6v, satdv,     satdv );    VEC_ADD_ABS( temp7v, satdv,     satdv );    VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,                     temp4v, temp5v, temp6v, temp7v,                     diffl0v, diffl1v, diffl2v, diffl3v,                     diffl4v, diffl5v, diffl6v, diffl7v );    VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_ADD_ABS( temp0v, satdv,     satdv );    VEC_ADD_ABS( temp1v, satdv,     satdv );    VEC_ADD_ABS( temp2v, satdv,     satdv );    VEC_ADD_ABS( temp3v, satdv,     satdv );    VEC_ADD_ABS( temp4v, satdv,     satdv );    VEC_ADD_ABS( temp5v, satdv,     satdv );    VEC_ADD_ABS( temp6v, satdv,     satdv );    VEC_ADD_ABS( temp7v, satdv,     satdv );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh0v, diffl0v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh1v, diffl1v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh2v, diffl2v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh3v, diffl3v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh4v, diffl4v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh5v, diffl5v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh6v, diffl6v );    VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh7v, diffl7v );    VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,                     temp4v, temp5v, temp6v, temp7v,                     diffh0v, diffh1v, diffh2v, diffh3v,                     diffh4v, diffh5v, diffh6v, diffh7v );    VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_ADD_ABS( temp0v, satdv,     satdv );    VEC_ADD_ABS( temp1v, satdv,     satdv );    VEC_ADD_ABS( temp2v, satdv,     satdv );    VEC_ADD_ABS( temp3v, satdv,     satdv );    VEC_ADD_ABS( temp4v, satdv,     satdv );    VEC_ADD_ABS( temp5v, satdv,     satdv );    VEC_ADD_ABS( temp6v, satdv,     satdv );    VEC_ADD_ABS( temp7v, satdv,     satdv );    VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,                     temp4v, temp5v, temp6v, temp7v,                     diffl0v, diffl1v, diffl2v, diffl3v,                     diffl4v, diffl5v, diffl6v, diffl7v );    VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,                 temp0v, temp1v, temp2v, temp3v );    VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,                 temp4v, temp5v, temp6v, temp7v );    VEC_ADD_ABS( temp0v, satdv,     satdv );    VEC_ADD_ABS( temp1v, satdv,     satdv );    VEC_ADD_ABS( temp2v, satdv,     satdv );    VEC_ADD_ABS( temp3v, satdv,     satdv );    VEC_ADD_ABS( temp4v, satdv,     satdv );    VEC_ADD_ABS( temp5v, satdv,     satdv );    VEC_ADD_ABS( temp6v, satdv,     satdv );    VEC_ADD_ABS( temp7v, satdv,     satdv );    satdv = vec_sums( satdv, zero_s32v );    satdv = vec_splat( satdv, 3 );    vec_ste( satdv, 0, &i_satd );    return i_satd / 2;}/**************************************************************************** * SHU264_pixel_init: ****************************************************************************/void SHU264_pixel_altivec_init( SHU264_pixel_function_t *pixf ){    pixf->sad[PIXEL_16x16]  = pixel_sad_16x16_altivec;    pixf->sad[PIXEL_8x16]   = pixel_sad_8x16_altivec;    pixf->sad[PIXEL_16x8]   = pixel_sad_16x8_altivec;    pixf->sad[PIXEL_8x8]    = pixel_sad_8x8_altivec;    pixf->satd[PIXEL_16x16] = pixel_satd_16x16_altivec;    pixf->satd[PIXEL_8x16]  = pixel_satd_8x16_altivec;    pixf->satd[PIXEL_16x8]  = pixel_satd_16x8_altivec;    pixf->satd[PIXEL_8x8]   = pixel_satd_8x8_altivec;    pixf->satd[PIXEL_8x4]   = pixel_satd_8x4_altivec;    pixf->satd[PIXEL_4x8]   = pixel_satd_4x8_altivec;    pixf->satd[PIXEL_4x4]   = pixel_satd_4x4_altivec;}

⌨️ 快捷键说明

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