Commit | Line | Data |
---|---|---|
c81a7063 NB |
1 | /* |
2 | * JPEG 2000 encoder and decoder common functions | |
3 | * Copyright (c) 2007 Kamil Nowosad | |
4 | * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com> | |
5 | * | |
6 | * This file is part of Libav. | |
7 | * | |
8 | * Libav 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. | |
12 | * | |
13 | * Libav 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. | |
17 | * | |
18 | * You should have received a copy of the GNU Lesser General Public | |
19 | * License along with Libav; if not, write to the Free Software | |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 | */ | |
22 | ||
23 | /** | |
24 | * @file | |
25 | * JPEG 2000 image encoder and decoder common functions | |
26 | */ | |
27 | ||
28 | #include "libavutil/common.h" | |
29 | #include "libavutil/mem.h" | |
30 | #include "avcodec.h" | |
31 | #include "jpeg2000.h" | |
32 | ||
33 | #define SHL(a, n) ((n) >= 0 ? (a) << (n) : (a) >> -(n)) | |
34 | ||
35 | /* tag tree routines */ | |
36 | ||
37 | /* allocate the memory for tag tree */ | |
38 | static int32_t tag_tree_size(uint16_t w, uint16_t h) | |
39 | { | |
40 | uint32_t res = 0; | |
41 | while (w > 1 || h > 1) { | |
42 | res += w * h; | |
43 | if (res + 1 >= INT32_MAX) | |
44 | return -1; | |
45 | w = (w + 1) >> 1; | |
46 | h = (h + 1) >> 1; | |
47 | } | |
48 | return (int32_t)(res + 1); | |
49 | } | |
50 | ||
51 | static Jpeg2000TgtNode *ff_jpeg2000_tag_tree_init(int w, int h) | |
52 | { | |
53 | int pw = w, ph = h; | |
54 | Jpeg2000TgtNode *res, *t, *t2; | |
55 | int32_t tt_size; | |
56 | ||
57 | tt_size = tag_tree_size(w, h); | |
58 | if (tt_size == -1) | |
59 | return NULL; | |
60 | ||
61 | t = res = av_mallocz_array(tt_size, sizeof(*t)); | |
62 | if (!res) | |
63 | return NULL; | |
64 | ||
65 | while (w > 1 || h > 1) { | |
66 | int i, j; | |
67 | pw = w; | |
68 | ph = h; | |
69 | ||
70 | w = (w + 1) >> 1; | |
71 | h = (h + 1) >> 1; | |
72 | t2 = t + pw * ph; | |
73 | ||
74 | for (i = 0; i < ph; i++) | |
75 | for (j = 0; j < pw; j++) | |
76 | t[i * pw + j].parent = &t2[(i >> 1) * w + (j >> 1)]; | |
77 | ||
78 | t = t2; | |
79 | } | |
80 | t[0].parent = NULL; | |
81 | return res; | |
82 | } | |
83 | ||
84 | uint8_t ff_jpeg2000_sigctxno_lut[256][4]; | |
85 | ||
86 | static int getsigctxno(int flag, int bandno) | |
87 | { | |
88 | int h, v, d; | |
89 | ||
90 | h = ((flag & JPEG2000_T1_SIG_E) ? 1 : 0) + | |
91 | ((flag & JPEG2000_T1_SIG_W) ? 1 : 0); | |
92 | v = ((flag & JPEG2000_T1_SIG_N) ? 1 : 0) + | |
93 | ((flag & JPEG2000_T1_SIG_S) ? 1 : 0); | |
94 | d = ((flag & JPEG2000_T1_SIG_NE) ? 1 : 0) + | |
95 | ((flag & JPEG2000_T1_SIG_NW) ? 1 : 0) + | |
96 | ((flag & JPEG2000_T1_SIG_SE) ? 1 : 0) + | |
97 | ((flag & JPEG2000_T1_SIG_SW) ? 1 : 0); | |
98 | if (bandno < 3) { | |
99 | if (bandno == 1) | |
100 | FFSWAP(int, h, v); | |
101 | if (h == 2) | |
102 | return 8; | |
103 | if (h == 1) { | |
104 | if (v >= 1) | |
105 | return 7; | |
106 | if (d >= 1) | |
107 | return 6; | |
108 | return 5; | |
109 | } | |
110 | if (v == 2) | |
111 | return 4; | |
112 | if (v == 1) | |
113 | return 3; | |
114 | if (d >= 2) | |
115 | return 2; | |
116 | if (d == 1) | |
117 | return 1; | |
c81a7063 NB |
118 | } else { |
119 | if (d >= 3) | |
120 | return 8; | |
121 | if (d == 2) { | |
122 | if (h + v >= 1) | |
123 | return 7; | |
124 | return 6; | |
125 | } | |
126 | if (d == 1) { | |
127 | if (h + v >= 2) | |
128 | return 5; | |
129 | if (h + v == 1) | |
130 | return 4; | |
131 | return 3; | |
132 | } | |
133 | if (h + v >= 2) | |
134 | return 2; | |
135 | if (h + v == 1) | |
136 | return 1; | |
c81a7063 NB |
137 | } |
138 | return 0; | |
139 | } | |
140 | ||
141 | uint8_t ff_jpeg2000_sgnctxno_lut[16][16], ff_jpeg2000_xorbit_lut[16][16]; | |
142 | ||
143 | static const int contribtab[3][3] = { { 0, -1, 1 }, { -1, -1, 0 }, { 1, 0, 1 } }; | |
144 | static const int ctxlbltab[3][3] = { { 13, 12, 11 }, { 10, 9, 10 }, { 11, 12, 13 } }; | |
145 | static const int xorbittab[3][3] = { { 1, 1, 1 }, { 1, 0, 0 }, { 0, 0, 0 } }; | |
146 | ||
147 | static int getsgnctxno(int flag, uint8_t *xorbit) | |
148 | { | |
149 | int vcontrib, hcontrib; | |
150 | ||
151 | hcontrib = contribtab[flag & JPEG2000_T1_SIG_E ? flag & JPEG2000_T1_SGN_E ? 1 : 2 : 0] | |
152 | [flag & JPEG2000_T1_SIG_W ? flag & JPEG2000_T1_SGN_W ? 1 : 2 : 0] + 1; | |
153 | vcontrib = contribtab[flag & JPEG2000_T1_SIG_S ? flag & JPEG2000_T1_SGN_S ? 1 : 2 : 0] | |
154 | [flag & JPEG2000_T1_SIG_N ? flag & JPEG2000_T1_SGN_N ? 1 : 2 : 0] + 1; | |
155 | *xorbit = xorbittab[hcontrib][vcontrib]; | |
156 | ||
157 | return ctxlbltab[hcontrib][vcontrib]; | |
158 | } | |
159 | ||
160 | void ff_jpeg2000_init_tier1_luts(void) | |
161 | { | |
162 | int i, j; | |
163 | for (i = 0; i < 256; i++) | |
164 | for (j = 0; j < 4; j++) | |
165 | ff_jpeg2000_sigctxno_lut[i][j] = getsigctxno(i, j); | |
166 | for (i = 0; i < 16; i++) | |
167 | for (j = 0; j < 16; j++) | |
168 | ff_jpeg2000_sgnctxno_lut[i][j] = | |
169 | getsgnctxno(i + (j << 8), &ff_jpeg2000_xorbit_lut[i][j]); | |
170 | } | |
171 | ||
172 | void ff_jpeg2000_set_significance(Jpeg2000T1Context *t1, int x, int y, | |
173 | int negative) | |
174 | { | |
175 | x++; | |
176 | y++; | |
177 | t1->flags[y][x] |= JPEG2000_T1_SIG; | |
178 | if (negative) { | |
179 | t1->flags[y][x + 1] |= JPEG2000_T1_SIG_W | JPEG2000_T1_SGN_W; | |
180 | t1->flags[y][x - 1] |= JPEG2000_T1_SIG_E | JPEG2000_T1_SGN_E; | |
181 | t1->flags[y + 1][x] |= JPEG2000_T1_SIG_N | JPEG2000_T1_SGN_N; | |
182 | t1->flags[y - 1][x] |= JPEG2000_T1_SIG_S | JPEG2000_T1_SGN_S; | |
183 | } else { | |
184 | t1->flags[y][x + 1] |= JPEG2000_T1_SIG_W; | |
185 | t1->flags[y][x - 1] |= JPEG2000_T1_SIG_E; | |
186 | t1->flags[y + 1][x] |= JPEG2000_T1_SIG_N; | |
187 | t1->flags[y - 1][x] |= JPEG2000_T1_SIG_S; | |
188 | } | |
189 | t1->flags[y + 1][x + 1] |= JPEG2000_T1_SIG_NW; | |
190 | t1->flags[y + 1][x - 1] |= JPEG2000_T1_SIG_NE; | |
191 | t1->flags[y - 1][x + 1] |= JPEG2000_T1_SIG_SW; | |
192 | t1->flags[y - 1][x - 1] |= JPEG2000_T1_SIG_SE; | |
193 | } | |
194 | ||
195 | static const uint8_t lut_gain[2][4] = { { 0, 0, 0, 0 }, { 0, 1, 1, 2 } }; | |
196 | ||
197 | int ff_jpeg2000_init_component(Jpeg2000Component *comp, | |
198 | Jpeg2000CodingStyle *codsty, | |
199 | Jpeg2000QuantStyle *qntsty, | |
200 | int cbps, int dx, int dy, | |
201 | AVCodecContext *avctx) | |
202 | { | |
203 | uint8_t log2_band_prec_width, log2_band_prec_height; | |
204 | int reslevelno, bandno, gbandno = 0, ret, i, j; | |
205 | uint32_t csize = 1; | |
206 | ||
78962d3d MN |
207 | if (!codsty->nreslevels2decode) { |
208 | av_log(avctx, AV_LOG_ERROR, "nreslevels2decode uninitialized\n"); | |
209 | return AVERROR_INVALIDDATA; | |
210 | } | |
211 | ||
c81a7063 NB |
212 | if (ret = ff_jpeg2000_dwt_init(&comp->dwt, comp->coord, |
213 | codsty->nreslevels2decode - 1, | |
214 | codsty->transform)) | |
215 | return ret; | |
216 | // component size comp->coord is uint16_t so ir cannot overflow | |
217 | csize = (comp->coord[0][1] - comp->coord[0][0]) * | |
218 | (comp->coord[1][1] - comp->coord[1][0]); | |
219 | ||
220 | comp->data = av_malloc_array(csize, sizeof(*comp->data)); | |
221 | if (!comp->data) | |
222 | return AVERROR(ENOMEM); | |
223 | comp->reslevel = av_malloc_array(codsty->nreslevels, sizeof(*comp->reslevel)); | |
224 | if (!comp->reslevel) | |
225 | return AVERROR(ENOMEM); | |
226 | /* LOOP on resolution levels */ | |
227 | for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) { | |
228 | int declvl = codsty->nreslevels - reslevelno; // N_L -r see ISO/IEC 15444-1:2002 B.5 | |
229 | Jpeg2000ResLevel *reslevel = comp->reslevel + reslevelno; | |
230 | ||
231 | /* Compute borders for each resolution level. | |
232 | * Computation of trx_0, trx_1, try_0 and try_1. | |
233 | * see ISO/IEC 15444-1:2002 eq. B.5 and B-14 */ | |
234 | for (i = 0; i < 2; i++) | |
235 | for (j = 0; j < 2; j++) | |
236 | reslevel->coord[i][j] = | |
237 | ff_jpeg2000_ceildivpow2(comp->coord_o[i][j], declvl - 1); | |
238 | // update precincts size: 2^n value | |
239 | reslevel->log2_prec_width = codsty->log2_prec_widths[reslevelno]; | |
240 | reslevel->log2_prec_height = codsty->log2_prec_heights[reslevelno]; | |
241 | ||
242 | /* Number of bands for each resolution level */ | |
243 | if (reslevelno == 0) | |
244 | reslevel->nbands = 1; | |
245 | else | |
246 | reslevel->nbands = 3; | |
247 | ||
248 | /* Number of precincts wich span the tile for resolution level reslevelno | |
249 | * see B.6 in ISO/IEC 15444-1:2002 eq. B-16 | |
250 | * num_precincts_x = |- trx_1 / 2 ^ log2_prec_width) -| - (trx_0 / 2 ^ log2_prec_width) | |
251 | * num_precincts_y = |- try_1 / 2 ^ log2_prec_width) -| - (try_0 / 2 ^ log2_prec_width) | |
252 | * for Dcinema profiles in JPEG 2000 | |
253 | * num_precincts_x = |- trx_1 / 2 ^ log2_prec_width) -| | |
254 | * num_precincts_y = |- try_1 / 2 ^ log2_prec_width) -| */ | |
255 | if (reslevel->coord[0][1] == reslevel->coord[0][0]) | |
256 | reslevel->num_precincts_x = 0; | |
257 | else | |
258 | reslevel->num_precincts_x = | |
259 | ff_jpeg2000_ceildivpow2(reslevel->coord[0][1], | |
260 | reslevel->log2_prec_width) - | |
261 | (reslevel->coord[0][0] >> reslevel->log2_prec_width); | |
262 | ||
263 | if (reslevel->coord[1][1] == reslevel->coord[1][0]) | |
264 | reslevel->num_precincts_y = 0; | |
265 | else | |
266 | reslevel->num_precincts_y = | |
267 | ff_jpeg2000_ceildivpow2(reslevel->coord[1][1], | |
268 | reslevel->log2_prec_height) - | |
269 | (reslevel->coord[1][0] >> reslevel->log2_prec_height); | |
270 | ||
271 | reslevel->band = av_malloc_array(reslevel->nbands, sizeof(*reslevel->band)); | |
272 | if (!reslevel->band) | |
273 | return AVERROR(ENOMEM); | |
274 | ||
275 | for (bandno = 0; bandno < reslevel->nbands; bandno++, gbandno++) { | |
276 | Jpeg2000Band *band = reslevel->band + bandno; | |
277 | int cblkno, precno; | |
278 | int nb_precincts; | |
279 | ||
280 | /* TODO: Implementation of quantization step not finished, | |
281 | * see ISO/IEC 15444-1:2002 E.1 and A.6.4. */ | |
282 | switch (qntsty->quantsty) { | |
283 | uint8_t gain; | |
284 | int numbps; | |
285 | case JPEG2000_QSTY_NONE: | |
286 | /* TODO: to verify. No quantization in this case */ | |
287 | numbps = cbps + | |
4cbd5ed1 | 288 | lut_gain[codsty->transform][bandno + (reslevelno > 0)]; |
c81a7063 NB |
289 | band->stepsize = (float)SHL(2048 + qntsty->mant[gbandno], |
290 | 2 + numbps - qntsty->expn[gbandno]); | |
291 | break; | |
292 | case JPEG2000_QSTY_SI: | |
293 | /*TODO: Compute formula to implement. */ | |
294 | band->stepsize = (float) (1 << 13); | |
295 | break; | |
296 | case JPEG2000_QSTY_SE: | |
297 | /* Exponent quantization step. | |
298 | * Formula: | |
299 | * delta_b = 2 ^ (R_b - expn_b) * (1 + (mant_b / 2 ^ 11)) | |
300 | * R_b = R_I + log2 (gain_b ) | |
301 | * see ISO/IEC 15444-1:2002 E.1.1 eqn. E-3 and E-4 */ | |
302 | /* TODO/WARN: value of log2 (gain_b ) not taken into account | |
303 | * but it works (compared to OpenJPEG). Why? | |
304 | * Further investigation needed. */ | |
305 | gain = cbps; | |
306 | band->stepsize = pow(2.0, gain - qntsty->expn[gbandno]); | |
307 | band->stepsize *= (float)qntsty->mant[gbandno] / 2048.0 + 1.0; | |
308 | /* FIXME: In openjepg code stespize = stepsize * 0.5. Why? | |
309 | * If not set output of entropic decoder is not correct. */ | |
310 | band->stepsize *= 0.5; | |
311 | break; | |
312 | default: | |
313 | band->stepsize = 0; | |
314 | av_log(avctx, AV_LOG_ERROR, "Unknown quantization format\n"); | |
315 | break; | |
316 | } | |
317 | /* BITEXACT computing case --> convert to int */ | |
318 | if (avctx->flags & CODEC_FLAG_BITEXACT) | |
319 | band->stepsize = (int32_t)(band->stepsize * (1 << 16)); | |
320 | ||
321 | /* computation of tbx_0, tbx_1, tby_0, tby_1 | |
322 | * see ISO/IEC 15444-1:2002 B.5 eq. B-15 and tbl B.1 | |
323 | * codeblock width and height is computed for | |
324 | * DCI JPEG 2000 codeblock_width = codeblock_width = 32 = 2 ^ 5 */ | |
325 | if (reslevelno == 0) { | |
326 | /* for reslevelno = 0, only one band, x0_b = y0_b = 0 */ | |
327 | for (i = 0; i < 2; i++) | |
328 | for (j = 0; j < 2; j++) | |
329 | band->coord[i][j] = | |
330 | ff_jpeg2000_ceildivpow2(comp->coord_o[i][j], | |
331 | declvl - 1); | |
332 | ||
333 | log2_band_prec_width = reslevel->log2_prec_width; | |
334 | log2_band_prec_height = reslevel->log2_prec_height; | |
335 | /* see ISO/IEC 15444-1:2002 eq. B-17 and eq. B-15 */ | |
336 | band->log2_cblk_width = FFMIN(codsty->log2_cblk_width, | |
337 | reslevel->log2_prec_width); | |
338 | band->log2_cblk_height = FFMIN(codsty->log2_cblk_height, | |
339 | reslevel->log2_prec_height); | |
340 | } else { | |
341 | /* 3 bands x0_b = 1 y0_b = 0; x0_b = 0 y0_b = 1; x0_b = y0_b = 1 */ | |
342 | /* x0_b and y0_b are computed with ((bandno + 1 >> i) & 1) */ | |
343 | for (i = 0; i < 2; i++) | |
344 | for (j = 0; j < 2; j++) | |
345 | /* Formula example for tbx_0 = ceildiv((tcx_0 - 2 ^ (declvl - 1) * x0_b) / declvl) */ | |
346 | band->coord[i][j] = | |
347 | ff_jpeg2000_ceildivpow2(comp->coord_o[i][j] - | |
348 | (((bandno + 1 >> i) & 1) << declvl - 1), | |
349 | declvl); | |
350 | /* TODO: Manage case of 3 band offsets here or | |
351 | * in coding/decoding function? */ | |
352 | ||
353 | /* see ISO/IEC 15444-1:2002 eq. B-17 and eq. B-15 */ | |
354 | band->log2_cblk_width = FFMIN(codsty->log2_cblk_width, | |
355 | reslevel->log2_prec_width - 1); | |
356 | band->log2_cblk_height = FFMIN(codsty->log2_cblk_height, | |
357 | reslevel->log2_prec_height - 1); | |
358 | ||
359 | log2_band_prec_width = reslevel->log2_prec_width - 1; | |
360 | log2_band_prec_height = reslevel->log2_prec_height - 1; | |
361 | } | |
362 | ||
363 | band->prec = av_malloc_array(reslevel->num_precincts_x * | |
364 | reslevel->num_precincts_y, | |
365 | sizeof(*band->prec)); | |
366 | if (!band->prec) | |
367 | return AVERROR(ENOMEM); | |
368 | ||
369 | nb_precincts = reslevel->num_precincts_x * reslevel->num_precincts_y; | |
370 | ||
371 | for (precno = 0; precno < nb_precincts; precno++) { | |
372 | Jpeg2000Prec *prec = band->prec + precno; | |
373 | ||
374 | /* TODO: Explain formula for JPEG200 DCINEMA. */ | |
375 | /* TODO: Verify with previous count of codeblocks per band */ | |
376 | ||
377 | /* Compute P_x0 */ | |
378 | prec->coord[0][0] = (precno % reslevel->num_precincts_x) * | |
379 | (1 << log2_band_prec_width); | |
380 | prec->coord[0][0] = FFMAX(prec->coord[0][0], band->coord[0][0]); | |
381 | ||
382 | /* Compute P_y0 */ | |
383 | prec->coord[1][0] = (precno / reslevel->num_precincts_x) * | |
384 | (1 << log2_band_prec_height); | |
385 | prec->coord[1][0] = FFMAX(prec->coord[1][0], band->coord[1][0]); | |
386 | ||
387 | /* Compute P_x1 */ | |
388 | prec->coord[0][1] = prec->coord[0][0] + | |
389 | (1 << log2_band_prec_width); | |
390 | prec->coord[0][1] = FFMIN(prec->coord[0][1], band->coord[0][1]); | |
391 | ||
392 | /* Compute P_y1 */ | |
393 | prec->coord[1][1] = prec->coord[1][0] + | |
394 | (1 << log2_band_prec_height); | |
395 | prec->coord[1][1] = FFMIN(prec->coord[1][1], band->coord[1][1]); | |
396 | ||
397 | prec->nb_codeblocks_width = | |
398 | ff_jpeg2000_ceildivpow2(prec->coord[0][1] - | |
399 | prec->coord[0][0], | |
400 | band->log2_cblk_width); | |
401 | prec->nb_codeblocks_height = | |
402 | ff_jpeg2000_ceildivpow2(prec->coord[1][1] - | |
403 | prec->coord[1][0], | |
404 | band->log2_cblk_height); | |
405 | ||
406 | /* Tag trees initialization */ | |
407 | prec->cblkincl = | |
408 | ff_jpeg2000_tag_tree_init(prec->nb_codeblocks_width, | |
409 | prec->nb_codeblocks_height); | |
410 | if (!prec->cblkincl) | |
411 | return AVERROR(ENOMEM); | |
412 | ||
413 | prec->zerobits = | |
414 | ff_jpeg2000_tag_tree_init(prec->nb_codeblocks_width, | |
415 | prec->nb_codeblocks_height); | |
416 | if (!prec->zerobits) | |
417 | return AVERROR(ENOMEM); | |
418 | ||
b44925ae MN |
419 | prec->cblk = av_mallocz_array(prec->nb_codeblocks_width * |
420 | prec->nb_codeblocks_height, | |
421 | sizeof(*prec->cblk)); | |
c81a7063 NB |
422 | if (!prec->cblk) |
423 | return AVERROR(ENOMEM); | |
424 | for (cblkno = 0; cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height; cblkno++) { | |
425 | Jpeg2000Cblk *cblk = prec->cblk + cblkno; | |
426 | uint16_t Cx0, Cy0; | |
427 | ||
428 | /* Compute coordinates of codeblocks */ | |
429 | /* Compute Cx0*/ | |
430 | Cx0 = (prec->coord[0][0] >> band->log2_cblk_width) << band->log2_cblk_width; | |
431 | Cx0 = Cx0 + ((cblkno % prec->nb_codeblocks_width) << band->log2_cblk_width); | |
432 | cblk->coord[0][0] = FFMAX(Cx0, prec->coord[0][0]); | |
433 | ||
434 | /* Compute Cy0*/ | |
435 | Cy0 = (prec->coord[1][0] >> band->log2_cblk_height) << band->log2_cblk_height; | |
436 | Cy0 = Cy0 + ((cblkno / prec->nb_codeblocks_width) << band->log2_cblk_height); | |
437 | cblk->coord[1][0] = FFMAX(Cy0, prec->coord[1][0]); | |
438 | ||
439 | /* Compute Cx1 */ | |
440 | cblk->coord[0][1] = FFMIN(Cx0 + (1 << band->log2_cblk_width), | |
441 | prec->coord[0][1]); | |
442 | ||
443 | /* Compute Cy1 */ | |
444 | cblk->coord[1][1] = FFMIN(Cy0 + (1 << band->log2_cblk_height), | |
445 | prec->coord[1][1]); | |
4e11b155 MN |
446 | /* Update code-blocks coordinates according sub-band position */ |
447 | if ((bandno + !!reslevelno) & 1) { | |
448 | cblk->coord[0][0] += comp->reslevel[reslevelno-1].coord[0][1] - | |
449 | comp->reslevel[reslevelno-1].coord[0][0]; | |
450 | cblk->coord[0][1] += comp->reslevel[reslevelno-1].coord[0][1] - | |
451 | comp->reslevel[reslevelno-1].coord[0][0]; | |
452 | } | |
453 | if ((bandno + !!reslevelno) & 2) { | |
454 | cblk->coord[1][0] += comp->reslevel[reslevelno-1].coord[1][1] - | |
455 | comp->reslevel[reslevelno-1].coord[1][0]; | |
456 | cblk->coord[1][1] += comp->reslevel[reslevelno-1].coord[1][1] - | |
457 | comp->reslevel[reslevelno-1].coord[1][0]; | |
458 | } | |
459 | ||
c81a7063 NB |
460 | cblk->zero = 0; |
461 | cblk->lblock = 3; | |
462 | cblk->length = 0; | |
463 | cblk->lengthinc = 0; | |
464 | cblk->npasses = 0; | |
465 | } | |
466 | } | |
467 | } | |
468 | } | |
469 | return 0; | |
470 | } | |
471 | ||
472 | void ff_jpeg2000_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty) | |
473 | { | |
474 | int reslevelno, bandno, precno; | |
475 | for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) { | |
476 | Jpeg2000ResLevel *reslevel = comp->reslevel + reslevelno; | |
477 | ||
478 | for (bandno = 0; bandno < reslevel->nbands; bandno++) { | |
479 | Jpeg2000Band *band = reslevel->band + bandno; | |
480 | for (precno = 0; precno < reslevel->num_precincts_x * reslevel->num_precincts_y; precno++) { | |
481 | Jpeg2000Prec *prec = band->prec + precno; | |
482 | av_freep(&prec->zerobits); | |
483 | av_freep(&prec->cblkincl); | |
484 | av_freep(&prec->cblk); | |
485 | } | |
486 | ||
487 | av_freep(&band->prec); | |
488 | } | |
489 | av_freep(&reslevel->band); | |
490 | } | |
491 | ||
492 | ff_dwt_destroy(&comp->dwt); | |
493 | av_freep(&comp->reslevel); | |
494 | av_freep(&comp->data); | |
495 | } |