diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-05-28 21:58:48 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-05-29 00:29:25 +0200 |
commit | 83fd377c94d8fbffdb3e69fb3efe1976ff897a88 (patch) | |
tree | 4aae47c689d2e4feee70c1d18cb75110e42b90ff /libavcodec/jpeg2000dec.c | |
parent | a510abd5d1f53193695323326c571c84fc5069a4 (diff) | |
download | ffmpeg-83fd377c94d8fbffdb3e69fb3efe1976ff897a88.tar.gz |
j2k/jpeg2000: merge float DWT and related code
the float conditions are largely changed to check the DWT
instead of the bitexact flag, which previously was wrong
(DWT53 is always int)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/jpeg2000dec.c')
-rw-r--r-- | libavcodec/jpeg2000dec.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 59af444068..071524659b 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -1056,10 +1056,10 @@ static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, x = cblk->coord[0][0]; y = cblk->coord[1][0]; - if (s->avctx->flags & CODEC_FLAG_BITEXACT) - dequantization_int(x, y, cblk, comp, &t1, band); - else + if (codsty->transform == FF_DWT97) dequantization_float(x, y, cblk, comp, &t1, band); + else + dequantization_int(x, y, cblk, comp, &t1, band); } /* end cblk */ } /*end prec */ } /* end band */ @@ -1079,7 +1079,8 @@ static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, if (s->precision <= 8) { for (compno = 0; compno < s->ncomponents; compno++) { Jpeg2000Component *comp = tile->comp + compno; - int32_t *datap = (int32_t *)comp->data; + float *datap = comp->data; + int32_t *i_datap = (int32_t *) comp->data; y = tile->comp[compno].coord[1][0] - s->image_offset_y; line = picture->data[0] + y * picture->linesize[0]; for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y += s->cdy[compno]) { @@ -1089,12 +1090,16 @@ static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, dst = line + x * s->ncomponents + compno; for (; x < tile->comp[compno].coord[0][1] - s->image_offset_x; x += s->cdx[compno]) { - *datap += 1 << (s->cbps[compno] - 1); - if (*datap < 0) - *datap = 0; - else if (*datap >= (1 << s->cbps[compno])) - *datap = (1 << s->cbps[compno]) - 1; - *dst = *datap++; + int val; + /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ + if (tile->codsty->transform == FF_DWT97) + val = lrintf(*datap) + (1 << (s->cbps[compno] - 1)); + else + val = *i_datap + (1 << (s->cbps[compno] - 1)); + val = av_clip(val, 0, (1 << s->cbps[compno]) - 1); + *dst = val << (8 - s->cbps[compno]); + datap++; + i_datap++; dst += s->ncomponents; } line += picture->linesize[0]; @@ -1114,15 +1119,15 @@ static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, x = tile->comp[compno].coord[0][0] - s->image_offset_x; dst = linel + (x * s->ncomponents + compno); for (; x < s->avctx->width; x += s->cdx[compno]) { - int16_t val; + int val; /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ - if (s->avctx->flags & CODEC_FLAG_BITEXACT) - val = *i_datap + (1 << (s->cbps[compno] - 1)); - else + if (tile->codsty->transform == FF_DWT97) val = lrintf(*datap) + (1 << (s->cbps[compno] - 1)); + else + val = *i_datap + (1 << (s->cbps[compno] - 1)); val = av_clip(val, 0, (1 << s->cbps[compno]) - 1); /* align 12 bit values in little-endian mode */ - *dst = val << 4; + *dst = val << (16 - s->cbps[compno]); datap++; i_datap++; dst += s->ncomponents; |