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