28 #include "libavutil/common.h"
29 #include "libavutil/mem.h"
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
39 #define F_LFTG_K 1.230174104914001f
40 #define F_LFTG_X 1.625732422f
47 #define I_LFTG_ALPHA 103949
48 #define I_LFTG_BETA 3472
49 #define I_LFTG_GAMMA 57862
50 #define I_LFTG_DELTA 29066
51 #define I_LFTG_K 80621
52 #define I_LFTG_X 106544
55 static inline void extend53(
int *p,
int i0,
int i1)
57 p[i0 - 1] = p[i0 + 1];
59 p[i0 - 2] = p[i0 + 2];
60 p[i1 + 1] = p[i1 - 3];
67 for (i = 1; i <= 4; i++) {
68 p[i0 - i] = p[i0 + i];
69 p[i1 + i - 1] = p[i1 - i - 1];
77 for (i = 1; i <= 4; i++) {
78 p[i0 - i] = p[i0 + i];
79 p[i1 + i - 1] = p[i1 - i - 1];
83 static void sr_1d53(
int *p,
int i0,
int i1)
92 for (i = i0 / 2; i < i1 / 2 + 1; i++)
93 p[2 * i] -= (p[2 * i - 1] + p[2 * i + 1] + 2) >> 2;
94 for (i = i0 / 2; i < i1 / 2; i++)
95 p[2 * i + 1] += (p[2 * i] + p[2 * i + 2]) >> 1;
115 for (lp = 0; lp < lv; lp++) {
118 for (i = mh; i < lh; i += 2, j++)
119 l[i] = t[w * lp + j];
120 for (i = 1 - mh; i < lh; i += 2, j++)
121 l[i] = t[w * lp + j];
125 for (i = 0; i < lh; i++)
126 t[w * lp + i] = l[i];
131 for (lp = 0; lp < lh; lp++) {
134 for (i = mv; i < lv; i += 2, j++)
135 l[i] = t[w * j + lp];
136 for (i = 1 - mv; i < lv; i += 2, j++)
137 l[i] = t[w * j + lp];
141 for (i = 0; i < lv; i++)
142 t[w * i + lp] = l[i];
156 for (i = i0 / 2 - 1; i < i1 / 2 + 2; i++)
157 p[2 * i] -=
F_LFTG_DELTA * (p[2 * i - 1] + p[2 * i + 1]);
159 for (i = i0 / 2 - 1; i < i1 / 2 + 1; i++)
160 p[2 * i + 1] -=
F_LFTG_GAMMA * (p[2 * i] + p[2 * i + 2]);
162 for (i = i0 / 2; i < i1 / 2 + 1; i++)
163 p[2 * i] +=
F_LFTG_BETA * (p[2 * i - 1] + p[2 * i + 1]);
165 for (i = i0 / 2; i < i1 / 2; i++)
166 p[2 * i + 1] +=
F_LFTG_ALPHA * (p[2 * i] + p[2 * i + 2]);
187 for (lp = 0; lp < lv; lp++) {
190 for (i = mh; i < lh; i += 2, j++)
192 for (i = 1 - mh; i < lh; i += 2, j++)
197 for (i = 0; i < lh; i++)
198 data[w * lp + i] = l[i];
203 for (lp = 0; lp < lh; lp++) {
206 for (i = mv; i < lv; i += 2, j++)
208 for (i = 1 - mv; i < lv; i += 2, j++)
213 for (i = 0; i < lv; i++)
214 data[w * i + lp] = l[i];
228 for (i = i0 / 2 - 1; i < i1 / 2 + 2; i++)
229 p[2 * i] -= (
I_LFTG_DELTA * (p[2 * i - 1] + p[2 * i + 1]) + (1 << 15)) >> 16;
231 for (i = i0 / 2 - 1; i < i1 / 2 + 1; i++)
232 p[2 * i + 1] -= (
I_LFTG_GAMMA * (p[2 * i] + p[2 * i + 2]) + (1 << 15)) >> 16;
234 for (i = i0 / 2; i < i1 / 2 + 1; i++)
235 p[2 * i] += (
I_LFTG_BETA * (p[2 * i - 1] + p[2 * i + 1]) + (1 << 15)) >> 16;
237 for (i = i0 / 2; i < i1 / 2; i++)
238 p[2 * i + 1] += (
I_LFTG_ALPHA * (p[2 * i] + p[2 * i + 2]) + (1 << 15)) >> 16;
259 for (lp = 0; lp < lv; lp++) {
262 for (i = mh; i < lh; i += 2, j++)
263 l[i] = ((data[w * lp + j] *
I_LFTG_K) + (1 << 15)) >> 16;
264 for (i = 1 - mh; i < lh; i += 2, j++)
265 l[i] = ((data[w * lp + j] *
I_LFTG_X) + (1 << 15)) >> 16;
269 for (i = 0; i < lh; i++)
270 data[w * lp + i] = l[i];
275 for (lp = 0; lp < lh; lp++) {
278 for (i = mv; i < lv; i += 2, j++)
279 l[i] = ((data[w * j + lp] *
I_LFTG_K) + (1 << 15)) >> 16;
280 for (i = 1 - mv; i < lv; i += 2, j++)
281 l[i] = ((data[w * j + lp] *
I_LFTG_X) + (1 << 15)) >> 16;
285 for (i = 0; i < lv; i++)
286 data[w * i + lp] = l[i];
292 int decomp_levels,
int type)
294 int i, j, lev = decomp_levels, maxlen,
300 for (i = 0; i < 2; i++)
301 for (j = 0; j < 2; j++)
302 b[i][j] = border[i][j];
304 maxlen =
FFMAX(b[0][1] - b[0][0],
307 for (i = 0; i < 2; i++) {
308 s->
linelen[lev][i] = b[i][1] - b[i][0];
309 s->
mod[lev][i] = b[i][0] & 1;
310 for (j = 0; j < 2; j++)
311 b[i][j] = (b[i][j] + 1) >> 1;
uint16_t linelen[FF_DWT_MAX_DECLVLS][2]
line lengths { horizontal, vertical } in consecutive decomposition levels
Discrete wavelet transform.
uint8_t ndeclevels
number of decomposition levels
static void sr_1d97_int(int32_t *p, int i0, int i1)
static void extend97_float(float *p, int i0, int i1)
uint8_t type
0 for 9/7; 1 for 5/3
static void sr_1d97_float(float *p, int i0, int i1)
void av_freep(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
int32_t * i_linebuf
int buffer used by transform
int ff_jpeg2000_dwt_init(DWTContext *s, uint16_t border[2][2], int decomp_levels, int type)
Initialize DWT.
static void dwt_decode97_int(DWTContext *s, int32_t *t)
static void dwt_decode53(DWTContext *s, int *t)
void * av_malloc(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
void ff_dwt_destroy(DWTContext *s)
static void extend53(int *p, int i0, int i1)
static const int8_t mv[256][2]
static void sr_1d53(int *p, int i0, int i1)
float * f_linebuf
float buffer used by transform
common internal api header.
int ff_dwt_decode(DWTContext *s, void *t)
uint8_t mod[FF_DWT_MAX_DECLVLS][2]
coordinates (x0, y0) of decomp. levels mod 2
static void extend97_int(int32_t *p, int i0, int i1)
static void dwt_decode97_float(DWTContext *s, float *t)