2 * Discrete wavelet transform
3 * Copyright (c) 2007 Kamil Nowosad
4 * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * Discrete wavelet transform
28 #include "libavutil/error.h"
29 #include "libavutil/macros.h"
30 #include "libavutil/mem.h"
31 #include "jpeg2000dwt.h"
33 /* Defines for 9/7 DWT lifting parameters.
34 * Parameters are in float. */
35 #define F_LFTG_ALPHA 1.586134342059924f
36 #define F_LFTG_BETA 0.052980118572961f
37 #define F_LFTG_GAMMA 0.882911075530934f
38 #define F_LFTG_DELTA 0.443506852043971f
40 /* Lifting parameters in integer format.
41 * Computed as param = (float param) * (1 << 16) */
42 #define I_LFTG_ALPHA_PRIME 38413ll // = 103949 - 65536, (= alpha - 1.0)
43 #define I_LFTG_BETA 3472ll
44 #define I_LFTG_GAMMA 57862ll
45 #define I_LFTG_DELTA 29066ll
46 #define I_LFTG_K 80621ll
47 #define I_LFTG_X 53274ll
49 static inline void extend53(int *p
, int i0
, int i1
)
51 p
[i0
- 1] = p
[i0
+ 1];
53 p
[i0
- 2] = p
[i0
+ 2];
54 p
[i1
+ 1] = p
[i1
- 3];
57 static inline void extend97_float(float *p
, int i0
, int i1
)
61 for (i
= 1; i
<= 4; i
++) {
62 p
[i0
- i
] = p
[i0
+ i
];
63 p
[i1
+ i
- 1] = p
[i1
- i
- 1];
67 static inline void extend97_int(int32_t *p
, int i0
, int i1
)
71 for (i
= 1; i
<= 4; i
++) {
72 p
[i0
- i
] = p
[i0
+ i
];
73 p
[i1
+ i
- 1] = p
[i1
- i
- 1];
77 static void sd_1d53(int *p
, int i0
, int i1
)
89 for (i
= ((i0
+1)>>1) - 1; i
< (i1
+1)>>1; i
++)
90 p
[2*i
+1] -= (p
[2*i
] + p
[2*i
+2]) >> 1;
91 for (i
= ((i0
+1)>>1); i
< (i1
+1)>>1; i
++)
92 p
[2*i
] += (p
[2*i
-1] + p
[2*i
+1] + 2) >> 2;
95 static void dwt_encode53(DWTContext
*s
, int *t
)
98 w
= s
->linelen
[s
->ndeclevels
-1][0];
99 int *line
= s
->i_linebuf
;
102 for (lev
= s
->ndeclevels
-1; lev
>= 0; lev
--){
103 int lh
= s
->linelen
[lev
][0],
104 lv
= s
->linelen
[lev
][1],
112 for (lp
= 0; lp
< lh
; lp
++) {
115 for (i
= 0; i
< lv
; i
++)
118 sd_1d53(line
, mv
, mv
+ lv
);
120 // copy back and deinterleave
121 for (i
= mv
; i
< lv
; i
+=2, j
++)
123 for (i
= 1-mv
; i
< lv
; i
+=2, j
++)
129 for (lp
= 0; lp
< lv
; lp
++){
132 for (i
= 0; i
< lh
; i
++)
135 sd_1d53(line
, mh
, mh
+ lh
);
137 // copy back and deinterleave
138 for (i
= mh
; i
< lh
; i
+=2, j
++)
140 for (i
= 1-mh
; i
< lh
; i
+=2, j
++)
145 static void sd_1d97_float(float *p
, int i0
, int i1
)
151 p
[1] *= F_LFTG_X
* 2;
157 extend97_float(p
, i0
, i1
);
160 for (i
= (i0
>>1) - 2; i
< (i1
>>1) + 1; i
++)
161 p
[2*i
+1] -= 1.586134 * (p
[2*i
] + p
[2*i
+2]);
162 for (i
= (i0
>>1) - 1; i
< (i1
>>1) + 1; i
++)
163 p
[2*i
] -= 0.052980 * (p
[2*i
-1] + p
[2*i
+1]);
164 for (i
= (i0
>>1) - 1; i
< (i1
>>1); i
++)
165 p
[2*i
+1] += 0.882911 * (p
[2*i
] + p
[2*i
+2]);
166 for (i
= (i0
>>1); i
< (i1
>>1); i
++)
167 p
[2*i
] += 0.443506 * (p
[2*i
-1] + p
[2*i
+1]);
170 static void dwt_encode97_float(DWTContext
*s
, float *t
)
173 w
= s
->linelen
[s
->ndeclevels
-1][0];
174 float *line
= s
->f_linebuf
;
177 for (lev
= s
->ndeclevels
-1; lev
>= 0; lev
--){
178 int lh
= s
->linelen
[lev
][0],
179 lv
= s
->linelen
[lev
][1],
187 for (lp
= 0; lp
< lv
; lp
++){
190 for (i
= 0; i
< lh
; i
++)
193 sd_1d97_float(line
, mh
, mh
+ lh
);
195 // copy back and deinterleave
196 for (i
= mh
; i
< lh
; i
+=2, j
++)
198 for (i
= 1-mh
; i
< lh
; i
+=2, j
++)
204 for (lp
= 0; lp
< lh
; lp
++) {
207 for (i
= 0; i
< lv
; i
++)
210 sd_1d97_float(line
, mv
, mv
+ lv
);
212 // copy back and deinterleave
213 for (i
= mv
; i
< lv
; i
+=2, j
++)
215 for (i
= 1-mv
; i
< lv
; i
+=2, j
++)
221 static void sd_1d97_int(int *p
, int i0
, int i1
)
227 p
[1] = (p
[1] * I_LFTG_X
+ (1<<14)) >> 15;
229 p
[0] = (p
[0] * I_LFTG_K
+ (1<<15)) >> 16;
233 extend97_int(p
, i0
, i1
);
236 for (i
= (i0
>>1) - 2; i
< (i1
>>1) + 1; i
++) {
237 const int64_t sum
= p
[2 * i
] + p
[2 * i
+ 2];
239 p
[2 * i
+ 1] -= (I_LFTG_ALPHA_PRIME
* sum
+ (1 << 15)) >> 16;
241 for (i
= (i0
>>1) - 1; i
< (i1
>>1) + 1; i
++)
242 p
[2 * i
] -= (I_LFTG_BETA
* (p
[2 * i
- 1] + p
[2 * i
+ 1]) + (1 << 15)) >> 16;
243 for (i
= (i0
>>1) - 1; i
< (i1
>>1); i
++)
244 p
[2 * i
+ 1] += (I_LFTG_GAMMA
* (p
[2 * i
] + p
[2 * i
+ 2]) + (1 << 15)) >> 16;
245 for (i
= (i0
>>1); i
< (i1
>>1); i
++)
246 p
[2 * i
] += (I_LFTG_DELTA
* (p
[2 * i
- 1] + p
[2 * i
+ 1]) + (1 << 15)) >> 16;
249 static void dwt_encode97_int(DWTContext
*s
, int *t
)
252 int w
= s
->linelen
[s
->ndeclevels
-1][0];
253 int h
= s
->linelen
[s
->ndeclevels
-1][1];
255 int *line
= s
->i_linebuf
;
258 for (i
= 0; i
< w
* h
; i
++)
259 t
[i
] *= 1 << I_PRESHIFT
;
261 for (lev
= s
->ndeclevels
-1; lev
>= 0; lev
--){
262 int lh
= s
->linelen
[lev
][0],
263 lv
= s
->linelen
[lev
][1],
271 for (lp
= 0; lp
< lh
; lp
++) {
274 for (i
= 0; i
< lv
; i
++)
277 sd_1d97_int(line
, mv
, mv
+ lv
);
279 // copy back and deinterleave
280 for (i
= mv
; i
< lv
; i
+=2, j
++)
282 for (i
= 1-mv
; i
< lv
; i
+=2, j
++)
288 for (lp
= 0; lp
< lv
; lp
++){
291 for (i
= 0; i
< lh
; i
++)
294 sd_1d97_int(line
, mh
, mh
+ lh
);
296 // copy back and deinterleave
297 for (i
= mh
; i
< lh
; i
+=2, j
++)
299 for (i
= 1-mh
; i
< lh
; i
+=2, j
++)
305 for (i
= 0; i
< w
* h
; i
++)
306 t
[i
] = (t
[i
] + ((1<<(I_PRESHIFT
))>>1)) >> (I_PRESHIFT
);
309 static void sr_1d53(unsigned *p
, int i0
, int i1
)
315 p
[1] = (int)p
[1] >> 1;
321 for (i
= (i0
>> 1); i
< (i1
>> 1) + 1; i
++)
322 p
[2 * i
] -= (int)(p
[2 * i
- 1] + p
[2 * i
+ 1] + 2) >> 2;
323 for (i
= (i0
>> 1); i
< (i1
>> 1); i
++)
324 p
[2 * i
+ 1] += (int)(p
[2 * i
] + p
[2 * i
+ 2]) >> 1;
327 static void dwt_decode53(DWTContext
*s
, int *t
)
330 int w
= s
->linelen
[s
->ndeclevels
- 1][0];
331 int32_t *line
= s
->i_linebuf
;
334 for (lev
= 0; lev
< s
->ndeclevels
; lev
++) {
335 int lh
= s
->linelen
[lev
][0],
336 lv
= s
->linelen
[lev
][1],
344 for (lp
= 0; lp
< lv
; lp
++) {
346 // copy with interleaving
347 for (i
= mh
; i
< lh
; i
+= 2, j
++)
348 l
[i
] = t
[w
* lp
+ j
];
349 for (i
= 1 - mh
; i
< lh
; i
+= 2, j
++)
350 l
[i
] = t
[w
* lp
+ j
];
352 sr_1d53(line
, mh
, mh
+ lh
);
354 for (i
= 0; i
< lh
; i
++)
355 t
[w
* lp
+ i
] = l
[i
];
360 for (lp
= 0; lp
< lh
; lp
++) {
362 // copy with interleaving
363 for (i
= mv
; i
< lv
; i
+= 2, j
++)
364 l
[i
] = t
[w
* j
+ lp
];
365 for (i
= 1 - mv
; i
< lv
; i
+= 2, j
++)
366 l
[i
] = t
[w
* j
+ lp
];
368 sr_1d53(line
, mv
, mv
+ lv
);
370 for (i
= 0; i
< lv
; i
++)
371 t
[w
* i
+ lp
] = l
[i
];
376 static void sr_1d97_float(float *p
, int i0
, int i1
)
388 extend97_float(p
, i0
, i1
);
390 for (i
= (i0
>> 1) - 1; i
< (i1
>> 1) + 2; i
++)
391 p
[2 * i
] -= F_LFTG_DELTA
* (p
[2 * i
- 1] + p
[2 * i
+ 1]);
393 for (i
= (i0
>> 1) - 1; i
< (i1
>> 1) + 1; i
++)
394 p
[2 * i
+ 1] -= F_LFTG_GAMMA
* (p
[2 * i
] + p
[2 * i
+ 2]);
396 for (i
= (i0
>> 1); i
< (i1
>> 1) + 1; i
++)
397 p
[2 * i
] += F_LFTG_BETA
* (p
[2 * i
- 1] + p
[2 * i
+ 1]);
399 for (i
= (i0
>> 1); i
< (i1
>> 1); i
++)
400 p
[2 * i
+ 1] += F_LFTG_ALPHA
* (p
[2 * i
] + p
[2 * i
+ 2]);
403 static void dwt_decode97_float(DWTContext
*s
, float *t
)
406 int w
= s
->linelen
[s
->ndeclevels
- 1][0];
407 float *line
= s
->f_linebuf
;
409 /* position at index O of line range [0-5,w+5] cf. extend function */
412 for (lev
= 0; lev
< s
->ndeclevels
; lev
++) {
413 int lh
= s
->linelen
[lev
][0],
414 lv
= s
->linelen
[lev
][1],
421 for (lp
= 0; lp
< lv
; lp
++) {
423 // copy with interleaving
424 for (i
= mh
; i
< lh
; i
+= 2, j
++)
425 l
[i
] = data
[w
* lp
+ j
];
426 for (i
= 1 - mh
; i
< lh
; i
+= 2, j
++)
427 l
[i
] = data
[w
* lp
+ j
];
429 sr_1d97_float(line
, mh
, mh
+ lh
);
431 for (i
= 0; i
< lh
; i
++)
432 data
[w
* lp
+ i
] = l
[i
];
437 for (lp
= 0; lp
< lh
; lp
++) {
439 // copy with interleaving
440 for (i
= mv
; i
< lv
; i
+= 2, j
++)
441 l
[i
] = data
[w
* j
+ lp
];
442 for (i
= 1 - mv
; i
< lv
; i
+= 2, j
++)
443 l
[i
] = data
[w
* j
+ lp
];
445 sr_1d97_float(line
, mv
, mv
+ lv
);
447 for (i
= 0; i
< lv
; i
++)
448 data
[w
* i
+ lp
] = l
[i
];
453 static void sr_1d97_int(int32_t *p
, int i0
, int i1
)
459 p
[1] = (p
[1] * I_LFTG_K
+ (1<<16)) >> 17;
461 p
[0] = (p
[0] * I_LFTG_X
+ (1<<15)) >> 16;
465 extend97_int(p
, i0
, i1
);
467 for (i
= (i0
>> 1) - 1; i
< (i1
>> 1) + 2; i
++)
468 p
[2 * i
] -= (I_LFTG_DELTA
* (p
[2 * i
- 1] + (int64_t)p
[2 * i
+ 1]) + (1 << 15)) >> 16;
470 for (i
= (i0
>> 1) - 1; i
< (i1
>> 1) + 1; i
++)
471 p
[2 * i
+ 1] -= (I_LFTG_GAMMA
* (p
[2 * i
] + (int64_t)p
[2 * i
+ 2]) + (1 << 15)) >> 16;
473 for (i
= (i0
>> 1); i
< (i1
>> 1) + 1; i
++)
474 p
[2 * i
] += (I_LFTG_BETA
* (p
[2 * i
- 1] + (int64_t)p
[2 * i
+ 1]) + (1 << 15)) >> 16;
476 for (i
= (i0
>> 1); i
< (i1
>> 1); i
++) {
477 const int64_t sum
= p
[2 * i
] + (int64_t) p
[2 * i
+ 2];
479 p
[2 * i
+ 1] += (I_LFTG_ALPHA_PRIME
* sum
+ (1 << 15)) >> 16;
483 static void dwt_decode97_int(DWTContext
*s
, int32_t *t
)
486 int w
= s
->linelen
[s
->ndeclevels
- 1][0];
487 int h
= s
->linelen
[s
->ndeclevels
- 1][1];
489 int32_t *line
= s
->i_linebuf
;
491 /* position at index O of line range [0-5,w+5] cf. extend function */
494 for (lev
= 0; lev
< s
->ndeclevels
; lev
++) {
495 int lh
= s
->linelen
[lev
][0],
496 lv
= s
->linelen
[lev
][1],
503 for (lp
= 0; lp
< lv
; lp
++) {
506 for (i
= mh
; i
< lh
; i
+= 2, j
++)
507 l
[i
] = data
[w
* lp
+ j
];
508 for (i
= 1 - mh
; i
< lh
; i
+= 2, j
++)
509 l
[i
] = data
[w
* lp
+ j
];
511 sr_1d97_int(line
, mh
, mh
+ lh
);
513 for (i
= 0; i
< lh
; i
++)
514 data
[w
* lp
+ i
] = l
[i
];
519 for (lp
= 0; lp
< lh
; lp
++) {
522 for (i
= mv
; i
< lv
; i
+= 2, j
++)
523 l
[i
] = data
[w
* j
+ lp
];
524 for (i
= 1 - mv
; i
< lv
; i
+= 2, j
++)
525 l
[i
] = data
[w
* j
+ lp
];
527 sr_1d97_int(line
, mv
, mv
+ lv
);
529 for (i
= 0; i
< lv
; i
++)
530 data
[w
* i
+ lp
] = l
[i
];
534 for (i
= 0; i
< w
* h
; i
++)
535 // We shift down by `I_PRESHIFT` because the input coefficients `datap[]` were shifted up by `I_PRESHIFT` to secure the precision
536 data
[i
] = (int32_t)(data
[i
] + ((1LL<<(I_PRESHIFT
))>>1)) >> (I_PRESHIFT
);
539 int ff_jpeg2000_dwt_init(DWTContext
*s
, int border
[2][2],
540 int decomp_levels
, int type
)
542 int i
, j
, lev
= decomp_levels
, maxlen
,
545 s
->ndeclevels
= decomp_levels
;
548 for (i
= 0; i
< 2; i
++)
549 for (j
= 0; j
< 2; j
++)
550 b
[i
][j
] = border
[i
][j
];
552 maxlen
= FFMAX(b
[0][1] - b
[0][0],
555 for (i
= 0; i
< 2; i
++) {
556 s
->linelen
[lev
][i
] = b
[i
][1] - b
[i
][0];
557 s
->mod
[lev
][i
] = b
[i
][0] & 1;
558 for (j
= 0; j
< 2; j
++)
559 b
[i
][j
] = (b
[i
][j
] + 1) >> 1;
563 s
->f_linebuf
= av_malloc_array((maxlen
+ 12), sizeof(*s
->f_linebuf
));
565 return AVERROR(ENOMEM
);
568 s
->i_linebuf
= av_malloc_array((maxlen
+ 12), sizeof(*s
->i_linebuf
));
570 return AVERROR(ENOMEM
);
573 s
->i_linebuf
= av_malloc_array((maxlen
+ 6), sizeof(*s
->i_linebuf
));
575 return AVERROR(ENOMEM
);
583 int ff_dwt_encode(DWTContext
*s
, void *t
)
585 if (s
->ndeclevels
== 0)
590 dwt_encode97_float(s
, t
); break;
592 dwt_encode97_int(s
, t
); break;
594 dwt_encode53(s
, t
); break;
601 int ff_dwt_decode(DWTContext
*s
, void *t
)
603 if (s
->ndeclevels
== 0)
608 dwt_decode97_float(s
, t
);
611 dwt_decode97_int(s
, t
);
622 void ff_dwt_destroy(DWTContext
*s
)
624 av_freep(&s
->f_linebuf
);
625 av_freep(&s
->i_linebuf
);