Skip to content

Commit f58b472

Browse files
committed
Big rework to support SVT, libavif, kvazaar
1 parent 629e273 commit f58b472

File tree

215 files changed

+24497
-112479
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

215 files changed

+24497
-112479
lines changed

app/build.gradle

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,16 @@ android {
4545

4646
dependencies {
4747
implementation project(":avif-coder")
48-
implementation 'androidx.core:core-ktx:1.10.1'
49-
implementation 'androidx.appcompat:appcompat:1.6.1'
50-
implementation 'com.google.android.material:material:1.9.0'
48+
implementation 'androidx.core:core-ktx:1.13.1'
49+
implementation 'androidx.appcompat:appcompat:1.7.0'
50+
implementation 'com.google.android.material:material:1.12.0'
5151
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
5252
testImplementation 'junit:junit:4.13.2'
53-
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
54-
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
53+
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
54+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
5555
implementation("com.squareup.okio:okio:3.3.0")
5656
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1")
57-
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1"
57+
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.6"
5858
implementation 'com.github.bumptech.glide:glide:4.16.0'
5959
ksp 'com.github.bumptech.glide:ksp:4.16.0'
6060
}

app/src/main/java/com/radzivon/bartoshyk/avif/MainActivity.kt

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import android.util.Log
3535
import android.util.Size
3636
import androidx.appcompat.app.AppCompatActivity
3737
import androidx.lifecycle.lifecycleScope
38-
import com.radzivon.bartoshyk.avif.coder.AvifSpeed
3938
import com.radzivon.bartoshyk.avif.coder.HeifCoder
4039
import com.radzivon.bartoshyk.avif.coder.PreciseMode
4140
import com.radzivon.bartoshyk.avif.coder.PreferredColorConfig
@@ -48,6 +47,7 @@ import kotlinx.coroutines.launch
4847
import okio.buffer
4948
import okio.sink
5049
import okio.source
50+
import java.io.ByteArrayInputStream
5151
import java.io.File
5252
import java.io.FileNotFoundException
5353
import java.io.FileOutputStream
@@ -107,7 +107,7 @@ class MainActivity : AppCompatActivity() {
107107
var allFiles = mutableListOf<String>()
108108
allFiles.addAll(allFiles2)
109109
allFiles.addAll(allFiles1)
110-
allFiles = allFiles.filter { it.contains("wide_gamut.avif") }.toMutableList()
110+
allFiles = allFiles.filter { it.contains("federico-beccari.avif") }.toMutableList()
111111
// allFiles = allFiles.filter { it.contains("bbb_alpha_inverted.avif") }.toMutableList()
112112
for (file in allFiles) {
113113
try {
@@ -123,20 +123,30 @@ class MainActivity : AppCompatActivity() {
123123
// PreferredColorConfig.RGBA_1010102,
124124
// ScaleMode.RESIZE
125125
// )
126-
val bitmap = coder.decode(
126+
127+
val start = System.currentTimeMillis()
128+
129+
val bitmap0 = coder.decode(
127130
buffer,
128131
preferredColorConfig = PreferredColorConfig.RGBA_8888,
129132
)
130-
val encoded = coder.encodeAvif(bitmap, 61, PreciseMode.LOSSY, AvifSpeed.SIX)
131-
val decodedEncoded = coder.decode(encoded);
133+
134+
// bitmap0.setColorSpace(ColorSpace.getFromDataSpace(DataSpace.DATASPACE_BT2020_PQ)!!)
135+
136+
Log.i("AVIF", "Decoding time ${System.currentTimeMillis() - start}")
137+
138+
val encode = coder.encodeAvif(bitmap = bitmap0, quality = 64)
139+
val bitmap = coder.decode(encode)
140+
141+
lifecycleScope.launch(Dispatchers.Main) {
142+
val imageView = BindingImageViewBinding.inflate(layoutInflater, binding.scrollViewContainer, false)
143+
imageView.root.setImageBitmap(bitmap0)
144+
binding.scrollViewContainer.addView(imageView.root)
145+
}
132146
lifecycleScope.launch(Dispatchers.Main) {
133147
val imageView = BindingImageViewBinding.inflate(layoutInflater, binding.scrollViewContainer, false)
134148
imageView.root.setImageBitmap(bitmap)
135149
binding.scrollViewContainer.addView(imageView.root)
136-
137-
val imageView1 = BindingImageViewBinding.inflate(layoutInflater, binding.scrollViewContainer, false)
138-
imageView1.root.setImageBitmap(decodedEncoded)
139-
binding.scrollViewContainer.addView(imageView1.root)
140150
}
141151
}
142152
} catch (e: Exception) {

avif-coder/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ android {
7272
"-std=c++20",
7373
)
7474
)
75-
abiFilters += setOf("armeabi-v7a", "arm64-v8a", "x86_64", "x86")
75+
abiFilters += setOf("arm64-v8a")
76+
// abiFilters += setOf("armeabi-v7a", "arm64-v8a", "x86_64", "x86")
7677
}
7778
}
7879

avif-coder/src/main/cpp/CMakeLists.txt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,30 @@ add_library(coder SHARED JniEncoder.cpp JniException.cpp SizeScaler.cpp
1616
icc/cmsps2.c icc/cmssamp.c icc/cmssm.c icc/cmstypes.c icc/cmsvirt.c
1717
icc/cmswtpnt.c icc/cmsxform.c colorspace/colorspace.cpp
1818
imagebits/RgbaF16bitToNBitU16.cpp imagebits/RgbaF16bitNBitU8.cpp imagebits/Rgb1010102.cpp
19-
colorspace/GamutAdapter.cpp
2019
imagebits/CopyUnalignedRGBA.cpp JniDecoder.cpp imagebits/Rgba8ToF16.cpp
2120
imagebits/Rgb565.cpp JniBitmap.cpp ReformatBitmap.cpp Support.cpp IccRecognizer.cpp
2221
HardwareBuffersCompat.cpp imagebits/half.cpp
2322
imagebits/half.hpp imagebits/RgbaU16toHF.cpp
2423
imagebits/RGBAlpha.cpp
25-
hwy/aligned_allocator.cc hwy/nanobenchmark.cc hwy/per_target.cc hwy/print.cc hwy/targets.cc
26-
hwy/timer.cc
27-
algo/sleef-hwy.cpp)
24+
colorspace/Trc.cpp YuvConversion.cpp
25+
colorspace/Rec2408ToneMapper.cpp colorspace/LogarithmicToneMapper.cpp
26+
colorspace/ColorMatrix.cpp imagebits/ScanAlpha.cpp imagebits/Rgba16.cpp)
2827

29-
add_library(libaom SHARED IMPORTED)
30-
add_library(libx265 SHARED IMPORTED)
28+
add_library(libkvazaar SHARED IMPORTED)
3129
add_library(libheif SHARED IMPORTED)
3230
add_library(libyuv STATIC IMPORTED)
3331
add_library(libde265 SHARED IMPORTED)
3432
add_library(libdav1d SHARED IMPORTED)
3533
add_library(libsharpyuv STATIC IMPORTED)
34+
add_library(svt SHARED IMPORTED)
3635

37-
set_target_properties(libaom PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libaom.so)
38-
set_target_properties(libx265 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libx265.so)
36+
set_target_properties(libkvazaar PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libkvazaar.so)
3937
set_target_properties(libheif PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libheif.so)
4038
set_target_properties(libyuv PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libyuv.a)
4139
set_target_properties(libde265 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libde265.so)
4240
set_target_properties(libdav1d PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libdav1d.so)
4341
set_target_properties(libsharpyuv PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libsharpyuv.a)
42+
set_target_properties(svt PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libSvtAv1Enc.so)
4443

4544
add_library(cpufeatures STATIC ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c)
4645
target_include_directories(cpufeatures PUBLIC ${ANDROID_NDK}/sources/android/cpufeatures)
@@ -50,6 +49,9 @@ list(APPEND EXTRA_LIBS cpufeatures)
5049
include(CheckCXXCompilerFlag)
5150
if (ANDROID_ABI STREQUAL arm64-v8a)
5251
add_definitions("-DHAVE_NEON=1")
52+
if (CMAKE_BUILD_TYPE STREQUAL "Release")
53+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon -mfloat-abi=hard -ftree-vectorize")
54+
endif ()
5355
endif ()
5456

5557
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
@@ -79,7 +81,9 @@ find_library(
7981

8082
include_directories(icc)
8183

84+
add_subdirectory(avif)
85+
8286
target_link_libraries( # Specifies the target library.
83-
coder
84-
${log-lib} libx265 libheif cpufeatures libyuv -ljnigraphics libaom
87+
coder PRIVATE
88+
${log-lib} libheif cpufeatures libyuv -ljnigraphics libkvazaar svt avif_shared
8589
libde265 libdav1d libsharpyuv ${android-lib})

avif-coder/src/main/cpp/JniBitmap.cpp

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#include "imagebits/CopyUnalignedRGBA.h"
3535

3636
jobject
37-
createBitmap(JNIEnv *env, std::vector<uint8_t> &data, std::string &colorConfig, int stride,
37+
createBitmap(JNIEnv *env, aligned_uint8_vector &data, std::string &colorConfig, int stride,
3838
int imageWidth, int imageHeight, bool use16Floats, jobject hwBuffer) {
3939
if (colorConfig == "HARDWARE") {
4040
jclass bitmapClass = env->FindClass("android/graphics/Bitmap");
@@ -71,24 +71,31 @@ createBitmap(JNIEnv *env, std::vector<uint8_t> &data, std::string &colorConfig,
7171
}
7272

7373
if (colorConfig == "RGB_565") {
74-
coder::CopyUnaligned(reinterpret_cast<const uint8_t *>(data.data()), stride,
75-
reinterpret_cast<uint8_t *>(addr), (int) info.stride,
76-
(int) info.width,
77-
(int) info.height, 2);
74+
coder::CopyUnaligned(reinterpret_cast<const uint16_t *>(data.data()), stride,
75+
reinterpret_cast<uint16_t *>(addr), (uint32_t) info.stride,
76+
(uint32_t) info.width,
77+
(uint32_t) info.height);
7878
} else {
79-
int copyWidth = (int) info.width * 4;
80-
int pixelSize = 1;
81-
if (use16Floats) {
82-
pixelSize = 2;
83-
}
79+
uint32_t copyWidth = (uint32_t) info.width * 4;
8480
if (colorConfig == "RGBA_1010102") {
85-
pixelSize = sizeof(uint32_t);
86-
copyWidth = (int) info.width;
81+
copyWidth = (uint32_t) info.width;
82+
coder::CopyUnaligned(reinterpret_cast<const uint32_t *>(data.data()), stride,
83+
reinterpret_cast<uint32_t *>(addr), (uint32_t) info.stride,
84+
copyWidth,
85+
(uint32_t) info.height);
86+
} else {
87+
if (use16Floats) {
88+
coder::CopyUnaligned(reinterpret_cast<const uint16_t *>(data.data()), stride,
89+
reinterpret_cast<uint16_t *>(addr), (uint32_t) info.stride,
90+
copyWidth,
91+
(uint32_t) info.height);
92+
} else {
93+
coder::CopyUnaligned(reinterpret_cast<const uint8_t *>(data.data()), stride,
94+
reinterpret_cast<uint8_t *>(addr), (uint32_t) info.stride,
95+
copyWidth,
96+
(uint32_t) info.height);
97+
}
8798
}
88-
coder::CopyUnaligned(reinterpret_cast<const uint8_t *>(data.data()), stride,
89-
reinterpret_cast<uint8_t *>(addr), (int) info.stride,
90-
copyWidth,
91-
(int) info.height, pixelSize);
9299
}
93100

94101
if (AndroidBitmap_unlockPixels(env, bitmapObj) != 0) {

avif-coder/src/main/cpp/JniBitmap.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@
3131

3232
#include <jni.h>
3333
#include <vector>
34+
#include "definitions.h"
3435

3536
jobject
36-
createBitmap(JNIEnv *env, std::vector<uint8_t> &data, std::string &colorConfig, int stride,
37+
createBitmap(JNIEnv *env, aligned_uint8_vector &data, std::string &colorConfig, int stride,
3738
int imageWidth, int imageHeight, bool use16Floats, jobject hwBuffer);
3839

3940
#endif //AVIF_JNIBITMAP_H

0 commit comments

Comments
 (0)