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

📄 snow.c

📁 ffmpeg移植到symbian的全部源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    int r= log2>=0 ? 1<<log2 : 1;    int v=0;    assert(log2>=-4);    while(get_rac(c, state+4+log2)){        v+= r;        log2++;        if(log2>0) r+=r;    }    for(i=log2-1; i>=0; i--){        v+= get_rac(c, state+31-i)<<i;    }    return v;}static av_always_inline voidlift(DWTELEM *dst, DWTELEM *src, DWTELEM *ref,     int dst_step, int src_step, int ref_step,     int width, int mul, int add, int shift,     int highpass, int inverse){    const int mirror_left= !highpass;    const int mirror_right= (width&1) ^ highpass;    const int w= (width>>1) - 1 + (highpass & width);    int i;#define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))    if(mirror_left){        dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);        dst += dst_step;        src += src_step;    }    for(i=0; i<w; i++){        dst[i*dst_step] =            LIFT(src[i*src_step],                 ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift),                 inverse);    }    if(mirror_right){        dst[w*dst_step] =            LIFT(src[w*src_step],                 ((mul*2*ref[w*ref_step]+add)>>shift),                 inverse);    }}static av_always_inline voidinv_lift(IDWTELEM *dst, IDWTELEM *src, IDWTELEM *ref,         int dst_step, int src_step, int ref_step,         int width, int mul, int add, int shift,         int highpass, int inverse){    const int mirror_left= !highpass;    const int mirror_right= (width&1) ^ highpass;    const int w= (width>>1) - 1 + (highpass & width);    int i;#define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))    if(mirror_left){        dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);        dst += dst_step;        src += src_step;    }    for(i=0; i<w; i++){        dst[i*dst_step] =            LIFT(src[i*src_step],                 ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift),                 inverse);    }    if(mirror_right){        dst[w*dst_step] =            LIFT(src[w*src_step],                 ((mul*2*ref[w*ref_step]+add)>>shift),                 inverse);    }}#ifndef liftSstatic av_always_inline voidliftS(DWTELEM *dst, DWTELEM *src, DWTELEM *ref,      int dst_step, int src_step, int ref_step,      int width, int mul, int add, int shift,      int highpass, int inverse){    const int mirror_left= !highpass;    const int mirror_right= (width&1) ^ highpass;    const int w= (width>>1) - 1 + (highpass & width);    int i;    assert(shift == 4);#define LIFTS(src, ref, inv) \        ((inv) ? \            (src) + (((ref) + 4*(src))>>shift): \            -((-16*(src) + (ref) + add/4 + 1 + (5<<25))/(5*4) - (1<<23)))    if(mirror_left){        dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);        dst += dst_step;        src += src_step;    }    for(i=0; i<w; i++){        dst[i*dst_step] =            LIFTS(src[i*src_step],                  mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add,                  inverse);    }    if(mirror_right){        dst[w*dst_step] =            LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse);    }}static av_always_inline voidinv_liftS(IDWTELEM *dst, IDWTELEM *src, IDWTELEM *ref,          int dst_step, int src_step, int ref_step,          int width, int mul, int add, int shift,          int highpass, int inverse){    const int mirror_left= !highpass;    const int mirror_right= (width&1) ^ highpass;    const int w= (width>>1) - 1 + (highpass & width);    int i;    assert(shift == 4);#define LIFTS(src, ref, inv) \    ((inv) ? \        (src) + (((ref) + 4*(src))>>shift): \        -((-16*(src) + (ref) + add/4 + 1 + (5<<25))/(5*4) - (1<<23)))    if(mirror_left){        dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);        dst += dst_step;        src += src_step;    }    for(i=0; i<w; i++){        dst[i*dst_step] =            LIFTS(src[i*src_step],                  mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add,                  inverse);    }    if(mirror_right){        dst[w*dst_step] =            LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse);    }}#endif /* ! liftS */static void horizontal_decompose53i(DWTELEM *b, int width){#ifdef __CW32__    DWTELEM *temp;#else    DWTELEM temp[width];#endif    const int width2= width>>1;    int x;    const int w2= (width+1)>>1;#ifdef __CW32__    temp = av_malloc(sizeof(DWTELEM)*width);#endif    for(x=0; x<width2; x++){        temp[x   ]= b[2*x    ];        temp[x+w2]= b[2*x + 1];    }    if(width&1)        temp[x   ]= b[2*x    ];#if 0    {    int A1,A2,A3,A4;    A2= temp[1       ];    A4= temp[0       ];    A1= temp[0+width2];    A1 -= (A2 + A4)>>1;    A4 += (A1 + 1)>>1;    b[0+width2] = A1;    b[0       ] = A4;    for(x=1; x+1<width2; x+=2){        A3= temp[x+width2];        A4= temp[x+1     ];        A3 -= (A2 + A4)>>1;        A2 += (A1 + A3 + 2)>>2;        b[x+width2] = A3;        b[x       ] = A2;        A1= temp[x+1+width2];        A2= temp[x+2       ];        A1 -= (A2 + A4)>>1;        A4 += (A1 + A3 + 2)>>2;        b[x+1+width2] = A1;        b[x+1       ] = A4;    }    A3= temp[width-1];    A3 -= A2;    A2 += (A1 + A3 + 2)>>2;    b[width -1] = A3;    b[width2-1] = A2;    }#else    lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);    lift(b   , temp   , b+w2, 1, 1, 1, width,  1, 2, 2, 0, 0);#endif /* 0 */#ifdef __CW32__    av_free(temp);#endif}static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){    int i;    for(i=0; i<width; i++){        b1[i] -= (b0[i] + b2[i])>>1;    }}static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){    int i;    for(i=0; i<width; i++){        b1[i] += (b0[i] + b2[i] + 2)>>2;    }}static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){    int y;    DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;    DWTELEM *b1= buffer + mirror(-2  , height-1)*stride;    for(y=-2; y<height; y+=2){        DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;        DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;        if(y+1<(unsigned)height) horizontal_decompose53i(b2, width);        if(y+2<(unsigned)height) horizontal_decompose53i(b3, width);        if(y+1<(unsigned)height) vertical_decompose53iH0(b1, b2, b3, width);        if(y+0<(unsigned)height) vertical_decompose53iL0(b0, b1, b2, width);        b0=b2;        b1=b3;    }}static void horizontal_decompose97i(DWTELEM *b, int width){#ifdef __CW32__    DWTELEM *temp;#else    DWTELEM temp[width];#endif    const int w2= (width+1)>>1;#ifdef __CW32__    temp = av_malloc(sizeof(DWTELEM)*width);#endif    lift (temp+w2, b    +1, b      , 1, 2, 2, width,  W_AM, W_AO, W_AS, 1, 1);    liftS(temp   , b      , temp+w2, 1, 2, 1, width,  W_BM, W_BO, W_BS, 0, 0);    lift (b   +w2, temp+w2, temp   , 1, 1, 1, width,  W_CM, W_CO, W_CS, 1, 0);    lift (b      , temp   , b   +w2, 1, 1, 1, width,  W_DM, W_DO, W_DS, 0, 0);#ifdef __CW32__    av_free(temp);#endif}static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){    int i;    for(i=0; i<width; i++){        b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;    }}static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){    int i;    for(i=0; i<width; i++){        b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;    }}static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){    int i;    for(i=0; i<width; i++){#ifdef liftS        b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;#else        b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + W_BO*5 + (5<<27)) / (5*16) - (1<<23);#endif    }}static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){    int i;    for(i=0; i<width; i++){        b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;    }}static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){    int y;    DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;    DWTELEM *b1= buffer + mirror(-4  , height-1)*stride;    DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;    DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;    for(y=-4; y<height; y+=2){        DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;        DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;        if(y+3<(unsigned)height) horizontal_decompose97i(b4, width);        if(y+4<(unsigned)height) horizontal_decompose97i(b5, width);        if(y+3<(unsigned)height) vertical_decompose97iH0(b3, b4, b5, width);        if(y+2<(unsigned)height) vertical_decompose97iL0(b2, b3, b4, width);        if(y+1<(unsigned)height) vertical_decompose97iH1(b1, b2, b3, width);        if(y+0<(unsigned)height) vertical_decompose97iL1(b0, b1, b2, width);        b0=b2;        b1=b3;        b2=b4;        b3=b5;    }}void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){    int level;    for(level=0; level<decomposition_count; level++){        switch(type){        case DWT_97: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;        case DWT_53: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;        }    }}static void horizontal_compose53i(IDWTELEM *b, int width){#ifdef __CW32__    IDWTELEM *temp;#else    DWTELEM temp[width];#endif    const int width2= width>>1;    const int w2= (width+1)>>1;    int x;#ifdef __CW32__    temp = av_malloc(sizeof(IDWTELEM)*width);#endif#if 0

⌨️ 快捷键说明

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