Skip to content

Commit 7ab64c9

Browse files
committed
Prefer ICC over NCLX as required, all libs update,
1 parent c7e368b commit 7ab64c9

Some content is hidden

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

47 files changed

+897
-577
lines changed

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,7 @@ aom
5454
libwebp
5555
/libwebp
5656
/app/release/
57+
SVT-AV1/
58+
/SVT-AV1
59+
kvazaar/
60+
kvazaar

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

+48-60
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ package com.radzivon.bartoshyk.avif
2727

2828
import android.graphics.Bitmap
2929
import android.graphics.BitmapFactory
30+
import android.graphics.ColorSpace
31+
import android.hardware.DataSpace
3032
import android.os.Build
3133
import android.os.Bundle
3234
import android.util.Log
@@ -38,6 +40,7 @@ import com.radzivon.bartoshyk.avif.coder.HeifCoder
3840
import com.radzivon.bartoshyk.avif.coder.PreciseMode
3941
import com.radzivon.bartoshyk.avif.coder.PreferredColorConfig
4042
import com.radzivon.bartoshyk.avif.coder.ScaleMode
43+
import com.radzivon.bartoshyk.avif.coder.ToneMapper
4144
import com.radzivon.bartoshyk.avif.databinding.ActivityMainBinding
4245
import com.radzivon.bartoshyk.avif.databinding.BindingImageViewBinding
4346
import kotlinx.coroutines.Dispatchers
@@ -93,72 +96,57 @@ class MainActivity : AppCompatActivity() {
9396

9497
// HDR EXAMPLES - https://us.zonerama.com/williamskeaguidingphotography/Photo/1000120226/1004888131
9598
lifecycleScope.launch(Dispatchers.IO) {
96-
val coder = HeifCoder()
97-
val buffer = assets.open("screenshot_test.png").source().buffer().readByteArray()
98-
val bitmap = BitmapFactory.decodeByteArray(buffer, 0, buffer.size)
99-
val encoded = coder.encodeAvif(bitmap, quality = 99, preciseMode = PreciseMode.LOSSLESS, speed = AvifSpeed.ONE)
100-
val decoded = coder.decode(encoded)
101-
lifecycleScope.launch(Dispatchers.Main) {
102-
val imageView = BindingImageViewBinding.inflate(layoutInflater, binding.scrollViewContainer, false)
103-
imageView.root.setImageBitmap(decoded)
104-
binding.scrollViewContainer.addView(imageView.root)
105-
}
106-
lifecycleScope.launch(Dispatchers.Main) {
107-
val imageView = BindingImageViewBinding.inflate(layoutInflater, binding.scrollViewContainer, false)
108-
imageView.root.setImageBitmap(bitmap)
109-
binding.scrollViewContainer.addView(imageView.root)
110-
}
11199
// lifecycleScope.launch(Dispatchers.Main) {
112100
// val imageView = BindingImageViewBinding.inflate(layoutInflater, binding.scrollViewContainer, false)
113101
// imageView.root.setImageBitmap(decoded100)
114102
// binding.scrollViewContainer.addView(imageView.root)
115103
// }
116-
// val allFiles1 = getAllFilesFromAssets().filter { it.contains(".avif") || it.contains(".heic") }
117-
// val allFiles2 = getAllFilesFromAssets(path = "hdr").filter { it.contains(".avif") || it.contains(".heic") }
118-
// var allFiles = mutableListOf<String>()
119-
// allFiles.addAll(allFiles2)
120-
// allFiles.addAll(allFiles1)
121-
// allFiles = allFiles.filter { it.contains("blue_lights.avif") || it.contains("bbb_alpha_inverted.avif") }.toMutableList()
122-
//// allFiles = allFiles.filter { it.contains("bbb_alpha_inverted.avif") }.toMutableList()
123-
// for (file in allFiles) {
124-
// try {
125-
// Log.d("AVIF", "start processing $file")
126-
// val buffer = [email protected](file).source().buffer()
127-
// .readByteArray()
128-
// val size = coder.getSize(buffer)
129-
// if (size != null) {
130-
//// val bitmap = coder.decodeSampled(
131-
//// buffer,
132-
//// if (size.width > 1800 || size.height > 1800) size.width / 2 else size.width,
133-
//// if (size.width > 1800 || size.height > 1800) size.height / 2 else size.height,
134-
//// PreferredColorConfig.RGBA_1010102,
135-
//// ScaleMode.RESIZE
136-
//// )
137-
// val bitmap = coder.decode(
138-
// buffer,
139-
// preferredColorConfig = PreferredColorConfig.RGBA_8888,
104+
val coder = HeifCoder(null, ToneMapper.REC2408)
105+
val allFiles1 = getAllFilesFromAssets().filter { it.contains(".avif") || it.contains(".heic") }
106+
val allFiles2 = getAllFilesFromAssets(path = "hdr").filter { it.contains(".avif") || it.contains(".heic") }
107+
var allFiles = mutableListOf<String>()
108+
allFiles.addAll(allFiles2)
109+
allFiles.addAll(allFiles1)
110+
allFiles = allFiles.filter { it.contains("wide_gamut.avif") }.toMutableList()
111+
// allFiles = allFiles.filter { it.contains("bbb_alpha_inverted.avif") }.toMutableList()
112+
for (file in allFiles) {
113+
try {
114+
Log.d("AVIF", "start processing $file")
115+
val buffer = this@MainActivity.assets.open(file).source().buffer()
116+
.readByteArray()
117+
val size = coder.getSize(buffer)
118+
if (size != null) {
119+
// val bitmap = coder.decodeSampled(
120+
// buffer,
121+
// if (size.width > 1800 || size.height > 1800) size.width / 2 else size.width,
122+
// if (size.width > 1800 || size.height > 1800) size.height / 2 else size.height,
123+
// PreferredColorConfig.RGBA_1010102,
124+
// ScaleMode.RESIZE
140125
// )
141-
// lifecycleScope.launch(Dispatchers.Main) {
142-
// val imageView = BindingImageViewBinding.inflate(layoutInflater, binding.scrollViewContainer, false)
143-
// imageView.root.setImageBitmap(bitmap)
144-
// binding.scrollViewContainer.addView(imageView.root)
145-
// }
146-
// val encoded = coder.encodeAvif(bitmap)
147-
// val decodedEncoded = coder.decode(encoded)
148-
// lifecycleScope.launch(Dispatchers.Main) {
149-
// val imageView = BindingImageViewBinding.inflate(layoutInflater, binding.scrollViewContainer, false)
150-
// imageView.root.setImageBitmap(decodedEncoded)
151-
// binding.scrollViewContainer.addView(imageView.root)
152-
// }
153-
// }
154-
// } catch (e: Exception) {
155-
// Log.d("AVIF", e.toString())
156-
// if (e is FileNotFoundException || e is java.io.FileNotFoundException) {
157-
// } else {
158-
// throw e
159-
// }
160-
// }
161-
// }
126+
val bitmap = coder.decode(
127+
buffer,
128+
preferredColorConfig = PreferredColorConfig.RGBA_8888,
129+
)
130+
val encoded = coder.encodeAvif(bitmap, 61, PreciseMode.LOSSY, AvifSpeed.SIX)
131+
val decodedEncoded = coder.decode(encoded);
132+
lifecycleScope.launch(Dispatchers.Main) {
133+
val imageView = BindingImageViewBinding.inflate(layoutInflater, binding.scrollViewContainer, false)
134+
imageView.root.setImageBitmap(bitmap)
135+
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)
140+
}
141+
}
142+
} catch (e: Exception) {
143+
Log.d("AVIF", e.toString())
144+
if (e is FileNotFoundException || e is java.io.FileNotFoundException) {
145+
} else {
146+
throw e
147+
}
148+
}
149+
}
162150
}
163151

