From b82fd8d201632b70d238b3986f6f96ee98b1ace3 Mon Sep 17 00:00:00 2001 From: Radzivon Bartoshyk Date: Thu, 14 Nov 2024 20:06:02 +0000 Subject: [PATCH 1/2] Hardware buffer acquire fix --- CHANGELOG.md | 2 +- app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt | 10 +++++----- jxlcoder/src/main/cpp/JniDecoding.cpp | 10 ++++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca65275..af9df7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1 @@ -Upgrade libjxl, speed improvements and stability \ No newline at end of file +Improvements for f16, fixes for non standard cpu processors \ No newline at end of file diff --git a/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt b/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt index 5a4ab19..5505b97 100644 --- a/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt +++ b/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt @@ -125,8 +125,8 @@ class MainActivity : ComponentActivity() { } LaunchedEffect(key1 = Unit, block = { lifecycleScope.launch(Dispatchers.IO) { - val buffer5 = - assets.open("hatice.jpg").source().buffer().readByteArray() +// val buffer5 = +// assets.open("hatice.jpg").source().buffer().readByteArray() // val bitmap = BitmapFactory.decodeByteArray(buffer5, 0, buffer5.size) // .scale(500, 500) // val encoder = JxlAnimatedEncoder( @@ -190,7 +190,7 @@ class MainActivity : ComponentActivity() { var assets = (this@MainActivity.assets.list("") ?: return@launch).toList() - assets = assets.filter { it.contains("20181110_213419__MMC1561-HDR.jxl") } +// assets = assets.filter { it.contains("20181110_213419__MMC1561-HDR.jxl") } for (asset in assets) { try { val buffer4 = @@ -204,9 +204,9 @@ class MainActivity : ComponentActivity() { buffer4, largeImageSize.width / 2, largeImageSize.height / 2, - preferredColorConfig = PreferredColorConfig.RGBA_F16, + preferredColorConfig = PreferredColorConfig.HARDWARE, com.awxkee.jxlcoder.ScaleMode.FIT, - toneMapper = JxlToneMapper.FILMIC, + toneMapper = JxlToneMapper.REC2408, ) // val srcImage = JxlCoder.decode(buffer4, // preferredColorConfig = PreferredColorConfig.RGB_565, diff --git a/jxlcoder/src/main/cpp/JniDecoding.cpp b/jxlcoder/src/main/cpp/JniDecoding.cpp index bef9f74..27e32bf 100644 --- a/jxlcoder/src/main/cpp/JniDecoding.cpp +++ b/jxlcoder/src/main/cpp/JniDecoding.cpp @@ -317,6 +317,11 @@ Java_com_awxkee_jxlcoder_JxlCoder_decodeSampledImpl(JNIEnv *env, jobject thiz, std::string errorString = "Not enough memory to decode this image"; throwException(env, errorString); return nullptr; + } catch (std::runtime_error &err) { + std::string w1 = err.what(); + std::string errorString = "Error while decoding: " + w1; + throwException(env, errorString); + return nullptr; } } @@ -346,6 +351,11 @@ Java_com_awxkee_jxlcoder_JxlCoder_decodeByteBufferSampledImpl(JNIEnv *env, jobje std::string errorString = "Not enough memory to decode this image"; throwException(env, errorString); return nullptr; + } catch (std::runtime_error &err) { + std::string w1 = err.what(); + std::string errorString = "Error while decoding: " + w1; + throwException(env, errorString); + return nullptr; } } From acbd9b5cc286b1820d4752a201b136284c8a9c4b Mon Sep 17 00:00:00 2001 From: Radzivon Bartoshyk Date: Thu, 14 Nov 2024 20:07:22 +0000 Subject: [PATCH 2/2] Hardware buffer acquire fix --- .../java/com/awxkee/jxlcoder/MainActivity.kt | 2 +- jxlcoder/src/main/cpp/JniDecoding.cpp | 28 +++++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt b/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt index 5505b97..4093881 100644 --- a/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt +++ b/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt @@ -204,7 +204,7 @@ class MainActivity : ComponentActivity() { buffer4, largeImageSize.width / 2, largeImageSize.height / 2, - preferredColorConfig = PreferredColorConfig.HARDWARE, + preferredColorConfig = PreferredColorConfig.RGBA_8888, com.awxkee.jxlcoder.ScaleMode.FIT, toneMapper = JxlToneMapper.REC2408, ) diff --git a/jxlcoder/src/main/cpp/JniDecoding.cpp b/jxlcoder/src/main/cpp/JniDecoding.cpp index 27e32bf..73ce5f4 100644 --- a/jxlcoder/src/main/cpp/JniDecoding.cpp +++ b/jxlcoder/src/main/cpp/JniDecoding.cpp @@ -103,7 +103,8 @@ jobject decodeSampledImageImpl(JNIEnv *env, std::vector &imageData, jin imageData.clear(); if (!iccProfile.empty()) { - size_t stride = (size_t) xsize * 4 * (size_t)(useBitmapFloats ? sizeof(uint16_t) : sizeof(uint8_t)); + size_t stride = + (size_t) xsize * 4 * (size_t) (useBitmapFloats ? sizeof(uint16_t) : sizeof(uint8_t)); convertUseDefinedColorSpace(rgbaPixels, stride, static_cast(xsize), @@ -113,11 +114,13 @@ jobject decodeSampledImageImpl(JNIEnv *env, std::vector &imageData, jin useBitmapFloats); } - bool useSampler = (scaledWidth > 0 || scaledHeight > 0) && (scaledWidth != 0 && scaledHeight != 0); + bool + useSampler = (scaledWidth > 0 || scaledHeight > 0) && (scaledWidth != 0 && scaledHeight != 0); uint32_t finalWidth = xsize; uint32_t finalHeight = ysize; - uint32_t stride = static_cast(finalWidth) * 4 * static_cast(useBitmapFloats ? sizeof(uint16_t) : sizeof(uint8_t)); + uint32_t stride = static_cast(finalWidth) * 4 + * static_cast(useBitmapFloats ? sizeof(uint16_t) : sizeof(uint8_t)); if (useSampler) { auto scaleResult = RescaleImage(rgbaPixels, env, &stride, useBitmapFloats, @@ -248,7 +251,8 @@ jobject decodeSampledImageImpl(JNIEnv *env, std::vector &imageData, jin jobject rgba8888Obj = env->GetStaticObjectField(bitmapConfig, rgba8888FieldID); jclass bitmapClass = env->FindClass("android/graphics/Bitmap"); - jmethodID createBitmapMethodID = env->GetStaticMethodID(bitmapClass, "createBitmap", + jmethodID createBitmapMethodID = env->GetStaticMethodID(bitmapClass, + "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;"); jobject bitmapObj = env->CallStaticObjectMethod(bitmapClass, createBitmapMethodID, static_cast(finalWidth), @@ -318,10 +322,10 @@ Java_com_awxkee_jxlcoder_JxlCoder_decodeSampledImpl(JNIEnv *env, jobject thiz, throwException(env, errorString); return nullptr; } catch (std::runtime_error &err) { - std::string w1 = err.what(); - std::string errorString = "Error while decoding: " + w1; - throwException(env, errorString); - return nullptr; + std::string w1 = err.what(); + std::string errorString = "Error while decoding: " + w1; + throwException(env, errorString); + return nullptr; } } @@ -352,10 +356,10 @@ Java_com_awxkee_jxlcoder_JxlCoder_decodeByteBufferSampledImpl(JNIEnv *env, jobje throwException(env, errorString); return nullptr; } catch (std::runtime_error &err) { - std::string w1 = err.what(); - std::string errorString = "Error while decoding: " + w1; - throwException(env, errorString); - return nullptr; + std::string w1 = err.what(); + std::string errorString = "Error while decoding: " + w1; + throwException(env, errorString); + return nullptr; } }