From d6e8a9109e3adfcd28eee4d2509c0e2818c3caff Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 4 Oct 2022 13:04:52 +0300
Subject: [PATCH] SL-16542 Fix openjpeg seeking and encoding

---
 indra/llimagej2coj/llimagej2coj.cpp | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp
index 944629cf4c1..12985c3c7f5 100644
--- a/indra/llimagej2coj/llimagej2coj.cpp
+++ b/indra/llimagej2coj/llimagej2coj.cpp
@@ -171,19 +171,28 @@ static OPJ_OFF_T opj_skip(OPJ_OFF_T bytes, void* user_data)
 {
     JPEG2KBase* jpeg_codec = static_cast<JPEG2KBase*>(user_data);
     jpeg_codec->offset += bytes;
+
     if (jpeg_codec->offset > jpeg_codec->size)
     {
         jpeg_codec->offset = jpeg_codec->size;
         // Indicate end of stream
         return (OPJ_OFF_T)-1;
     }
+
+    if (jpeg_codec->offset < 0)
+    {
+        // Shouldn't be possible?
+        jpeg_codec->offset = 0;
+        return (OPJ_OFF_T)-1;
+    }
+
     return bytes;
 }
 
 static OPJ_BOOL opj_seek(OPJ_OFF_T bytes, void * user_data)
 {
     JPEG2KBase* jpeg_codec = static_cast<JPEG2KBase*>(user_data);
-    jpeg_codec->offset += bytes;
+    jpeg_codec->offset = bytes;
     jpeg_codec->offset = llclamp(U32(jpeg_codec->offset), U32(0), U32(jpeg_codec->size));
     return OPJ_TRUE;
 }
@@ -420,7 +429,7 @@ class JPEG2KEncode : public JPEG2KBase
         event_mgr.info_handler = info_callback;
 
         opj_set_default_encoder_parameters(&parameters);
-        parameters.cod_format = 0;
+        parameters.cod_format = OPJ_CODEC_J2K;
         parameters.cp_disto_alloc = 1;
         parameters.max_cs_size = (1 << 15);
 
@@ -486,11 +495,13 @@ class JPEG2KEncode : public JPEG2KBase
 
         parameters.tcp_mct = (image->numcomps >= 3) ? 1 : 0;
         parameters.cod_format = OPJ_CODEC_J2K;
-        parameters.numresolution = MAX_ENCODED_DISCARD_LEVELS;
         parameters.prog_order = OPJ_RLCP;
         parameters.cp_disto_alloc = 1;
 
-        opj_setup_encoder(encoder, &parameters, image);
+        if (!opj_setup_encoder(encoder, &parameters, image))
+        {
+            return false;
+        }
 
         opj_set_info_handler(encoder, opj_info, this);
         opj_set_warning_handler(encoder, opj_warn, this);
@@ -504,9 +515,7 @@ class JPEG2KEncode : public JPEG2KBase
         size = data_size_guess;
         offset = 0;
 
-#if LL_DEBUG
         memset(buffer, 0, data_size_guess);
-#endif
 
         if (stream)
         {
@@ -804,8 +813,8 @@ bool LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
     {
         LL_WARNS() << "Openjpeg encoding implementation isn't complete, returning false" << LL_ENDL;
     }
-    //return encoded;
-    return false;
+    return encoded;
+    //return false;
 }
 
 bool LLImageJ2COJ::getMetadata(LLImageJ2C &base)
-- 
GitLab