diff options
Diffstat (limited to 'libavcodec/jpeg2000.c')
-rw-r--r-- | libavcodec/jpeg2000.c | 125 |
1 files changed, 73 insertions, 52 deletions
diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c index bf46398361..f3658c2c84 100644 --- a/libavcodec/jpeg2000.c +++ b/libavcodec/jpeg2000.c @@ -3,20 +3,20 @@ * Copyright (c) 2007 Kamil Nowosad * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com> * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * 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. * - * Libav is distributed in the hope that it will be useful, + * 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 Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -25,6 +25,7 @@ * JPEG 2000 image encoder and decoder common functions */ +#include "libavutil/avassert.h" #include "libavutil/common.h" #include "libavutil/mem.h" #include "avcodec.h" @@ -40,8 +41,7 @@ static int32_t tag_tree_size(uint16_t w, uint16_t h) uint32_t res = 0; while (w > 1 || h > 1) { res += w * h; - if (res + 1 >= INT32_MAX) - return -1; + av_assert0(res + 1 < INT32_MAX); w = (w + 1) >> 1; h = (h + 1) >> 1; } @@ -55,8 +55,6 @@ static Jpeg2000TgtNode *ff_jpeg2000_tag_tree_init(int w, int h) int32_t tt_size; tt_size = tag_tree_size(w, h); - if (tt_size == -1) - return NULL; t = res = av_mallocz_array(tt_size, sizeof(*t)); if (!res) @@ -81,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) @@ -95,45 +103,33 @@ static int getsigctxno(int flag, int bandno) ((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 == 2) return 8; if (h == 1) { - if (v >= 1) - return 7; - if (d >= 1) - return 6; + 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; + 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 >= 3) return 8; if (d == 2) { - if (h + v >= 1) - return 7; + if (h+v >= 1) return 7; return 6; } if (d == 1) { - if (h + v >= 2) - return 5; - if (h + v == 1) - return 4; + 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; + if (h+v >= 2) return 2; + if (h+v == 1) return 1; } return 0; } @@ -204,8 +200,8 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, int reslevelno, bandno, gbandno = 0, ret, i, j; uint32_t csize; - if (!codsty->nreslevels2decode) { - av_log(avctx, AV_LOG_ERROR, "nreslevels2decode uninitialized\n"); + if (codsty->nreslevels2decode <= 0) { + av_log(avctx, AV_LOG_ERROR, "nreslevels2decode %d invalid or uninitialized\n", codsty->nreslevels2decode); return AVERROR_INVALIDDATA; } @@ -219,16 +215,16 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, if (codsty->transform == FF_DWT97) { comp->i_data = NULL; - comp->f_data = av_malloc_array(csize, sizeof(*comp->f_data)); + comp->f_data = av_mallocz_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)); + comp->i_data = av_mallocz_array(csize, sizeof(*comp->i_data)); if (!comp->i_data) return AVERROR(ENOMEM); } - comp->reslevel = av_malloc_array(codsty->nreslevels, sizeof(*comp->reslevel)); + comp->reslevel = av_calloc(codsty->nreslevels, sizeof(*comp->reslevel)); if (!comp->reslevel) return AVERROR(ENOMEM); /* LOOP on resolution levels */ @@ -276,7 +272,7 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, reslevel->log2_prec_height) - (reslevel->coord[1][0] >> reslevel->log2_prec_height); - reslevel->band = av_malloc_array(reslevel->nbands, sizeof(*reslevel->band)); + reslevel->band = av_calloc(reslevel->nbands, sizeof(*reslevel->band)); if (!reslevel->band) return AVERROR(ENOMEM); @@ -324,7 +320,7 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, if (!av_codec_is_encoder(avctx->codec)) band->f_stepsize *= 0.5; - band->i_stepsize = band->f_stepsize * (1 << 16); + band->i_stepsize = band->f_stepsize * (1 << 15); /* 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 @@ -372,8 +368,8 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, 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, + band->prec = av_calloc(reslevel->num_precincts_x * + (uint64_t)reslevel->num_precincts_y, sizeof(*band->prec)); if (!band->prec) return AVERROR(ENOMEM); @@ -429,7 +425,7 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, return AVERROR(ENOMEM); prec->cblk = av_mallocz_array(prec->nb_codeblocks_width * - prec->nb_codeblocks_height, + (uint64_t)prec->nb_codeblocks_height, sizeof(*prec->cblk)); if (!prec->cblk) return AVERROR(ENOMEM); @@ -481,6 +477,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; @@ -490,15 +507,19 @@ void ff_jpeg2000_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty) 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); - } + if (reslevel->band) { + Jpeg2000Band *band = reslevel->band + bandno; + for (precno = 0; precno < reslevel->num_precincts_x * reslevel->num_precincts_y; precno++) { + if (band->prec) { + Jpeg2000Prec *prec = band->prec + precno; + av_freep(&prec->zerobits); + av_freep(&prec->cblkincl); + av_freep(&prec->cblk); + } + } - av_freep(&band->prec); + av_freep(&band->prec); + } } av_freep(&reslevel->band); } |