Am Mo., 20. Apr. 2020 um 21:38 Uhr schrieb <gautamr...@gmail.com>:
>
> From: Gautam Ramakrishnan <gautamr...@gmail.com>
>
> This patch adds support for decoding images
> with a Region of Interest. Allows decoding
> samples such as p0_03.j2k. This patch should
> fix ticket #4681.

The following inlined poc makes FFmpeg's output for this
sample bit-exact with kdu_render and opj_decompress.

jasper's output file looks ugly.

Carl Eugen

diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
index af6dcee228..5380596c04 100644
--- a/libavcodec/jpeg2000dec.c
+++ b/libavcodec/jpeg2000dec.c
@@ -1921,7 +1921,9 @@ static inline void tile_codeblocks
                         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;
                            \
                     }
                            \
@@ -1930,7 +1932,9 @@ static inline void tile_codeblocks
                         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;
                            \
                     }
                            \
@@ -1972,7 +1976,7 @@ static int jpeg2000_decode_tile
     }

     if (s->precision <= 8) {
-        write_frame_8(s, tile, picture, 8);
+        write_frame_8(s, tile, picture, s->precision);
     } else {
         int precision = picture->format == AV_PIX_FMT_XYZ12 ||
                         picture->format == AV_PIX_FMT_RGB48 ||
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to