5353#include " avif/avif_cxx.h"
5454#include < libyuv.h>
5555#include " AvifDecoderController.h"
56+ #include " avifweaver.h"
5657
5758using namespace std ;
5859
@@ -74,7 +75,8 @@ enum AvifChromaSubsampling {
7475 AVIF_CHROMA_YUV_420,
7576 AVIF_CHROMA_YUV_422,
7677 AVIF_CHROMA_YUV_444,
77- AVIF_CHROMA_YUV_400
78+ AVIF_CHROMA_YUV_400,
79+ AVIF_CHROMA_LOSELESS
7880};
7981
8082struct heif_error writeHeifData (struct heif_context *ctx,
@@ -319,7 +321,7 @@ jbyteArray encodeBitmapHevc(JNIEnv *env,
319321 vStride,
320322 info.width ,
321323 info.height ,
322- profile->full_range_flag ? YuvRange::Full : YuvRange::Tv,
324+ profile->full_range_flag ? YuvRange::Pc : YuvRange::Tv,
323325 matrix);
324326
325327 if (nclxResult) {
@@ -456,10 +458,17 @@ jbyteArray encodeBitmapAvif(JNIEnv *env,
456458 }
457459 } else if (preferredChromaSubsampling == AvifChromaSubsampling::AVIF_CHROMA_YUV_422) {
458460 pixelFormat = avifPixelFormat::AVIF_PIXEL_FORMAT_YUV422;
459- } else if (preferredChromaSubsampling == AvifChromaSubsampling::AVIF_CHROMA_YUV_444) {
461+ } else if (preferredChromaSubsampling == AvifChromaSubsampling::AVIF_CHROMA_YUV_444
462+ || preferredChromaSubsampling == AvifChromaSubsampling::AVIF_CHROMA_LOSELESS) {
460463 pixelFormat = avifPixelFormat::AVIF_PIXEL_FORMAT_YUV444;
461464 } else if (preferredChromaSubsampling == AvifChromaSubsampling::AVIF_CHROMA_YUV_400) {
462465 pixelFormat = avifPixelFormat::AVIF_PIXEL_FORMAT_YUV400;
466+ } else if (preferredChromaSubsampling == AvifChromaSubsampling::AVIF_CHROMA_YUV_420) {
467+ pixelFormat = avifPixelFormat::AVIF_PIXEL_FORMAT_YUV420;
468+ } else {
469+ std::string str = " Unknown chroma subsampling" ;
470+ throwException (env, str);
471+ return static_cast <jbyteArray>(nullptr );
463472 }
464473 avif::ImagePtr image (avifImageCreate (info.width , info.height , 8 , pixelFormat));
465474
@@ -595,7 +604,7 @@ jbyteArray encodeBitmapAvif(JNIEnv *env,
595604 vStride,
596605 info.width ,
597606 info.height ,
598- yuvRange == AVIF_RANGE_FULL ? YuvRange::Full : YuvRange::Tv,
607+ yuvRange == AVIF_RANGE_FULL ? YuvRange::Pc : YuvRange::Tv,
599608 matrix);
600609 } else if (pixelFormat == AVIF_PIXEL_FORMAT_YUV422) {
601610 RgbaToYuv422 (imageStore.data (),
@@ -608,9 +617,13 @@ jbyteArray encodeBitmapAvif(JNIEnv *env,
608617 vStride,
609618 info.width ,
610619 info.height ,
611- yuvRange == AVIF_RANGE_FULL ? YuvRange::Full : YuvRange::Tv,
620+ yuvRange == AVIF_RANGE_FULL ? YuvRange::Pc : YuvRange::Tv,
612621 matrix);
613622 } else if (pixelFormat == AVIF_PIXEL_FORMAT_YUV444) {
623+ if (preferredChromaSubsampling == AvifChromaSubsampling::AVIF_CHROMA_LOSELESS) {
624+ matrix = YuvMatrix::Identity;
625+ yuvRange = AVIF_RANGE_FULL;
626+ }
614627 RgbaToYuv444 (imageStore.data (),
615628 stride,
616629 yPlane,
@@ -621,7 +634,7 @@ jbyteArray encodeBitmapAvif(JNIEnv *env,
621634 vStride,
622635 info.width ,
623636 info.height ,
624- yuvRange == AVIF_RANGE_FULL ? YuvRange::Full : YuvRange::Tv,
637+ yuvRange == AVIF_RANGE_FULL ? YuvRange::Pc : YuvRange::Tv,
625638 matrix);
626639 } else if (pixelFormat == AVIF_PIXEL_FORMAT_YUV400) {
627640 RgbaToYuv400 (imageStore.data (),
@@ -630,17 +643,17 @@ jbyteArray encodeBitmapAvif(JNIEnv *env,
630643 yStride,
631644 info.width ,
632645 info.height ,
633- yuvRange == AVIF_RANGE_FULL ? YuvRange::Full : YuvRange::Tv,
646+ yuvRange == AVIF_RANGE_FULL ? YuvRange::Pc : YuvRange::Tv,
634647 matrix);
635648 }
636649
650+ image->matrixCoefficients = matrixCoefficients;
651+ image->colorPrimaries = colorPrimaries;
652+ image->transferCharacteristics = transferCharacteristics;
653+ image->yuvRange = yuvRange;
654+
637655 if (nclxResult) {
638- if (iccProfile.empty ()) {
639- image->matrixCoefficients = matrixCoefficients;
640- image->colorPrimaries = colorPrimaries;
641- image->transferCharacteristics = transferCharacteristics;
642- image->yuvRange = yuvRange;
643- } else {
656+ if (!iccProfile.empty ()) {
644657 result = avifImageSetProfileICC (image.get (), iccProfile.data (), iccProfile.size ());
645658 if (result != AVIF_RESULT_OK) {
646659 std::string str = " Can't set required color profile" ;
0 commit comments