Skip to content

Commit a81aba9

Browse files
committed
Refactoring
1 parent 62b535a commit a81aba9

File tree

10 files changed

+375
-243
lines changed

10 files changed

+375
-243
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ add_library(coder SHARED coder.cpp JniException.cpp scaler.cpp
2020
imagebits/RgbaF16bitToNBitU16.cpp imagebits/RgbaF16bitNBitU8.cpp imagebits/Rgb1010102.cpp
2121
colorspace/PerceptualQuantinizer.cpp ThreadPool.hpp
2222
imagebits/CopyUnalignedRGBA.cpp colorspace/HLG.cpp JniDecoder.cpp imagebits/Rgba8ToF16.cpp
23-
imagebits/Rgb565.cpp)
23+
imagebits/Rgb565.cpp JniBitmap.cpp ReformatBitmap.cpp Support.cpp IccRecognizer.cpp)
2424

2525
add_library(libaom STATIC IMPORTED)
2626
add_library(libx265 STATIC IMPORTED)
@@ -62,6 +62,8 @@ if (CMAKE_BUILD_TYPE STREQUAL "Release")
6262
endif ()
6363
add_definitions(-DCMS_NO_REGISTER_KEYWORD)
6464

65+
set(CMAKE_ANDROID_API_MIN 24)
66+
6567
target_include_directories(coder PRIVATE ${CMAKE_SOURCE_DIR}/libheif ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/libyuv ${CMAKE_SOURCE_DIR}/colorspace)
6668
# Searches for a specified prebuilt library and stores the path as a
6769
# variable. Because CMake includes system libraries in the search path by
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
//
2+
// Created by Radzivon Bartoshyk on 16/09/2023.
3+
//
4+
5+
#include <android/log.h>
6+
#include "IccRecognizer.h"
7+
#include "LinearExtendedRec2020.h"
8+
9+
void RecognizeICC(heif_image_handle* handle,
10+
heif_image *image,
11+
std::vector<uint8_t> &iccProfile,
12+
std::string &colorSpaceName) {
13+
14+
heif_color_profile_nclx *colorProfileNclx = nullptr;
15+
auto type = heif_image_get_color_profile_type(image);
16+
17+
auto nclxColorProfile = heif_image_handle_get_nclx_color_profile(handle, &colorProfileNclx);
18+
19+
if (nclxColorProfile.code == heif_error_Ok) {
20+
if (colorProfileNclx && colorProfileNclx->color_primaries != 0 &&
21+
colorProfileNclx->transfer_characteristics != 0) {
22+
auto transfer = colorProfileNclx->transfer_characteristics;
23+
auto colorPrimaries = colorProfileNclx->color_primaries;
24+
if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0 &&
25+
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_PQ) {
26+
colorSpaceName = "BT2020_PQ";
27+
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_709_5 &&
28+
transfer == heif_transfer_characteristic_linear) {
29+
colorSpaceName = "LINEAR_SRGB";
30+
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0 &&
31+
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_HLG) {
32+
colorSpaceName = "BT2020_HLG";
33+
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_709_5 &&
34+
transfer == heif_transfer_characteristic_ITU_R_BT_709_5) {
35+
colorSpaceName = "BT709";
36+
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0 &&
37+
transfer == heif_transfer_characteristic_linear) {
38+
iccProfile.resize(sizeof(linearExtendedBT2020));
39+
std::copy(&linearExtendedBT2020[0],
40+
&linearExtendedBT2020[0] + sizeof(linearExtendedBT2020),
41+
iccProfile.begin());
42+
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0 &&
43+
(transfer == heif_transfer_characteristic_ITU_R_BT_2020_2_10bit ||
44+
transfer == heif_transfer_characteristic_ITU_R_BT_2020_2_12bit)) {
45+
colorSpaceName = "BT2020";
46+
} else if (colorPrimaries == heif_color_primaries_SMPTE_EG_432_1 &&
47+
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_HLG) {
48+
colorSpaceName = "DISPLAY_P3_HLG";
49+
} else if (colorPrimaries == heif_color_primaries_SMPTE_EG_432_1 &&
50+
transfer == heif_transfer_characteristic_ITU_R_BT_2100_0_PQ) {
51+
colorSpaceName = "DISPLAY_P3_PQ";
52+
} else if (colorPrimaries == heif_color_primaries_SMPTE_EG_432_1 &&
53+
transfer == heif_transfer_characteristic_IEC_61966_2_1) {
54+
colorSpaceName = "DISPLAY_P3";
55+
} else if (colorPrimaries == heif_color_primaries_ITU_R_BT_2020_2_and_2100_0) {
56+
colorSpaceName = "BT2020";
57+
}
58+
}
59+
} else if (type == heif_color_profile_type_prof || type == heif_color_profile_type_rICC) {
60+
auto profileSize = heif_image_get_raw_color_profile_size(image);
61+
if (profileSize > 0) {
62+
iccProfile.resize(profileSize);
63+
auto iccStatus = heif_image_get_raw_color_profile(image, iccProfile.data());
64+
if (iccStatus.code != heif_error_Ok) {
65+
if (iccStatus.message) {
66+
__android_log_print(ANDROID_LOG_ERROR, "AVIF",
67+
"ICC profile retrieving failed with: %s",
68+
iccStatus.message);
69+
} else {
70+
__android_log_print(ANDROID_LOG_ERROR, "AVIF",
71+
"ICC profile retrieving failed with unknown error");
72+
}
73+
}
74+
}
75+
}
76+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//
2+
// Created by Radzivon Bartoshyk on 16/09/2023.
3+
//
4+
5+
#ifndef AVIF_ICCRECOGNIZER_H
6+
#define AVIF_ICCRECOGNIZER_H
7+
8+
#include <vector>
9+
#include <string>
10+
#include "heif.h"
11+
12+
void RecognizeICC(heif_image_handle* handle,
13+
heif_image *image,
14+
std::vector<uint8_t> &iccProfile,
15+
std::string &colorSpaceName);
16+
17+
#endif //AVIF_ICCRECOGNIZER_H
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// Created by Radzivon Bartoshyk on 16/09/2023.
3+
//
4+
5+
#include "JniBitmap.h"
6+
#include <jni.h>
7+
#include <vector>
8+
#include "JniException.h"
9+
#include <android/bitmap.h>
10+
#include "imagebits/CopyUnalignedRGBA.h"
11+
12+
jobject
13+
createBitmap(JNIEnv *env, std::shared_ptr<uint8_t> &data, std::string &colorConfig, int stride,
14+
int imageWidth, int imageHeight, bool use16Floats) {
15+
jclass bitmapConfig = env->FindClass("android/graphics/Bitmap$Config");
16+
jfieldID rgba8888FieldID = env->GetStaticFieldID(bitmapConfig, colorConfig.c_str(),
17+
"Landroid/graphics/Bitmap$Config;");
18+
jobject rgba8888Obj = env->GetStaticObjectField(bitmapConfig, rgba8888FieldID);
19+
20+
jclass bitmapClass = env->FindClass("android/graphics/Bitmap");
21+
jmethodID createBitmapMethodID = env->GetStaticMethodID(bitmapClass, "createBitmap",
22+
"(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
23+
jobject bitmapObj = env->CallStaticObjectMethod(bitmapClass, createBitmapMethodID,
24+
imageWidth, imageHeight, rgba8888Obj);
25+
26+
AndroidBitmapInfo info;
27+
if (AndroidBitmap_getInfo(env, bitmapObj, &info) < 0) {
28+
throwPixelsException(env);
29+
return static_cast<jbyteArray>(nullptr);
30+
}
31+
32+
void *addr;
33+
if (AndroidBitmap_lockPixels(env, bitmapObj, &addr) != 0) {
34+
throwPixelsException(env);
35+
return static_cast<jobject>(nullptr);
36+
}
37+
38+
coder::CopyUnalignedRGBA(reinterpret_cast<const uint8_t *>(data.get()), stride,
39+
reinterpret_cast<uint8_t *>(addr), (int) info.stride, (int) info.width,
40+
(int) info.height, use16Floats ? 2 : 1);
41+
42+
if (AndroidBitmap_unlockPixels(env, bitmapObj) != 0) {
43+
throwPixelsException(env);
44+
return static_cast<jobject>(nullptr);
45+
}
46+
47+
return bitmapObj;
48+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
// Created by Radzivon Bartoshyk on 16/09/2023.
3+
//
4+
5+
#ifndef AVIF_JNIBITMAP_H
6+
#define AVIF_JNIBITMAP_H
7+
8+
#include <jni.h>
9+
#include <vector>
10+
11+
jobject
12+
createBitmap(JNIEnv *env, std::shared_ptr<uint8_t> &data, std::string &colorConfig, int stride,
13+
int imageWidth, int imageHeight, bool use16Floats);
14+
15+
#endif //AVIF_JNIBITMAP_H

0 commit comments

Comments
 (0)