From: Michael Niedermayer <[email protected]> This is more clear and less prone to mistakes.
Signed-off-by: Michael Niedermayer <[email protected]> Conflicts: libavcodec/j2k.c libavcodec/j2k.h libavcodec/j2kdec.c libavcodec/j2kenc.c --- libavcodec/jpeg2000.c | 18 +++++++++--------- libavcodec/jpeg2000.h | 5 ++--- libavcodec/jpeg2000dec.c | 4 ++-- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c index 3332092..8ebba79 100644 --- a/libavcodec/jpeg2000.c +++ b/libavcodec/jpeg2000.c @@ -279,13 +279,13 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, int numbps; case JPEG2000_QSTY_NONE: /* TODO: to verify. No quantization in this case */ - band->stepsize = (float) (1 << 13); + band->f_stepsize = (float) (1 << 13); break; case JPEG2000_QSTY_SI: /*TODO: Compute formula to implement. */ numbps = cbps + lut_gain[codsty->transform][bandno + (reslevelno > 0)]; - band->stepsize = (float)SHL(2048 + qntsty->mant[gbandno], + band->f_stepsize = (float)SHL(2048 + qntsty->mant[gbandno], 2 + numbps - qntsty->expn[gbandno]); break; case JPEG2000_QSTY_SE: @@ -298,20 +298,20 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, * but it works (compared to OpenJPEG). Why? * Further investigation needed. */ gain = cbps; - band->stepsize = pow(2.0, gain - qntsty->expn[gbandno]); - band->stepsize *= (float)qntsty->mant[gbandno] / 2048.0 + 1.0; + band->f_stepsize = pow(2.0, gain - qntsty->expn[gbandno]); + band->f_stepsize *= (float)qntsty->mant[gbandno] / 2048.0 + 1.0; break; default: - band->stepsize = 0; + 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. */ - band->stepsize *= 0.5; - /* BITEXACT computing case --> convert to int */ - if (avctx->flags & CODEC_FLAG_BITEXACT) - band->stepsize = (int32_t)(band->stepsize * (1 << 16)); + if (!av_codec_is_encoder(avctx->codec)) + band->f_stepsize *= 0.5; + + band->i_stepsize = (int32_t)(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 diff --git a/libavcodec/jpeg2000.h b/libavcodec/jpeg2000.h index c4b52ff..b17167e 100644 --- a/libavcodec/jpeg2000.h +++ b/libavcodec/jpeg2000.h @@ -180,12 +180,11 @@ typedef struct Jpeg2000Prec { uint16_t coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} } Jpeg2000Prec; // precinct -/* TODO: stepsize can be float or integer depending on - * reversible or irreversible transformation. */ typedef struct Jpeg2000Band { uint16_t coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} uint16_t log2_cblk_width, log2_cblk_height; - float stepsize; // quantization stepsize + int i_stepsize; // quantization stepsize + float f_stepsize; // quantization stepsize Jpeg2000Prec *prec; } Jpeg2000Band; // subband diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 4d67a2c..ec23e6b 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -942,7 +942,7 @@ static void dequantization_float(int x, int y, Jpeg2000Cblk *cblk, for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) for (i = 0; i < (cblk->coord[0][1] - cblk->coord[0][0]); ++i) { idx = (comp->coord[0][1] - comp->coord[0][0]) * j + i; - datap[idx] = (float)(t1->data[j][i]) * ((float)band->stepsize); + datap[idx] = (float)(t1->data[j][i]) * band->f_stepsize; } } @@ -958,7 +958,7 @@ static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk, for (i = 0; i < (cblk->coord[0][1] - cblk->coord[0][0]); ++i) { idx = (comp->coord[0][1] - comp->coord[0][0]) * j + i; datap[idx] = - ((int32_t)(t1->data[j][i]) * ((int32_t)band->stepsize) + (1 << 15)) >> 16; + ((int32_t)(t1->data[j][i]) * band->i_stepsize + (1 << 15)) >> 16; } } -- 1.8.2.1 _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
