Originally committed as revision 10278 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Luca Barbato 18 years ago
parent c0fee8c985
commit 9d14ffbcce
  1. 70
      libavcodec/snow.c

@ -716,7 +716,11 @@ static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
return v; 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){ 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_left= !highpass;
const int mirror_right= (width&1) ^ highpass; const int mirror_right= (width&1) ^ highpass;
const int w= (width>>1) - 1 + (highpass & width); const int w= (width>>1) - 1 + (highpass & width);
@ -730,15 +734,25 @@ static av_always_inline void lift(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int
} }
for(i=0; i<w; i++){ 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); 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){ if(mirror_right){
dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse); 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){ 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_left= !highpass;
const int mirror_right= (width&1) ^ highpass; const int mirror_right= (width&1) ^ highpass;
const int w= (width>>1) - 1 + (highpass & width); const int w= (width>>1) - 1 + (highpass & width);
@ -752,23 +766,36 @@ static av_always_inline void inv_lift(IDWTELEM *dst, IDWTELEM *src, IDWTELEM *re
} }
for(i=0; i<w; i++){ 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); 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){ if(mirror_right){
dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse); dst[w*dst_step] =
LIFT(src[w*src_step],
((mul*2*ref[w*ref_step]+add)>>shift),
inverse);
} }
} }
#ifndef liftS #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){ 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_left= !highpass;
const int mirror_right= (width&1) ^ highpass; const int mirror_right= (width&1) ^ highpass;
const int w= (width>>1) - 1 + (highpass & width); const int w= (width>>1) - 1 + (highpass & width);
int i; int i;
assert(shift == 4); 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))) #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){ if(mirror_left){
dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse); dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);
dst += dst_step; dst += dst_step;
@ -776,21 +803,32 @@ static av_always_inline void liftS(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int
} }
for(i=0; i<w; i++){ 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); dst[i*dst_step] =
LIFTS(src[i*src_step],
mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add,
inverse);
} }
if(mirror_right){ if(mirror_right){
dst[w*dst_step] = LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse); 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){ 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_left= !highpass;
const int mirror_right= (width&1) ^ highpass; const int mirror_right= (width&1) ^ highpass;
const int w= (width>>1) - 1 + (highpass & width); const int w= (width>>1) - 1 + (highpass & width);
int i; int i;
assert(shift == 4); 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))) #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){ if(mirror_left){
dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse); dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);
dst += dst_step; dst += dst_step;
@ -798,11 +836,15 @@ static av_always_inline void inv_liftS(IDWTELEM *dst, IDWTELEM *src, IDWTELEM *r
} }
for(i=0; i<w; i++){ 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); dst[i*dst_step] =
LIFTS(src[i*src_step],
mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add,
inverse);
} }
if(mirror_right){ if(mirror_right){
dst[w*dst_step] = LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse); dst[w*dst_step] =
LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse);
} }
} }
#endif #endif

Loading…
Cancel
Save