[FFmpeg-cvslog] j2kdec: merge decode_tile cblk handling 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 14:51:30 2013 +0200| [81ccc31f75e0e4c35f345784e58244d846a5d862] | committer: Michael Niedermayer

j2kdec: merge decode_tile cblk handling from jpeg2000

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

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

 libavcodec/j2kdec.c |   75 ++++++++++++++++++++++++++-------------------------
 1 file changed, 39 insertions(+), 36 deletions(-)

diff --git a/libavcodec/j2kdec.c b/libavcodec/j2kdec.c
index 656ee38..1881ba0 100644
--- a/libavcodec/j2kdec.c
+++ b/libavcodec/j2kdec.c
@@ -789,59 +789,62 @@ static int decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
             Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
             /* Loop on bands */
             for (bandno = 0; bandno < rlevel->nbands; bandno++) {
+                int nb_precincts, precno;
                 Jpeg2000Band *band = rlevel->band + bandno;
-                int cblkx, cblky, cblkno=0, xx0, x0, xx1, y0, yy0, yy1, bandpos;
+                int cblkx, cblky, cblkno=0, bandpos;
 
                 bandpos = bandno + (reslevelno > 0);
 
-                yy0 = bandno == 0 ? 0 : comp->reslevel[reslevelno-1].coord[1][1] - comp->reslevel[reslevelno-1].coord[1][0];
-                y0 = yy0;
-                yy1 = FFMIN(ff_jpeg2000_ceildivpow2(band->coord[1][0] + 1,  band->log2_cblk_height) << band->log2_cblk_height,
-                            band->coord[1][1]) - band->coord[1][0] + yy0;
-
                 if (band->coord[0][0] == band->coord[0][1] || band->coord[1][0] == band->coord[1][1])
                     continue;
 
-                for (cblky = 0; cblky < band->cblkny; cblky++) {
-                    if (reslevelno == 0 || bandno == 1)
-                        xx0 = 0;
-                    else
-                        xx0 = comp->reslevel[reslevelno-1].coord[0][1] - comp->reslevel[reslevelno-1].coord[0][0];
-                    x0 = xx0;
-                    xx1 = FFMIN(ff_jpeg2000_ceildivpow2(band->coord[0][0] + 1, band->log2_cblk_width) << band->log2_cblk_width,
-                                band->coord[0][1]) - band->coord[0][0] + xx0;
-
-                    for (cblkx = 0; cblkx < band->cblknx; cblkx++, cblkno++) {
-                        int y, x;
-                        decode_cblk(s, codsty, &t1, band->cblk + cblkno, xx1 - xx0, yy1 - yy0, bandpos);
+                nb_precincts = rlevel->num_precincts_x * rlevel->num_precincts_y;
+                /* Loop on precincts */
+                for (precno = 0; precno < nb_precincts; precno++) {
+                    Jpeg2000Prec *prec = band->prec + precno;
+
+                    /* Loop on codeblocks */
+                    for (cblkno = 0; cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height; cblkno++) {
+                        int x, y;
+                        int i, j;
+                        Jpeg2000Cblk *cblk = prec->cblk + cblkno;
+                        decode_cblk(s, codsty, &t1, cblk,
+                                    cblk->coord[0][1] - cblk->coord[0][0],
+                                    cblk->coord[1][1] - cblk->coord[1][0],
+                                    bandpos);
+
+                        /* Manage band offsets */
+                        x = cblk->coord[0][0];
+                        y = cblk->coord[1][0];
+
                         if (codsty->transform == FF_DWT53) {
-                            for (y = yy0; y < yy1; y+=s->cdy[compno]) {
-                                int *ptr = t1.data[y-yy0];
-                                for (x = xx0; x < xx1; x+=s->cdx[compno]) {
-                                    comp->data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] = *ptr++ >> 1;
+                            for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
+                                int *datap = &comp->data[(comp->coord[0][1] - comp->coord[0][0]) * (y+j) + x];
+                                int *ptr = t1.data[j];
+                                for (i = 0; i < (cblk->coord[0][1] - cblk->coord[0][0]); ++i) {
+                                    datap[i] = ptr[i] >> 1;
                                 }
                             }
                         } else{
-                            for (y = yy0; y < yy1; y+=s->cdy[compno]) {
-                                int *ptr = t1.data[y-yy0];
-                                for (x = xx0; x < xx1; x+=s->cdx[compno]) {
-                                    int tmp = ((int64_t)*ptr++) * ((int64_t)band->stepsize) >> 13, tmp2;
+                            for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
+                                int *datap = &comp->data[(comp->coord[0][1] - comp->coord[0][0]) * (y+j) + x];
+                                int *ptr = t1.data[j];
+                                for (i = 0; i < (cblk->coord[0][1] - cblk->coord[0][0]); ++i) {
+                                    int tmp = ((int64_t)ptr[i]) * ((int64_t)band->stepsize) >> 13, tmp2;
                                     tmp2 = FFABS(tmp>>1) + (tmp&1);
-                                    comp->data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] = tmp < 0 ? -tmp2 : tmp2;
+                                    datap[i] = tmp < 0 ? -tmp2 : tmp2;
                                 }
                             }
                         }
-                        xx0 = xx1;
-                        xx1 = FFMIN(xx1 + (1 << band->log2_cblk_width), band->coord[0][1] - band->coord[0][0] + x0);
-                    }
-                    yy0 = yy1;
-                    yy1 = FFMIN(yy1 + (1 << band->log2_cblk_height), band->coord[1][1] - band->coord[1][0] + y0);
-                }
-            }
-        }
+                   } /* end cblk */
+                } /*end prec */
+            } /* end band */
+        } /* end reslevel */
+
         ff_j2k_dwt_decode(&comp->dwt, comp->data);
         src[compno] = comp->data;
-    }
+    } /*end comp */
+
     /* inverse MCT transformation */
     if (tile->codsty[0].mct)
         mct_decode(s, tile);



More information about the ffmpeg-cvslog mailing list