From 71a0f177052691964f2313defb69ba53211e5136 Mon Sep 17 00:00:00 2001 From: Amirhosein Date: Mon, 31 Oct 2022 18:56:31 +0330 Subject: [PATCH 1/6] support YUV_420_888 --- .../src/main/cpp/RenderScriptToolkit.h | 3 ++- .../src/main/cpp/YuvToRgb.cpp | 9 +++++++++ .../google/android/renderscript/Toolkit.kt | 5 +++-- .../android/renderscript_test/BufferUtils.kt | 1 + .../renderscript_test/IntrinsicYuvToRgb.kt | 1 + .../renderscript_test/ReferenceYuvToRgb.kt | 19 ++++++++++++++++++- 6 files changed, 34 insertions(+), 4 deletions(-) diff --git a/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h b/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h index 5315a93..d4f448f 100644 --- a/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h +++ b/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h @@ -509,6 +509,7 @@ class RenderScriptToolkit { */ enum class YuvFormat { NV21 = 0x11, + YUV_420_888 = 0x23, YV12 = 0x32315659, }; @@ -527,7 +528,7 @@ class RenderScriptToolkit { * @param out The buffer that receives the converted image. * @param sizeX The width in pixels of the image. Must be even. * @param sizeY The height in pixels of the image. - * @param format Either YV12 or NV21. + * @param format Either YV12 or NV21 or YUV_420_888 */ void yuvToRgb(const uint8_t* _Nonnull in, uint8_t* _Nonnull out, size_t sizeX, size_t sizeY, YuvFormat format); diff --git a/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp b/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp index 741bcc4..0ed79a9 100644 --- a/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp +++ b/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp @@ -57,6 +57,15 @@ class YuvToRgbTask : public Task { mInV = reinterpret_cast(input + mStrideY * sizeY); mInU = mInV + 1; break; + case RenderScriptToolkit::YuvFormat::YUV_420_888: + mCstep = 2; + mStrideY = sizeX; + mStrideU = mStrideY; + mStrideV = mStrideY; + mInY = reinterpret_cast(input); + mInU = reinterpret_cast(input + mStrideY * sizeY); + mInV = mInU + 1; + break; case RenderScriptToolkit::YuvFormat::YV12: mCstep = 1; mStrideY = roundUpTo16(sizeX); diff --git a/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt b/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt index 8d761cb..2b93f6e 100644 --- a/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt +++ b/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt @@ -1047,7 +1047,7 @@ object Toolkit { * @param inputArray The buffer of the image to be converted. * @param sizeX The width in pixels of the image. * @param sizeY The height in pixels of the image. - * @param format Either YV12 or NV21. + * @param format Either YV12 or NV21 or YUV_420_888 * @return The converted image as a byte array. */ fun yuvToRgb(inputArray: ByteArray, sizeX: Int, sizeY: Int, format: YuvFormat): ByteArray { @@ -1073,7 +1073,7 @@ object Toolkit { * @param inputArray The buffer of the image to be converted. * @param sizeX The width in pixels of the image. * @param sizeY The height in pixels of the image. - * @param format Either YV12 or NV21. + * @param format Either YV12 or NV21 or YUV_420_888 * @return The converted image. */ fun yuvToRgbBitmap(inputArray: ByteArray, sizeX: Int, sizeY: Int, format: YuvFormat): Bitmap { @@ -1422,6 +1422,7 @@ class LookupTable { */ enum class YuvFormat(val value: Int) { NV21(0x11), + YUV_420_888(0x23), YV12(0x32315659), } diff --git a/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt b/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt index 51ece8e..1f90d4c 100644 --- a/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt +++ b/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt @@ -361,6 +361,7 @@ fun randomYuvArray(seed: Long, sizeX: Int, sizeY: Int, format: YuvFormat): ByteA totalSize = strideX * sizeY + roundUpTo16(strideX / 2) * halfSizeY * 2 } YuvFormat.NV21 -> totalSize = sizeX * sizeY + halfSizeX * halfSizeY * 2 + YuvFormat.YUV_420_888 -> totalSize = sizeX * sizeY + halfSizeX * halfSizeY * 2 else -> require(false) { "Unknown YUV format $format" } } diff --git a/test-app/src/main/java/com/google/android/renderscript_test/IntrinsicYuvToRgb.kt b/test-app/src/main/java/com/google/android/renderscript_test/IntrinsicYuvToRgb.kt index 2ae8a89..1f2d36d 100644 --- a/test-app/src/main/java/com/google/android/renderscript_test/IntrinsicYuvToRgb.kt +++ b/test-app/src/main/java/com/google/android/renderscript_test/IntrinsicYuvToRgb.kt @@ -43,6 +43,7 @@ fun intrinsicYuvToRgb( inputBuilder.setY(sizeY) when (format) { YuvFormat.NV21 -> inputBuilder.setYuvFormat(ImageFormat.NV21) + YuvFormat.YUV_420_888 -> inputBuilder.setYuvFormat(ImageFormat.YUV_420_888) YuvFormat.YV12 -> inputBuilder.setYuvFormat(ImageFormat.YV12) else -> require(false) { "Unknown YUV format $format" } } diff --git a/test-app/src/main/java/com/google/android/renderscript_test/ReferenceYuvToRgb.kt b/test-app/src/main/java/com/google/android/renderscript_test/ReferenceYuvToRgb.kt index aa58516..b6d587e 100644 --- a/test-app/src/main/java/com/google/android/renderscript_test/ReferenceYuvToRgb.kt +++ b/test-app/src/main/java/com/google/android/renderscript_test/ReferenceYuvToRgb.kt @@ -33,8 +33,8 @@ fun referenceYuvToRgb(inputSignedArray: ByteArray, sizeX: Int, sizeY: Int, forma when (format) { YuvFormat.NV21 -> { val startY = 0 - val startU = sizeX * sizeY + 1 val startV = sizeX * sizeY + val startU = startV + 1 for (y in 0 until sizeY) { for (x in 0 until sizeX) { @@ -49,7 +49,24 @@ fun referenceYuvToRgb(inputSignedArray: ByteArray, sizeX: Int, sizeY: Int, forma } } } + YuvFormat.YUV_420_888 -> { + val startY = 0 + val startU = sizeX * sizeY + val startV = startU + 1 + for (y in 0 until sizeY) { + for (x in 0 until sizeX) { + val offsetY = y * sizeX + x + val offsetU = ((y shr 1) * sizeX + (x shr 1) * 2) + val offsetV = ((y shr 1) * sizeX + (x shr 1) * 2) + output[x, y] = yuvToRGBA4( + inputArray[startY + offsetY], + inputArray[startU + offsetU], + inputArray[startV + offsetV] + ) + } + } + } YuvFormat.YV12 -> { /* According to https://developer.android.com/reference/kotlin/android/graphics/ImageFormat#yv12, * strideX and strideUV should be aligned to 16 byte boundaries. If we do this, we From 3db33b641c668b0dfc1495d4ac989ff0d4d7755a Mon Sep 17 00:00:00 2001 From: Amirhosein Barati Date: Mon, 9 Sep 2024 20:57:48 +0330 Subject: [PATCH 2/6] Upgrade gradle & libs & java & sdk & ndk & cmake --- build.gradle | 11 ++++---- gradle/wrapper/gradle-wrapper.properties | 2 +- renderscript-toolkit/build.gradle | 26 +++++++++++-------- renderscript-toolkit/consumer-rules.pro | 0 .../google/android/renderscript/Toolkit.kt | 2 +- test-app/build.gradle | 24 ++++++++++------- .../android/renderscript_test/BufferUtils.kt | 2 +- 7 files changed, 39 insertions(+), 28 deletions(-) delete mode 100644 renderscript-toolkit/consumer-rules.pro diff --git a/build.gradle b/build.gradle index 4cfb714..dc62b48 100644 --- a/build.gradle +++ b/build.gradle @@ -1,17 +1,18 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = "1.5.31" + + ext.kotlin_version = "1.8.10" + repositories { google() mavenCentral() } + dependencies { - classpath 'com.android.tools.build:gradle:7.0.3' + classpath 'com.android.tools.build:gradle:7.3.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files } + } allprojects { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6154b02..556a77c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Mar 30 16:57:53 PDT 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/renderscript-toolkit/build.gradle b/renderscript-toolkit/build.gradle index 7d62b0e..45484f3 100644 --- a/renderscript-toolkit/build.gradle +++ b/renderscript-toolkit/build.gradle @@ -4,17 +4,15 @@ plugins { } android { - compileSdkVersion 31 - buildToolsVersion "31.0.0" + + compileSdk 35 + ndkVersion "27.1.12297006" defaultConfig { - minSdkVersion 16 - targetSdkVersion 31 + minSdk 16 + targetSdk 35 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" externalNativeBuild { cmake { cppFlags "-std=c++17" @@ -28,22 +26,28 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } + kotlinOptions { - jvmTarget = '1.8' + jvmTarget = '11' } + externalNativeBuild { cmake { path file('src/main/cpp/CMakeLists.txt') + version "3.22.1" } } + } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'androidx.core:core-ktx:1.6.0' + implementation 'androidx.core:core-ktx:1.9.0' + } diff --git a/renderscript-toolkit/consumer-rules.pro b/renderscript-toolkit/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt b/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt index 2b93f6e..eb88d24 100644 --- a/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt +++ b/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt @@ -1499,7 +1499,7 @@ internal fun validateBitmap( } internal fun createCompatibleBitmap(inputBitmap: Bitmap) = - Bitmap.createBitmap(inputBitmap.width, inputBitmap.height, inputBitmap.config) + Bitmap.createBitmap(inputBitmap.width, inputBitmap.height, inputBitmap.config!!) internal fun validateHistogramDotCoefficients( coefficients: FloatArray?, diff --git a/test-app/build.gradle b/test-app/build.gradle index c7de909..2f40349 100644 --- a/test-app/build.gradle +++ b/test-app/build.gradle @@ -4,16 +4,15 @@ plugins { } android { - compileSdkVersion 31 - buildToolsVersion "31.0.0" + + compileSdk 35 defaultConfig { applicationId "com.google.android.renderscript_test" - minSdkVersion 21 - targetSdkVersion 31 + minSdk 21 + targetSdk 35 versionCode 1 versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -23,22 +22,29 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } + kotlinOptions { - jvmTarget = '1.8' + jvmTarget = '11' } + } dependencies { - implementation project(":renderscript-toolkit") + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.6.0' implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' + + implementation project(":renderscript-toolkit") + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + } diff --git a/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt b/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt index 1f90d4c..6d4cb2b 100644 --- a/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt +++ b/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt @@ -481,7 +481,7 @@ fun vectorSizeOfBitmap(bitmap: Bitmap): Int { } fun duplicateBitmap(original: Bitmap): Bitmap { - val copy = Bitmap.createBitmap(original.width, original.height, original.config) + val copy = Bitmap.createBitmap(original.width, original.height, original.config!!) val canvas = Canvas(copy) canvas.drawBitmap(original, 0f, 0f, null) return copy From 0705e632f9f9c845bcc1fba2ed8c8c0c5893bd8e Mon Sep 17 00:00:00 2001 From: Amirhosein Barati Date: Mon, 9 Sep 2024 22:11:26 +0330 Subject: [PATCH 3/6] Revert "support YUV_420_888" This reverts commit 71a0f177052691964f2313defb69ba53211e5136. --- .../src/main/cpp/RenderScriptToolkit.h | 3 +-- .../src/main/cpp/YuvToRgb.cpp | 9 --------- .../google/android/renderscript/Toolkit.kt | 5 ++--- .../android/renderscript_test/BufferUtils.kt | 1 - .../renderscript_test/IntrinsicYuvToRgb.kt | 1 - .../renderscript_test/ReferenceYuvToRgb.kt | 19 +------------------ 6 files changed, 4 insertions(+), 34 deletions(-) diff --git a/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h b/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h index d4f448f..5315a93 100644 --- a/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h +++ b/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h @@ -509,7 +509,6 @@ class RenderScriptToolkit { */ enum class YuvFormat { NV21 = 0x11, - YUV_420_888 = 0x23, YV12 = 0x32315659, }; @@ -528,7 +527,7 @@ class RenderScriptToolkit { * @param out The buffer that receives the converted image. * @param sizeX The width in pixels of the image. Must be even. * @param sizeY The height in pixels of the image. - * @param format Either YV12 or NV21 or YUV_420_888 + * @param format Either YV12 or NV21. */ void yuvToRgb(const uint8_t* _Nonnull in, uint8_t* _Nonnull out, size_t sizeX, size_t sizeY, YuvFormat format); diff --git a/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp b/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp index 0ed79a9..741bcc4 100644 --- a/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp +++ b/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp @@ -57,15 +57,6 @@ class YuvToRgbTask : public Task { mInV = reinterpret_cast(input + mStrideY * sizeY); mInU = mInV + 1; break; - case RenderScriptToolkit::YuvFormat::YUV_420_888: - mCstep = 2; - mStrideY = sizeX; - mStrideU = mStrideY; - mStrideV = mStrideY; - mInY = reinterpret_cast(input); - mInU = reinterpret_cast(input + mStrideY * sizeY); - mInV = mInU + 1; - break; case RenderScriptToolkit::YuvFormat::YV12: mCstep = 1; mStrideY = roundUpTo16(sizeX); diff --git a/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt b/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt index eb88d24..ab1d842 100644 --- a/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt +++ b/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt @@ -1047,7 +1047,7 @@ object Toolkit { * @param inputArray The buffer of the image to be converted. * @param sizeX The width in pixels of the image. * @param sizeY The height in pixels of the image. - * @param format Either YV12 or NV21 or YUV_420_888 + * @param format Either YV12 or NV21. * @return The converted image as a byte array. */ fun yuvToRgb(inputArray: ByteArray, sizeX: Int, sizeY: Int, format: YuvFormat): ByteArray { @@ -1073,7 +1073,7 @@ object Toolkit { * @param inputArray The buffer of the image to be converted. * @param sizeX The width in pixels of the image. * @param sizeY The height in pixels of the image. - * @param format Either YV12 or NV21 or YUV_420_888 + * @param format Either YV12 or NV21. * @return The converted image. */ fun yuvToRgbBitmap(inputArray: ByteArray, sizeX: Int, sizeY: Int, format: YuvFormat): Bitmap { @@ -1422,7 +1422,6 @@ class LookupTable { */ enum class YuvFormat(val value: Int) { NV21(0x11), - YUV_420_888(0x23), YV12(0x32315659), } diff --git a/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt b/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt index 6d4cb2b..c750677 100644 --- a/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt +++ b/test-app/src/main/java/com/google/android/renderscript_test/BufferUtils.kt @@ -361,7 +361,6 @@ fun randomYuvArray(seed: Long, sizeX: Int, sizeY: Int, format: YuvFormat): ByteA totalSize = strideX * sizeY + roundUpTo16(strideX / 2) * halfSizeY * 2 } YuvFormat.NV21 -> totalSize = sizeX * sizeY + halfSizeX * halfSizeY * 2 - YuvFormat.YUV_420_888 -> totalSize = sizeX * sizeY + halfSizeX * halfSizeY * 2 else -> require(false) { "Unknown YUV format $format" } } diff --git a/test-app/src/main/java/com/google/android/renderscript_test/IntrinsicYuvToRgb.kt b/test-app/src/main/java/com/google/android/renderscript_test/IntrinsicYuvToRgb.kt index 1f2d36d..2ae8a89 100644 --- a/test-app/src/main/java/com/google/android/renderscript_test/IntrinsicYuvToRgb.kt +++ b/test-app/src/main/java/com/google/android/renderscript_test/IntrinsicYuvToRgb.kt @@ -43,7 +43,6 @@ fun intrinsicYuvToRgb( inputBuilder.setY(sizeY) when (format) { YuvFormat.NV21 -> inputBuilder.setYuvFormat(ImageFormat.NV21) - YuvFormat.YUV_420_888 -> inputBuilder.setYuvFormat(ImageFormat.YUV_420_888) YuvFormat.YV12 -> inputBuilder.setYuvFormat(ImageFormat.YV12) else -> require(false) { "Unknown YUV format $format" } } diff --git a/test-app/src/main/java/com/google/android/renderscript_test/ReferenceYuvToRgb.kt b/test-app/src/main/java/com/google/android/renderscript_test/ReferenceYuvToRgb.kt index b6d587e..aa58516 100644 --- a/test-app/src/main/java/com/google/android/renderscript_test/ReferenceYuvToRgb.kt +++ b/test-app/src/main/java/com/google/android/renderscript_test/ReferenceYuvToRgb.kt @@ -33,8 +33,8 @@ fun referenceYuvToRgb(inputSignedArray: ByteArray, sizeX: Int, sizeY: Int, forma when (format) { YuvFormat.NV21 -> { val startY = 0 + val startU = sizeX * sizeY + 1 val startV = sizeX * sizeY - val startU = startV + 1 for (y in 0 until sizeY) { for (x in 0 until sizeX) { @@ -49,24 +49,7 @@ fun referenceYuvToRgb(inputSignedArray: ByteArray, sizeX: Int, sizeY: Int, forma } } } - YuvFormat.YUV_420_888 -> { - val startY = 0 - val startU = sizeX * sizeY - val startV = startU + 1 - for (y in 0 until sizeY) { - for (x in 0 until sizeX) { - val offsetY = y * sizeX + x - val offsetU = ((y shr 1) * sizeX + (x shr 1) * 2) - val offsetV = ((y shr 1) * sizeX + (x shr 1) * 2) - output[x, y] = yuvToRGBA4( - inputArray[startY + offsetY], - inputArray[startU + offsetU], - inputArray[startV + offsetV] - ) - } - } - } YuvFormat.YV12 -> { /* According to https://developer.android.com/reference/kotlin/android/graphics/ImageFormat#yv12, * strideX and strideUV should be aligned to 16 byte boundaries. If we do this, we From 52e8a19991edcd11782f86d0d512516e9db5ede1 Mon Sep 17 00:00:00 2001 From: Amirhosein Barati Date: Mon, 9 Sep 2024 23:15:34 +0330 Subject: [PATCH 4/6] Support NV12 & YV21 in YuvToRgb.cpp --- .../src/main/cpp/RenderScriptToolkit.h | 2 ++ renderscript-toolkit/src/main/cpp/YuvToRgb.cpp | 18 ++++++++++++++++++ .../com/google/android/renderscript/Toolkit.kt | 12 ++++++++++++ 3 files changed, 32 insertions(+) diff --git a/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h b/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h index 5315a93..fe0b80c 100644 --- a/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h +++ b/renderscript-toolkit/src/main/cpp/RenderScriptToolkit.h @@ -508,8 +508,10 @@ class RenderScriptToolkit { * The YUV formats supported by yuvToRgb. */ enum class YuvFormat { + NV12 = 0x10, NV21 = 0x11, YV12 = 0x32315659, + YV21 = 0x32315660, }; /** diff --git a/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp b/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp index 741bcc4..efbab4d 100644 --- a/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp +++ b/renderscript-toolkit/src/main/cpp/YuvToRgb.cpp @@ -48,6 +48,15 @@ class YuvToRgbTask : public Task { RenderScriptToolkit::YuvFormat format) : Task{sizeX, sizeY, 4, false, nullptr}, mOut{reinterpret_cast(output)} { switch (format) { + case RenderScriptToolkit::YuvFormat::NV12: + mCstep = 2; + mStrideY = sizeX; + mStrideU = mStrideY; + mStrideV = mStrideY; + mInY = reinterpret_cast(input); + mInU = reinterpret_cast(input + mStrideY * sizeY); + mInV = mInU + 1; + break; case RenderScriptToolkit::YuvFormat::NV21: mCstep = 2; mStrideY = sizeX; @@ -66,6 +75,15 @@ class YuvToRgbTask : public Task { mInU = reinterpret_cast(input + mStrideY * sizeY); mInV = mInU + mStrideV * sizeY / 2; break; + case RenderScriptToolkit::YuvFormat::YV21: + mCstep = 1; + mStrideY = roundUpTo16(sizeX); + mStrideU = roundUpTo16(mStrideY >> 1u); + mStrideV = mStrideU; + mInY = reinterpret_cast(input); + mInV = reinterpret_cast(input + mStrideY * sizeY); + mInU = mInV + mStrideU * sizeY / 2; + break; } } }; diff --git a/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt b/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt index ab1d842..fb12c29 100644 --- a/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt +++ b/renderscript-toolkit/src/main/java/com/google/android/renderscript/Toolkit.kt @@ -1038,6 +1038,11 @@ object Toolkit { /** * Convert an image from YUV to RGB. * + * YV12 + * I420 = IYUV = YUV420p (sometimes YUV420p can refer to YV12) + * NV21 + * NV12 = YUV420sp (sometimes YUV420sp can refer to NV21) + * * Converts a YUV buffer to RGB. The input array should be supplied in a supported YUV format. * The output is RGBA; the alpha channel will be set to 255. * @@ -1064,6 +1069,11 @@ object Toolkit { /** * Convert an image from YUV to an RGB Bitmap. * + * YV12 = YUV420p, YUV420pp + * I420 = IYUV = YUV420p (sometimes YUV420p can refer to YV12) + * NV21 + * NV12 = YUV420sp, YUV420psp + * * Converts a YUV buffer to an RGB Bitmap. The input array should be supplied in a supported * YUV format. The output is RGBA; the alpha channel will be set to 255. * @@ -1421,8 +1431,10 @@ class LookupTable { * The YUV formats supported by yuvToRgb. */ enum class YuvFormat(val value: Int) { + NV12(0x10), NV21(0x11), YV12(0x32315659), + YV21(0x32315660), } /** From 957f9fb4b24d168d8e272733984de31e80add60f Mon Sep 17 00:00:00 2001 From: Amirhosein Barati Date: Tue, 10 Sep 2024 16:00:18 +0330 Subject: [PATCH 5/6] Fixing jitpack build --- renderscript-toolkit/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renderscript-toolkit/build.gradle b/renderscript-toolkit/build.gradle index 45484f3..b5e9261 100644 --- a/renderscript-toolkit/build.gradle +++ b/renderscript-toolkit/build.gradle @@ -39,7 +39,7 @@ android { externalNativeBuild { cmake { path file('src/main/cpp/CMakeLists.txt') - version "3.22.1" + //version "3.22.1" } } From 9be10fe902a7b55f59975d42a7ecec5d58e32663 Mon Sep 17 00:00:00 2001 From: Amirhosein Barati Date: Tue, 10 Sep 2024 16:07:43 +0330 Subject: [PATCH 6/6] Fixing jitpack build --- renderscript-toolkit/build.gradle | 4 ++-- test-app/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/renderscript-toolkit/build.gradle b/renderscript-toolkit/build.gradle index b5e9261..9c9bcc5 100644 --- a/renderscript-toolkit/build.gradle +++ b/renderscript-toolkit/build.gradle @@ -5,12 +5,12 @@ plugins { android { - compileSdk 35 + compileSdk 34 ndkVersion "27.1.12297006" defaultConfig { minSdk 16 - targetSdk 35 + targetSdk 34 versionCode 1 versionName "1.0" externalNativeBuild { diff --git a/test-app/build.gradle b/test-app/build.gradle index 2f40349..572e4f4 100644 --- a/test-app/build.gradle +++ b/test-app/build.gradle @@ -5,12 +5,12 @@ plugins { android { - compileSdk 35 + compileSdk 34 defaultConfig { applicationId "com.google.android.renderscript_test" minSdk 21 - targetSdk 35 + targetSdk 34 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"