If reduce_factor value greater than number of decomposition level: raise a
warning and set decomposition level to the lowest value.
---
Minor version bump due to option interface changer.
Replace patches :jpeg2000: add check of lowres size.
 libavcodec/jpeg2000dec.c |   34 ++++++++++++++++++----------------
 libavcodec/version.h     |    2 +-
 2 files changed, 19 insertions(+), 17 deletions(-)

diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
index 11211d3..478cc72 100644
--- a/libavcodec/jpeg2000dec.c
+++ b/libavcodec/jpeg2000dec.c
@@ -87,8 +87,7 @@ typedef struct Jpeg2000DecoderContext {
     Jpeg2000Tile    *tile;
 
     /*options parameters*/
-    int16_t         lowres;
-    int16_t         reduction_factor;
+    int16_t         reduce_factor;
 } Jpeg2000DecoderContext;
 
 /* get_bits functions for JPEG2000 packet bitstream
@@ -203,12 +202,6 @@ static int get_siz(Jpeg2000DecoderContext *s)
             return AVERROR(ENOMEM);
     }
 
-    /* compute image size with reduction factor */
-    s->avctx->width  = ff_jpeg2000_ceildivpow2(s->width  - s->image_offset_x,
-                                               s->reduction_factor);
-    s->avctx->height = ff_jpeg2000_ceildivpow2(s->height - s->image_offset_y,
-                                               s->reduction_factor);
-
     switch (s->avctx->profile) {
     case FF_PROFILE_JPEG2000_DCINEMA_2K:
     case FF_PROFILE_JPEG2000_DCINEMA_4K:
@@ -251,13 +244,24 @@ static int get_cox(Jpeg2000DecoderContext *s, 
Jpeg2000CodingStyle *c)
 
     if (s->buf_end - s->buf < 5)
         return AVERROR(EINVAL);
-    c->nreslevels = bytestream_get_byte(&s->buf) + 1; // num of resolution 
levels - 1
+    c->nreslevels = bytestream_get_byte(&s->buf) + 1; // num of resolution 
levels
 
     /* compute number of resolution levels to decode */
-    if (c->nreslevels < s->reduction_factor)
+    if (c->nreslevels <= s->reduce_factor) {
+        av_log(s->avctx, AV_LOG_WARNING,
+               "Cannot set reduce_factor to %d, so set to minimum value for 
this file(%d)\n",
+               s->reduce_factor, c->nreslevels - 1);
         c->nreslevels2decode = 1;
-    else
-        c->nreslevels2decode = c->nreslevels - s->reduction_factor;
+        s->reduce_factor = c->nreslevels - 1;
+    } else
+        c->nreslevels2decode = c->nreslevels - s->reduce_factor;
+
+    /* compute image size with reduction factor */
+    s->avctx->width  = ff_jpeg2000_ceildivpow2(s->width  - s->image_offset_x,
+                                               s->reduce_factor);
+    s->avctx->height = ff_jpeg2000_ceildivpow2(s->height - s->image_offset_y,
+                                               s->reduce_factor);
+
 
     c->log2_cblk_width  = bytestream_get_byte(&s->buf) + 2; // cblk width
     c->log2_cblk_height = bytestream_get_byte(&s->buf) + 2; // cblk height
@@ -1261,8 +1265,6 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, 
void *data,
     s->buf_end   = s->buf_start + avpkt->size;
     s->curtileno = 0; // TODO: only one tile in DCI JP2K. to implement for 
more tiles
 
-    // reduction factor, i.e number of resolution levels to skip
-    s->reduction_factor = s->lowres;
 
     if (s->buf_end - s->buf < 2)
         return AVERROR(EINVAL);
@@ -1315,8 +1317,8 @@ static void jpeg2000_init_static_data(AVCodec *codec)
 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
 
 static const AVOption options[] = {
-    { "lowres",  "Lower the decoding resolution by a power of two",
-        OFFSET(lowres), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 
JPEG2000_MAX_RESLEVELS - 1, VD },
+    { "reduce_factor", "Number of highest resolution level to discard. The 
image resolution is divided by 2^reduce_factor",
+        OFFSET(reduce_factor), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 
JPEG2000_MAX_RESLEVELS - 1, VD },
     { NULL },
 };
 
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 2dc0f4d..afc2d35 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -27,7 +27,7 @@
  */
 
 #define LIBAVCODEC_VERSION_MAJOR 55
-#define LIBAVCODEC_VERSION_MINOR  4
+#define LIBAVCODEC_VERSION_MINOR  5
 #define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
-- 
1.7.9.5

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to