xref: /third_party/ffmpeg/libavcodec/jpeg2000.c (revision cabdff1a)
1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * JPEG 2000 encoder and decoder common functions
3cabdff1aSopenharmony_ci * Copyright (c) 2007 Kamil Nowosad
4cabdff1aSopenharmony_ci * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com>
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * This file is part of FFmpeg.
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cabdff1aSopenharmony_ci * Lesser General Public License for more details.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21cabdff1aSopenharmony_ci */
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci/**
24cabdff1aSopenharmony_ci * @file
25cabdff1aSopenharmony_ci * JPEG 2000 image encoder and decoder common functions
26cabdff1aSopenharmony_ci */
27cabdff1aSopenharmony_ci
28cabdff1aSopenharmony_ci#include "libavutil/attributes.h"
29cabdff1aSopenharmony_ci#include "libavutil/avassert.h"
30cabdff1aSopenharmony_ci#include "libavutil/common.h"
31cabdff1aSopenharmony_ci#include "libavutil/imgutils.h"
32cabdff1aSopenharmony_ci#include "libavutil/mem.h"
33cabdff1aSopenharmony_ci#include "libavutil/thread.h"
34cabdff1aSopenharmony_ci#include "avcodec.h"
35cabdff1aSopenharmony_ci#include "internal.h"
36cabdff1aSopenharmony_ci#include "jpeg2000.h"
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci#define SHL(a, n) ((n) >= 0 ? (a) << (n) : (a) >> -(n))
39cabdff1aSopenharmony_ci
40cabdff1aSopenharmony_ci/* tag tree routines */
41cabdff1aSopenharmony_ci
42cabdff1aSopenharmony_cistatic int32_t tag_tree_size(int w, int h)
43cabdff1aSopenharmony_ci{
44cabdff1aSopenharmony_ci    int64_t res = 0;
45cabdff1aSopenharmony_ci    while (w > 1 || h > 1) {
46cabdff1aSopenharmony_ci        res += w * (int64_t)h;
47cabdff1aSopenharmony_ci        av_assert0(res + 1 < INT32_MAX);
48cabdff1aSopenharmony_ci        w = (w + 1) >> 1;
49cabdff1aSopenharmony_ci        h = (h + 1) >> 1;
50cabdff1aSopenharmony_ci    }
51cabdff1aSopenharmony_ci    return (int32_t)(res + 1);
52cabdff1aSopenharmony_ci}
53cabdff1aSopenharmony_ci
54cabdff1aSopenharmony_ci/* allocate the memory for tag tree */
55cabdff1aSopenharmony_cistatic Jpeg2000TgtNode *ff_jpeg2000_tag_tree_init(int w, int h)
56cabdff1aSopenharmony_ci{
57cabdff1aSopenharmony_ci    int pw = w, ph = h;
58cabdff1aSopenharmony_ci    Jpeg2000TgtNode *res, *t, *t2;
59cabdff1aSopenharmony_ci    int32_t tt_size;
60cabdff1aSopenharmony_ci
61cabdff1aSopenharmony_ci    tt_size = tag_tree_size(w, h);
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_ci    t = res = av_calloc(tt_size, sizeof(*t));
64cabdff1aSopenharmony_ci    if (!res)
65cabdff1aSopenharmony_ci        return NULL;
66cabdff1aSopenharmony_ci
67cabdff1aSopenharmony_ci    while (w > 1 || h > 1) {
68cabdff1aSopenharmony_ci        int i, j;
69cabdff1aSopenharmony_ci        pw = w;
70cabdff1aSopenharmony_ci        ph = h;
71cabdff1aSopenharmony_ci
72cabdff1aSopenharmony_ci        w  = (w + 1) >> 1;
73cabdff1aSopenharmony_ci        h  = (h + 1) >> 1;
74cabdff1aSopenharmony_ci        t2 = t + pw * ph;
75cabdff1aSopenharmony_ci
76cabdff1aSopenharmony_ci        for (i = 0; i < ph; i++)
77cabdff1aSopenharmony_ci            for (j = 0; j < pw; j++)
78cabdff1aSopenharmony_ci                t[i * pw + j].parent = &t2[(i >> 1) * w + (j >> 1)];
79cabdff1aSopenharmony_ci
80cabdff1aSopenharmony_ci        t = t2;
81cabdff1aSopenharmony_ci    }
82cabdff1aSopenharmony_ci    t[0].parent = NULL;
83cabdff1aSopenharmony_ci    return res;
84cabdff1aSopenharmony_ci}
85cabdff1aSopenharmony_ci
86cabdff1aSopenharmony_civoid ff_tag_tree_zero(Jpeg2000TgtNode *t, int w, int h, int val)
87cabdff1aSopenharmony_ci{
88cabdff1aSopenharmony_ci    int i, siz = tag_tree_size(w, h);
89cabdff1aSopenharmony_ci
90cabdff1aSopenharmony_ci    for (i = 0; i < siz; i++) {
91cabdff1aSopenharmony_ci        t[i].val = val;
92cabdff1aSopenharmony_ci        t[i].temp_val = 0;
93cabdff1aSopenharmony_ci        t[i].vis = 0;
94cabdff1aSopenharmony_ci    }
95cabdff1aSopenharmony_ci}
96cabdff1aSopenharmony_ci
97cabdff1aSopenharmony_ciuint8_t ff_jpeg2000_sigctxno_lut[256][4];
98cabdff1aSopenharmony_ci
99cabdff1aSopenharmony_cistatic int getsigctxno(int flag, int bandno)
100cabdff1aSopenharmony_ci{
101cabdff1aSopenharmony_ci    int h, v, d;
102cabdff1aSopenharmony_ci
103cabdff1aSopenharmony_ci    h = ((flag & JPEG2000_T1_SIG_E)  ? 1 : 0) +
104cabdff1aSopenharmony_ci        ((flag & JPEG2000_T1_SIG_W)  ? 1 : 0);
105cabdff1aSopenharmony_ci    v = ((flag & JPEG2000_T1_SIG_N)  ? 1 : 0) +
106cabdff1aSopenharmony_ci        ((flag & JPEG2000_T1_SIG_S)  ? 1 : 0);
107cabdff1aSopenharmony_ci    d = ((flag & JPEG2000_T1_SIG_NE) ? 1 : 0) +
108cabdff1aSopenharmony_ci        ((flag & JPEG2000_T1_SIG_NW) ? 1 : 0) +
109cabdff1aSopenharmony_ci        ((flag & JPEG2000_T1_SIG_SE) ? 1 : 0) +
110cabdff1aSopenharmony_ci        ((flag & JPEG2000_T1_SIG_SW) ? 1 : 0);
111cabdff1aSopenharmony_ci
112cabdff1aSopenharmony_ci    if (bandno < 3) {
113cabdff1aSopenharmony_ci        if (bandno == 1)
114cabdff1aSopenharmony_ci            FFSWAP(int, h, v);
115cabdff1aSopenharmony_ci        if (h == 2) return 8;
116cabdff1aSopenharmony_ci        if (h == 1) {
117cabdff1aSopenharmony_ci            if (v >= 1) return 7;
118cabdff1aSopenharmony_ci            if (d >= 1) return 6;
119cabdff1aSopenharmony_ci            return 5;
120cabdff1aSopenharmony_ci        }
121cabdff1aSopenharmony_ci        if (v == 2) return 4;
122cabdff1aSopenharmony_ci        if (v == 1) return 3;
123cabdff1aSopenharmony_ci        if (d >= 2) return 2;
124cabdff1aSopenharmony_ci        if (d == 1) return 1;
125cabdff1aSopenharmony_ci    } else {
126cabdff1aSopenharmony_ci        if (d >= 3) return 8;
127cabdff1aSopenharmony_ci        if (d == 2) {
128cabdff1aSopenharmony_ci            if (h+v >= 1) return 7;
129cabdff1aSopenharmony_ci            return 6;
130cabdff1aSopenharmony_ci        }
131cabdff1aSopenharmony_ci        if (d == 1) {
132cabdff1aSopenharmony_ci            if (h+v >= 2) return 5;
133cabdff1aSopenharmony_ci            if (h+v == 1) return 4;
134cabdff1aSopenharmony_ci            return 3;
135cabdff1aSopenharmony_ci        }
136cabdff1aSopenharmony_ci        if (h+v >= 2) return 2;
137cabdff1aSopenharmony_ci        if (h+v == 1) return 1;
138cabdff1aSopenharmony_ci    }
139cabdff1aSopenharmony_ci    return 0;
140cabdff1aSopenharmony_ci}
141cabdff1aSopenharmony_ci
142cabdff1aSopenharmony_ciuint8_t ff_jpeg2000_sgnctxno_lut[16][16], ff_jpeg2000_xorbit_lut[16][16];
143cabdff1aSopenharmony_ci
144cabdff1aSopenharmony_cistatic const int contribtab[3][3] = { {  0, -1,  1 }, { -1, -1,  0 }, {  1,  0,  1 } };
145cabdff1aSopenharmony_cistatic const int  ctxlbltab[3][3] = { { 13, 12, 11 }, { 10,  9, 10 }, { 11, 12, 13 } };
146cabdff1aSopenharmony_cistatic const int  xorbittab[3][3] = { {  1,  1,  1 }, {  1,  0,  0 }, {  0,  0,  0 } };
147cabdff1aSopenharmony_ci
148cabdff1aSopenharmony_cistatic int getsgnctxno(int flag, uint8_t *xorbit)
149cabdff1aSopenharmony_ci{
150cabdff1aSopenharmony_ci    int vcontrib, hcontrib;
151cabdff1aSopenharmony_ci
152cabdff1aSopenharmony_ci    hcontrib = contribtab[flag & JPEG2000_T1_SIG_E ? flag & JPEG2000_T1_SGN_E ? 1 : 2 : 0]
153cabdff1aSopenharmony_ci                         [flag & JPEG2000_T1_SIG_W ? flag & JPEG2000_T1_SGN_W ? 1 : 2 : 0] + 1;
154cabdff1aSopenharmony_ci    vcontrib = contribtab[flag & JPEG2000_T1_SIG_S ? flag & JPEG2000_T1_SGN_S ? 1 : 2 : 0]
155cabdff1aSopenharmony_ci                         [flag & JPEG2000_T1_SIG_N ? flag & JPEG2000_T1_SGN_N ? 1 : 2 : 0] + 1;
156cabdff1aSopenharmony_ci    *xorbit = xorbittab[hcontrib][vcontrib];
157cabdff1aSopenharmony_ci
158cabdff1aSopenharmony_ci    return ctxlbltab[hcontrib][vcontrib];
159cabdff1aSopenharmony_ci}
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_cistatic void av_cold jpeg2000_init_tier1_luts(void)
162cabdff1aSopenharmony_ci{
163cabdff1aSopenharmony_ci    int i, j;
164cabdff1aSopenharmony_ci    for (i = 0; i < 256; i++)
165cabdff1aSopenharmony_ci        for (j = 0; j < 4; j++)
166cabdff1aSopenharmony_ci            ff_jpeg2000_sigctxno_lut[i][j] = getsigctxno(i, j);
167cabdff1aSopenharmony_ci    for (i = 0; i < 16; i++)
168cabdff1aSopenharmony_ci        for (j = 0; j < 16; j++)
169cabdff1aSopenharmony_ci            ff_jpeg2000_sgnctxno_lut[i][j] =
170cabdff1aSopenharmony_ci                getsgnctxno(i + (j << 8), &ff_jpeg2000_xorbit_lut[i][j]);
171cabdff1aSopenharmony_ci}
172cabdff1aSopenharmony_ci
173cabdff1aSopenharmony_civoid av_cold ff_jpeg2000_init_tier1_luts(void)
174cabdff1aSopenharmony_ci{
175cabdff1aSopenharmony_ci    static AVOnce init_static_once = AV_ONCE_INIT;
176cabdff1aSopenharmony_ci    ff_thread_once(&init_static_once, jpeg2000_init_tier1_luts);
177cabdff1aSopenharmony_ci}
178cabdff1aSopenharmony_ci
179cabdff1aSopenharmony_civoid ff_jpeg2000_set_significance(Jpeg2000T1Context *t1, int x, int y,
180cabdff1aSopenharmony_ci                                  int negative)
181cabdff1aSopenharmony_ci{
182cabdff1aSopenharmony_ci    x++;
183cabdff1aSopenharmony_ci    y++;
184cabdff1aSopenharmony_ci    t1->flags[(y) * t1->stride + x] |= JPEG2000_T1_SIG;
185cabdff1aSopenharmony_ci    if (negative) {
186cabdff1aSopenharmony_ci        t1->flags[(y) * t1->stride + x + 1] |= JPEG2000_T1_SIG_W | JPEG2000_T1_SGN_W;
187cabdff1aSopenharmony_ci        t1->flags[(y) * t1->stride + x - 1] |= JPEG2000_T1_SIG_E | JPEG2000_T1_SGN_E;
188cabdff1aSopenharmony_ci        t1->flags[(y + 1) * t1->stride + x] |= JPEG2000_T1_SIG_N | JPEG2000_T1_SGN_N;
189cabdff1aSopenharmony_ci        t1->flags[(y - 1) * t1->stride + x] |= JPEG2000_T1_SIG_S | JPEG2000_T1_SGN_S;
190cabdff1aSopenharmony_ci    } else {
191cabdff1aSopenharmony_ci        t1->flags[(y) * t1->stride + x + 1] |= JPEG2000_T1_SIG_W;
192cabdff1aSopenharmony_ci        t1->flags[(y) * t1->stride + x - 1] |= JPEG2000_T1_SIG_E;
193cabdff1aSopenharmony_ci        t1->flags[(y + 1) * t1->stride + x] |= JPEG2000_T1_SIG_N;
194cabdff1aSopenharmony_ci        t1->flags[(y - 1) * t1->stride + x] |= JPEG2000_T1_SIG_S;
195cabdff1aSopenharmony_ci    }
196cabdff1aSopenharmony_ci    t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_SIG_NW;
197cabdff1aSopenharmony_ci    t1->flags[(y + 1) * t1->stride + x - 1] |= JPEG2000_T1_SIG_NE;
198cabdff1aSopenharmony_ci    t1->flags[(y - 1) * t1->stride + x + 1] |= JPEG2000_T1_SIG_SW;
199cabdff1aSopenharmony_ci    t1->flags[(y - 1) * t1->stride + x - 1] |= JPEG2000_T1_SIG_SE;
200cabdff1aSopenharmony_ci}
201cabdff1aSopenharmony_ci
202cabdff1aSopenharmony_ci// static const uint8_t lut_gain[2][4] = { { 0, 0, 0, 0 }, { 0, 1, 1, 2 } }; (unused)
203cabdff1aSopenharmony_ci
204cabdff1aSopenharmony_cistatic void init_band_stepsize(AVCodecContext *avctx,
205cabdff1aSopenharmony_ci                               Jpeg2000Band *band,
206cabdff1aSopenharmony_ci                               Jpeg2000CodingStyle *codsty,
207cabdff1aSopenharmony_ci                               Jpeg2000QuantStyle *qntsty,
208cabdff1aSopenharmony_ci                               int bandno, int gbandno, int reslevelno,
209cabdff1aSopenharmony_ci                               int cbps)
210cabdff1aSopenharmony_ci{
211cabdff1aSopenharmony_ci    /* TODO: Implementation of quantization step not finished,
212cabdff1aSopenharmony_ci     * see ISO/IEC 15444-1:2002 E.1 and A.6.4. */
213cabdff1aSopenharmony_ci    switch (qntsty->quantsty) {
214cabdff1aSopenharmony_ci        uint8_t gain;
215cabdff1aSopenharmony_ci    case JPEG2000_QSTY_NONE:
216cabdff1aSopenharmony_ci        /* TODO: to verify. No quantization in this case */
217cabdff1aSopenharmony_ci        band->f_stepsize = 1;
218cabdff1aSopenharmony_ci        break;
219cabdff1aSopenharmony_ci    case JPEG2000_QSTY_SI:
220cabdff1aSopenharmony_ci        /*TODO: Compute formula to implement. */
221cabdff1aSopenharmony_ci//         numbps = cbps +
222cabdff1aSopenharmony_ci//                  lut_gain[codsty->transform == FF_DWT53][bandno + (reslevelno > 0)];
223cabdff1aSopenharmony_ci//         band->f_stepsize = SHL(2048 + qntsty->mant[gbandno],
224cabdff1aSopenharmony_ci//                                2 + numbps - qntsty->expn[gbandno]);
225cabdff1aSopenharmony_ci//         break;
226cabdff1aSopenharmony_ci    case JPEG2000_QSTY_SE:
227cabdff1aSopenharmony_ci        /* Exponent quantization step.
228cabdff1aSopenharmony_ci         * Formula:
229cabdff1aSopenharmony_ci         * delta_b = 2 ^ (R_b - expn_b) * (1 + (mant_b / 2 ^ 11))
230cabdff1aSopenharmony_ci         * R_b = R_I + log2 (gain_b )
231cabdff1aSopenharmony_ci         * see ISO/IEC 15444-1:2002 E.1.1 eqn. E-3 and E-4 */
232cabdff1aSopenharmony_ci        gain            = cbps;
233cabdff1aSopenharmony_ci        band->f_stepsize  = ff_exp2fi(gain - qntsty->expn[gbandno]);
234cabdff1aSopenharmony_ci        band->f_stepsize *= qntsty->mant[gbandno] / 2048.0 + 1.0;
235cabdff1aSopenharmony_ci        break;
236cabdff1aSopenharmony_ci    default:
237cabdff1aSopenharmony_ci        band->f_stepsize = 0;
238cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Unknown quantization format\n");
239cabdff1aSopenharmony_ci        break;
240cabdff1aSopenharmony_ci    }
241cabdff1aSopenharmony_ci    if (codsty->transform != FF_DWT53) {
242cabdff1aSopenharmony_ci        int lband = 0;
243cabdff1aSopenharmony_ci        switch (bandno + (reslevelno > 0)) {
244cabdff1aSopenharmony_ci            case 1:
245cabdff1aSopenharmony_ci            case 2:
246cabdff1aSopenharmony_ci                band->f_stepsize *= F_LFTG_X * 2;
247cabdff1aSopenharmony_ci                lband = 1;
248cabdff1aSopenharmony_ci                break;
249cabdff1aSopenharmony_ci            case 3:
250cabdff1aSopenharmony_ci                band->f_stepsize *= F_LFTG_X * F_LFTG_X * 4;
251cabdff1aSopenharmony_ci                break;
252cabdff1aSopenharmony_ci        }
253cabdff1aSopenharmony_ci        if (codsty->transform == FF_DWT97) {
254cabdff1aSopenharmony_ci            band->f_stepsize *= pow(F_LFTG_K, 2*(codsty->nreslevels2decode - reslevelno) + lband - 2);
255cabdff1aSopenharmony_ci        }
256cabdff1aSopenharmony_ci    }
257cabdff1aSopenharmony_ci
258cabdff1aSopenharmony_ci    if (band->f_stepsize > (INT_MAX >> 15)) {
259cabdff1aSopenharmony_ci        band->f_stepsize = 0;
260cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "stepsize out of range\n");
261cabdff1aSopenharmony_ci    }
262cabdff1aSopenharmony_ci
263cabdff1aSopenharmony_ci    band->i_stepsize = band->f_stepsize * (1 << 15);
264cabdff1aSopenharmony_ci
265cabdff1aSopenharmony_ci    /* FIXME: In OpenJPEG code stepsize = stepsize * 0.5. Why?
266cabdff1aSopenharmony_ci     * If not set output of entropic decoder is not correct. */
267cabdff1aSopenharmony_ci    if (!av_codec_is_encoder(avctx->codec))
268cabdff1aSopenharmony_ci        band->f_stepsize *= 0.5;
269cabdff1aSopenharmony_ci}
270cabdff1aSopenharmony_ci
271cabdff1aSopenharmony_cistatic int init_prec(AVCodecContext *avctx,
272cabdff1aSopenharmony_ci                     Jpeg2000Band *band,
273cabdff1aSopenharmony_ci                     Jpeg2000ResLevel *reslevel,
274cabdff1aSopenharmony_ci                     Jpeg2000Component *comp,
275cabdff1aSopenharmony_ci                     Jpeg2000CodingStyle *codsty,
276cabdff1aSopenharmony_ci                     int precno, int bandno, int reslevelno,
277cabdff1aSopenharmony_ci                     int log2_band_prec_width,
278cabdff1aSopenharmony_ci                     int log2_band_prec_height)
279cabdff1aSopenharmony_ci{
280cabdff1aSopenharmony_ci    Jpeg2000Prec *prec = band->prec + precno;
281cabdff1aSopenharmony_ci    int nb_codeblocks, cblkno;
282cabdff1aSopenharmony_ci
283cabdff1aSopenharmony_ci    prec->decoded_layers = 0;
284cabdff1aSopenharmony_ci
285cabdff1aSopenharmony_ci    /* TODO: Explain formula for JPEG200 DCINEMA. */
286cabdff1aSopenharmony_ci    /* TODO: Verify with previous count of codeblocks per band */
287cabdff1aSopenharmony_ci
288cabdff1aSopenharmony_ci    /* Compute P_x0 */
289cabdff1aSopenharmony_ci    prec->coord[0][0] = ((reslevel->coord[0][0] >> reslevel->log2_prec_width) + precno % reslevel->num_precincts_x) *
290cabdff1aSopenharmony_ci                        (1 << log2_band_prec_width);
291cabdff1aSopenharmony_ci
292cabdff1aSopenharmony_ci    /* Compute P_y0 */
293cabdff1aSopenharmony_ci    prec->coord[1][0] = ((reslevel->coord[1][0] >> reslevel->log2_prec_height) + precno / reslevel->num_precincts_x) *
294cabdff1aSopenharmony_ci                        (1 << log2_band_prec_height);
295cabdff1aSopenharmony_ci
296cabdff1aSopenharmony_ci    /* Compute P_x1 */
297cabdff1aSopenharmony_ci    prec->coord[0][1] = prec->coord[0][0] +
298cabdff1aSopenharmony_ci                        (1 << log2_band_prec_width);
299cabdff1aSopenharmony_ci    prec->coord[0][0] = FFMAX(prec->coord[0][0], band->coord[0][0]);
300cabdff1aSopenharmony_ci    prec->coord[0][1] = FFMIN(prec->coord[0][1], band->coord[0][1]);
301cabdff1aSopenharmony_ci
302cabdff1aSopenharmony_ci    /* Compute P_y1 */
303cabdff1aSopenharmony_ci    prec->coord[1][1] = prec->coord[1][0] +
304cabdff1aSopenharmony_ci                        (1 << log2_band_prec_height);
305cabdff1aSopenharmony_ci    prec->coord[1][0] = FFMAX(prec->coord[1][0], band->coord[1][0]);
306cabdff1aSopenharmony_ci    prec->coord[1][1] = FFMIN(prec->coord[1][1], band->coord[1][1]);
307cabdff1aSopenharmony_ci
308cabdff1aSopenharmony_ci    prec->nb_codeblocks_width =
309cabdff1aSopenharmony_ci        ff_jpeg2000_ceildivpow2(prec->coord[0][1],
310cabdff1aSopenharmony_ci                                band->log2_cblk_width)
311cabdff1aSopenharmony_ci        - (prec->coord[0][0] >> band->log2_cblk_width);
312cabdff1aSopenharmony_ci    prec->nb_codeblocks_height =
313cabdff1aSopenharmony_ci        ff_jpeg2000_ceildivpow2(prec->coord[1][1],
314cabdff1aSopenharmony_ci                                band->log2_cblk_height)
315cabdff1aSopenharmony_ci        - (prec->coord[1][0] >> band->log2_cblk_height);
316cabdff1aSopenharmony_ci
317cabdff1aSopenharmony_ci
318cabdff1aSopenharmony_ci    /* Tag trees initialization */
319cabdff1aSopenharmony_ci    prec->cblkincl =
320cabdff1aSopenharmony_ci        ff_jpeg2000_tag_tree_init(prec->nb_codeblocks_width,
321cabdff1aSopenharmony_ci                                  prec->nb_codeblocks_height);
322cabdff1aSopenharmony_ci    if (!prec->cblkincl)
323cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
324cabdff1aSopenharmony_ci
325cabdff1aSopenharmony_ci    prec->zerobits =
326cabdff1aSopenharmony_ci        ff_jpeg2000_tag_tree_init(prec->nb_codeblocks_width,
327cabdff1aSopenharmony_ci                                  prec->nb_codeblocks_height);
328cabdff1aSopenharmony_ci    if (!prec->zerobits)
329cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
330cabdff1aSopenharmony_ci
331cabdff1aSopenharmony_ci    if (prec->nb_codeblocks_width * (uint64_t)prec->nb_codeblocks_height > INT_MAX) {
332cabdff1aSopenharmony_ci        prec->cblk = NULL;
333cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
334cabdff1aSopenharmony_ci    }
335cabdff1aSopenharmony_ci    nb_codeblocks = prec->nb_codeblocks_width * prec->nb_codeblocks_height;
336cabdff1aSopenharmony_ci    prec->cblk = av_calloc(nb_codeblocks, sizeof(*prec->cblk));
337cabdff1aSopenharmony_ci    if (!prec->cblk)
338cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
339cabdff1aSopenharmony_ci    for (cblkno = 0; cblkno < nb_codeblocks; cblkno++) {
340cabdff1aSopenharmony_ci        Jpeg2000Cblk *cblk = prec->cblk + cblkno;
341cabdff1aSopenharmony_ci        int Cx0, Cy0;
342cabdff1aSopenharmony_ci
343cabdff1aSopenharmony_ci        /* Compute coordinates of codeblocks */
344cabdff1aSopenharmony_ci        /* Compute Cx0*/
345cabdff1aSopenharmony_ci        Cx0 = ((prec->coord[0][0]) >> band->log2_cblk_width) << band->log2_cblk_width;
346cabdff1aSopenharmony_ci        Cx0 = Cx0 + ((cblkno % prec->nb_codeblocks_width)  << band->log2_cblk_width);
347cabdff1aSopenharmony_ci        cblk->coord[0][0] = FFMAX(Cx0, prec->coord[0][0]);
348cabdff1aSopenharmony_ci
349cabdff1aSopenharmony_ci        /* Compute Cy0*/
350cabdff1aSopenharmony_ci        Cy0 = ((prec->coord[1][0]) >> band->log2_cblk_height) << band->log2_cblk_height;
351cabdff1aSopenharmony_ci        Cy0 = Cy0 + ((cblkno / prec->nb_codeblocks_width)   << band->log2_cblk_height);
352cabdff1aSopenharmony_ci        cblk->coord[1][0] = FFMAX(Cy0, prec->coord[1][0]);
353cabdff1aSopenharmony_ci
354cabdff1aSopenharmony_ci        /* Compute Cx1 */
355cabdff1aSopenharmony_ci        cblk->coord[0][1] = FFMIN(Cx0 + (1 << band->log2_cblk_width),
356cabdff1aSopenharmony_ci                                  prec->coord[0][1]);
357cabdff1aSopenharmony_ci
358cabdff1aSopenharmony_ci        /* Compute Cy1 */
359cabdff1aSopenharmony_ci        cblk->coord[1][1] = FFMIN(Cy0 + (1 << band->log2_cblk_height),
360cabdff1aSopenharmony_ci                                  prec->coord[1][1]);
361cabdff1aSopenharmony_ci        /* Update code-blocks coordinates according sub-band position */
362cabdff1aSopenharmony_ci        if ((bandno + !!reslevelno) & 1) {
363cabdff1aSopenharmony_ci            cblk->coord[0][0] += comp->reslevel[reslevelno-1].coord[0][1] -
364cabdff1aSopenharmony_ci                                 comp->reslevel[reslevelno-1].coord[0][0];
365cabdff1aSopenharmony_ci            cblk->coord[0][1] += comp->reslevel[reslevelno-1].coord[0][1] -
366cabdff1aSopenharmony_ci                                 comp->reslevel[reslevelno-1].coord[0][0];
367cabdff1aSopenharmony_ci        }
368cabdff1aSopenharmony_ci        if ((bandno + !!reslevelno) & 2) {
369cabdff1aSopenharmony_ci            cblk->coord[1][0] += comp->reslevel[reslevelno-1].coord[1][1] -
370cabdff1aSopenharmony_ci                                 comp->reslevel[reslevelno-1].coord[1][0];
371cabdff1aSopenharmony_ci            cblk->coord[1][1] += comp->reslevel[reslevelno-1].coord[1][1] -
372cabdff1aSopenharmony_ci                                 comp->reslevel[reslevelno-1].coord[1][0];
373cabdff1aSopenharmony_ci        }
374cabdff1aSopenharmony_ci
375cabdff1aSopenharmony_ci        cblk->lblock    = 3;
376cabdff1aSopenharmony_ci        cblk->length    = 0;
377cabdff1aSopenharmony_ci        cblk->npasses   = 0;
378cabdff1aSopenharmony_ci        if (av_codec_is_encoder(avctx->codec)) {
379cabdff1aSopenharmony_ci            cblk->layers = av_calloc(codsty->nlayers, sizeof(*cblk->layers));
380cabdff1aSopenharmony_ci            if (!cblk->layers)
381cabdff1aSopenharmony_ci                return AVERROR(ENOMEM);
382cabdff1aSopenharmony_ci        }
383cabdff1aSopenharmony_ci    }
384cabdff1aSopenharmony_ci
385cabdff1aSopenharmony_ci    return 0;
386cabdff1aSopenharmony_ci}
387cabdff1aSopenharmony_ci
388cabdff1aSopenharmony_cistatic int init_band(AVCodecContext *avctx,
389cabdff1aSopenharmony_ci                     Jpeg2000ResLevel *reslevel,
390cabdff1aSopenharmony_ci                     Jpeg2000Component *comp,
391cabdff1aSopenharmony_ci                     Jpeg2000CodingStyle *codsty,
392cabdff1aSopenharmony_ci                     Jpeg2000QuantStyle *qntsty,
393cabdff1aSopenharmony_ci                     int bandno, int gbandno, int reslevelno,
394cabdff1aSopenharmony_ci                     int cbps, int dx, int dy)
395cabdff1aSopenharmony_ci{
396cabdff1aSopenharmony_ci    Jpeg2000Band *band = reslevel->band + bandno;
397cabdff1aSopenharmony_ci    uint8_t log2_band_prec_width, log2_band_prec_height;
398cabdff1aSopenharmony_ci    int declvl = codsty->nreslevels - reslevelno;    // N_L -r see  ISO/IEC 15444-1:2002 B.5
399cabdff1aSopenharmony_ci    int precno;
400cabdff1aSopenharmony_ci    int nb_precincts;
401cabdff1aSopenharmony_ci    int i, j, ret;
402cabdff1aSopenharmony_ci
403cabdff1aSopenharmony_ci    init_band_stepsize(avctx, band, codsty, qntsty, bandno, gbandno, reslevelno, cbps);
404cabdff1aSopenharmony_ci
405cabdff1aSopenharmony_ci    /* computation of tbx_0, tbx_1, tby_0, tby_1
406cabdff1aSopenharmony_ci     * see ISO/IEC 15444-1:2002 B.5 eq. B-15 and tbl B.1
407cabdff1aSopenharmony_ci     * codeblock width and height is computed for
408cabdff1aSopenharmony_ci     * DCI JPEG 2000 codeblock_width = codeblock_width = 32 = 2 ^ 5 */
409cabdff1aSopenharmony_ci    if (reslevelno == 0) {
410cabdff1aSopenharmony_ci        /* for reslevelno = 0, only one band, x0_b = y0_b = 0 */
411cabdff1aSopenharmony_ci        for (i = 0; i < 2; i++)
412cabdff1aSopenharmony_ci            for (j = 0; j < 2; j++)
413cabdff1aSopenharmony_ci                band->coord[i][j] =
414cabdff1aSopenharmony_ci                    ff_jpeg2000_ceildivpow2(comp->coord_o[i][j],
415cabdff1aSopenharmony_ci                                            declvl - 1);
416cabdff1aSopenharmony_ci        log2_band_prec_width  = reslevel->log2_prec_width;
417cabdff1aSopenharmony_ci        log2_band_prec_height = reslevel->log2_prec_height;
418cabdff1aSopenharmony_ci        /* see ISO/IEC 15444-1:2002 eq. B-17 and eq. B-15 */
419cabdff1aSopenharmony_ci        band->log2_cblk_width  = FFMIN(codsty->log2_cblk_width,
420cabdff1aSopenharmony_ci                                       reslevel->log2_prec_width);
421cabdff1aSopenharmony_ci        band->log2_cblk_height = FFMIN(codsty->log2_cblk_height,
422cabdff1aSopenharmony_ci                                       reslevel->log2_prec_height);
423cabdff1aSopenharmony_ci    } else {
424cabdff1aSopenharmony_ci        /* 3 bands x0_b = 1 y0_b = 0; x0_b = 0 y0_b = 1; x0_b = y0_b = 1 */
425cabdff1aSopenharmony_ci        /* x0_b and y0_b are computed with ((bandno + 1 >> i) & 1) */
426cabdff1aSopenharmony_ci        for (i = 0; i < 2; i++)
427cabdff1aSopenharmony_ci            for (j = 0; j < 2; j++)
428cabdff1aSopenharmony_ci                /* Formula example for tbx_0 = ceildiv((tcx_0 - 2 ^ (declvl - 1) * x0_b) / declvl) */
429cabdff1aSopenharmony_ci                band->coord[i][j] =
430cabdff1aSopenharmony_ci                    ff_jpeg2000_ceildivpow2(comp->coord_o[i][j] -
431cabdff1aSopenharmony_ci                                            (((bandno + 1 >> i) & 1LL) << declvl - 1),
432cabdff1aSopenharmony_ci                                            declvl);
433cabdff1aSopenharmony_ci        /* TODO: Manage case of 3 band offsets here or
434cabdff1aSopenharmony_ci         * in coding/decoding function? */
435cabdff1aSopenharmony_ci
436cabdff1aSopenharmony_ci        /* see ISO/IEC 15444-1:2002 eq. B-17 and eq. B-15 */
437cabdff1aSopenharmony_ci        band->log2_cblk_width  = FFMIN(codsty->log2_cblk_width,
438cabdff1aSopenharmony_ci                                       reslevel->log2_prec_width - 1);
439cabdff1aSopenharmony_ci        band->log2_cblk_height = FFMIN(codsty->log2_cblk_height,
440cabdff1aSopenharmony_ci                                       reslevel->log2_prec_height - 1);
441cabdff1aSopenharmony_ci
442cabdff1aSopenharmony_ci        log2_band_prec_width  = reslevel->log2_prec_width  - 1;
443cabdff1aSopenharmony_ci        log2_band_prec_height = reslevel->log2_prec_height - 1;
444cabdff1aSopenharmony_ci    }
445cabdff1aSopenharmony_ci
446cabdff1aSopenharmony_ci    if (reslevel->num_precincts_x * (uint64_t)reslevel->num_precincts_y > INT_MAX) {
447cabdff1aSopenharmony_ci        band->prec = NULL;
448cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
449cabdff1aSopenharmony_ci    }
450cabdff1aSopenharmony_ci    nb_precincts = reslevel->num_precincts_x * reslevel->num_precincts_y;
451cabdff1aSopenharmony_ci    band->prec = av_calloc(nb_precincts, sizeof(*band->prec));
452cabdff1aSopenharmony_ci    if (!band->prec)
453cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
454cabdff1aSopenharmony_ci
455cabdff1aSopenharmony_ci    for (precno = 0; precno < nb_precincts; precno++) {
456cabdff1aSopenharmony_ci        ret = init_prec(avctx, band, reslevel, comp, codsty,
457cabdff1aSopenharmony_ci                        precno, bandno, reslevelno,
458cabdff1aSopenharmony_ci                        log2_band_prec_width, log2_band_prec_height);
459cabdff1aSopenharmony_ci        if (ret < 0)
460cabdff1aSopenharmony_ci            return ret;
461cabdff1aSopenharmony_ci    }
462cabdff1aSopenharmony_ci
463cabdff1aSopenharmony_ci    return 0;
464cabdff1aSopenharmony_ci}
465cabdff1aSopenharmony_ci
466cabdff1aSopenharmony_ciint ff_jpeg2000_init_component(Jpeg2000Component *comp,
467cabdff1aSopenharmony_ci                               Jpeg2000CodingStyle *codsty,
468cabdff1aSopenharmony_ci                               Jpeg2000QuantStyle *qntsty,
469cabdff1aSopenharmony_ci                               int cbps, int dx, int dy,
470cabdff1aSopenharmony_ci                               AVCodecContext *avctx)
471cabdff1aSopenharmony_ci{
472cabdff1aSopenharmony_ci    int reslevelno, bandno, gbandno = 0, ret, i, j;
473cabdff1aSopenharmony_ci    uint32_t csize;
474cabdff1aSopenharmony_ci
475cabdff1aSopenharmony_ci    if (codsty->nreslevels2decode <= 0) {
476cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "nreslevels2decode %d invalid or uninitialized\n", codsty->nreslevels2decode);
477cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
478cabdff1aSopenharmony_ci    }
479cabdff1aSopenharmony_ci
480cabdff1aSopenharmony_ci    if (ret = ff_jpeg2000_dwt_init(&comp->dwt, comp->coord,
481cabdff1aSopenharmony_ci                                   codsty->nreslevels2decode - 1,
482cabdff1aSopenharmony_ci                                   codsty->transform))
483cabdff1aSopenharmony_ci        return ret;
484cabdff1aSopenharmony_ci
485cabdff1aSopenharmony_ci    if (av_image_check_size(comp->coord[0][1] - comp->coord[0][0],
486cabdff1aSopenharmony_ci                            comp->coord[1][1] - comp->coord[1][0], 0, avctx))
487cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
488cabdff1aSopenharmony_ci    csize = (comp->coord[0][1] - comp->coord[0][0]) *
489cabdff1aSopenharmony_ci            (comp->coord[1][1] - comp->coord[1][0]);
490cabdff1aSopenharmony_ci    if (comp->coord[0][1] - comp->coord[0][0] > 32768 ||
491cabdff1aSopenharmony_ci        comp->coord[1][1] - comp->coord[1][0] > 32768) {
492cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "component size too large\n");
493cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
494cabdff1aSopenharmony_ci    }
495cabdff1aSopenharmony_ci
496cabdff1aSopenharmony_ci    if (codsty->transform == FF_DWT97) {
497cabdff1aSopenharmony_ci        csize += AV_INPUT_BUFFER_PADDING_SIZE / sizeof(*comp->f_data);
498cabdff1aSopenharmony_ci        comp->i_data = NULL;
499cabdff1aSopenharmony_ci        comp->f_data = av_calloc(csize, sizeof(*comp->f_data));
500cabdff1aSopenharmony_ci        if (!comp->f_data)
501cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
502cabdff1aSopenharmony_ci    } else {
503cabdff1aSopenharmony_ci        csize += AV_INPUT_BUFFER_PADDING_SIZE / sizeof(*comp->i_data);
504cabdff1aSopenharmony_ci        comp->f_data = NULL;
505cabdff1aSopenharmony_ci        comp->i_data = av_calloc(csize, sizeof(*comp->i_data));
506cabdff1aSopenharmony_ci        if (!comp->i_data)
507cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
508cabdff1aSopenharmony_ci    }
509cabdff1aSopenharmony_ci    comp->reslevel = av_calloc(codsty->nreslevels, sizeof(*comp->reslevel));
510cabdff1aSopenharmony_ci    if (!comp->reslevel)
511cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
512cabdff1aSopenharmony_ci    /* LOOP on resolution levels */
513cabdff1aSopenharmony_ci    for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) {
514cabdff1aSopenharmony_ci        int declvl = codsty->nreslevels - reslevelno;    // N_L -r see  ISO/IEC 15444-1:2002 B.5
515cabdff1aSopenharmony_ci        Jpeg2000ResLevel *reslevel = comp->reslevel + reslevelno;
516cabdff1aSopenharmony_ci
517cabdff1aSopenharmony_ci        /* Compute borders for each resolution level.
518cabdff1aSopenharmony_ci         * Computation of trx_0, trx_1, try_0 and try_1.
519cabdff1aSopenharmony_ci         * see ISO/IEC 15444-1:2002 eq. B.5 and B-14 */
520cabdff1aSopenharmony_ci        for (i = 0; i < 2; i++)
521cabdff1aSopenharmony_ci            for (j = 0; j < 2; j++)
522cabdff1aSopenharmony_ci                reslevel->coord[i][j] =
523cabdff1aSopenharmony_ci                    ff_jpeg2000_ceildivpow2(comp->coord_o[i][j], declvl - 1);
524cabdff1aSopenharmony_ci        // update precincts size: 2^n value
525cabdff1aSopenharmony_ci        reslevel->log2_prec_width  = codsty->log2_prec_widths[reslevelno];
526cabdff1aSopenharmony_ci        reslevel->log2_prec_height = codsty->log2_prec_heights[reslevelno];
527cabdff1aSopenharmony_ci
528cabdff1aSopenharmony_ci        /* Number of bands for each resolution level */
529cabdff1aSopenharmony_ci        if (reslevelno == 0)
530cabdff1aSopenharmony_ci            reslevel->nbands = 1;
531cabdff1aSopenharmony_ci        else
532cabdff1aSopenharmony_ci            reslevel->nbands = 3;
533cabdff1aSopenharmony_ci
534cabdff1aSopenharmony_ci        /* Number of precincts which span the tile for resolution level reslevelno
535cabdff1aSopenharmony_ci         * see B.6 in ISO/IEC 15444-1:2002 eq. B-16
536cabdff1aSopenharmony_ci         * num_precincts_x = |- trx_1 / 2 ^ log2_prec_width) -| - (trx_0 / 2 ^ log2_prec_width)
537cabdff1aSopenharmony_ci         * num_precincts_y = |- try_1 / 2 ^ log2_prec_width) -| - (try_0 / 2 ^ log2_prec_width)
538cabdff1aSopenharmony_ci         * for Dcinema profiles in JPEG 2000
539cabdff1aSopenharmony_ci         * num_precincts_x = |- trx_1 / 2 ^ log2_prec_width) -|
540cabdff1aSopenharmony_ci         * num_precincts_y = |- try_1 / 2 ^ log2_prec_width) -| */
541cabdff1aSopenharmony_ci        if (reslevel->coord[0][1] == reslevel->coord[0][0])
542cabdff1aSopenharmony_ci            reslevel->num_precincts_x = 0;
543cabdff1aSopenharmony_ci        else
544cabdff1aSopenharmony_ci            reslevel->num_precincts_x =
545cabdff1aSopenharmony_ci                ff_jpeg2000_ceildivpow2(reslevel->coord[0][1],
546cabdff1aSopenharmony_ci                                        reslevel->log2_prec_width) -
547cabdff1aSopenharmony_ci                (reslevel->coord[0][0] >> reslevel->log2_prec_width);
548cabdff1aSopenharmony_ci
549cabdff1aSopenharmony_ci        if (reslevel->coord[1][1] == reslevel->coord[1][0])
550cabdff1aSopenharmony_ci            reslevel->num_precincts_y = 0;
551cabdff1aSopenharmony_ci        else
552cabdff1aSopenharmony_ci            reslevel->num_precincts_y =
553cabdff1aSopenharmony_ci                ff_jpeg2000_ceildivpow2(reslevel->coord[1][1],
554cabdff1aSopenharmony_ci                                        reslevel->log2_prec_height) -
555cabdff1aSopenharmony_ci                (reslevel->coord[1][0] >> reslevel->log2_prec_height);
556cabdff1aSopenharmony_ci
557cabdff1aSopenharmony_ci        reslevel->band = av_calloc(reslevel->nbands, sizeof(*reslevel->band));
558cabdff1aSopenharmony_ci        if (!reslevel->band)
559cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
560cabdff1aSopenharmony_ci
561cabdff1aSopenharmony_ci        if (reslevel->num_precincts_x * (uint64_t)reslevel->num_precincts_y * reslevel->nbands > avctx->max_pixels / sizeof(*reslevel->band->prec))
562cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
563cabdff1aSopenharmony_ci
564cabdff1aSopenharmony_ci        for (bandno = 0; bandno < reslevel->nbands; bandno++, gbandno++) {
565cabdff1aSopenharmony_ci            ret = init_band(avctx, reslevel,
566cabdff1aSopenharmony_ci                            comp, codsty, qntsty,
567cabdff1aSopenharmony_ci                            bandno, gbandno, reslevelno,
568cabdff1aSopenharmony_ci                            cbps, dx, dy);
569cabdff1aSopenharmony_ci            if (ret < 0)
570cabdff1aSopenharmony_ci                return ret;
571cabdff1aSopenharmony_ci        }
572cabdff1aSopenharmony_ci    }
573cabdff1aSopenharmony_ci    return 0;
574cabdff1aSopenharmony_ci}
575cabdff1aSopenharmony_ci
576cabdff1aSopenharmony_civoid ff_jpeg2000_reinit(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty)
577cabdff1aSopenharmony_ci{
578cabdff1aSopenharmony_ci    int reslevelno, bandno, cblkno, precno;
579cabdff1aSopenharmony_ci    for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) {
580cabdff1aSopenharmony_ci        Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
581cabdff1aSopenharmony_ci        for (bandno = 0; bandno < rlevel->nbands; bandno++) {
582cabdff1aSopenharmony_ci            Jpeg2000Band *band = rlevel->band + bandno;
583cabdff1aSopenharmony_ci            for(precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++) {
584cabdff1aSopenharmony_ci                Jpeg2000Prec *prec = band->prec + precno;
585cabdff1aSopenharmony_ci                ff_tag_tree_zero(prec->zerobits, prec->nb_codeblocks_width, prec->nb_codeblocks_height, 0);
586cabdff1aSopenharmony_ci                ff_tag_tree_zero(prec->cblkincl, prec->nb_codeblocks_width, prec->nb_codeblocks_height, 0);
587cabdff1aSopenharmony_ci                for (cblkno = 0; cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height; cblkno++) {
588cabdff1aSopenharmony_ci                    Jpeg2000Cblk *cblk = prec->cblk + cblkno;
589cabdff1aSopenharmony_ci                    cblk->length = 0;
590cabdff1aSopenharmony_ci                    cblk->lblock = 3;
591cabdff1aSopenharmony_ci                }
592cabdff1aSopenharmony_ci            }
593cabdff1aSopenharmony_ci        }
594cabdff1aSopenharmony_ci    }
595cabdff1aSopenharmony_ci}
596cabdff1aSopenharmony_ci
597cabdff1aSopenharmony_civoid ff_jpeg2000_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty)
598cabdff1aSopenharmony_ci{
599cabdff1aSopenharmony_ci    int reslevelno, bandno, precno;
600cabdff1aSopenharmony_ci    for (reslevelno = 0;
601cabdff1aSopenharmony_ci         comp->reslevel && reslevelno < codsty->nreslevels;
602cabdff1aSopenharmony_ci         reslevelno++) {
603cabdff1aSopenharmony_ci        Jpeg2000ResLevel *reslevel;
604cabdff1aSopenharmony_ci
605cabdff1aSopenharmony_ci        if (!comp->reslevel)
606cabdff1aSopenharmony_ci            continue;
607cabdff1aSopenharmony_ci
608cabdff1aSopenharmony_ci        reslevel = comp->reslevel + reslevelno;
609cabdff1aSopenharmony_ci        for (bandno = 0; bandno < reslevel->nbands; bandno++) {
610cabdff1aSopenharmony_ci            Jpeg2000Band *band;
611cabdff1aSopenharmony_ci
612cabdff1aSopenharmony_ci            if (!reslevel->band)
613cabdff1aSopenharmony_ci                continue;
614cabdff1aSopenharmony_ci
615cabdff1aSopenharmony_ci            band = reslevel->band + bandno;
616cabdff1aSopenharmony_ci            for (precno = 0; precno < reslevel->num_precincts_x * reslevel->num_precincts_y; precno++) {
617cabdff1aSopenharmony_ci                if (band->prec) {
618cabdff1aSopenharmony_ci                    Jpeg2000Prec *prec = band->prec + precno;
619cabdff1aSopenharmony_ci                    int nb_code_blocks = prec->nb_codeblocks_height * prec->nb_codeblocks_width;
620cabdff1aSopenharmony_ci
621cabdff1aSopenharmony_ci                    av_freep(&prec->zerobits);
622cabdff1aSopenharmony_ci                    av_freep(&prec->cblkincl);
623cabdff1aSopenharmony_ci                    if (prec->cblk) {
624cabdff1aSopenharmony_ci                        int cblkno;
625cabdff1aSopenharmony_ci                        for (cblkno = 0; cblkno < nb_code_blocks; cblkno ++) {
626cabdff1aSopenharmony_ci                            Jpeg2000Cblk *cblk = &prec->cblk[cblkno];
627cabdff1aSopenharmony_ci                            av_freep(&cblk->data);
628cabdff1aSopenharmony_ci                            av_freep(&cblk->passes);
629cabdff1aSopenharmony_ci                            av_freep(&cblk->lengthinc);
630cabdff1aSopenharmony_ci                            av_freep(&cblk->data_start);
631cabdff1aSopenharmony_ci                            av_freep(&cblk->layers);
632cabdff1aSopenharmony_ci                        }
633cabdff1aSopenharmony_ci                        av_freep(&prec->cblk);
634cabdff1aSopenharmony_ci                    }
635cabdff1aSopenharmony_ci                }
636cabdff1aSopenharmony_ci            }
637cabdff1aSopenharmony_ci
638cabdff1aSopenharmony_ci            av_freep(&band->prec);
639cabdff1aSopenharmony_ci        }
640cabdff1aSopenharmony_ci        av_freep(&reslevel->band);
641cabdff1aSopenharmony_ci    }
642cabdff1aSopenharmony_ci
643cabdff1aSopenharmony_ci    ff_dwt_destroy(&comp->dwt);
644cabdff1aSopenharmony_ci    av_freep(&comp->reslevel);
645cabdff1aSopenharmony_ci    av_freep(&comp->i_data);
646cabdff1aSopenharmony_ci    av_freep(&comp->f_data);
647cabdff1aSopenharmony_ci}
648