1313#import " avif/avif.h"
1414#endif
1515
16- static CGImageRef CreateImageRef (avifImage * avif, vImage_Buffer* result) {
16+ static CGImageRef CreateImageFromBuffer (avifImage * avif, vImage_Buffer* result) {
1717 BOOL monochrome = avif->yuvPlanes [1 ] == NULL || avif->yuvPlanes [2 ] == NULL ;
1818 BOOL hasAlpha = avif->alphaPlane != NULL ;
1919 BOOL usesU16 = avifImageUsesU16 (avif);
@@ -26,10 +26,11 @@ static CGImageRef CreateImageRef(avifImage * avif, vImage_Buffer* result) {
2626 // Currently, there is no way to get MatrixCoefficients, TransferCharacteristics and ColourPrimaries values
2727 // in Sequence Header OBU.
2828 // https://github.com/AOMediaCodec/libavif/blob/7d36984b2994210b/include/avif/avif.h#L149-L236
29- CGColorSpaceRef colorSpace = [SDImageCoderHelper colorSpaceGetDeviceRGB ] ;
29+ CGColorSpaceRef colorSpace = NULL ;
3030 if (monochrome){
31- // colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericGray);
3231 colorSpace = CGColorSpaceCreateDeviceGray ();
32+ }else {
33+ colorSpace = CGColorSpaceCreateDeviceRGB ();
3334 }
3435 CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault ;
3536
@@ -39,7 +40,9 @@ static CGImageRef CreateImageRef(avifImage * avif, vImage_Buffer* result) {
3940
4041 CGImageRef imageRef = CGImageCreate (result->width , result->height , bitsPerComponent, bitsPerPixel, rowBytes, colorSpace, bitmapInfo, provider, NULL , NO , renderingIntent);
4142
43+
4244 // clean up
45+ CFRelease (colorSpace);
4346 CGDataProviderRelease (provider);
4447
4548 return imageRef;
@@ -134,7 +137,7 @@ static void SetupConversionInfo(avifImage * avif,
134137
135138
136139// Convert 8bit AVIF image into RGB888/ARGB8888/Mono/MonoA using vImage Acceralation Framework.
137- static CGImageRef ConvertAvifImage8 (avifImage * avif) {
140+ static CGImageRef CreateImage16U (avifImage * avif) {
138141 vImage_Error err = kvImageNoError;
139142 BOOL const monochrome = avif->yuvPlanes [1 ] == NULL || avif->yuvPlanes [2 ] == NULL ;
140143 BOOL const hasAlpha = avif->alphaPlane != NULL ;
@@ -488,12 +491,19 @@ static CGImageRef ConvertAvifImage8(avifImage * avif) {
488491 NSLog (@" Failed to convert ARGB to RGB: %ld " , err);
489492 return NULL ;
490493 }
491- err = vImageConvert_PlanarToChunky8 ((const vImage_Buffer*[]){&monoBuffer , &alphaBuffer },
494+ err = vImageConvert_PlanarToChunky8 ((const vImage_Buffer*[]){&alphaBuffer , &monoBuffer },
492495 (void *[]){outBuffer.data , outBuffer.data + 1 },
493496 2 /* channelCount */ , 2 /* destStrideBytes */ ,
494497 outBuffer.width , outBuffer.height ,
495498 outBuffer.rowBytes , kvImageNoFlags);
496- CGImageRef img = CreateImageRef (avif, &outBuffer);
499+ free (monoBuffer.data );
500+ free (alphaBuffer.data );
501+ if (err != kvImageNoError) {
502+ free (outPixels);
503+ NSLog (@" Failed to combine mono and alpha: %ld " , err);
504+ return NULL ;
505+ }
506+ CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
497507 free (outPixels);
498508 return img;
499509 } else {
@@ -503,7 +513,7 @@ static CGImageRef ConvertAvifImage8(avifImage * avif) {
503513 NSLog (@" Failed to overwrite alpha: %ld " , err);
504514 return NULL ;
505515 }
506- CGImageRef img = CreateImageRef (avif, &argbBuffer);
516+ CGImageRef img = CreateImageFromBuffer (avif, &argbBuffer);
507517 free (outPixels);
508518 return img;
509519 }
@@ -534,7 +544,7 @@ static CGImageRef ConvertAvifImage8(avifImage * avif) {
534544 NSLog (@" Failed to convert ARGB to RGB: %ld " , err);
535545 return NULL ;
536546 }
537- CGImageRef img = CreateImageRef (avif, &outBuffer);
547+ CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
538548 free (outPixels);
539549 return img;
540550 } else {
@@ -551,15 +561,15 @@ static CGImageRef ConvertAvifImage8(avifImage * avif) {
551561 NSLog (@" Failed to convert ARGB to RGB: %ld " , err);
552562 return NULL ;
553563 }
554- CGImageRef img = CreateImageRef (avif, &outBuffer);
564+ CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
555565 free (outPixels);
556566 return img;
557567 }
558568 }
559569}
560570
561571// Convert 10/12bit AVIF image into RGB16U/ARGB16U/Mono16U/MonoA16U
562- static CGImageRef ConvertAvifImage16U (avifImage * avif) {
572+ static CGImageRef CreateImage8 (avifImage * avif) {
563573 vImage_Error err = kvImageNoError;
564574 BOOL const monochrome = avif->yuvPlanes [1 ] == NULL || avif->yuvPlanes [2 ] == NULL ;
565575 BOOL const hasAlpha = avif->alphaPlane != NULL ;
@@ -962,7 +972,6 @@ static CGImageRef ConvertAvifImage16U(avifImage * avif) {
962972 if (err != kvImageNoError) {
963973 free (outPixels);
964974 free (alphaBuffer.data );
965- free (monoBuffer.data );
966975 free (monoBuffer1.data );
967976 free (monoBuffer2.data );
968977 NSLog (@" Failed to split Mono16: %ld " , err);
@@ -1018,7 +1027,7 @@ static CGImageRef ConvertAvifImage16U(avifImage * avif) {
10181027 .height = avif->height ,
10191028 .rowBytes = avif->width * components * sizeof (uint16_t ),
10201029 };
1021- err = vImageConvert_Planar16UtoARGB16U (&monoBuffer1 , &monoBuffer2 , &alphaBuffer1 , &alphaBuffer2 , &outBuffer, kvImageNoFlags);
1030+ err = vImageConvert_Planar16UtoARGB16U (&alphaBuffer1 , &alphaBuffer2 , &monoBuffer1 , &monoBuffer2 , &outBuffer, kvImageNoFlags);
10221031 free (monoBuffer1.data );
10231032 free (monoBuffer2.data );
10241033 free (alphaBuffer1.data );
@@ -1028,12 +1037,11 @@ static CGImageRef ConvertAvifImage16U(avifImage * avif) {
10281037 NSLog (@" Failed to convert ARGB to MonoA: %ld " , err);
10291038 return NULL ;
10301039 }
1031- CGImageRef img = CreateImageRef (avif, &outBuffer);
1040+ CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
10321041 free (outPixels);
10331042 return img;
1034- return NULL ;
10351043 }else {
1036- CGImageRef img = CreateImageRef (avif, &argbBuffer);
1044+ CGImageRef img = CreateImageFromBuffer (avif, &argbBuffer);
10371045 free (outPixels);
10381046 return img;
10391047 }
@@ -1064,7 +1072,7 @@ static CGImageRef ConvertAvifImage16U(avifImage * avif) {
10641072 NSLog (@" Failed to convert ARGB to Mono: %ld " , err);
10651073 return NULL ;
10661074 }
1067- CGImageRef img = CreateImageRef (avif, &outBuffer);
1075+ CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
10681076 free (outPixels);
10691077 return img;
10701078 } else {
@@ -1075,7 +1083,7 @@ static CGImageRef ConvertAvifImage16U(avifImage * avif) {
10751083 NSLog (@" Failed to convert ARGB to RGB: %ld " , err);
10761084 return NULL ;
10771085 }
1078- CGImageRef img = CreateImageRef (avif, &outBuffer);
1086+ CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
10791087 free (outPixels);
10801088 return img;
10811089 }
@@ -1173,9 +1181,9 @@ - (nullable CGImageRef)sd_createAVIFImageWithData:(nonnull NSData *)data CF_RETU
11731181 CGImageRef image = NULL ;
11741182 // convert planar to ARGB/RGB
11751183 if (avifImageUsesU16 (avif)) { // 10bit or 12bit
1176- image = ConvertAvifImage16U (avif);
1184+ image = CreateImage8 (avif);
11771185 } else { // 8bit
1178- image = ConvertAvifImage8 (avif);
1186+ image = CreateImage16U (avif);
11791187 }
11801188 avifDecoderDestroy (decoder);
11811189 return image;
0 commit comments