Skip to content

Commit c6bb34d

Browse files
committed
Fix issues reported by static analyzer.
1 parent d8d32be commit c6bb34d

File tree

1 file changed

+27
-19
lines changed

1 file changed

+27
-19
lines changed

SDWebImageAVIFCoder/Classes/SDImageAVIFCoder.m

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
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

Comments
 (0)