1313#import " avif/avif.h"
1414#endif
1515
16+ static void FreeImageData (void *info, const void *data, size_t size) {
17+ free ((void *)data);
18+ }
19+
1620static CGImageRef CreateImageFromBuffer (avifImage * avif, vImage_Buffer* result) {
1721 BOOL monochrome = avif->yuvPlanes [1 ] == NULL || avif->yuvPlanes [2 ] == NULL ;
1822 BOOL hasAlpha = avif->alphaPlane != NULL ;
1923 BOOL usesU16 = avifImageUsesU16 (avif);
2024 size_t components = (monochrome ? 1 : 3 ) + (hasAlpha ? 1 : 0 );
2125
22- CGDataProviderRef provider = CGDataProviderCreateWithData (NULL , result->data , result->rowBytes * result->height , NULL );
26+ CGDataProviderRef provider = CGDataProviderCreateWithData (NULL , result->data , result->rowBytes * result->height , FreeImageData );
2327 CGBitmapInfo bitmapInfo = usesU16 ? kCGBitmapByteOrder16Host : kCGBitmapByteOrderDefault ;
2428 bitmapInfo |= hasAlpha ? kCGImageAlphaFirst : kCGImageAlphaNone ;
2529 // FIXME: (ledyba-z): Set appropriate color space.
@@ -40,7 +44,6 @@ static CGImageRef CreateImageFromBuffer(avifImage * avif, vImage_Buffer* result)
4044
4145 CGImageRef imageRef = CGImageCreate (result->width , result->height , bitsPerComponent, bitsPerPixel, rowBytes, colorSpace, bitmapInfo, provider, NULL , NO , renderingIntent);
4246
43-
4447 // clean up
4548 CGColorSpaceRelease (colorSpace);
4649 CGDataProviderRelease (provider);
@@ -137,7 +140,7 @@ static void SetupConversionInfo(avifImage * avif,
137140
138141
139142// Convert 8bit AVIF image into RGB888/ARGB8888/Mono/MonoA using vImage Acceralation Framework.
140- static CGImageRef CreateImage16U (avifImage * avif) {
143+ static CGImageRef CreateImage8 (avifImage * avif) {
141144 vImage_Error err = kvImageNoError;
142145 BOOL const monochrome = avif->yuvPlanes [1 ] == NULL || avif->yuvPlanes [2 ] == NULL ;
143146 BOOL const hasAlpha = avif->alphaPlane != NULL ;
@@ -503,19 +506,15 @@ static CGImageRef CreateImage16U(avifImage * avif) {
503506 NSLog (@" Failed to combine mono and alpha: %ld " , err);
504507 return NULL ;
505508 }
506- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
507- free (outPixels);
508- return img;
509+ return CreateImageFromBuffer (avif, &outBuffer);
509510 } else {
510511 err = vImageOverwriteChannels_ARGB8888 (&alphaBuffer, &argbBuffer, &argbBuffer, 0x8 , kvImageNoFlags);
511512 if (err != kvImageNoError) {
512513 free (outPixels);
513514 NSLog (@" Failed to overwrite alpha: %ld " , err);
514515 return NULL ;
515516 }
516- CGImageRef img = CreateImageFromBuffer (avif, &argbBuffer);
517- free (outPixels);
518- return img;
517+ return CreateImageFromBuffer (avif, &argbBuffer);
519518 }
520519 } else {
521520 if (monochrome) {
@@ -544,9 +543,7 @@ static CGImageRef CreateImage16U(avifImage * avif) {
544543 NSLog (@" Failed to convert ARGB to RGB: %ld " , err);
545544 return NULL ;
546545 }
547- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
548- free (outPixels);
549- return img;
546+ return CreateImageFromBuffer (avif, &outBuffer);
550547 } else {
551548 vImage_Buffer outBuffer = {
552549 .data = outPixels,
@@ -561,15 +558,13 @@ static CGImageRef CreateImage16U(avifImage * avif) {
561558 NSLog (@" Failed to convert ARGB to RGB: %ld " , err);
562559 return NULL ;
563560 }
564- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
565- free (outPixels);
566- return img;
561+ return CreateImageFromBuffer (avif, &outBuffer);
567562 }
568563 }
569564}
570565
571566// Convert 10/12bit AVIF image into RGB16U/ARGB16U/Mono16U/MonoA16U
572- static CGImageRef CreateImage8 (avifImage * avif) {
567+ static CGImageRef CreateImage16U (avifImage * avif) {
573568 vImage_Error err = kvImageNoError;
574569 BOOL const monochrome = avif->yuvPlanes [1 ] == NULL || avif->yuvPlanes [2 ] == NULL ;
575570 BOOL const hasAlpha = avif->alphaPlane != NULL ;
@@ -1037,13 +1032,9 @@ static CGImageRef CreateImage8(avifImage * avif) {
10371032 NSLog (@" Failed to convert ARGB to MonoA: %ld " , err);
10381033 return NULL ;
10391034 }
1040- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
1041- free (outPixels);
1042- return img;
1035+ return CreateImageFromBuffer (avif, &outBuffer);
10431036 }else {
1044- CGImageRef img = CreateImageFromBuffer (avif, &argbBuffer);
1045- free (outPixels);
1046- return img;
1037+ return CreateImageFromBuffer (avif, &argbBuffer);
10471038 }
10481039 } else {
10491040 vImage_Buffer outBuffer = {
@@ -1072,9 +1063,7 @@ static CGImageRef CreateImage8(avifImage * avif) {
10721063 NSLog (@" Failed to convert ARGB to Mono: %ld " , err);
10731064 return NULL ;
10741065 }
1075- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
1076- free (outPixels);
1077- return img;
1066+ return CreateImageFromBuffer (avif, &outBuffer);
10781067 } else {
10791068 err = vImageConvert_ARGB16UtoRGB16U (&argbBuffer, &outBuffer, kvImageNoFlags);
10801069 free (argbPixels);
@@ -1083,9 +1072,7 @@ static CGImageRef CreateImage8(avifImage * avif) {
10831072 NSLog (@" Failed to convert ARGB to RGB: %ld " , err);
10841073 return NULL ;
10851074 }
1086- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
1087- free (outPixels);
1088- return img;
1075+ return CreateImageFromBuffer (avif, &outBuffer);
10891076 }
10901077 }
10911078}
@@ -1181,9 +1168,9 @@ - (nullable CGImageRef)sd_createAVIFImageWithData:(nonnull NSData *)data CF_RETU
11811168 CGImageRef image = NULL ;
11821169 // convert planar to ARGB/RGB
11831170 if (avifImageUsesU16 (avif)) { // 10bit or 12bit
1184- image = CreateImage8 (avif);
1185- } else { // 8bit
11861171 image = CreateImage16U (avif);
1172+ } else { // 8bit
1173+ image = CreateImage8 (avif);
11871174 }
11881175 avifDecoderDestroy (decoder);
11891176 return image;
0 commit comments