summaryrefslogtreecommitdiff
path: root/libavcodec/jpeg2000dwt.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-06-22 02:22:36 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-06-22 02:27:50 +0200
commitb1fdf81c6eed786742c08037a9aa662ef7967ab2 (patch)
tree4d0e56e4db9a2f38ae8f3c3d8825e5239b8df7c6 /libavcodec/jpeg2000dwt.c
parent6c7b1597c7790da6018695dda6cd8a6b6690d6e5 (diff)
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/jpeg2000dwt.c')
-rw-r--r--libavcodec/jpeg2000dwt.c33
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],