]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/jpeg2000.c
Merge commit '41740ef8be6ec409f7eff3932ddba9a9eeec27b1'
[ffmpeg] / libavcodec / jpeg2000.c
index b5dd36dff5fe9c1ea20d7214e327a720e1507395..b333aad568403c7ad0e4f38dea73263f315213c4 100644 (file)
@@ -305,9 +305,6 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp,
                  * 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;
@@ -317,6 +314,22 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp,
                 av_log(avctx, AV_LOG_ERROR, "Unknown quantization format\n");
                 break;
             }
+            if (codsty->transform != FF_DWT53) {
+                int lband = 0;
+                switch (bandno + (reslevelno > 0)) {
+                    case 1:
+                    case 2:
+                        band->f_stepsize *= F_LFTG_X * 2;
+                        lband = 1;
+                        break;
+                    case 3:
+                        band->f_stepsize *= F_LFTG_X * F_LFTG_X * 4;
+                        break;
+                }
+                if (codsty->transform == FF_DWT97) {
+                    band->f_stepsize *= pow(F_LFTG_K, 2*(codsty->nreslevels2decode - reslevelno) + lband - 2);
+                }
+            }
             /* 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))
@@ -402,13 +415,14 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp,
                 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);
+                    ff_jpeg2000_ceildivpow2(prec->coord[0][1],
+                                            band->log2_cblk_width)
+                    - (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);
+                    ff_jpeg2000_ceildivpow2(prec->coord[1][1],
+                                            band->log2_cblk_height)
+                    - (prec->coord[1][0] >> band->log2_cblk_height);
+
 
                 /* Tag trees initialization */
                 prec->cblkincl =
@@ -437,22 +451,22 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp,
 
                     /* Compute coordinates of codeblocks */
                     /* Compute Cx0*/
-                    Cx0 = ((prec->coord[0][0] - band->coord[0][0]) >> band->log2_cblk_width) << band->log2_cblk_width;
+                    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] - band->coord[0][0]);
+                    cblk->coord[0][0] = FFMAX(Cx0, prec->coord[0][0]);
 
                     /* Compute Cy0*/
-                    Cy0 = ((prec->coord[1][0] - band->coord[1][0]) >> band->log2_cblk_height) << band->log2_cblk_height;
+                    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] - band->coord[1][0]);
+                    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] - band->coord[0][0]);
+                                              prec->coord[0][1]);
 
                     /* Compute Cy1 */
                     cblk->coord[1][1] = FFMIN(Cy0 + (1 << band->log2_cblk_height),
-                                              prec->coord[1][1] - band->coord[1][0]);
+                                              prec->coord[1][1]);
                     /* Update code-blocks coordinates according sub-band position */
                     if ((bandno + !!reslevelno) & 1) {
                         cblk->coord[0][0] += comp->reslevel[reslevelno-1].coord[0][1] -