53
53
#include " avif/avif_cxx.h"
54
54
#include < libyuv.h>
55
55
#include " AvifDecoderController.h"
56
+ #include " avifweaver.h"
56
57
57
58
using namespace std ;
58
59
@@ -74,7 +75,8 @@ enum AvifChromaSubsampling {
74
75
AVIF_CHROMA_YUV_420,
75
76
AVIF_CHROMA_YUV_422,
76
77
AVIF_CHROMA_YUV_444,
77
- AVIF_CHROMA_YUV_400
78
+ AVIF_CHROMA_YUV_400,
79
+ AVIF_CHROMA_LOSELESS
78
80
};
79
81
80
82
struct heif_error writeHeifData (struct heif_context *ctx,
@@ -319,7 +321,7 @@ jbyteArray encodeBitmapHevc(JNIEnv *env,
319
321
vStride,
320
322
info.width ,
321
323
info.height ,
322
- profile->full_range_flag ? YuvRange::Full : YuvRange::Tv,
324
+ profile->full_range_flag ? YuvRange::Pc : YuvRange::Tv,
323
325
matrix);
324
326
325
327
if (nclxResult) {
@@ -456,10 +458,17 @@ jbyteArray encodeBitmapAvif(JNIEnv *env,
456
458
}
457
459
} else if (preferredChromaSubsampling == AvifChromaSubsampling::AVIF_CHROMA_YUV_422) {
458
460
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) {
460
463
pixelFormat = avifPixelFormat::AVIF_PIXEL_FORMAT_YUV444;
461
464
} else if (preferredChromaSubsampling == AvifChromaSubsampling::AVIF_CHROMA_YUV_400) {
462
465
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 );
463
472
}
464
473
avif::ImagePtr image (avifImageCreate (info.width , info.height , 8 , pixelFormat));
465
474
@@ -595,7 +604,7 @@ jbyteArray encodeBitmapAvif(JNIEnv *env,
595
604
vStride,
596
605
info.width ,
597
606
info.height ,
598
- yuvRange == AVIF_RANGE_FULL ? YuvRange::Full : YuvRange::Tv,
607
+ yuvRange == AVIF_RANGE_FULL ? YuvRange::Pc : YuvRange::Tv,
599
608
matrix);
600
609
} else if (pixelFormat == AVIF_PIXEL_FORMAT_YUV422) {
601
610
RgbaToYuv422 (imageStore.data (),
@@ -608,9 +617,13 @@ jbyteArray encodeBitmapAvif(JNIEnv *env,
608
617
vStride,
609
618
info.width ,
610
619
info.height ,
611
- yuvRange == AVIF_RANGE_FULL ? YuvRange::Full : YuvRange::Tv,
620
+ yuvRange == AVIF_RANGE_FULL ? YuvRange::Pc : YuvRange::Tv,
612
621
matrix);
613
622
} else if (pixelFormat == AVIF_PIXEL_FORMAT_YUV444) {
623
+ if (preferredChromaSubsampling == AvifChromaSubsampling::AVIF_CHROMA_LOSELESS) {
624
+ matrix = YuvMatrix::Identity;
625
+ yuvRange = AVIF_RANGE_FULL;
626
+ }
614
627
RgbaToYuv444 (imageStore.data (),
615
628
stride,
616
629
yPlane,
@@ -621,7 +634,7 @@ jbyteArray encodeBitmapAvif(JNIEnv *env,
621
634
vStride,
622
635
info.width ,
623
636
info.height ,
624
- yuvRange == AVIF_RANGE_FULL ? YuvRange::Full : YuvRange::Tv,
637
+ yuvRange == AVIF_RANGE_FULL ? YuvRange::Pc : YuvRange::Tv,
625
638
matrix);
626
639
} else if (pixelFormat == AVIF_PIXEL_FORMAT_YUV400) {
627
640
RgbaToYuv400 (imageStore.data (),
@@ -630,17 +643,17 @@ jbyteArray encodeBitmapAvif(JNIEnv *env,
630
643
yStride,
631
644
info.width ,
632
645
info.height ,
633
- yuvRange == AVIF_RANGE_FULL ? YuvRange::Full : YuvRange::Tv,
646
+ yuvRange == AVIF_RANGE_FULL ? YuvRange::Pc : YuvRange::Tv,
634
647
matrix);
635
648
}
636
649
650
+ image->matrixCoefficients = matrixCoefficients;
651
+ image->colorPrimaries = colorPrimaries;
652
+ image->transferCharacteristics = transferCharacteristics;
653
+ image->yuvRange = yuvRange;
654
+
637
655
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 ()) {
644
657
result = avifImageSetProfileICC (image.get (), iccProfile.data (), iccProfile.size ());
645
658
if (result != AVIF_RESULT_OK) {
646
659
std::string str = " Can't set required color profile" ;
0 commit comments