[FFmpeg-devel] [PATCH]lavc/jpeg2000dec: Scale 4-7bit output to 8 bits
Michael Niedermayer
michael at niedermayer.cc
Mon Apr 27 00:36:43 EEST 2020
On Sat, Apr 25, 2020 at 07:26:08PM +0200, Carl Eugen Hoyos wrote:
> Hi!
>
> Attached patch makes the output of the reference sample p0_03.j2k
> bit-exact with opj_decompress and kdu_render and more similar to
> jasper's output.
>
> Please comment, Carl Eugen
> jpeg2000dec.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
> 895351be2965009049944f0ceeb42bc5f8cee733 0001-lavc-jpeg2000dec-Scale-4-7-bit-output-to-8-bits.patch
> From de80453a8decd95b4a71cea71b20ba0bd74485cb Mon Sep 17 00:00:00 2001
> From: Carl Eugen Hoyos <ceffmpeg at gmail.com>
> Date: Sat, 25 Apr 2020 18:31:22 +0200
> Subject: [PATCH] lavc/jpeg2000dec: Scale 4-7 bit output to 8 bits.
>
> Makes p0_03.j2k output bitexact with opj_decompress and kdu_render
> and more similar with the output of jasper.
> ---
> libavcodec/jpeg2000dec.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
> index 460a4ad95c..8d7c729530 100644
> --- a/libavcodec/jpeg2000dec.c
> +++ b/libavcodec/jpeg2000dec.c
> @@ -1938,7 +1938,9 @@ static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile
> int val = lrintf(*datap) + (1 << (cbps - 1)); \
> /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
> val = av_clip(val, 0, (1 << cbps) - 1); \
> - *dst = val << (precision - cbps); \
> + *dst = val << ((precision < 8 ? 8 : precision) - cbps); \
> + if (precision < 8) \
> + *dst |= *dst >> (8 - precision); \
> datap++; \
> dst += pixelsize; \
> } \
> @@ -1947,7 +1949,9 @@ static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile
> int val = *i_datap + (1 << (cbps - 1)); \
> /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
> val = av_clip(val, 0, (1 << cbps) - 1); \
> - *dst = val << (precision - cbps); \
> + *dst = val << ((precision < 8 ? 8 : precision) - cbps); \
> + if (precision < 8) \
> + *dst |= *dst >> (8 - precision); \
> i_datap++; \
> dst += pixelsize; \
> } \
the check should be outside the pixel loop, as precission does not change
between pixels, this is already a macro to avoid a 8/16 check. And it would
probably be hard for the compiler to figure out when it can remove which side
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Why not whip the teacher when the pupil misbehaves? -- Diogenes of Sinope
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20200426/839cd8c4/attachment.sig>
More information about the ffmpeg-devel
mailing list