Now only j2kdec / jpeg2000dec.c remain Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.0
| @@ -243,8 +243,8 @@ OBJS-$(CONFIG_INDEO5_DECODER) += indeo5.o ivi_common.o ivi_dsp.o | |||
| OBJS-$(CONFIG_INTERPLAY_DPCM_DECODER) += dpcm.o | |||
| OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o | |||
| OBJS-$(CONFIG_JACOSUB_DECODER) += jacosubdec.o ass.o | |||
| OBJS-$(CONFIG_J2K_DECODER) += j2kdec.o mqcdec.o mqc.o j2k.o | |||
| OBJS-$(CONFIG_J2K_ENCODER) += j2kenc.o mqcenc.o mqc.o j2k.o | |||
| OBJS-$(CONFIG_J2K_DECODER) += j2kdec.o mqcdec.o mqc.o jpeg2000.o | |||
| OBJS-$(CONFIG_J2K_ENCODER) += j2kenc.o mqcenc.o mqc.o jpeg2000.o | |||
| OBJS-$(CONFIG_JPEG2000_DECODER) += jpeg2000dec.o jpeg2000.o \ | |||
| jpeg2000dwt.o mqcdec.o mqc.o | |||
| OBJS-$(CONFIG_JPEGLS_DECODER) += jpeglsdec.o jpegls.o \ | |||
| @@ -1,497 +0,0 @@ | |||
| /* | |||
| * JPEG 2000 encoder and decoder common functions | |||
| * Copyright (c) 2007 Kamil Nowosad | |||
| * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com> | |||
| * | |||
| * This file is part of FFmpeg. | |||
| * | |||
| * FFmpeg is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 of the License, or (at your option) any later version. | |||
| * | |||
| * FFmpeg is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
| * Lesser General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU Lesser General Public | |||
| * License along with FFmpeg; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| /** | |||
| * JPEG 2000 image encoder and decoder common functions | |||
| * @file | |||
| * @author Kamil Nowosad | |||
| */ | |||
| #include "libavutil/avassert.h" | |||
| #include "libavutil/common.h" | |||
| #include "libavutil/mem.h" | |||
| #include "avcodec.h" | |||
| #include "j2k.h" | |||
| #define SHL(a, n) ((n) >= 0 ? (a) << (n) : (a) >> -(n)) | |||
| /* tag tree routines */ | |||
| /* allocate the memory for tag tree */ | |||
| static int tag_tree_size(int w, int h) | |||
| { | |||
| int res = 0; | |||
| while (w > 1 || h > 1) { | |||
| res += w * h; | |||
| w = (w + 1) >> 1; | |||
| h = (h + 1) >> 1; | |||
| } | |||
| return res + 1; | |||
| } | |||
| Jpeg2000TgtNode *ff_j2k_tag_tree_init(int w, int h) | |||
| { | |||
| int pw = w, ph = h; | |||
| Jpeg2000TgtNode *res, *t, *t2; | |||
| int32_t tt_size; | |||
| tt_size = tag_tree_size(w, h); | |||
| t = res = av_mallocz_array(tt_size, sizeof(*t)); | |||
| if (!res) | |||
| return NULL; | |||
| while (w > 1 || h > 1) { | |||
| int i, j; | |||
| pw = w; | |||
| ph = h; | |||
| w = (w + 1) >> 1; | |||
| h = (h + 1) >> 1; | |||
| t2 = t + pw * ph; | |||
| for (i = 0; i < ph; i++) | |||
| for (j = 0; j < pw; j++) | |||
| t[i * pw + j].parent = &t2[(i >> 1) * w + (j >> 1)]; | |||
| t = t2; | |||
| } | |||
| t[0].parent = NULL; | |||
| return res; | |||
| } | |||
| static void tag_tree_zero(Jpeg2000TgtNode *t, int w, int h) | |||
| { | |||
| int i, siz = tag_tree_size(w, h); | |||
| for (i = 0; i < siz; i++) { | |||
| t[i].val = 0; | |||
| t[i].vis = 0; | |||
| } | |||
| } | |||
| static int getsigctxno(int flag, int bandno) | |||
| { | |||
| int h, v, d; | |||
| h = ((flag & JPEG2000_T1_SIG_E) ? 1 : 0) + | |||
| ((flag & JPEG2000_T1_SIG_W) ? 1 : 0); | |||
| v = ((flag & JPEG2000_T1_SIG_N) ? 1 : 0) + | |||
| ((flag & JPEG2000_T1_SIG_S) ? 1 : 0); | |||
| d = ((flag & JPEG2000_T1_SIG_NE) ? 1 : 0) + | |||
| ((flag & JPEG2000_T1_SIG_NW) ? 1 : 0) + | |||
| ((flag & JPEG2000_T1_SIG_SE) ? 1 : 0) + | |||
| ((flag & JPEG2000_T1_SIG_SW) ? 1 : 0); | |||
| if (bandno < 3) { | |||
| if (bandno == 1) | |||
| FFSWAP(int, h, v); | |||
| if (h == 2) return 8; | |||
| if (h == 1) { | |||
| if (v >= 1) return 7; | |||
| if (d >= 1) return 6; | |||
| return 5; | |||
| } | |||
| if (v == 2) return 4; | |||
| if (v == 1) return 3; | |||
| if (d >= 2) return 2; | |||
| if (d == 1) return 1; | |||
| } else { | |||
| if (d >= 3) return 8; | |||
| if (d == 2) { | |||
| if (h+v >= 1) return 7; | |||
| return 6; | |||
| } | |||
| if (d == 1) { | |||
| if (h+v >= 2) return 5; | |||
| if (h+v == 1) return 4; | |||
| return 3; | |||
| } | |||
| if (h+v >= 2) return 2; | |||
| if (h+v == 1) return 1; | |||
| } | |||
| return 0; | |||
| } | |||
| static const int contribtab[3][3] = { { 0, -1, 1 }, { -1, -1, 0 }, { 1, 0, 1 } }; | |||
| static const int ctxlbltab[3][3] = { { 13, 12, 11 }, { 10, 9, 10 }, { 11, 12, 13 } }; | |||
| static const int xorbittab[3][3] = { { 1, 1, 1 }, { 1, 0, 0 }, { 0, 0, 0 } }; | |||
| static int getsgnctxno(int flag, uint8_t *xorbit) | |||
| { | |||
| int vcontrib, hcontrib; | |||
| hcontrib = contribtab[flag & JPEG2000_T1_SIG_E ? flag & JPEG2000_T1_SGN_E ? 1 : 2 : 0] | |||
| [flag & JPEG2000_T1_SIG_W ? flag & JPEG2000_T1_SGN_W ? 1 : 2 : 0] + 1; | |||
| vcontrib = contribtab[flag & JPEG2000_T1_SIG_S ? flag & JPEG2000_T1_SGN_S ? 1 : 2 : 0] | |||
| [flag & JPEG2000_T1_SIG_N ? flag & JPEG2000_T1_SGN_N ? 1 : 2 : 0] + 1; | |||
| *xorbit = xorbittab[hcontrib][vcontrib]; | |||
| return ctxlbltab[hcontrib][vcontrib]; | |||
| } | |||
| void ff_j2k_set_significant(Jpeg2000T1Context *t1, int x, int y, | |||
| int negative) | |||
| { | |||
| x++; | |||
| y++; | |||
| t1->flags[y][x] |= JPEG2000_T1_SIG; | |||
| if (negative) { | |||
| t1->flags[y][x + 1] |= JPEG2000_T1_SIG_W | JPEG2000_T1_SGN_W; | |||
| t1->flags[y][x - 1] |= JPEG2000_T1_SIG_E | JPEG2000_T1_SGN_E; | |||
| t1->flags[y + 1][x] |= JPEG2000_T1_SIG_N | JPEG2000_T1_SGN_N; | |||
| t1->flags[y - 1][x] |= JPEG2000_T1_SIG_S | JPEG2000_T1_SGN_S; | |||
| } else { | |||
| t1->flags[y][x + 1] |= JPEG2000_T1_SIG_W; | |||
| t1->flags[y][x - 1] |= JPEG2000_T1_SIG_E; | |||
| t1->flags[y + 1][x] |= JPEG2000_T1_SIG_N; | |||
| t1->flags[y - 1][x] |= JPEG2000_T1_SIG_S; | |||
| } | |||
| t1->flags[y + 1][x + 1] |= JPEG2000_T1_SIG_NW; | |||
| t1->flags[y + 1][x - 1] |= JPEG2000_T1_SIG_NE; | |||
| t1->flags[y - 1][x + 1] |= JPEG2000_T1_SIG_SW; | |||
| t1->flags[y - 1][x - 1] |= JPEG2000_T1_SIG_SE; | |||
| } | |||
| static const uint8_t lut_gain[2][4] = { { 0, 0, 0, 0 }, { 0, 1, 1, 2 } }; | |||
| int ff_j2k_init_component(Jpeg2000Component *comp, | |||
| Jpeg2000CodingStyle *codsty, | |||
| Jpeg2000QuantStyle *qntsty, | |||
| int cbps, int dx, int dy, | |||
| AVCodecContext *avctx) | |||
| { | |||
| uint8_t log2_band_prec_width, log2_band_prec_height; | |||
| int reslevelno, bandno, gbandno = 0, ret, i, j, csize = 1; | |||
| if (ret=ff_jpeg2000_dwt_init(&comp->dwt, comp->coord, codsty->nreslevels2decode-1, codsty->transform)) | |||
| return ret; | |||
| for (i = 0; i < 2; i++) | |||
| csize *= comp->coord[i][1] - comp->coord[i][0]; | |||
| if (codsty->transform == FF_DWT97) { | |||
| comp->i_data = NULL; | |||
| comp->f_data = av_malloc_array(csize, sizeof(*comp->f_data)); | |||
| if (!comp->f_data) | |||
| return AVERROR(ENOMEM); | |||
| } else { | |||
| comp->f_data = NULL; | |||
| comp->i_data = av_malloc_array(csize, sizeof(*comp->i_data)); | |||
| if (!comp->i_data) | |||
| return AVERROR(ENOMEM); | |||
| } | |||
| comp->reslevel = av_malloc_array(codsty->nreslevels, sizeof(*comp->reslevel)); | |||
| if (!comp->reslevel) | |||
| return AVERROR(ENOMEM); | |||
| /* LOOP on resolution levels */ | |||
| for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) { | |||
| int declvl = codsty->nreslevels - reslevelno; // N_L -r see ISO/IEC 15444-1:2002 B.5 | |||
| Jpeg2000ResLevel *reslevel = comp->reslevel + reslevelno; | |||
| /* Compute borders for each resolution level. | |||
| * Computation of trx_0, trx_1, try_0 and try_1. | |||
| * see ISO/IEC 15444-1:2002 eq. B.5 and B-14 */ | |||
| for (i = 0; i < 2; i++) | |||
| for (j = 0; j < 2; j++) | |||
| reslevel->coord[i][j] = | |||
| ff_jpeg2000_ceildivpow2(comp->coord_o[i][j], declvl - 1); | |||
| // update precincts size: 2^n value | |||
| reslevel->log2_prec_width = codsty->log2_prec_widths[reslevelno]; | |||
| reslevel->log2_prec_height = codsty->log2_prec_heights[reslevelno]; | |||
| /* Number of bands for each resolution level */ | |||
| if (reslevelno == 0) | |||
| reslevel->nbands = 1; | |||
| else | |||
| reslevel->nbands = 3; | |||
| /* Number of precincts wich span the tile for resolution level reslevelno | |||
| * see B.6 in ISO/IEC 15444-1:2002 eq. B-16 | |||
| * num_precincts_x = |- trx_1 / 2 ^ log2_prec_width) -| - (trx_0 / 2 ^ log2_prec_width) | |||
| * num_precincts_y = |- try_1 / 2 ^ log2_prec_width) -| - (try_0 / 2 ^ log2_prec_width) | |||
| * for Dcinema profiles in JPEG 2000 | |||
| * num_precincts_x = |- trx_1 / 2 ^ log2_prec_width) -| | |||
| * num_precincts_y = |- try_1 / 2 ^ log2_prec_width) -| */ | |||
| if (reslevel->coord[0][1] == reslevel->coord[0][0]) | |||
| reslevel->num_precincts_x = 0; | |||
| else | |||
| reslevel->num_precincts_x = | |||
| ff_jpeg2000_ceildivpow2(reslevel->coord[0][1], | |||
| reslevel->log2_prec_width) - | |||
| (reslevel->coord[0][0] >> reslevel->log2_prec_width); | |||
| if (reslevel->coord[1][1] == reslevel->coord[1][0]) | |||
| reslevel->num_precincts_y = 0; | |||
| else | |||
| reslevel->num_precincts_y = | |||
| ff_jpeg2000_ceildivpow2(reslevel->coord[1][1], | |||
| reslevel->log2_prec_height) - | |||
| (reslevel->coord[1][0] >> reslevel->log2_prec_height); | |||
| reslevel->band = av_malloc_array(reslevel->nbands, sizeof(*reslevel->band)); | |||
| if (!reslevel->band) | |||
| return AVERROR(ENOMEM); | |||
| for (bandno = 0; bandno < reslevel->nbands; bandno++, gbandno++) { | |||
| Jpeg2000Band *band = reslevel->band + bandno; | |||
| int cblkno, precno; | |||
| int nb_precincts; | |||
| /* TODO: Implementation of quantization step not finished, | |||
| * see ISO/IEC 15444-1:2002 E.1 and A.6.4. */ | |||
| switch (qntsty->quantsty) { | |||
| uint8_t gain; | |||
| int numbps; | |||
| case JPEG2000_QSTY_NONE: | |||
| /* TODO: to verify. No quantization in this case */ | |||
| band->f_stepsize = 1; | |||
| break; | |||
| case JPEG2000_QSTY_SI: | |||
| /*TODO: Compute formula to implement. */ | |||
| numbps = cbps + | |||
| lut_gain[codsty->transform == FF_DWT53][bandno + (reslevelno > 0)]; | |||
| band->f_stepsize = SHL(2048 + qntsty->mant[gbandno], | |||
| 2 + numbps - qntsty->expn[gbandno]); | |||
| break; | |||
| case JPEG2000_QSTY_SE: | |||
| /* Exponent quantization step. | |||
| * Formula: | |||
| * delta_b = 2 ^ (R_b - expn_b) * (1 + (mant_b / 2 ^ 11)) | |||
| * R_b = R_I + log2 (gain_b ) | |||
| * see ISO/IEC 15444-1:2002 E.1.1 eqn. E-3 and E-4 */ | |||
| /* TODO/WARN: value of log2 (gain_b ) not taken into account | |||
| * but it works (compared to OpenJPEG). Why? | |||
| * Further investigation needed. */ | |||
| gain = cbps; | |||
| band->f_stepsize = pow(2.0, gain - qntsty->expn[gbandno]); | |||
| band->f_stepsize *= (qntsty->mant[gbandno] / 2048.0 + 1.0); | |||
| break; | |||
| default: | |||
| band->f_stepsize = 0; | |||
| av_log(avctx, AV_LOG_ERROR, "Unknown quantization format\n"); | |||
| break; | |||
| } | |||
| /* FIXME: In openjepg code stespize = stepsize * 0.5. Why? | |||
| * If not set output of entropic decoder is not correct. */ | |||
| if (!av_codec_is_encoder(avctx->codec)) | |||
| band->f_stepsize *= 0.5; | |||
| band->i_stepsize = band->f_stepsize * (1 << 16); | |||
| /* computation of tbx_0, tbx_1, tby_0, tby_1 | |||
| * see ISO/IEC 15444-1:2002 B.5 eq. B-15 and tbl B.1 | |||
| * codeblock width and height is computed for | |||
| * DCI JPEG 2000 codeblock_width = codeblock_width = 32 = 2 ^ 5 */ | |||
| if (reslevelno == 0) { | |||
| /* for reslevelno = 0, only one band, x0_b = y0_b = 0 */ | |||
| for (i = 0; i < 2; i++) | |||
| for (j = 0; j < 2; j++) | |||
| band->coord[i][j] = | |||
| ff_jpeg2000_ceildivpow2(comp->coord_o[i][j] - comp->coord_o[i][0], | |||
| declvl - 1); | |||
| log2_band_prec_width = reslevel->log2_prec_width; | |||
| log2_band_prec_height = reslevel->log2_prec_height; | |||
| /* see ISO/IEC 15444-1:2002 eq. B-17 and eq. B-15 */ | |||
| band->log2_cblk_width = FFMIN(codsty->log2_cblk_width, | |||
| reslevel->log2_prec_width); | |||
| band->log2_cblk_height = FFMIN(codsty->log2_cblk_height, | |||
| reslevel->log2_prec_height); | |||
| } else { | |||
| /* 3 bands x0_b = 1 y0_b = 0; x0_b = 0 y0_b = 1; x0_b = y0_b = 1 */ | |||
| /* x0_b and y0_b are computed with ((bandno + 1 >> i) & 1) */ | |||
| for (i = 0; i < 2; i++) | |||
| for (j = 0; j < 2; j++) | |||
| /* Formula example for tbx_0 = ceildiv((tcx_0 - 2 ^ (declvl - 1) * x0_b) / declvl) */ | |||
| band->coord[i][j] = | |||
| ff_jpeg2000_ceildivpow2(comp->coord_o[i][j] - comp->coord_o[i][0] - | |||
| (((bandno + 1 >> i) & 1) << declvl - 1), | |||
| declvl); | |||
| /* TODO: Manage case of 3 band offsets here or | |||
| * in coding/decoding function? */ | |||
| /* see ISO/IEC 15444-1:2002 eq. B-17 and eq. B-15 */ | |||
| band->log2_cblk_width = FFMIN(codsty->log2_cblk_width, | |||
| reslevel->log2_prec_width - 1); | |||
| band->log2_cblk_height = FFMIN(codsty->log2_cblk_height, | |||
| reslevel->log2_prec_height - 1); | |||
| log2_band_prec_width = reslevel->log2_prec_width - 1; | |||
| log2_band_prec_height = reslevel->log2_prec_height - 1; | |||
| } | |||
| for (j = 0; j < 2; j++) | |||
| band->coord[0][j] = ff_jpeg2000_ceildiv(band->coord[0][j], dx); | |||
| for (j = 0; j < 2; j++) | |||
| band->coord[1][j] = ff_jpeg2000_ceildiv(band->coord[1][j], dy); | |||
| band->prec = av_malloc_array(reslevel->num_precincts_x * | |||
| reslevel->num_precincts_y, | |||
| sizeof(*band->prec)); | |||
| if (!band->prec) | |||
| return AVERROR(ENOMEM); | |||
| nb_precincts = reslevel->num_precincts_x * reslevel->num_precincts_y; | |||
| for (precno = 0; precno < nb_precincts; precno++) { | |||
| Jpeg2000Prec *prec = band->prec + precno; | |||
| /* TODO: Explain formula for JPEG200 DCINEMA. */ | |||
| /* TODO: Verify with previous count of codeblocks per band */ | |||
| /* Compute P_x0 */ | |||
| prec->coord[0][0] = (precno % reslevel->num_precincts_x) * | |||
| (1 << log2_band_prec_width); | |||
| prec->coord[0][0] = FFMAX(prec->coord[0][0], band->coord[0][0]); | |||
| /* Compute P_y0 */ | |||
| prec->coord[1][0] = (precno / reslevel->num_precincts_x) * | |||
| (1 << log2_band_prec_height); | |||
| prec->coord[1][0] = FFMAX(prec->coord[1][0], band->coord[1][0]); | |||
| /* Compute P_x1 */ | |||
| prec->coord[0][1] = prec->coord[0][0] + | |||
| (1 << log2_band_prec_width); | |||
| prec->coord[0][1] = FFMIN(prec->coord[0][1], band->coord[0][1]); | |||
| /* Compute P_y1 */ | |||
| prec->coord[1][1] = prec->coord[1][0] + | |||
| (1 << log2_band_prec_height); | |||
| prec->coord[1][1] = FFMIN(prec->coord[1][1], band->coord[1][1]); | |||
| prec->nb_codeblocks_width = | |||
| ff_jpeg2000_ceildivpow2(prec->coord[0][1] - | |||
| prec->coord[0][0], | |||
| band->log2_cblk_width); | |||
| prec->nb_codeblocks_height = | |||
| ff_jpeg2000_ceildivpow2(prec->coord[1][1] - | |||
| prec->coord[1][0], | |||
| band->log2_cblk_height); | |||
| /* Tag trees initialization */ | |||
| prec->cblkincl = | |||
| ff_j2k_tag_tree_init(prec->nb_codeblocks_width, | |||
| prec->nb_codeblocks_height); | |||
| if (!prec->cblkincl) | |||
| return AVERROR(ENOMEM); | |||
| prec->zerobits = | |||
| ff_j2k_tag_tree_init(prec->nb_codeblocks_width, | |||
| prec->nb_codeblocks_height); | |||
| if (!prec->zerobits) | |||
| return AVERROR(ENOMEM); | |||
| prec->cblk = av_malloc_array(prec->nb_codeblocks_width * | |||
| prec->nb_codeblocks_height, | |||
| sizeof(*prec->cblk)); | |||
| if (!prec->cblk) | |||
| return AVERROR(ENOMEM); | |||
| for (cblkno = 0; cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height; cblkno++) { | |||
| Jpeg2000Cblk *cblk = prec->cblk + cblkno; | |||
| uint16_t Cx0, Cy0; | |||
| /* Compute coordinates of codeblocks */ | |||
| /* Compute Cx0*/ | |||
| Cx0 = (prec->coord[0][0] >> band->log2_cblk_width) << band->log2_cblk_width; | |||
| Cx0 = Cx0 + ((cblkno % prec->nb_codeblocks_width) << band->log2_cblk_width); | |||
| cblk->coord[0][0] = FFMAX(Cx0, prec->coord[0][0]); | |||
| /* Compute Cy0*/ | |||
| Cy0 = (prec->coord[1][0] >> band->log2_cblk_height) << band->log2_cblk_height; | |||
| Cy0 = Cy0 + ((cblkno / prec->nb_codeblocks_width) << band->log2_cblk_height); | |||
| cblk->coord[1][0] = FFMAX(Cy0, prec->coord[1][0]); | |||
| /* Compute Cx1 */ | |||
| cblk->coord[0][1] = FFMIN(Cx0 + (1 << band->log2_cblk_width), | |||
| prec->coord[0][1]); | |||
| /* Compute Cy1 */ | |||
| cblk->coord[1][1] = FFMIN(Cy0 + (1 << band->log2_cblk_height), | |||
| prec->coord[1][1]); | |||
| if((bandno + !!reslevelno) & 1) { | |||
| cblk->coord[0][0] += comp->reslevel[reslevelno-1].coord[0][1] - comp->reslevel[reslevelno-1].coord[0][0]; | |||
| cblk->coord[0][1] += comp->reslevel[reslevelno-1].coord[0][1] - comp->reslevel[reslevelno-1].coord[0][0]; | |||
| } | |||
| if((bandno + !!reslevelno) & 2) { | |||
| cblk->coord[1][0] += comp->reslevel[reslevelno-1].coord[1][1] - comp->reslevel[reslevelno-1].coord[1][0]; | |||
| cblk->coord[1][1] += comp->reslevel[reslevelno-1].coord[1][1] - comp->reslevel[reslevelno-1].coord[1][0]; | |||
| } | |||
| cblk->zero = 0; | |||
| cblk->lblock = 3; | |||
| cblk->length = 0; | |||
| cblk->lengthinc = 0; | |||
| cblk->npasses = 0; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return 0; | |||
| } | |||
| void ff_j2k_reinit(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty) | |||
| { | |||
| int reslevelno, bandno, cblkno, precno; | |||
| for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) { | |||
| Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno; | |||
| for (bandno = 0; bandno < rlevel->nbands; bandno++) { | |||
| Jpeg2000Band *band = rlevel->band + bandno; | |||
| for(precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++) { | |||
| Jpeg2000Prec *prec = band->prec + precno; | |||
| tag_tree_zero(prec->zerobits, prec->nb_codeblocks_width, prec->nb_codeblocks_height); | |||
| tag_tree_zero(prec->cblkincl, prec->nb_codeblocks_width, prec->nb_codeblocks_height); | |||
| for (cblkno = 0; cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height; cblkno++) { | |||
| Jpeg2000Cblk *cblk = prec->cblk + cblkno; | |||
| cblk->length = 0; | |||
| cblk->lblock = 3; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| void ff_j2k_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty) | |||
| { | |||
| int reslevelno, bandno, precno; | |||
| for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) { | |||
| Jpeg2000ResLevel *reslevel = comp->reslevel + reslevelno; | |||
| for (bandno = 0; bandno < reslevel->nbands; bandno++) { | |||
| Jpeg2000Band *band = reslevel->band + bandno; | |||
| for (precno = 0; precno < reslevel->num_precincts_x * reslevel->num_precincts_y; precno++) { | |||
| Jpeg2000Prec *prec = band->prec + precno; | |||
| av_freep(&prec->zerobits); | |||
| av_freep(&prec->cblkincl); | |||
| av_freep(&prec->cblk); | |||
| } | |||
| av_freep(&band->prec); | |||
| } | |||
| av_freep(&reslevel->band); | |||
| } | |||
| ff_dwt_destroy(&comp->dwt); | |||
| av_freep(&comp->reslevel); | |||
| av_freep(&comp->i_data); | |||
| av_freep(&comp->f_data); | |||
| } | |||
| @@ -1,264 +0,0 @@ | |||
| /* | |||
| * JPEG 2000 common defines, structures and functions | |||
| * Copyright (c) 2007 Kamil Nowosad | |||
| * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com> | |||
| * | |||
| * This file is part of FFmpeg. | |||
| * | |||
| * FFmpeg is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 of the License, or (at your option) any later version. | |||
| * | |||
| * FFmpeg is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
| * Lesser General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU Lesser General Public | |||
| * License along with FFmpeg; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #ifndef AVCODEC_J2K_H | |||
| #define AVCODEC_J2K_H | |||
| /** | |||
| * @file | |||
| * JPEG 2000 structures and defines common | |||
| * to encoder and decoder | |||
| */ | |||
| #include <stdint.h> | |||
| #include "avcodec.h" | |||
| #include "mqc.h" | |||
| #include "jpeg2000dwt.h" | |||
| enum Jpeg2000Markers { | |||
| JPEG2000_SOC = 0xff4f, // start of codestream | |||
| JPEG2000_SIZ = 0xff51, // image and tile size | |||
| JPEG2000_COD, // coding style default | |||
| JPEG2000_COC, // coding style component | |||
| JPEG2000_TLM = 0xff55, // packed packet headers, tile-part header | |||
| JPEG2000_PLM = 0xff57, // tile-part lengths | |||
| JPEG2000_PLT, // packet length, main header | |||
| JPEG2000_QCD = 0xff5c, // quantization default | |||
| JPEG2000_QCC, // quantization component | |||
| JPEG2000_RGN, // region of interest | |||
| JPEG2000_POC, // progression order change | |||
| JPEG2000_PPM, // packet length, tile-part header | |||
| JPEG2000_PPT, // packed packet headers, main header | |||
| JPEG2000_CRG = 0xff63, // component registration | |||
| JPEG2000_COM, // comment | |||
| JPEG2000_SOT = 0xff90, // start of tile-part | |||
| JPEG2000_SOP, // start of packet | |||
| JPEG2000_EPH, // end of packet header | |||
| JPEG2000_SOD, // start of data | |||
| JPEG2000_EOC = 0xffd9, // end of codestream | |||
| }; | |||
| enum Jpeg2000Quantsty { // quantization style | |||
| JPEG2000_QSTY_NONE, // no quantization | |||
| JPEG2000_QSTY_SI, // scalar derived | |||
| JPEG2000_QSTY_SE // scalar expounded | |||
| }; | |||
| #define JPEG2000_MAX_CBLKW 64 | |||
| #define JPEG2000_MAX_CBLKH 64 | |||
| #define JPEG2000_MAX_RESLEVELS 33 | |||
| // T1 flags | |||
| // flags determining significance of neighbor coefficients | |||
| #define JPEG2000_T1_SIG_N 0x0001 | |||
| #define JPEG2000_T1_SIG_E 0x0002 | |||
| #define JPEG2000_T1_SIG_W 0x0004 | |||
| #define JPEG2000_T1_SIG_S 0x0008 | |||
| #define JPEG2000_T1_SIG_NE 0x0010 | |||
| #define JPEG2000_T1_SIG_NW 0x0020 | |||
| #define JPEG2000_T1_SIG_SE 0x0040 | |||
| #define JPEG2000_T1_SIG_SW 0x0080 | |||
| #define JPEG2000_T1_SIG_NB (JPEG2000_T1_SIG_N | JPEG2000_T1_SIG_E | \ | |||
| JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_W | \ | |||
| JPEG2000_T1_SIG_NE | JPEG2000_T1_SIG_NW | \ | |||
| JPEG2000_T1_SIG_SE | JPEG2000_T1_SIG_SW) | |||
| // flags determining sign bit of neighbor coefficients | |||
| #define JPEG2000_T1_SGN_N 0x0100 | |||
| #define JPEG2000_T1_SGN_S 0x0200 | |||
| #define JPEG2000_T1_SGN_W 0x0400 | |||
| #define JPEG2000_T1_SGN_E 0x0800 | |||
| #define JPEG2000_T1_VIS 0x1000 | |||
| #define JPEG2000_T1_SIG 0x2000 | |||
| #define JPEG2000_T1_REF 0x4000 | |||
| #define JPEG2000_T1_SGN 0x8000 | |||
| // Codeblock coding styles | |||
| #define JPEG2000_CBLK_BYPASS 0x01 // Selective arithmetic coding bypass | |||
| #define JPEG2000_CBLK_RESET 0x02 // Reset context probabilities | |||
| #define JPEG2000_CBLK_TERMALL 0x04 // Terminate after each coding pass | |||
| #define JPEG2000_CBLK_VSC 0x08 // Vertical stripe causal context formation | |||
| #define JPEG2000_CBLK_PREDTERM 0x10 // Predictable termination | |||
| #define JPEG2000_CBLK_SEGSYM 0x20 // Segmentation symbols present | |||
| // Coding styles | |||
| #define JPEG2000_CSTY_PREC 0x01 // Precincts defined in coding style | |||
| #define JPEG2000_CSTY_SOP 0x02 // SOP marker present | |||
| #define JPEG2000_CSTY_EPH 0x04 // EPH marker present | |||
| // Progression orders | |||
| #define JPEG2000_PGOD_LRCP 0x00 // Layer-resolution level-component-position progression | |||
| #define JPEG2000_PGOD_RLCP 0x01 // Resolution level-layer-component-position progression | |||
| #define JPEG2000_PGOD_RPCL 0x02 // Resolution level-position-component-layer progression | |||
| #define JPEG2000_PGOD_PCRL 0x03 // Position-component-resolution level-layer progression | |||
| #define JPEG2000_PGOD_CPRL 0x04 // Component-position-resolution level-layer progression | |||
| typedef struct Jpeg2000T1Context { | |||
| int data[JPEG2000_MAX_CBLKW][JPEG2000_MAX_CBLKH]; | |||
| int flags[JPEG2000_MAX_CBLKW + 2][JPEG2000_MAX_CBLKH + 2]; | |||
| MqcState mqc; | |||
| } Jpeg2000T1Context; | |||
| typedef struct Jpeg2000TgtNode { | |||
| uint8_t val; | |||
| uint8_t vis; | |||
| struct Jpeg2000TgtNode *parent; | |||
| } Jpeg2000TgtNode; | |||
| typedef struct Jpeg2000CodingStyle { | |||
| uint8_t nreslevels; // number of resolution levels | |||
| uint8_t nreslevels2decode; // number of resolution levels to decode | |||
| uint8_t log2_cblk_width, | |||
| log2_cblk_height; // exponent of codeblock size | |||
| uint8_t transform; // DWT type | |||
| uint8_t csty; // coding style | |||
| uint8_t nlayers; // number of layers | |||
| uint8_t mct; // multiple component transformation | |||
| uint8_t cblk_style; // codeblock coding style | |||
| uint8_t prog_order; // progression order | |||
| uint8_t log2_prec_widths[JPEG2000_MAX_RESLEVELS]; // precincts size according resolution levels | |||
| uint8_t log2_prec_heights[JPEG2000_MAX_RESLEVELS]; // TODO: initialize prec_size array with 0? | |||
| } Jpeg2000CodingStyle; | |||
| typedef struct Jpeg2000QuantStyle { | |||
| uint8_t expn[32 * 3]; // quantization exponent | |||
| uint16_t mant[32 * 3]; // quantization mantissa | |||
| uint8_t quantsty; // quantization style | |||
| uint8_t nguardbits; // number of guard bits | |||
| } Jpeg2000QuantStyle; | |||
| typedef struct Jpeg2000Pass { | |||
| uint16_t rate; | |||
| int64_t disto; | |||
| } Jpeg2000Pass; | |||
| typedef struct Jpeg2000Cblk { | |||
| uint8_t npasses; | |||
| uint8_t ninclpasses; // number coding of passes included in codestream | |||
| uint8_t nonzerobits; | |||
| uint16_t length; | |||
| uint16_t lengthinc; | |||
| uint8_t lblock; | |||
| uint8_t zero; | |||
| uint8_t data[8192]; | |||
| Jpeg2000Pass passes[100]; | |||
| uint16_t coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} | |||
| } Jpeg2000Cblk; // code block | |||
| typedef struct Jpeg2000Prec { | |||
| uint16_t nb_codeblocks_width; | |||
| uint16_t nb_codeblocks_height; | |||
| Jpeg2000TgtNode *zerobits; | |||
| Jpeg2000TgtNode *cblkincl; | |||
| Jpeg2000Cblk *cblk; | |||
| uint16_t coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} | |||
| } Jpeg2000Prec; // precinct | |||
| typedef struct Jpeg2000Band { | |||
| uint16_t coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} | |||
| uint16_t log2_cblk_width, log2_cblk_height; | |||
| int i_stepsize; // quantization stepsize | |||
| float f_stepsize; // quantization stepsize | |||
| Jpeg2000Prec *prec; | |||
| } Jpeg2000Band; // subband | |||
| typedef struct Jpeg2000ResLevel { | |||
| uint8_t nbands; | |||
| uint16_t coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} | |||
| uint16_t num_precincts_x, num_precincts_y; // number of precincts in x/y direction | |||
| uint8_t log2_prec_width, log2_prec_height; // exponent of precinct size | |||
| Jpeg2000Band *band; | |||
| } Jpeg2000ResLevel; // resolution level | |||
| typedef struct Jpeg2000Component { | |||
| Jpeg2000ResLevel *reslevel; | |||
| DWTContext dwt; | |||
| float *f_data; | |||
| int *i_data; | |||
| uint16_t coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} -- can be reduced with lowres option | |||
| uint16_t coord_o[2][2]; // border coordinates {{x0, x1}, {y0, y1}} -- original values from jpeg2000 headers | |||
| } Jpeg2000Component; | |||
| /* misc tools */ | |||
| static inline int ff_jpeg2000_ceildivpow2(int a, int b) | |||
| { | |||
| return (a + (1 << b) - 1) >> b; | |||
| } | |||
| static inline int ff_jpeg2000_ceildiv(int a, int b) | |||
| { | |||
| return (a + b - 1) / b; | |||
| } | |||
| /* tag tree routines */ | |||
| Jpeg2000TgtNode *ff_j2k_tag_tree_init(int w, int h); | |||
| /* TIER-1 routines */ | |||
| /* Set up lookup tables used in TIER-1. */ | |||
| void ff_jpeg2000_init_tier1_luts(void); | |||
| /* Update significance of a coefficient at current position (x,y) and | |||
| * for neighbors. */ | |||
| void ff_j2k_set_significant(Jpeg2000T1Context *t1, | |||
| int x, int y, int negative); | |||
| extern uint8_t ff_jpeg2000_sigctxno_lut[256][4]; | |||
| /* Get context label (number in range[0..8]) of a coefficient for significance | |||
| * propagation and cleanup coding passes. */ | |||
| static inline int ff_jpeg2000_getsigctxno(int flag, int bandno) | |||
| { | |||
| return ff_jpeg2000_sigctxno_lut[flag & 255][bandno]; | |||
| } | |||
| static const uint8_t refctxno_lut[2][2] = { { 14, 15 }, { 16, 16 } }; | |||
| /* Get context label (number in range[14..16]) of a coefficient for magnitude | |||
| * refinement pass. */ | |||
| static inline int ff_jpeg2000_getrefctxno(int flag) | |||
| { | |||
| return refctxno_lut[(flag >> 14) & 1][(flag & 255) != 0]; | |||
| } | |||
| extern uint8_t ff_jpeg2000_sgnctxno_lut[16][16]; | |||
| extern uint8_t ff_jpeg2000_xorbit_lut[16][16]; | |||
| /* Get context label (number in range[9..13]) for sign decoding. */ | |||
| static inline int ff_jpeg2000_getsgnctxno(int flag, int *xorbit) | |||
| { | |||
| *xorbit = ff_jpeg2000_xorbit_lut[flag & 15][(flag >> 8) & 15]; | |||
| return ff_jpeg2000_sgnctxno_lut[flag & 15][(flag >> 8) & 15]; | |||
| } | |||
| int ff_j2k_init_component(Jpeg2000Component *comp, | |||
| Jpeg2000CodingStyle *codsty, | |||
| Jpeg2000QuantStyle *qntsty, | |||
| int cbps, int dx, int dy, | |||
| AVCodecContext *avctx); | |||
| void ff_j2k_reinit(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty); | |||
| void ff_j2k_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty); | |||
| #endif /* AVCODEC_J2K_H */ | |||
| @@ -33,7 +33,7 @@ | |||
| #include "bytestream.h" | |||
| #include "internal.h" | |||
| #include "thread.h" | |||
| #include "j2k.h" | |||
| #include "jpeg2000.h" | |||
| #define JP2_SIG_TYPE 0x6A502020 | |||
| #define JP2_SIG_VALUE 0x0D0A870A | |||
| @@ -508,7 +508,7 @@ static int init_tile(Jpeg2000DecoderContext *s, int tileno) | |||
| comp->coord[1][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], s->reduction_factor); | |||
| comp->coord[1][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][1], s->reduction_factor); | |||
| if (ret = ff_j2k_init_component(comp, codsty, qntsty, s->cbps[compno], s->cdx[compno], s->cdy[compno], s->avctx)) | |||
| if (ret = ff_jpeg2000_init_component(comp, codsty, qntsty, s->cbps[compno], s->cdx[compno], s->cdy[compno], s->avctx)) | |||
| return ret; | |||
| } | |||
| return 0; | |||
| @@ -680,7 +680,7 @@ static void decode_sigpass(Jpeg2000T1Context *t1, int width, int height, | |||
| t1->data[y][x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ? | |||
| -mask : mask; | |||
| ff_j2k_set_significant(t1, x, y, t1->data[y][x] < 0); | |||
| ff_jpeg2000_set_significance(t1, x, y, t1->data[y][x] < 0); | |||
| } | |||
| t1->flags[y + 1][x + 1] |= JPEG2000_T1_VIS; | |||
| } | |||
| @@ -753,7 +753,7 @@ static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1, | |||
| t1->mqc.cx_states + ctxno) ^ | |||
| xorbit) | |||
| ? -mask : mask; | |||
| ff_j2k_set_significant(t1, x, y, t1->data[y][x] < 0); | |||
| ff_jpeg2000_set_significance(t1, x, y, t1->data[y][x] < 0); | |||
| } | |||
| dec = 0; | |||
| t1->flags[y + 1][x + 1] &= ~JPEG2000_T1_VIS; | |||
| @@ -1046,7 +1046,7 @@ static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s) | |||
| Jpeg2000Component *comp = s->tile[tileno].comp + compno; | |||
| Jpeg2000CodingStyle *codsty = s->tile[tileno].codsty + compno; | |||
| ff_j2k_cleanup(comp, codsty); | |||
| ff_jpeg2000_cleanup(comp, codsty); | |||
| } | |||
| av_freep(&s->tile[tileno].comp); | |||
| } | |||
| @@ -29,7 +29,7 @@ | |||
| #include "avcodec.h" | |||
| #include "internal.h" | |||
| #include "bytestream.h" | |||
| #include "j2k.h" | |||
| #include "jpeg2000.h" | |||
| #include "libavutil/common.h" | |||
| #define NMSEDEC_BITS 7 | |||
| @@ -98,7 +98,7 @@ static void printcomp(Jpeg2000Component *comp) | |||
| { | |||
| int i; | |||
| for (i = 0; i < comp->y1 - comp->y0; i++) | |||
| ff_j2k_printv(comp->i_data + i * (comp->x1 - comp->x0), comp->x1 - comp->x0); | |||
| ff_jpeg2000_printv(comp->i_data + i * (comp->x1 - comp->x0), comp->x1 - comp->x0); | |||
| } | |||
| static void dump(Jpeg2000EncoderContext *s, FILE *fd) | |||
| @@ -366,7 +366,7 @@ static int init_tiles(Jpeg2000EncoderContext *s) | |||
| for (j = 0; j < 2; j++) | |||
| comp->coord[i][j] = comp->coord_o[i][j] = ff_jpeg2000_ceildivpow2(comp->coord[i][j], s->chroma_shift[i]); | |||
| if (ret = ff_j2k_init_component(comp, | |||
| if (ret = ff_jpeg2000_init_component(comp, | |||
| codsty, | |||
| qntsty, | |||
| s->cbps[compno], | |||
| @@ -495,7 +495,7 @@ static void encode_sigpass(Jpeg2000T1Context *t1, int width, int height, int ban | |||
| int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1], &xorbit); | |||
| ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[y+1][x+1] >> 15) ^ xorbit); | |||
| *nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS); | |||
| ff_j2k_set_significant(t1, x, y, t1->flags[y+1][x+1] >> 15); | |||
| ff_jpeg2000_set_significance(t1, x, y, t1->flags[y+1][x+1] >> 15); | |||
| } | |||
| t1->flags[y+1][x+1] |= JPEG2000_T1_VIS; | |||
| } | |||
| @@ -547,7 +547,7 @@ static void encode_clnpass(Jpeg2000T1Context *t1, int width, int height, int ban | |||
| int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1], &xorbit); | |||
| *nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS); | |||
| ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[y+1][x+1] >> 15) ^ xorbit); | |||
| ff_j2k_set_significant(t1, x, y, t1->flags[y+1][x+1] >> 15); | |||
| ff_jpeg2000_set_significance(t1, x, y, t1->flags[y+1][x+1] >> 15); | |||
| } | |||
| } | |||
| t1->flags[y+1][x+1] &= ~JPEG2000_T1_VIS; | |||
| @@ -562,7 +562,7 @@ static void encode_clnpass(Jpeg2000T1Context *t1, int width, int height, int ban | |||
| int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1], &xorbit); | |||
| *nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS); | |||
| ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[y+1][x+1] >> 15) ^ xorbit); | |||
| ff_j2k_set_significant(t1, x, y, t1->flags[y+1][x+1] >> 15); | |||
| ff_jpeg2000_set_significance(t1, x, y, t1->flags[y+1][x+1] >> 15); | |||
| } | |||
| } | |||
| t1->flags[y+1][x+1] &= ~JPEG2000_T1_VIS; | |||
| @@ -897,7 +897,7 @@ static void cleanup(Jpeg2000EncoderContext *s) | |||
| for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++){ | |||
| for (compno = 0; compno < s->ncomponents; compno++){ | |||
| Jpeg2000Component *comp = s->tile[tileno].comp + compno; | |||
| ff_j2k_cleanup(comp, codsty); | |||
| ff_jpeg2000_cleanup(comp, codsty); | |||
| } | |||
| av_freep(&s->tile[tileno].comp); | |||
| } | |||
| @@ -910,7 +910,7 @@ static void reinit(Jpeg2000EncoderContext *s) | |||
| for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++){ | |||
| Jpeg2000Tile *tile = s->tile + tileno; | |||
| for (compno = 0; compno < s->ncomponents; compno++) | |||
| ff_j2k_reinit(tile->comp + compno, &s->codsty); | |||
| ff_jpeg2000_reinit(tile->comp + compno, &s->codsty); | |||
| } | |||
| } | |||
| @@ -79,6 +79,16 @@ static Jpeg2000TgtNode *ff_jpeg2000_tag_tree_init(int w, int h) | |||
| return res; | |||
| } | |||
| static void tag_tree_zero(Jpeg2000TgtNode *t, int w, int h) | |||
| { | |||
| int i, siz = tag_tree_size(w, h); | |||
| for (i = 0; i < siz; i++) { | |||
| t[i].val = 0; | |||
| t[i].vis = 0; | |||
| } | |||
| } | |||
| uint8_t ff_jpeg2000_sigctxno_lut[256][4]; | |||
| static int getsigctxno(int flag, int bandno) | |||
| @@ -316,9 +326,8 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, | |||
| for (i = 0; i < 2; i++) | |||
| for (j = 0; j < 2; j++) | |||
| band->coord[i][j] = | |||
| ff_jpeg2000_ceildivpow2(comp->coord_o[i][j], | |||
| ff_jpeg2000_ceildivpow2(comp->coord_o[i][j] - comp->coord_o[i][0], | |||
| declvl - 1); | |||
| log2_band_prec_width = reslevel->log2_prec_width; | |||
| log2_band_prec_height = reslevel->log2_prec_height; | |||
| /* see ISO/IEC 15444-1:2002 eq. B-17 and eq. B-15 */ | |||
| @@ -333,7 +342,7 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, | |||
| for (j = 0; j < 2; j++) | |||
| /* Formula example for tbx_0 = ceildiv((tcx_0 - 2 ^ (declvl - 1) * x0_b) / declvl) */ | |||
| band->coord[i][j] = | |||
| ff_jpeg2000_ceildivpow2(comp->coord_o[i][j] - | |||
| ff_jpeg2000_ceildivpow2(comp->coord_o[i][j] - comp->coord_o[i][0] - | |||
| (((bandno + 1 >> i) & 1) << declvl - 1), | |||
| declvl); | |||
| /* TODO: Manage case of 3 band offsets here or | |||
| @@ -349,6 +358,11 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, | |||
| log2_band_prec_height = reslevel->log2_prec_height - 1; | |||
| } | |||
| for (j = 0; j < 2; j++) | |||
| band->coord[0][j] = ff_jpeg2000_ceildiv(band->coord[0][j], dx); | |||
| for (j = 0; j < 2; j++) | |||
| band->coord[1][j] = ff_jpeg2000_ceildiv(band->coord[1][j], dy); | |||
| band->prec = av_malloc_array(reslevel->num_precincts_x * | |||
| reslevel->num_precincts_y, | |||
| sizeof(*band->prec)); | |||
| @@ -454,6 +468,27 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, | |||
| return 0; | |||
| } | |||
| void ff_jpeg2000_reinit(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty) | |||
| { | |||
| int reslevelno, bandno, cblkno, precno; | |||
| for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) { | |||
| Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno; | |||
| for (bandno = 0; bandno < rlevel->nbands; bandno++) { | |||
| Jpeg2000Band *band = rlevel->band + bandno; | |||
| for(precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++) { | |||
| Jpeg2000Prec *prec = band->prec + precno; | |||
| tag_tree_zero(prec->zerobits, prec->nb_codeblocks_width, prec->nb_codeblocks_height); | |||
| tag_tree_zero(prec->cblkincl, prec->nb_codeblocks_width, prec->nb_codeblocks_height); | |||
| for (cblkno = 0; cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height; cblkno++) { | |||
| Jpeg2000Cblk *cblk = prec->cblk + cblkno; | |||
| cblk->length = 0; | |||
| cblk->lblock = 3; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| void ff_jpeg2000_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty) | |||
| { | |||
| int reslevelno, bandno, precno; | |||
| @@ -256,6 +256,8 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, | |||
| int cbps, int dx, int dy, | |||
| AVCodecContext *ctx); | |||
| void ff_jpeg2000_reinit(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty); | |||
| void ff_jpeg2000_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty); | |||
| #endif /* AVCODEC_JPEG2000_H */ | |||