Skip to content

Commit 576ffb1

Browse files
committed
Don't free outPixels. It will be owned by provider.
1 parent dcdcf9b commit 576ffb1

File tree

1 file changed

+17
-30
lines changed

1 file changed

+17
-30
lines changed

SDWebImageAVIFCoder/Classes/SDImageAVIFCoder.m

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,17 @@
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+
1620
static 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

Comments
 (0)