Skip to content

Commit cf6554e

Browse files
authored
Merge pull request #34 from awxkee/dev
Decoding improvements
2 parents 0a70e62 + 9b155f7 commit cf6554e

Some content is hidden

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

58 files changed

+1128
-41976
lines changed

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class MainActivity : AppCompatActivity() {
103103
// imageView.root.setImageBitmap(decoded100)
104104
// binding.scrollViewContainer.addView(imageView.root)
105105
// }
106-
val coder = HeifCoder(ToneMapper.REC2408)
106+
val coder = HeifCoder()
107107
val allFiles1 =
108108
getAllFilesFromAssets().filter {
109109
it.contains(".avif") || it.contains(".heic") || it.contains(
@@ -120,9 +120,9 @@ class MainActivity : AppCompatActivity() {
120120
allFiles.addAll(allFiles2)
121121
allFiles.addAll(allFiles1)
122122
// allFiles = allFiles.take(5).toMutableList()
123-
// allFiles = allFiles.filter { it.contains("wide_gamut.avif") || it.contains("IMG_0199_rr.avif") || it.contains("bt_2020_pq.avif") }.toMutableList()
123+
// allFiles = allFiles.filter { it.contains("hato-wide-gamut-8bit.avif") || it.contains("wide_gamut.avif") || it.contains("IMG_0199_rr.avif") || it.contains("bt_2020_pq.avif") }.toMutableList()
124124
// allFiles = allFiles.filter { it.contains("bbb_alpha_inverted.avif") }.toMutableList()
125-
allFiles = allFiles.filter { it.contains("bt_2020_pq.avif") }.toMutableList()
125+
allFiles = allFiles.filter { it.contains("result.heic") }.toMutableList()
126126
for (file in allFiles) {
127127
try {
128128
Log.d("AVIF", "start processing $file")
@@ -135,7 +135,7 @@ class MainActivity : AppCompatActivity() {
135135
buffer,
136136
if (size.width > 1800 || size.height > 1800) size.width / 4 else size.width,
137137
if (size.width > 1800 || size.height > 1800) size.height / 4 else size.height,
138-
PreferredColorConfig.RGBA_1010102,
138+
PreferredColorConfig.RGBA_8888,
139139
ScaleMode.RESIZE
140140
)
141141
var start = System.currentTimeMillis()

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

+36-39
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ AvifImageFrame AvifDecoderController::getFrame(uint32_t frame,
8181
uint32_t scaledHeight,
8282
PreferredColorConfig javaColorSpace,
8383
ScaleMode javaScaleMode,
84-
CurveToneMapper toneMapper,
8584
int scalingQuality) {
8685
std::lock_guard guard(this->mutex);
8786
if (!this->isBufferAttached) {
@@ -318,7 +317,7 @@ AvifImageFrame AvifDecoderController::getFrame(uint32_t frame,
318317
if (!iccProfile.empty()) {
319318
convertUseICC(imageStore, stride, imageWidth, imageHeight, iccProfile.data(),
320319
iccProfile.size(),
321-
isImageRequires64Bit);
320+
isImageRequires64Bit, bitDepth);
322321
} else if (transferCharacteristics != AVIF_TRANSFER_CHARACTERISTICS_UNSPECIFIED
323322
|| colorPrimaries != AVIF_COLOR_PRIMARIES_UNSPECIFIED) {
324323
Eigen::Matrix<float, 3, 2> primaries;
@@ -341,82 +340,80 @@ AvifImageFrame AvifDecoderController::getFrame(uint32_t frame,
341340

342341
Eigen::Matrix3f conversion = destinationProfile.inverse() * sourceProfile;
343342

343+
ToneMapping toneMapping = ToneMapping::Rec2408;
344+
344345
if (transferCharacteristics !=
345346
AVIF_TRANSFER_CHARACTERISTICS_HLG &&
346347
transferCharacteristics != AVIF_TRANSFER_CHARACTERISTICS_PQ) {
347-
toneMapper = TONE_SKIP;
348+
toneMapping = ToneMapping::Skip;
348349
}
349350

350-
TransferFunction forwardTrc = TransferFunction::Srgb;
351+
FfiTrc transferFfi = FfiTrc::Srgb;
351352

352353
if (transferCharacteristics ==
353354
AVIF_TRANSFER_CHARACTERISTICS_HLG) {
354-
forwardTrc = TransferFunction::Hlg;
355+
transferFfi = FfiTrc::Hlg;
355356
} else if (transferCharacteristics ==
356357
AVIF_TRANSFER_CHARACTERISTICS_SMPTE428) {
357-
forwardTrc = TransferFunction::Smpte428;
358+
transferFfi = FfiTrc::Smpte428;
358359
} else if (transferCharacteristics ==
359360
AVIF_TRANSFER_CHARACTERISTICS_PQ) {
360-
forwardTrc = TransferFunction::Pq;
361+
transferFfi = FfiTrc::Smpte2084;
361362
} else if (transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_LINEAR) {
362-
forwardTrc = TransferFunction::Linear;
363+
transferFfi = FfiTrc::Linear;
363364
} else if (transferCharacteristics ==
364365
AVIF_TRANSFER_CHARACTERISTICS_BT470M) {
365-
forwardTrc = TransferFunction::Gamma2p2;
366+
transferFfi = FfiTrc::Bt470M;
366367
} else if (transferCharacteristics ==
367368
AVIF_TRANSFER_CHARACTERISTICS_BT470BG) {
368-
forwardTrc = TransferFunction::Gamma2p8;
369+
transferFfi = FfiTrc::Bt470Bg;
369370
} else if (transferCharacteristics ==
370371
AVIF_TRANSFER_CHARACTERISTICS_BT601) {
371-
forwardTrc = TransferFunction::Itur709;
372+
transferFfi = FfiTrc::Bt709;
372373
} else if (transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_BT709) {
373-
forwardTrc = TransferFunction::Itur709;
374+
transferFfi = FfiTrc::Bt709;
374375
} else if (transferCharacteristics ==
375376
AVIF_TRANSFER_CHARACTERISTICS_BT2020_10BIT ||
376377
transferCharacteristics ==
377378
AVIF_TRANSFER_CHARACTERISTICS_BT2020_12BIT) {
378-
forwardTrc = TransferFunction::Itur709;
379+
transferFfi = FfiTrc::Bt709;
379380
} else if (transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_SMPTE240) {
380-
forwardTrc = TransferFunction::Smpte240;
381+
transferFfi = FfiTrc::Smpte240;
381382
} else if (transferCharacteristics ==
382383
AVIF_TRANSFER_CHARACTERISTICS_LOG100) {
383-
forwardTrc = TransferFunction::Log100;
384+
transferFfi = FfiTrc::Log100;
384385
} else if (transferCharacteristics ==
385386
AVIF_TRANSFER_CHARACTERISTICS_LOG100_SQRT10) {
386-
forwardTrc = TransferFunction::Log100Sqrt10;
387+
transferFfi = FfiTrc::Log100sqrt10;
387388
} else if (transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_SRGB) {
388-
forwardTrc = TransferFunction::Srgb;
389+
transferFfi = FfiTrc::Srgb;
389390
} else if (transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_IEC61966) {
390-
forwardTrc = TransferFunction::Iec61966;
391+
transferFfi = FfiTrc::Iec61966;
391392
} else if (transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_BT1361) {
392-
forwardTrc = TransferFunction::Bt1361;
393+
transferFfi = FfiTrc::Bt1361;
393394
} else if (transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_UNSPECIFIED) {
394-
forwardTrc = TransferFunction::Srgb;
395+
transferFfi = FfiTrc::Srgb;
395396
}
396397

397-
ITURColorCoefficients coeffs = colorPrimariesComputeYCoeffs(primaries, whitePoint);
398-
399-
const float matrix[9] = {
400-
conversion(0, 0), conversion(0, 1), conversion(0, 2),
401-
conversion(1, 0), conversion(1, 1), conversion(1, 2),
402-
conversion(2, 0), conversion(2, 1), conversion(2, 2),
398+
const float cPrimaries[6] = {
399+
imagePrimaries[0], imagePrimaries[1],
400+
imagePrimaries[2], imagePrimaries[3],
401+
imagePrimaries[4], imagePrimaries[5]
402+
};
403+
const float wp[2] = {
404+
whitePoint(0), whitePoint(1)
403405
};
404406

405407
if (isImageRequires64Bit) {
406-
applyColorMatrix16Bit(reinterpret_cast<uint16_t *>(imageStore.data()),
407-
stride,
408-
imageWidth,
409-
imageHeight,
410-
bitDepth,
411-
matrix,
412-
forwardTrc,
413-
TransferFunction::Srgb,
414-
toneMapper,
415-
coeffs, intensityTarget);
408+
apply_tone_mapping_rgba16(
409+
reinterpret_cast<uint16_t *>(imageStore.data()), stride, bitDepth,
410+
imageWidth, imageHeight, cPrimaries, wp, transferFfi, toneMapping, intensityTarget
411+
);
416412
} else {
417-
applyColorMatrix(reinterpret_cast<uint8_t *>(imageStore.data()), stride, imageWidth,
418-
imageHeight, matrix, forwardTrc, TransferFunction::Srgb, toneMapper,
419-
coeffs, intensityTarget);
413+
apply_tone_mapping_rgba8(
414+
reinterpret_cast<uint8_t *>(imageStore.data()), stride,
415+
imageWidth, imageHeight, cPrimaries, wp, transferFfi, toneMapping, intensityTarget
416+
);
420417
}
421418

422419
}

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

-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ class AvifDecoderController {
5858
uint32_t scaledHeight,
5959
PreferredColorConfig javaColorSpace,
6060
ScaleMode javaScaleMode,
61-
CurveToneMapper javaToneMapper,
6261
int scalingQuality);
6362
void attachBuffer(uint8_t *data, uint32_t bufferSize);
6463
uint32_t getFramesCount();

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

+1-7
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,7 @@ cmake_minimum_required(VERSION 3.22.1)
33
project("coder")
44

55
add_library(coder SHARED JniEncoder.cpp JniException.cpp SizeScaler.cpp
6-
icc/cmsalpha.c icc/cmscam02.c
7-
icc/cmscgats.c icc/cmscnvrt.c icc/cmserr.c icc/cmsgamma.c
8-
icc/cmsgmt.c icc/cmshalf.c icc/cmsintrp.c icc/cmsio0.c
9-
icc/cmsio1.c icc/cmslut.c icc/cmsmd5.c icc/cmsmtrx.c icc/cmsnamed.c
10-
icc/cmsopt.c icc/cmspack.c icc/cmspcs.c icc/cmsplugin.c
11-
icc/cmsps2.c icc/cmssamp.c icc/cmssm.c icc/cmstypes.c icc/cmsvirt.c
12-
icc/cmswtpnt.c icc/cmsxform.c colorspace/colorspace.cpp
6+
colorspace/colorspace.cpp
137
imagebits/RgbaF16bitToNBitU16.cpp imagebits/RgbaF16bitNBitU8.cpp imagebits/Rgb1010102.cpp
148
imagebits/CopyUnalignedRGBA.cpp JniDecoder.cpp imagebits/Rgba8ToF16.cpp
159
imagebits/Rgb565.cpp JniBitmap.cpp ReformatBitmap.cpp Support.cpp IccRecognizer.cpp

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

+37-38
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@
3535
#include <Trc.h>
3636
#include <ITUR.h>
3737
#include "ColorMatrix.h"
38+
#include "avifweaver.h"
3839

3940
AvifImageFrame HeifImageDecoder::getFrame(std::vector<uint8_t> &srcBuffer,
4041
uint32_t scaledWidth,
4142
uint32_t scaledHeight,
4243
PreferredColorConfig javaColorSpace,
4344
ScaleMode javaScaleMode,
44-
CurveToneMapper toneMapper,
4545
int scalingQuality) {
4646
heif_context_set_max_decoding_threads(ctx.get(), (int) std::thread::hardware_concurrency());
4747

@@ -142,7 +142,7 @@ AvifImageFrame HeifImageDecoder::getFrame(std::vector<uint8_t> &srcBuffer,
142142
if (!profile.empty()) {
143143
convertUseICC(dstARGB, stride, imageWidth, imageHeight, profile.data(),
144144
profile.size(),
145-
useBitmapHalf16Floats);
145+
useBitmapHalf16Floats, bitDepth);
146146
} else if (hasNCLX && nclx &&
147147
nclx->transfer_characteristics != heif_transfer_characteristic_unspecified &&
148148
nclx->color_primaries != heif_color_primaries_unspecified) {
@@ -170,82 +170,81 @@ AvifImageFrame HeifImageDecoder::getFrame(std::vector<uint8_t> &srcBuffer,
170170

171171
Eigen::Matrix3f conversion = destinationProfile.inverse() * sourceProfile;
172172

173+
ToneMapping toneMapping = ToneMapping::Rec2408;
174+
173175
if (nclx->transfer_characteristics !=
174176
heif_transfer_characteristic_ITU_R_BT_2100_0_HLG &&
175177
nclx->transfer_characteristics != heif_transfer_characteristic_ITU_R_BT_2100_0_PQ) {
176-
toneMapper = TONE_SKIP;
178+
toneMapping = ToneMapping::Skip;
177179
}
178180

181+
FfiTrc transferFfi = FfiTrc::Srgb;
179182
TransferFunction forwardTrc = TransferFunction::Srgb;
180183

181184
if (nclx->transfer_characteristics ==
182185
heif_transfer_characteristic_ITU_R_BT_2100_0_HLG) {
183-
forwardTrc = TransferFunction::Hlg;
186+
transferFfi = FfiTrc::Hlg;
184187
} else if (nclx->transfer_characteristics ==
185188
heif_transfer_characteristic_SMPTE_ST_428_1) {
186-
forwardTrc = TransferFunction::Smpte428;
189+
transferFfi = FfiTrc::Smpte428;
187190
} else if (nclx->transfer_characteristics ==
188191
heif_transfer_characteristic_ITU_R_BT_2100_0_PQ) {
189-
forwardTrc = TransferFunction::Pq;
192+
transferFfi = FfiTrc::Smpte2084;
190193
} else if (nclx->transfer_characteristics == heif_transfer_characteristic_linear) {
191-
forwardTrc = TransferFunction::Linear;
194+
transferFfi = FfiTrc::Linear;
192195
} else if (nclx->transfer_characteristics ==
193196
heif_transfer_characteristic_ITU_R_BT_470_6_System_M) {
194-
forwardTrc = TransferFunction::Gamma2p2;
197+
transferFfi = FfiTrc::Bt470M;
195198
} else if (nclx->transfer_characteristics ==
196199
heif_transfer_characteristic_ITU_R_BT_470_6_System_B_G) {
197-
forwardTrc = TransferFunction::Gamma2p8;
200+
transferFfi = FfiTrc::Bt470Bg;
198201
} else if (nclx->transfer_characteristics ==
199202
heif_transfer_characteristic_ITU_R_BT_601_6) {
200-
forwardTrc = TransferFunction::Itur709;
203+
transferFfi = FfiTrc::Bt709;
201204
} else if (nclx->transfer_characteristics == heif_transfer_characteristic_ITU_R_BT_709_5) {
202-
forwardTrc = TransferFunction::Itur709;
205+
transferFfi = FfiTrc::Bt709;
203206
} else if (nclx->transfer_characteristics ==
204207
heif_transfer_characteristic_ITU_R_BT_2020_2_10bit ||
205208
nclx->transfer_characteristics ==
206209
heif_transfer_characteristic_ITU_R_BT_2020_2_12bit) {
207-
forwardTrc = TransferFunction::Itur709;
210+
transferFfi = FfiTrc::Bt709;
208211
} else if (nclx->transfer_characteristics == heif_transfer_characteristic_SMPTE_240M) {
209-
forwardTrc = TransferFunction::Smpte240;
212+
transferFfi = FfiTrc::Smpte240;
210213
} else if (nclx->transfer_characteristics ==
211214
heif_transfer_characteristic_logarithmic_100) {
212-
forwardTrc = TransferFunction::Log100;
215+
transferFfi = FfiTrc::Log100;
213216
} else if (nclx->transfer_characteristics ==
214217
heif_transfer_characteristic_logarithmic_100_sqrt10) {
215-
forwardTrc = TransferFunction::Log100Sqrt10;
218+
transferFfi = FfiTrc::Log100sqrt10;
216219
} else if (nclx->transfer_characteristics == heif_transfer_characteristic_IEC_61966_2_1) {
217-
forwardTrc = TransferFunction::Srgb;
220+
transferFfi = FfiTrc::Srgb;
218221
} else if (nclx->transfer_characteristics == heif_transfer_characteristic_IEC_61966_2_4) {
219-
forwardTrc = TransferFunction::Iec61966;
222+
transferFfi = FfiTrc::Iec61966;
220223
} else if (nclx->transfer_characteristics == heif_transfer_characteristic_ITU_R_BT_1361) {
221-
forwardTrc = TransferFunction::Bt1361;
224+
transferFfi = FfiTrc::Bt1361;
222225
} else if (nclx->transfer_characteristics == heif_transfer_characteristic_unspecified) {
223-
forwardTrc = TransferFunction::Srgb;
226+
transferFfi = FfiTrc::Srgb;
224227
}
225228

226-
ITURColorCoefficients coeffs = colorPrimariesComputeYCoeffs(primaries, whitePoint);
227-
228-
const float matrix[9] = {
229-
conversion(0, 0), conversion(0, 1), conversion(0, 2),
230-
conversion(1, 0), conversion(1, 1), conversion(1, 2),
231-
conversion(2, 0), conversion(2, 1), conversion(2, 2),
229+
const float cPrimaries[6] = {
230+
primaries(0), primaries(1),
231+
primaries(2), primaries(3),
232+
primaries(4), primaries(5)
233+
};
234+
const float wp[2] = {
235+
whitePoint(0), whitePoint(1)
232236
};
233237

234238
if (useBitmapHalf16Floats) {
235-
applyColorMatrix16Bit(reinterpret_cast<uint16_t *>(dstARGB.data()),
236-
stride,
237-
imageWidth,
238-
imageHeight,
239-
bitDepth,
240-
matrix,
241-
forwardTrc,
242-
TransferFunction::Srgb,
243-
toneMapper,
244-
coeffs, intensityTarget);
239+
apply_tone_mapping_rgba16(
240+
reinterpret_cast<uint16_t *>(dstARGB.data()), stride, bitDepth,
241+
imageWidth, imageHeight, cPrimaries, wp, transferFfi, toneMapping, intensityTarget
242+
);
245243
} else {
246-
applyColorMatrix(reinterpret_cast<uint8_t *>(dstARGB.data()), stride, imageWidth,
247-
imageHeight, matrix, forwardTrc, TransferFunction::Srgb, toneMapper,
248-
coeffs, intensityTarget);
244+
apply_tone_mapping_rgba8(
245+
reinterpret_cast<uint8_t *>(dstARGB.data()), stride,
246+
imageWidth, imageHeight, cPrimaries, wp, transferFfi, toneMapping, intensityTarget
247+
);
249248
}
250249
}
251250

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

-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class HeifImageDecoder {
5757
uint32_t scaledHeight,
5858
PreferredColorConfig javaColorSpace,
5959
ScaleMode javaScaleMode,
60-
CurveToneMapper javaToneMapper,
6160
int scalingQuality);
6261

6362
static std::string getImageType(std::vector<uint8_t> &srcBuffer);

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

+1-3
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,8 @@ Java_com_radzivon_bartoshyk_avif_coder_AvifAnimatedDecoder_getFrameImpl(JNIEnv *
181181
try {
182182
PreferredColorConfig preferredColorConfig;
183183
ScaleMode scaleMode;
184-
CurveToneMapper toneMapper;
185184
if (!checkDecodePreconditions(env, javaColorSpace, &preferredColorConfig, javaScaleMode,
186-
&scaleMode, javaToneMapper, &toneMapper)) {
185+
&scaleMode)) {
187186
std::string exception = "Can't retrieve basic values";
188187
throwException(env, exception);
189188
return static_cast<jobject>(nullptr);
@@ -195,7 +194,6 @@ Java_com_radzivon_bartoshyk_avif_coder_AvifAnimatedDecoder_getFrameImpl(JNIEnv *
195194
scaledHeight,
196195
preferredColorConfig,
197196
scaleMode,
198-
toneMapper,
199197
scaleQuality);
200198

201199
int osVersion = androidOSVersion();

0 commit comments

Comments
 (0)