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

📄 deblock.c

📁 从服务器上下的x264编码器C源码……希望对大家有帮助……这个是09年4月的
💻 C
📖 第 1 页 / 共 2 页
字号:
    register vec_u8_t mask;    register vec_u8_t tempmask;    mask = diff_lt_altivec(p0, q0, alpha);    tempmask = diff_lt_altivec(p1, p0, beta);    mask = vec_and(mask, tempmask);    tempmask = diff_lt_altivec(q1, q0, beta);    mask = vec_and(mask, tempmask);    return mask;}// out: newp1 = clip((p2 + ((p0 + q0 + 1) >> 1)) >> 1, p1-tc0, p1+tc0)static inline vec_u8_t h264_deblock_q1(register vec_u8_t p0,                                       register vec_u8_t p1,                                       register vec_u8_t p2,                                       register vec_u8_t q0,                                       register vec_u8_t tc0) {    register vec_u8_t average = vec_avg(p0, q0);    register vec_u8_t temp;    register vec_u8_t uncliped;    register vec_u8_t ones;    register vec_u8_t max;    register vec_u8_t min;    register vec_u8_t newp1;    temp = vec_xor(average, p2);    average = vec_avg(average, p2);     /*avg(p2, avg(p0, q0)) */    ones = vec_splat_u8(1);    temp = vec_and(temp, ones);         /*(p2^avg(p0, q0)) & 1 */    uncliped = vec_subs(average, temp); /*(p2+((p0+q0+1)>>1))>>1 */    max = vec_adds(p1, tc0);    min = vec_subs(p1, tc0);    newp1 = vec_max(min, uncliped);    newp1 = vec_min(max, newp1);    return newp1;}#define h264_deblock_p0_q0(p0, p1, q0, q1, tc0masked) {                                         \                                                                                                \    const vec_u8_t A0v = vec_sl(vec_splat_u8(10), vec_splat_u8(4));                             \                                                                                                \    register vec_u8_t pq0bit = vec_xor(p0,q0);                                                  \    register vec_u8_t q1minus;                                                                  \    register vec_u8_t p0minus;                                                                  \    register vec_u8_t stage1;                                                                   \    register vec_u8_t stage2;                                                                   \    register vec_u8_t vec160;                                                                   \    register vec_u8_t delta;                                                                    \    register vec_u8_t deltaneg;                                                                 \                                                                                                \    q1minus = vec_nor(q1, q1);                /* 255 - q1 */                                    \    stage1 = vec_avg(p1, q1minus);            /* (p1 - q1 + 256)>>1 */                          \    stage2 = vec_sr(stage1, vec_splat_u8(1)); /* (p1 - q1 + 256)>>2 = 64 + (p1 - q1) >> 2 */    \    p0minus = vec_nor(p0, p0);                /* 255 - p0 */                                    \    stage1 = vec_avg(q0, p0minus);            /* (q0 - p0 + 256)>>1 */                          \    pq0bit = vec_and(pq0bit, vec_splat_u8(1));                                                  \    stage2 = vec_avg(stage2, pq0bit);         /* 32 + ((q0 - p0)&1 + (p1 - q1) >> 2 + 1) >> 1 */\    stage2 = vec_adds(stage2, stage1);        /* 160 + ((p0 - q0) + (p1 - q1) >> 2 + 1) >> 1 */ \    vec160 = vec_ld(0, &A0v);                                                                   \    deltaneg = vec_subs(vec160, stage2);      /* -d */                                          \    delta = vec_subs(stage2, vec160);         /*  d */                                          \    deltaneg = vec_min(tc0masked, deltaneg);                                                    \    delta = vec_min(tc0masked, delta);                                                          \    p0 = vec_subs(p0, deltaneg);                                                                \    q0 = vec_subs(q0, delta);                                                                   \    p0 = vec_adds(p0, delta);                                                                   \    q0 = vec_adds(q0, deltaneg);                                                                \}#define h264_loop_filter_luma_altivec(p2, p1, p0, q0, q1, q2, alpha, beta, tc0) {            \    DECLARE_ALIGNED_16(unsigned char temp[16]);                                              \    register vec_u8_t alphavec;                                                              \    register vec_u8_t betavec;                                                               \    register vec_u8_t mask;                                                                  \    register vec_u8_t p1mask;                                                                \    register vec_u8_t q1mask;                                                                \    register vec_s8_t tc0vec;                                                                \    register vec_u8_t finaltc0;                                                              \    register vec_u8_t tc0masked;                                                             \    register vec_u8_t newp1;                                                                 \    register vec_u8_t newq1;                                                                 \                                                                                             \    temp[0] = alpha;                                                                         \    temp[1] = beta;                                                                          \    alphavec = vec_ld(0, temp);                                                              \    betavec = vec_splat(alphavec, 0x1);                                                      \    alphavec = vec_splat(alphavec, 0x0);                                                     \    mask = h264_deblock_mask(p0, p1, q0, q1, alphavec, betavec); /*if in block */            \                                                                                             \    *((int *)temp) = *((int *)tc0);                                                          \    tc0vec = vec_ld(0, (signed char*)temp);                                                  \    tc0vec = vec_mergeh(tc0vec, tc0vec);                                                     \    tc0vec = vec_mergeh(tc0vec, tc0vec);                                                     \    mask = vec_and(mask, vec_cmpgt(tc0vec, vec_splat_s8(-1)));  /* if tc0[i] >= 0 */         \    finaltc0 = vec_and((vec_u8_t)tc0vec, mask);                 /* tc = tc0 */               \                                                                                             \    p1mask = diff_lt_altivec(p2, p0, betavec);                                               \    p1mask = vec_and(p1mask, mask);                             /* if( |p2 - p0| < beta) */  \    tc0masked = vec_and(p1mask, (vec_u8_t)tc0vec);                                           \    finaltc0 = vec_sub(finaltc0, p1mask);                       /* tc++ */                   \    newp1 = h264_deblock_q1(p0, p1, p2, q0, tc0masked);                                      \    /*end if*/                                                                               \                                                                                             \    q1mask = diff_lt_altivec(q2, q0, betavec);                                               \    q1mask = vec_and(q1mask, mask);                             /* if ( |q2 - q0| < beta ) */\    tc0masked = vec_and(q1mask, (vec_u8_t)tc0vec);                                           \    finaltc0 = vec_sub(finaltc0, q1mask);                       /* tc++ */                   \    newq1 = h264_deblock_q1(p0, q1, q2, q0, tc0masked);                                      \    /*end if*/                                                                               \                                                                                             \    h264_deblock_p0_q0(p0, p1, q0, q1, finaltc0);                                            \    p1 = newp1;                                                                              \    q1 = newq1;                                                                              \}void x264_deblock_v_luma_altivec(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0) {    if((tc0[0] & tc0[1] & tc0[2] & tc0[3]) >= 0) {        register vec_u8_t p2 = vec_ld(-3*stride, pix);        register vec_u8_t p1 = vec_ld(-2*stride, pix);        register vec_u8_t p0 = vec_ld(-1*stride, pix);        register vec_u8_t q0 = vec_ld(0, pix);        register vec_u8_t q1 = vec_ld(stride, pix);        register vec_u8_t q2 = vec_ld(2*stride, pix);        h264_loop_filter_luma_altivec(p2, p1, p0, q0, q1, q2, alpha, beta, tc0);        vec_st(p1, -2*stride, pix);        vec_st(p0, -1*stride, pix);        vec_st(q0, 0, pix);        vec_st(q1, stride, pix);    }}void x264_deblock_h_luma_altivec(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0) {    register vec_u8_t line0, line1, line2, line3, line4, line5;    if((tc0[0] & tc0[1] & tc0[2] & tc0[3]) < 0)        return;    PREP_LOAD;    vec_u8_t _pix_ = vec_lvsl(0, pix-3);    readAndTranspose16x6(pix-3, stride, line0, line1, line2, line3, line4, line5);    h264_loop_filter_luma_altivec(line0, line1, line2, line3, line4, line5, alpha, beta, tc0);    transpose4x16(line1, line2, line3, line4);    write16x4(pix-2, stride, line1, line2, line3, line4);}

⌨️ 快捷键说明

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