164152
// https://wh.aimuse.online/creatives/IMUSE_03617fe2db82a584166_27/TT_a9d21ff1061d785347935fef/68f06252.avif

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

+11-11
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,20 @@ add_library(coder SHARED JniEncoder.cpp JniException.cpp SizeScaler.cpp
2626
hwy/timer.cc
2727
algo/sleef-hwy.cpp)
2828

29-
add_library(libaom STATIC IMPORTED)
30-
add_library(libx265 STATIC IMPORTED)
31-
add_library(libheif STATIC IMPORTED)
29+
add_library(libaom SHARED IMPORTED)
30+
add_library(libx265 SHARED IMPORTED)
31+
add_library(libheif SHARED IMPORTED)
3232
add_library(libyuv STATIC IMPORTED)
33-
add_library(libde265 STATIC IMPORTED)
34-
add_library(libdav1d STATIC IMPORTED)
33+
add_library(libde265 SHARED IMPORTED)
34+
add_library(libdav1d SHARED IMPORTED)
3535
add_library(libsharpyuv STATIC IMPORTED)
3636

37-
set_target_properties(libaom PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libaom.a)
38-
set_target_properties(libx265 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libx265.a)
39-
set_target_properties(libheif PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libheif.a)
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)
39+
set_target_properties(libheif PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libheif.so)
4040
set_target_properties(libyuv PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libyuv.a)
41-
set_target_properties(libde265 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libde265.a)
42-
set_target_properties(libdav1d PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libdav1d.a)
41+
set_target_properties(libde265 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libde265.so)
42+
set_target_properties(libdav1d PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libdav1d.so)
4343
set_target_properties(libsharpyuv PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/libsharpyuv.a)
4444

