📄 snow.c
字号:
e++;
}
a= 1;
for(i=e-1; i>=0; i--){
a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
}
if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21
return -a;
else
return a;
}
}
static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){
int i;
int r= log2>=0 ? 1<<log2 : 1;
assert(v>=0);
assert(log2>=-4);
while(v >= r){
put_rac(c, state+4+log2, 1);
v -= r;
log2++;
if(log2>0) r+=r;
}
put_rac(c, state+4+log2, 0);
for(i=log2-1; i>=0; i--){
put_rac(c, state+31-i, (v>>i)&1);
}
}
static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
int i;
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 void
lift(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 void
inv_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 liftS
static av_always_inline void
liftS(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 void
inv_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
static void horizontal_decompose53i(DWTELEM *b, int width){
DWTELEM temp[width];
const int width2= width>>1;
int x;
const int w2= (width+1)>>1;
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
}
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;
{START_TIMER
if(y+1<(unsigned)height) horizontal_decompose53i(b2, width);
if(y+2<(unsigned)height) horizontal_decompose53i(b3, width);
STOP_TIMER("horizontal_decompose53i")}
{START_TIMER
if(y+1<(unsigned)height) vertical_decompose53iH0(b1, b2, b3, width);
if(y+0<(unsigned)height) vertical_decompose53iL0(b0, b1, b2, width);
STOP_TIMER("vertical_decompose53i*")}
b0=b2;
b1=b3;
}
}
static void horizontal_decompose97i(DWTELEM *b, int width){
DWTELEM temp[width];
const int w2= (width+1)>>1;
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);
}
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;
{START_TIMER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -