[FFmpeg-cvslog] j2kdec: merge cblk restructuring from jpeg2000

Michael Niedermayer git at videolan.org
Mon May 27 15:21:57 CEST 2013


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Mon May 27 10:05:21 2013 +0200| [369422db0c6dafa08c9b22f676eb4c480bee72fb] | committer: Michael Niedermayer

j2kdec: merge cblk restructuring from jpeg2000

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=369422db0c6dafa08c9b22f676eb4c480bee72fb
---

 libavcodec/j2kdec.c |   99 +++++++++++++++++++++++++++++----------------------
 1 file changed, 56 insertions(+), 43 deletions(-)

diff --git a/libavcodec/j2kdec.c b/libavcodec/j2kdec.c
index 2193539..41b109a 100644
--- a/libavcodec/j2kdec.c
+++ b/libavcodec/j2kdec.c
@@ -469,10 +469,12 @@ static int getlblockinc(Jpeg2000DecoderContext *s)
     return res;
 }
 
-static int decode_packet(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty, Jpeg2000ResLevel *rlevel, int precno,
+static int decode_packet(Jpeg2000DecoderContext *s,
+                         Jpeg2000CodingStyle *codsty,
+                         Jpeg2000ResLevel *rlevel, int precno,
                          int layno, uint8_t *expn, int numgbits)
 {
-    int bandno, cblkny, cblknx, cblkno, ret;
+    int bandno, cblkno, ret, nb_code_blocks;
 
     if (!(ret = get_bits(s, 1))) {
         j2k_flush(s);
@@ -483,64 +485,71 @@ static int decode_packet(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty,
     for (bandno = 0; bandno < rlevel->nbands; bandno++) {
         Jpeg2000Band *band = rlevel->band + bandno;
         Jpeg2000Prec *prec = band->prec + precno;
-        int pos = 0;
 
         if (band->coord[0][0] == band->coord[0][1] ||
             band->coord[1][0] == band->coord[1][1])
             continue;
 
-        for (cblkny = prec->yi0; cblkny < prec->yi1; cblkny++)
-            for (cblknx = prec->xi0, cblkno = cblkny * band->cblknx + cblknx; cblknx < prec->xi1; cblknx++, cblkno++, pos++) {
-                Jpeg2000Cblk *cblk = band->cblk + cblkno;
-                int incl, newpasses, llen;
+        nb_code_blocks =  prec->nb_codeblocks_height *
+                          prec->nb_codeblocks_width;
+        for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
+            Jpeg2000Cblk *cblk = prec->cblk + cblkno;
+            int incl, newpasses, llen;
 
-                if (cblk->npasses)
-                    incl = get_bits(s, 1);
-                else
-                    incl = tag_tree_decode(s, prec->cblkincl + pos, layno+1) == layno;
-                if (!incl)
-                    continue;
-                else if (incl < 0)
-                    return incl;
-
-                if (!cblk->npasses)
-                    cblk->nonzerobits = expn[bandno] + numgbits - 1 - tag_tree_decode(s, prec->zerobits + pos, 100);
-                if ((newpasses = getnpasses(s)) < 0)
-                    return newpasses;
-                if ((llen = getlblockinc(s)) < 0)
-                    return llen;
-                cblk->lblock += llen;
-                if ((ret = get_bits(s, av_log2(newpasses) + cblk->lblock)) < 0)
-                    return ret;
-                cblk->lengthinc = ret;
-                cblk->npasses += newpasses;
-            }
+            if (cblk->npasses)
+                incl = get_bits(s, 1);
+            else
+                incl = tag_tree_decode(s, prec->cblkincl + cblkno, layno + 1) == layno;
+            if (!incl)
+                continue;
+            else if (incl < 0)
+                return incl;
+
+            if (!cblk->npasses)
+                cblk->nonzerobits = expn[bandno] + numgbits - 1 -
+                                    tag_tree_decode(s, prec->zerobits + cblkno,
+                                                    100);
+            if ((newpasses = getnpasses(s)) < 0)
+                return newpasses;
+            if ((llen = getlblockinc(s)) < 0)
+                return llen;
+            cblk->lblock += llen;
+            if ((ret = get_bits(s, av_log2(newpasses) + cblk->lblock)) < 0)
+                return ret;
+            cblk->lengthinc = ret;
+            cblk->npasses  += newpasses;
+        }
     }
     j2k_flush(s);
 
     if (codsty->csty & JPEG2000_CSTY_EPH) {
-        if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH) {
+        if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH)
             bytestream2_skip(&s->g, 2);
-        } else {
+        else
             av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found.\n");
-        }
     }
 
     for (bandno = 0; bandno < rlevel->nbands; bandno++) {
         Jpeg2000Band *band = rlevel->band + bandno;
-        int yi, cblknw = band->prec[precno].xi1 - band->prec[precno].xi0;
-        for (yi = band->prec[precno].yi0; yi < band->prec[precno].yi1; yi++) {
-            int xi;
-            for (xi = band->prec[precno].xi0; xi < band->prec[precno].xi1; xi++) {
-                Jpeg2000Cblk *cblk = band->cblk + yi * cblknw + xi;
-                if (   bytestream2_get_bytes_left(&s->g) < cblk->lengthinc
-                    || sizeof(cblk->data) < cblk->lengthinc
-                )
-                    return AVERROR(EINVAL);
-                bytestream2_get_bufferu(&s->g, cblk->data, cblk->lengthinc);
-                cblk->length += cblk->lengthinc;
-                cblk->lengthinc = 0;
+        Jpeg2000Prec *prec = band->prec + precno;
+
+        nb_code_blocks = prec->nb_codeblocks_height * prec->nb_codeblocks_width;
+        for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
+            Jpeg2000Cblk *cblk = prec->cblk + cblkno;
+            if (   bytestream2_get_bytes_left(&s->g) < cblk->lengthinc
+                || sizeof(cblk->data) < cblk->lengthinc
+            )
+                return AVERROR(EINVAL);
+            /* Code-block data can be empty. In that case initialize data
+             * with 0xFFFF. */
+            if (cblk->lengthinc > 0) {
+                 bytestream2_get_bufferu(&s->g, cblk->data, cblk->lengthinc);
+            } else {
+                cblk->data[0] = 0xFF;
+                cblk->data[1] = 0xFF;
             }
+            cblk->length   += cblk->lengthinc;
+            cblk->lengthinc = 0;
         }
     }
     return 0;
@@ -767,12 +776,15 @@ static int decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
     uint8_t *line;
     Jpeg2000T1Context t1;
 
+    /* Loop on tile components */
     for (compno = 0; compno < s->ncomponents; compno++) {
         Jpeg2000Component *comp     = tile->comp + compno;
         Jpeg2000CodingStyle *codsty = tile->codsty + compno;
 
+        /* Loop on resolution levels */
         for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) {
             Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
+            /* Loop on bands */
             for (bandno = 0; bandno < rlevel->nbands; bandno++) {
                 Jpeg2000Band *band = rlevel->band + bandno;
                 int cblkx, cblky, cblkno=0, xx0, x0, xx1, y0, yy0, yy1, bandpos;
@@ -827,6 +839,7 @@ static int decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
         ff_j2k_dwt_decode(&comp->dwt, comp->data);
         src[compno] = comp->data;
     }
+    /* inverse MCT transformation */
     if (tile->codsty[0].mct)
         mct_decode(s, tile);
 



More information about the ffmpeg-cvslog mailing list