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

📄 dct.c

📁 从服务器上下的x264编码器C源码……希望对大家有帮助……这个是09年4月的
💻 C
📖 第 1 页 / 共 2 页
字号:
    d2 = vec_sub(a1v, a2v);                              \    /* DST(3,    a0 - a3); */                            \    d3 = vec_sub(a0v, a3v);                              \}#define VEC_LOAD_U8_ADD_S16_STORE_U8(va)             \    vdst_orig = vec_ld(0, dst);                      \    vdst = vec_perm(vdst_orig, zero_u8v, vdst_mask); \    vdst_ss = (vec_s16_t)vec_mergeh(zero_u8v, vdst); \    va = vec_add(va, vdst_ss);                       \    va_u8 = vec_s16_to_u8(va);                       \    va_u32 = vec_splat((vec_u32_t)va_u8, 0);         \    vec_ste(va_u32, element, (uint32_t*)dst);#define ALTIVEC_STORE4_SUM_CLIP(dest, idctv, perm_ldv)          \{                                                               \    /* unaligned load */                                        \    vec_u8_t lv = vec_ld(0, dest);                              \    vec_u8_t dstv = vec_perm(lv, zero_u8v, (vec_u8_t)perm_ldv); \    vec_s16_t idct_sh6 = vec_sra(idctv, sixv);                  \    vec_u16_t dst16 = (vec_u16_t)vec_mergeh(zero_u8v, dstv);    \    vec_s16_t idstsum = vec_adds(idct_sh6, (vec_s16_t)dst16);   \    vec_u8_t idstsum8 = vec_s16_to_u8(idstsum);                 \    /* unaligned store */                                       \    vec_u32_t bodyv = vec_splat((vec_u32_t)idstsum8, 0);        \    int element = ((unsigned long)dest & 0xf) >> 2;             \    vec_ste(bodyv, element, (uint32_t *)dest);                  \}void x264_add4x4_idct_altivec( uint8_t *dst, int16_t dct[4][4] ){    vec_u16_t onev = vec_splat_u16(1);    dct[0][0] += 32; // rounding for the >>6 at the end    vec_s16_t s0, s1, s2, s3;    s0 = vec_ld( 0x00, (int16_t*)dct );    s1 = vec_sld( s0, s0, 8 );    s2 = vec_ld( 0x10, (int16_t*)dct );    s3 = vec_sld( s2, s2, 8 );    vec_s16_t d0, d1, d2, d3;    IDCT_1D_ALTIVEC( s0, s1, s2, s3, d0, d1, d2, d3 );    vec_s16_t tr0, tr1, tr2, tr3;    VEC_TRANSPOSE_4( d0, d1, d2, d3, tr0, tr1, tr2, tr3 );    vec_s16_t idct0, idct1, idct2, idct3;    IDCT_1D_ALTIVEC( tr0, tr1, tr2, tr3, idct0, idct1, idct2, idct3 );    vec_u8_t perm_ldv = vec_lvsl( 0, dst );    vec_u16_t sixv = vec_splat_u16(6);    LOAD_ZERO;    ALTIVEC_STORE4_SUM_CLIP( &dst[0*FDEC_STRIDE], idct0, perm_ldv );    ALTIVEC_STORE4_SUM_CLIP( &dst[1*FDEC_STRIDE], idct1, perm_ldv );    ALTIVEC_STORE4_SUM_CLIP( &dst[2*FDEC_STRIDE], idct2, perm_ldv );    ALTIVEC_STORE4_SUM_CLIP( &dst[3*FDEC_STRIDE], idct3, perm_ldv );}void x264_add8x8_idct_altivec( uint8_t *p_dst, int16_t dct[4][4][4] ){    x264_add4x4_idct_altivec( &p_dst[0],               dct[0] );    x264_add4x4_idct_altivec( &p_dst[4],               dct[1] );    x264_add4x4_idct_altivec( &p_dst[4*FDEC_STRIDE+0], dct[2] );    x264_add4x4_idct_altivec( &p_dst[4*FDEC_STRIDE+4], dct[3] );}void x264_add16x16_idct_altivec( uint8_t *p_dst, int16_t dct[16][4][4] ){    x264_add8x8_idct_altivec( &p_dst[0],               &dct[0] );    x264_add8x8_idct_altivec( &p_dst[8],               &dct[4] );    x264_add8x8_idct_altivec( &p_dst[8*FDEC_STRIDE+0], &dct[8] );    x264_add8x8_idct_altivec( &p_dst[8*FDEC_STRIDE+8], &dct[12] );}#define IDCT8_1D_ALTIVEC(s0, s1, s2, s3, s4, s5, s6, s7,  d0, d1, d2, d3, d4, d5, d6, d7)\{\    /*        a0  = SRC(0) + SRC(4); */ \    vec_s16_t a0v = vec_add(s0, s4);    \    /*        a2  = SRC(0) - SRC(4); */ \    vec_s16_t a2v = vec_sub(s0, s4);    \    /*        a4  =           (SRC(2)>>1) - SRC(6); */ \    vec_s16_t a4v = vec_sub(vec_sra(s2, onev), s6);    \    /*        a6  =           (SRC(6)>>1) + SRC(2); */ \    vec_s16_t a6v = vec_add(vec_sra(s6, onev), s2);    \    /*        b0  =         a0 + a6; */ \    vec_s16_t b0v = vec_add(a0v, a6v);  \    /*        b2  =         a2 + a4; */ \    vec_s16_t b2v = vec_add(a2v, a4v);  \    /*        b4  =         a2 - a4; */ \    vec_s16_t b4v = vec_sub(a2v, a4v);  \    /*        b6  =         a0 - a6; */ \    vec_s16_t b6v = vec_sub(a0v, a6v);  \    /* a1 =  SRC(5) - SRC(3) - SRC(7) - (SRC(7)>>1); */ \    /*        a1 =             (SRC(5)-SRC(3)) -  (SRC(7)  +  (SRC(7)>>1)); */ \    vec_s16_t a1v = vec_sub( vec_sub(s5, s3), vec_add(s7, vec_sra(s7, onev)) );\    /* a3 =  SRC(7) + SRC(1) - SRC(3) - (SRC(3)>>1); */ \    /*        a3 =             (SRC(7)+SRC(1)) -  (SRC(3)  +  (SRC(3)>>1)); */ \    vec_s16_t a3v = vec_sub( vec_add(s7, s1), vec_add(s3, vec_sra(s3, onev)) );\    /* a5 =  SRC(7) - SRC(1) + SRC(5) + (SRC(5)>>1); */ \    /*        a5 =             (SRC(7)-SRC(1)) +   SRC(5) +   (SRC(5)>>1); */  \    vec_s16_t a5v = vec_add( vec_sub(s7, s1), vec_add(s5, vec_sra(s5, onev)) );\    /*        a7 =                SRC(5)+SRC(3) +  SRC(1) +   (SRC(1)>>1); */  \    vec_s16_t a7v = vec_add( vec_add(s5, s3), vec_add(s1, vec_sra(s1, onev)) );\    /*        b1 =                  (a7>>2)  +  a1; */  \    vec_s16_t b1v = vec_add( vec_sra(a7v, twov), a1v);  \    /*        b3 =          a3 +        (a5>>2); */     \    vec_s16_t b3v = vec_add(a3v, vec_sra(a5v, twov));   \    /*        b5 =                  (a3>>2)  -   a5; */ \    vec_s16_t b5v = vec_sub( vec_sra(a3v, twov), a5v);  \    /*        b7 =           a7 -        (a1>>2); */    \    vec_s16_t b7v = vec_sub( a7v, vec_sra(a1v, twov));  \    /* DST(0,    b0 + b7); */ \    d0 = vec_add(b0v, b7v); \    /* DST(1,    b2 + b5); */ \    d1 = vec_add(b2v, b5v); \    /* DST(2,    b4 + b3); */ \    d2 = vec_add(b4v, b3v); \    /* DST(3,    b6 + b1); */ \    d3 = vec_add(b6v, b1v); \    /* DST(4,    b6 - b1); */ \    d4 = vec_sub(b6v, b1v); \    /* DST(5,    b4 - b3); */ \    d5 = vec_sub(b4v, b3v); \    /* DST(6,    b2 - b5); */ \    d6 = vec_sub(b2v, b5v); \    /* DST(7,    b0 - b7); */ \    d7 = vec_sub(b0v, b7v); \}#define ALTIVEC_STORE_SUM_CLIP(dest, idctv, perm_ldv, perm_stv, sel)\{\    /* unaligned load */                                       \    vec_u8_t hv = vec_ld( 0, dest );                           \    vec_u8_t lv = vec_ld( 7, dest );                           \    vec_u8_t dstv   = vec_perm( hv, lv, (vec_u8_t)perm_ldv );  \    vec_s16_t idct_sh6 = vec_sra(idctv, sixv);                 \    vec_u16_t dst16 = (vec_u16_t)vec_mergeh(zero_u8v, dstv);   \    vec_s16_t idstsum = vec_adds(idct_sh6, (vec_s16_t)dst16);  \    vec_u8_t idstsum8 = vec_packsu(zero_s16v, idstsum);        \    /* unaligned store */                                      \    vec_u8_t bodyv  = vec_perm( idstsum8, idstsum8, perm_stv );\    vec_u8_t edgelv = vec_perm( sel, zero_u8v, perm_stv );     \    lv    = vec_sel( lv, bodyv, edgelv );                      \    vec_st( lv, 7, dest );                                     \    hv    = vec_ld( 0, dest );                                 \    vec_u8_t edgehv = vec_perm( zero_u8v, sel, perm_stv );     \    hv    = vec_sel( hv, bodyv, edgehv );                      \    vec_st( hv, 0, dest );                                     \}void x264_add8x8_idct8_altivec( uint8_t *dst, int16_t dct[8][8] ){    vec_u16_t onev = vec_splat_u16(1);    vec_u16_t twov = vec_splat_u16(2);    dct[0][0] += 32; // rounding for the >>6 at the end    vec_s16_t s0, s1, s2, s3, s4, s5, s6, s7;    s0 = vec_ld(0x00, (int16_t*)dct);    s1 = vec_ld(0x10, (int16_t*)dct);    s2 = vec_ld(0x20, (int16_t*)dct);    s3 = vec_ld(0x30, (int16_t*)dct);    s4 = vec_ld(0x40, (int16_t*)dct);    s5 = vec_ld(0x50, (int16_t*)dct);    s6 = vec_ld(0x60, (int16_t*)dct);    s7 = vec_ld(0x70, (int16_t*)dct);    vec_s16_t d0, d1, d2, d3, d4, d5, d6, d7;    IDCT8_1D_ALTIVEC(s0, s1, s2, s3, s4, s5, s6, s7,  d0, d1, d2, d3, d4, d5, d6, d7);    vec_s16_t tr0, tr1, tr2, tr3, tr4, tr5, tr6, tr7;    VEC_TRANSPOSE_8( d0,  d1,  d2,  d3,  d4,  d5,  d6, d7,                    tr0, tr1, tr2, tr3, tr4, tr5, tr6, tr7);    vec_s16_t idct0, idct1, idct2, idct3, idct4, idct5, idct6, idct7;    IDCT8_1D_ALTIVEC(tr0,     tr1,   tr2,   tr3,   tr4,   tr5,   tr6,   tr7,                     idct0, idct1, idct2, idct3, idct4, idct5, idct6, idct7);    vec_u8_t perm_ldv = vec_lvsl(0, dst);    vec_u8_t perm_stv = vec_lvsr(8, dst);    vec_u16_t sixv = vec_splat_u16(6);    const vec_u8_t sel = (vec_u8_t) CV(0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1);    LOAD_ZERO;    ALTIVEC_STORE_SUM_CLIP(&dst[0*FDEC_STRIDE], idct0, perm_ldv, perm_stv, sel);    ALTIVEC_STORE_SUM_CLIP(&dst[1*FDEC_STRIDE], idct1, perm_ldv, perm_stv, sel);    ALTIVEC_STORE_SUM_CLIP(&dst[2*FDEC_STRIDE], idct2, perm_ldv, perm_stv, sel);    ALTIVEC_STORE_SUM_CLIP(&dst[3*FDEC_STRIDE], idct3, perm_ldv, perm_stv, sel);    ALTIVEC_STORE_SUM_CLIP(&dst[4*FDEC_STRIDE], idct4, perm_ldv, perm_stv, sel);    ALTIVEC_STORE_SUM_CLIP(&dst[5*FDEC_STRIDE], idct5, perm_ldv, perm_stv, sel);    ALTIVEC_STORE_SUM_CLIP(&dst[6*FDEC_STRIDE], idct6, perm_ldv, perm_stv, sel);    ALTIVEC_STORE_SUM_CLIP(&dst[7*FDEC_STRIDE], idct7, perm_ldv, perm_stv, sel);}void x264_add16x16_idct8_altivec( uint8_t *dst, int16_t dct[4][8][8] ){    x264_add8x8_idct8_altivec( &dst[0],               dct[0] );    x264_add8x8_idct8_altivec( &dst[8],               dct[1] );    x264_add8x8_idct8_altivec( &dst[8*FDEC_STRIDE+0], dct[2] );    x264_add8x8_idct8_altivec( &dst[8*FDEC_STRIDE+8], dct[3] );}void x264_zigzag_scan_4x4_frame_altivec( int16_t level[16], int16_t dct[4][4] ){    vec_s16_t dct0v, dct1v;    vec_s16_t tmp0v, tmp1v;    dct0v = vec_ld(0x00, (int16_t*)dct);    dct1v = vec_ld(0x10, (int16_t*)dct);    const vec_u8_t sel0 = (vec_u8_t) CV(0,1,8,9,2,3,4,5,10,11,16,17,24,25,18,19);    const vec_u8_t sel1 = (vec_u8_t) CV(12,13,6,7,14,15,20,21,26,27,28,29,22,23,30,31);    tmp0v = vec_perm( dct0v, dct1v, sel0 );    tmp1v = vec_perm( dct0v, dct1v, sel1 );    vec_st( tmp0v, 0x00, level );    vec_st( tmp1v, 0x10, level );}void x264_zigzag_scan_4x4_field_altivec( int16_t level[16], int16_t dct[4][4] ){    vec_s16_t dct0v, dct1v;    vec_s16_t tmp0v, tmp1v;    dct0v = vec_ld(0x00, (int16_t*)dct);    dct1v = vec_ld(0x10, (int16_t*)dct);    const vec_u8_t sel0 = (vec_u8_t) CV(0,1,2,3,8,9,4,5,6,7,10,11,12,13,14,15);    tmp0v = vec_perm( dct0v, dct1v, sel0 );    tmp1v = dct1v;    vec_st( tmp0v, 0x00, level );    vec_st( tmp1v, 0x10, level );}

⌨️ 快捷键说明

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