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 <michaelni@gmx.at>
This commit is contained in:
parent
f0a2c8285a
commit
32475f56f3
@ -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);
|
||||
|
@ -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 */
|
||||
|
@ -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));
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user