@@ -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 }
0 commit comments