From 32475f56f38d321b123fce116bc4521f6af0d738 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Tue, 28 May 2013 14:27:49 +0200 Subject: [PATCH] j2kdec/jpeg2000dec: partially merge quantization code The quantization code needs more work, not so much work merging but more work investigating what is correct. Signed-off-by: Michael Niedermayer --- libavcodec/j2k.c | 7 ++++--- libavcodec/j2kdec.c | 37 ++++++++++++++++----------------- libavcodec/jpeg2000.c | 6 +++--- tests/ref/vsynth/vsynth1-j2k | 4 ++-- tests/ref/vsynth/vsynth1-j2k-97 | 4 ++-- tests/ref/vsynth/vsynth2-j2k | 4 ++-- tests/ref/vsynth/vsynth2-j2k-97 | 4 ++-- 7 files changed, 33 insertions(+), 33 deletions(-) diff --git a/libavcodec/j2k.c b/libavcodec/j2k.c index 2a86dcedd4..7da05a8701 100644 --- a/libavcodec/j2k.c +++ b/libavcodec/j2k.c @@ -278,15 +278,16 @@ int ff_j2k_init_component(Jpeg2000Component *comp, gain = cbps; stepsize = pow(2.0, gain - qntsty->expn[gbandno]); stepsize *= (qntsty->mant[gbandno] / 2048.0 + 1.0); - /* FIXME: In openjepg code stespize = stepsize * 0.5. Why? - * If not set output of entropic decoder is not correct. */ -// stepsize *= 0.5; break; default: 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. */ + if (!av_codec_is_encoder(avctx->codec)) + stepsize *= 0.5; /* BITEXACT computing case --> convert to int */ // if (avctx->flags & CODEC_FLAG_BITEXACT) band->stepsize = stepsize * (1 << 16); diff --git a/libavcodec/j2kdec.c b/libavcodec/j2kdec.c index d2e003ce8f..42862b927a 100644 --- a/libavcodec/j2kdec.c +++ b/libavcodec/j2kdec.c @@ -26,6 +26,7 @@ * @author Kamil Nowosad */ +#include "libavutil/avassert.h" #include "libavutil/common.h" #include "libavutil/opt.h" #include "avcodec.h" @@ -814,6 +815,22 @@ static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty, return 0; } +/* Integer dequantization of a codeblock.*/ +static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk, + Jpeg2000Component *comp, + Jpeg2000T1Context *t1, Jpeg2000Band *band) +{ + int i, j, idx; + int32_t *datap = + (int32_t *) &comp->data[(comp->coord[0][1] - comp->coord[0][0]) * y + x]; + 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] = + ((int32_t)(t1->data[j][i]) * ((int32_t)band->stepsize) + (1 << 15)) >> 16; + } +} + static void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) { int i, *src[3], i0, i1, i2, csize = 1; @@ -890,25 +907,7 @@ static int decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) x = cblk->coord[0][0]; y = cblk->coord[1][0]; - if (codsty->transform == FF_DWT53) { - 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 (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) >> 16, tmp2; - tmp2 = FFABS(tmp>>1) + (tmp&1); - datap[i] = tmp < 0 ? -tmp2 : tmp2; - } - } - } + dequantization_int(x, y, cblk, comp, &t1, band); } /* end cblk */ } /*end prec */ } /* end band */ diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c index 5b15efcc29..c5fc35dbd1 100644 --- a/libavcodec/jpeg2000.c +++ b/libavcodec/jpeg2000.c @@ -288,15 +288,15 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, gain = cbps; band->stepsize = pow(2.0, gain - qntsty->expn[gbandno]); band->stepsize *= (float)qntsty->mant[gbandno] / 2048.0 + 1.0; - /* FIXME: In openjepg code stespize = stepsize * 0.5. Why? - * If not set output of entropic decoder is not correct. */ - band->stepsize *= 0.5; break; default: band->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)); diff --git a/tests/ref/vsynth/vsynth1-j2k b/tests/ref/vsynth/vsynth1-j2k index 1e2f3f21d8..726d452568 100644 --- a/tests/ref/vsynth/vsynth1-j2k +++ b/tests/ref/vsynth/vsynth1-j2k @@ -1,4 +1,4 @@ e6e3d338eeb394d6fadc7bbb55fa9e6e *tests/data/fate/vsynth1-j2k.avi 2306902 tests/data/fate/vsynth1-j2k.avi -ee9b245b3b07eed90bc6f2147bbd916c *tests/data/fate/vsynth1-j2k.out.rawvideo -stddev: 5.47 PSNR: 33.37 MAXDIFF: 64 bytes: 7603200/ 7603200 +1774b621bd92a53a24712cb77e9f0b28 *tests/data/fate/vsynth1-j2k.out.rawvideo +stddev: 5.37 PSNR: 33.52 MAXDIFF: 63 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth1-j2k-97 b/tests/ref/vsynth/vsynth1-j2k-97 index 3c59e798f7..1cc197a6f0 100644 --- a/tests/ref/vsynth/vsynth1-j2k-97 +++ b/tests/ref/vsynth/vsynth1-j2k-97 @@ -1,4 +1,4 @@ c135eb14e9f219242180270c2a242634 *tests/data/fate/vsynth1-j2k-97.avi 2243132 tests/data/fate/vsynth1-j2k-97.avi -c8dc404072bf57d3ca823c0adaac013c *tests/data/fate/vsynth1-j2k-97.out.rawvideo -stddev: 6.79 PSNR: 31.49 MAXDIFF: 77 bytes: 7603200/ 7603200 +30a9c13e18fe4acaf28062b5003bb671 *tests/data/fate/vsynth1-j2k-97.out.rawvideo +stddev: 6.41 PSNR: 31.99 MAXDIFF: 75 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth2-j2k b/tests/ref/vsynth/vsynth2-j2k index 4f038fedbd..1120b902d3 100644 --- a/tests/ref/vsynth/vsynth2-j2k +++ b/tests/ref/vsynth/vsynth2-j2k @@ -1,4 +1,4 @@ fc49816ba28731689872f5c87ca91c10 *tests/data/fate/vsynth2-j2k.avi 1151144 tests/data/fate/vsynth2-j2k.avi -ec5218eec33a021945c28c72093382a5 *tests/data/fate/vsynth2-j2k.out.rawvideo -stddev: 4.54 PSNR: 34.99 MAXDIFF: 61 bytes: 7603200/ 7603200 +e7d79c9e11d0fe97f03e38be66c34e4f *tests/data/fate/vsynth2-j2k.out.rawvideo +stddev: 4.41 PSNR: 35.23 MAXDIFF: 63 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth2-j2k-97 b/tests/ref/vsynth/vsynth2-j2k-97 index ed5bcc999e..5232802f7f 100644 --- a/tests/ref/vsynth/vsynth2-j2k-97 +++ b/tests/ref/vsynth/vsynth2-j2k-97 @@ -1,4 +1,4 @@ 3ac3e49a89136bddde9e44bac3e5b4ed *tests/data/fate/vsynth2-j2k-97.avi 1118952 tests/data/fate/vsynth2-j2k-97.avi -a9434a726d6976facf53ff63d1466a99 *tests/data/fate/vsynth2-j2k-97.out.rawvideo -stddev: 5.81 PSNR: 32.84 MAXDIFF: 59 bytes: 7603200/ 7603200 +9d69ac6d46152ed2d6dd6a90d5793c80 *tests/data/fate/vsynth2-j2k-97.out.rawvideo +stddev: 5.32 PSNR: 33.61 MAXDIFF: 60 bytes: 7603200/ 7603200