diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2015-06-22 02:22:36 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-06-22 02:27:50 +0200 |
commit | b1fdf81c6eed786742c08037a9aa662ef7967ab2 (patch) | |
tree | 4d0e56e4db9a2f38ae8f3c3d8825e5239b8df7c6 /libavcodec | |
parent | 6c7b1597c7790da6018695dda6cd8a6b6690d6e5 (diff) | |
download | ffmpeg-b1fdf81c6eed786742c08037a9aa662ef7967ab2.tar.gz |
avcodec/jpeg2000dwt: use 32x32->64 multiplies in the 9/7i DWT
This significantly improves the quality when the integer 9/7 transform
is used
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/jpeg2000dwt.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/libavcodec/jpeg2000dwt.c b/libavcodec/jpeg2000dwt.c index a1fe713202..dff2516d11 100644 --- a/libavcodec/jpeg2000dwt.c +++ b/libavcodec/jpeg2000dwt.c @@ -40,12 +40,13 @@ /* Lifting parameters in integer format. * Computed as param = (float param) * (1 << 16) */ -#define I_LFTG_ALPHA 103949 -#define I_LFTG_BETA 3472 -#define I_LFTG_GAMMA 57862 -#define I_LFTG_DELTA 29066 -#define I_LFTG_K 80621 -#define I_LFTG_X 53274 +#define I_LFTG_ALPHA 103949ll +#define I_LFTG_BETA 3472ll +#define I_LFTG_GAMMA 57862ll +#define I_LFTG_DELTA 29066ll +#define I_LFTG_K 80621ll +#define I_LFTG_X 53274ll +#define I_PRESHIFT 8 static inline void extend53(int *p, int i0, int i1) { @@ -246,11 +247,16 @@ static void sd_1d97_int(int *p, int i0, int i1) static void dwt_encode97_int(DWTContext *s, int *t) { - int lev, - w = s->linelen[s->ndeclevels-1][0]; + int lev; + int w = s->linelen[s->ndeclevels-1][0]; + int h = s->linelen[s->ndeclevels-1][1]; + int i; int *line = s->i_linebuf; line += 5; + for (i = 0; i < w * h; i++) + t[i] <<= I_PRESHIFT; + for (lev = s->ndeclevels-1; lev >= 0; lev--){ int lh = s->linelen[lev][0], lv = s->linelen[lev][1], @@ -294,6 +300,9 @@ static void dwt_encode97_int(DWTContext *s, int *t) } } + + for (i = 0; i < w * h; i++) + t[i] = (t[i] + ((1<<I_PRESHIFT)>>1)) >> I_PRESHIFT; } static void sr_1d53(int *p, int i0, int i1) @@ -471,11 +480,16 @@ static void dwt_decode97_int(DWTContext *s, int32_t *t) { int lev; int w = s->linelen[s->ndeclevels - 1][0]; + int h = s->linelen[s->ndeclevels - 1][1]; + int i; int32_t *line = s->i_linebuf; int32_t *data = t; /* position at index O of line range [0-5,w+5] cf. extend function */ line += 5; + for (i = 0; i < w * h; i++) + data[i] <<= I_PRESHIFT; + for (lev = 0; lev < s->ndeclevels; lev++) { int lh = s->linelen[lev][0], lv = s->linelen[lev][1], @@ -515,6 +529,9 @@ static void dwt_decode97_int(DWTContext *s, int32_t *t) data[w * i + lp] = l[i]; } } + + for (i = 0; i < w * h; i++) + data[i] = (data[i] + ((1<<I_PRESHIFT)>>1)) >> I_PRESHIFT; } int ff_jpeg2000_dwt_init(DWTContext *s, uint16_t border[2][2], |