4545
add_library(cpufeatures STATIC ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c)
@@ -81,5 +81,5 @@ include_directories(icc)
8181

8282
target_link_libraries( # Specifies the target library.
8383
coder
84-
${log-lib} libaom libx265 libheif cpufeatures libyuv -ljnigraphics
84+
${log-lib} libx265 libheif cpufeatures libyuv -ljnigraphics libaom
8585
libde265 libdav1d libsharpyuv ${android-lib})

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

+60-60
Original file line numberDiff line numberDiff line change
@@ -34,69 +34,69 @@ void RecognizeICC(std::shared_ptr<heif_image_handle> &handle,
3434
std::vector<uint8_t> &iccProfile,
3535
std::string &colorSpaceName,
3636
heif_color_profile_nclx **nclx,
37-
bool* hasNclx) {
37+
bool *hasNclx) {
3838

39-
auto type = heif_image_get_color_profile_type(image.get());
39+
auto type = heif_image_get_color_profile_type(image.get());
4040

41-
auto nclxColorProfile = heif_image_handle_get_nclx_color_profile(handle.get(),
42-
nclx);
41+
auto nclxColorProfile = heif_image_handle_get_nclx_color_profile(handle.get(),
42+
nclx);
4343

44-
if (nclxColorProfile.code == heif_error_Ok) {
45-
*hasNclx = true;
46-
auto colorProfileNclx = *nclx;
47-
if (colorProfileNclx && colorProfileNclx->color_primaries != 0 &&
48-
colorProfileNclx->transfer_characteristics != 0) {
49-
auto transfer = colorProfileNclx->transfer_characteristics;
50-
auto colorPrimaries = colorProfileNclx->color_primaries;
51-
if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0 &&
52-
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_PQ) {
53-
colorSpaceName = "BT2020_PQ";
54-
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_709_5 &&
55-
transfer == heif_transfer_characteristic_linear) {
56-
colorSpaceName = "LINEAR_SRGB";
57-
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0 &&
58-
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_HLG) {
59-
colorSpaceName = "BT2020_HLG";
60-
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_709_5 &&
61-
transfer == heif_transfer_characteristic_ITU_R_BT_709_5) {
62-
colorSpaceName = "BT709";
63-
} else if ((transfer == heif_transfer_characteristic_ITU_R_BT_2020_2_10bit ||
64-
transfer == heif_transfer_characteristic_ITU_R_BT_2020_2_12bit)) {
65-
colorSpaceName = "BT2020";
66-
} else if (colorPrimaries == heif_color_primaries_SMPTE_EG_432_1 &&
67-
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_HLG) {
68-
colorSpaceName = "DISPLAY_P3_HLG";
69-
} else if (colorPrimaries == heif_color_primaries_SMPTE_EG_432_1 &&
70-
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_PQ) {
71-
colorSpaceName = "DISPLAY_P3_PQ";
72-
} else if (colorPrimaries == heif_color_primaries_SMPTE_EG_432_1 &&
73-
transfer == heif_transfer_characteristic_ITU_R_BT_709_5) {
74-
colorSpaceName = "DISPLAY_P3";
75-
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0) {
76-
colorSpaceName = "BT2020";
77-
} else if (transfer == heif_transfer_characteristic_SMPTE_ST_428_1) {
78-
colorSpaceName = "SMPTE_428";
79-
} else if (transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_PQ) {
80-
colorSpaceName = "BT2020_PQ";
81-
} else if (transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_HLG) {
82-
colorSpaceName = "BT2020_HLG";
83-
}
84-
}
85-
} else if (type == heif_color_profile_type_prof || type == heif_color_profile_type_rICC) {
86-
auto profileSize = heif_image_get_raw_color_profile_size(image.get());
87-
if (profileSize > 0) {
88-
iccProfile.resize(profileSize);
89-
auto iccStatus = heif_image_get_raw_color_profile(image.get(), iccProfile.data());
90-
if (iccStatus.code != heif_error_Ok) {
91-
if (iccStatus.message) {
92-
__android_log_print(ANDROID_LOG_ERROR, "AVIF",
93-
"ICC profile retrieving failed with: %s",
94-
iccStatus.message);
95-
} else {
96-
__android_log_print(ANDROID_LOG_ERROR, "AVIF",
97-
"ICC profile retrieving failed with unknown error");
98-
}
99-
}
44+
if (type == heif_color_profile_type_prof || type == heif_color_profile_type_rICC) {
45+
auto profileSize = heif_image_get_raw_color_profile_size(image.get());
46+
if (profileSize > 0) {
47+
iccProfile.resize(profileSize);
48+
auto iccStatus = heif_image_get_raw_color_profile(image.get(), iccProfile.data());
49+
if (iccStatus.code != heif_error_Ok) {
50+
if (iccStatus.message) {
51+
__android_log_print(ANDROID_LOG_ERROR, "AVIF",
52+
"ICC profile retrieving failed with: %s",
53+
iccStatus.message);
54+
} else {
55+
__android_log_print(ANDROID_LOG_ERROR, "AVIF",
56+
"ICC profile retrieving failed with unknown error");
10057
}
58+
}
59+
}
60+
} else if (nclxColorProfile.code == heif_error_Ok) {
61+
*hasNclx = true;
62+
auto colorProfileNclx = *nclx;
63+
if (colorProfileNclx && colorProfileNclx->color_primaries != 0 &&
64+
colorProfileNclx->transfer_characteristics != 0) {
65+
auto transfer = colorProfileNclx->transfer_characteristics;
66+
auto colorPrimaries = colorProfileNclx->color_primaries;
67+
if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0 &&
68+
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_PQ) {
69+
colorSpaceName = "BT2020_PQ";
70+
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_709_5 &&
71+
transfer == heif_transfer_characteristic_linear) {
72+
colorSpaceName = "LINEAR_SRGB";
73+
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0 &&
74+
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_HLG) {
75+
colorSpaceName = "BT2020_HLG";
76+
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_709_5 &&
77+
transfer == heif_transfer_characteristic_ITU_R_BT_709_5) {
78+
colorSpaceName = "BT709";
79+
} else if ((transfer == heif_transfer_characteristic_ITU_R_BT_2020_2_10bit ||
80+
transfer == heif_transfer_characteristic_ITU_R_BT_2020_2_12bit)) {
81+
colorSpaceName = "BT2020";
82+
} else if (colorPrimaries == heif_color_primaries_SMPTE_EG_432_1 &&
83+
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_HLG) {
84+
colorSpaceName = "DISPLAY_P3_HLG";
85+
} else if (colorPrimaries == heif_color_primaries_SMPTE_EG_432_1 &&
86+
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_PQ) {
87+
colorSpaceName = "DISPLAY_P3_PQ";
88+
} else if (colorPrimaries == heif_color_primaries_SMPTE_EG_432_1 &&
89+
transfer == heif_transfer_characteristic_ITU_R_BT_709_5) {
90+
colorSpaceName = "DISPLAY_P3";
91+
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0) {
92+
colorSpaceName = "BT2020";
93+
} else if (transfer == heif_transfer_characteristic_SMPTE_ST_428_1) {
94+
colorSpaceName = "SMPTE_428";
95+
} else if (transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_PQ) {
96+
colorSpaceName = "BT2020_PQ";
97+
} else if (transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_HLG) {
98+
colorSpaceName = "BT2020_HLG";
99+
}
101100
}
101+
}
102102
}

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ jbyteArray encodeBitmap(JNIEnv *env, jobject thiz,
123123
throwException(env, str);
124124
return static_cast<jbyteArray>(nullptr);
125125
}
126-
result = heif_encoder_set_parameter_string(encoder.get(), "chroma", "444");
126+
// SVT-AV1 do not supports 444, so chroma is always 4:2:0
127+
result = heif_encoder_set_parameter_string(encoder.get(), "chroma", "420");
127128
if (result.code != heif_error_Ok) {
128129
std::string choke(result.message);
129130
std::string str = "Can't set encoder chroma: " + choke;
@@ -271,7 +272,7 @@ jbyteArray encodeBitmap(JNIEnv *env, jobject thiz,
271272
profile.get(),
272273
iccProfile);
273274
if (nclxResult) {
274-
if (iccProfile.size() < 1) {
275+
if (iccProfile.empty()) {
275276
result = heif_image_set_nclx_color_profile(image.get(), profile.get());
276277
if (result.code != heif_error_Ok) {
277278
std::string choke(result.message);

0 commit comments

Comments
 (0)