Skip to content

Commit 55c10aa

Browse files
authored
Merge pull request #55 from SDWebImage/bugfix/quick_hack_support_hdr10bit_pq
Quick hack to support 10 bit HDR AVIF using PQ transfer function...
2 parents 2cad767 + e703334 commit 55c10aa

File tree

4 files changed

+106
-176
lines changed

4 files changed

+106
-176
lines changed

Cartfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
github "SDWebImage/SDWebImage" ~> 5.10
2-
github "SDWebImage/libavif-Xcode" >= 0.11.0
2+
github "SDWebImage/libavif-Xcode" >= 0.11.2-rc1

Cartfile.resolved

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
github "SDWebImage/SDWebImage" "5.10.2"
2-
github "SDWebImage/libaom-Xcode" "1.0.2"
3-
github "SDWebImage/libavif-Xcode" "0.8.1"
1+
github "SDWebImage/SDWebImage" "5.17.0"
2+
github "SDWebImage/libaom-Xcode" "3.0.0"
3+
github "SDWebImage/libavif-Xcode" "0.11.2-rc1"
4+
github "SDWebImage/libvmaf-Xcode" "2.3.1"

SDWebImageAVIFCoder/Classes/ColorSpace.m

Lines changed: 98 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -164,45 +164,37 @@ static void CalcTransferFunction(uint16_t const transferCharacteristics, vImageT
164164
}
165165
}
166166
CGColorSpaceRef SDAVIFCreateColorSpaceMono(avifColorPrimaries const colorPrimaries, avifTransferCharacteristics const transferCharacteristics) {
167-
if (@available(macOS 10.10, iOS 8.0, tvOS 8.0, *)) {
168-
vImage_Error err;
169-
vImageWhitePoint white;
170-
vImageTransferFunction transfer;
171-
CalcWhitePoint(colorPrimaries, &white);
172-
CalcTransferFunction(transferCharacteristics, &transfer);
173-
CGColorSpaceRef colorSpace = vImageCreateMonochromeColorSpaceWithWhitePointAndTransferFunction(&white, &transfer, kCGRenderingIntentDefault, kvImagePrintDiagnosticsToConsole, &err);
174-
if(err != kvImageNoError) {
175-
NSLog(@"[BUG] Failed to create monochrome color space: %ld", err);
176-
if(colorSpace != NULL) {
177-
CGColorSpaceRelease(colorSpace);
178-
}
179-
return NULL;
167+
vImage_Error err;
168+
vImageWhitePoint white;
169+
vImageTransferFunction transfer;
170+
CalcWhitePoint(colorPrimaries, &white);
171+
CalcTransferFunction(transferCharacteristics, &transfer);
172+
CGColorSpaceRef colorSpace = vImageCreateMonochromeColorSpaceWithWhitePointAndTransferFunction(&white, &transfer, kCGRenderingIntentDefault, kvImagePrintDiagnosticsToConsole, &err);
173+
if(err != kvImageNoError) {
174+
NSLog(@"[BUG] Failed to create monochrome color space: %ld", err);
175+
if(colorSpace != NULL) {
176+
CGColorSpaceRelease(colorSpace);
180177
}
181-
return colorSpace;
182-
}else{
183178
return NULL;
184179
}
180+
return colorSpace;
185181
}
186182

187183
CGColorSpaceRef SDAVIFCreateColorSpaceRGB(avifColorPrimaries const colorPrimaries, avifTransferCharacteristics const transferCharacteristics) {
188-
if (@available(macOS 10.10, iOS 8.0, tvOS 8.0, *)) {
189-
vImage_Error err;
190-
vImageRGBPrimaries primaries;
191-
vImageTransferFunction transfer;
192-
CalcRGBPrimaries(colorPrimaries, &primaries);
193-
CalcTransferFunction(transferCharacteristics, &transfer);
194-
CGColorSpaceRef colorSpace = vImageCreateRGBColorSpaceWithPrimariesAndTransferFunction(&primaries, &transfer, kCGRenderingIntentDefault, kvImagePrintDiagnosticsToConsole, &err);
195-
if(err != kvImageNoError) {
196-
NSLog(@"[BUG] Failed to create monochrome color space: %ld", err);
197-
if(colorSpace != NULL) {
198-
CGColorSpaceRelease(colorSpace);
199-
}
200-
return NULL;
184+
vImage_Error err;
185+
vImageRGBPrimaries primaries;
186+
vImageTransferFunction transfer;
187+
CalcRGBPrimaries(colorPrimaries, &primaries);
188+
CalcTransferFunction(transferCharacteristics, &transfer);
189+
CGColorSpaceRef colorSpace = vImageCreateRGBColorSpaceWithPrimariesAndTransferFunction(&primaries, &transfer, kCGRenderingIntentDefault, kvImagePrintDiagnosticsToConsole, &err);
190+
if(err != kvImageNoError) {
191+
NSLog(@"[BUG] Failed to create monochrome color space: %ld", err);
192+
if(colorSpace != NULL) {
193+
CGColorSpaceRelease(colorSpace);
201194
}
202-
return colorSpace;
203-
}else{
204195
return NULL;
205196
}
197+
return colorSpace;
206198
}
207199

208200
void SDAVIFCalcColorSpaceMono(avifImage * avif, CGColorSpaceRef* ref, BOOL* shouldRelease) {
@@ -214,7 +206,7 @@ void SDAVIFCalcColorSpaceMono(avifImage * avif, CGColorSpaceRef* ref, BOOL* shou
214206
});
215207
}
216208
if(avif->icc.data && avif->icc.size) {
217-
if(@available(macOS 10.12, iOS 10.0, tvOS 10.0, *)) {
209+
if(@available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *)) {
218210
CFDataRef iccData = CFDataCreate(kCFAllocatorDefault, avif->icc.data, avif->icc.size);
219211
*ref = CGColorSpaceCreateWithICCData(iccData);
220212
CFRelease(iccData);
@@ -312,7 +304,7 @@ void SDAVIFCalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shoul
312304
});
313305
}
314306
if(avif->icc.data && avif->icc.size) {
315-
if(@available(macOS 10.12, iOS 10.0, tvOS 10.0, *)) {
307+
if(@available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *)) {
316308
CFDataRef iccData = CFDataCreate(kCFAllocatorDefault, avif->icc.data, avif->icc.size);
317309
*ref = CGColorSpaceCreateWithICCData(iccData);
318310
CFRelease(iccData);
@@ -339,7 +331,7 @@ void SDAVIFCalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shoul
339331
static CGColorSpaceRef bt709 = NULL;
340332
static dispatch_once_t onceToken;
341333
dispatch_once(&onceToken, ^{
342-
if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, *)) {
334+
if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, watchOS 2.0, *)) {
343335
bt709 = CGColorSpaceCreateWithName(kCGColorSpaceITUR_709);
344336
} else {
345337
bt709 = defaultColorSpace;
@@ -354,7 +346,7 @@ void SDAVIFCalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shoul
354346
static CGColorSpaceRef sRGB = NULL;
355347
static dispatch_once_t onceToken;
356348
dispatch_once(&onceToken, ^{
357-
if (@available(macOS 10.5, iOS 9.0, tvOS 9.0, *)) {
349+
if (@available(macOS 10.5, iOS 9.0, tvOS 9.0, watchOS 2.0, *)) {
358350
sRGB = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
359351
} else {
360352
sRGB = defaultColorSpace;
@@ -369,7 +361,7 @@ void SDAVIFCalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shoul
369361
static CGColorSpaceRef sRGBlinear = NULL;
370362
static dispatch_once_t onceToken;
371363
dispatch_once(&onceToken, ^{
372-
if (@available(macOS 10.12, iOS 10.0, tvOS 10.0, *)) {
364+
if (@available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *)) {
373365
sRGBlinear = CGColorSpaceCreateWithName(kCGColorSpaceLinearSRGB);
374366
} else {
375367
sRGBlinear = defaultColorSpace;
@@ -385,7 +377,7 @@ void SDAVIFCalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shoul
385377
static CGColorSpaceRef bt2020 = NULL;
386378
static dispatch_once_t onceToken;
387379
dispatch_once(&onceToken, ^{
388-
if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, *)) {
380+
if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, watchOS 2.0, *)) {
389381
bt2020 = CGColorSpaceCreateWithName(kCGColorSpaceITUR_2020);
390382
} else {
391383
bt2020 = defaultColorSpace;
@@ -395,12 +387,57 @@ void SDAVIFCalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shoul
395387
*shouldRelease = FALSE;
396388
return;
397389
}
390+
if(colorPrimaries == AVIF_COLOR_PRIMARIES_BT2020 &&
391+
transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_SMPTE2084) {
392+
static CGColorSpaceRef bt2020pq = NULL;
393+
static dispatch_once_t onceToken;
394+
dispatch_once(&onceToken, ^{
395+
CFStringRef colorSpaceName = NULL;
396+
if (@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)) {
397+
colorSpaceName = kCGColorSpaceITUR_2100_PQ;
398+
} else if (@available(macOS 10.15.4, iOS 13.4, tvOS 13.4, watchOS 6.2, *)) {
399+
colorSpaceName = kCGColorSpaceITUR_2020_PQ;
400+
} else if (@available(macOS 10.14.6, iOS 12.6, tvOS 12.0, watchOS 5.0, *)) {
401+
colorSpaceName = kCGColorSpaceITUR_2020_PQ_EOTF;
402+
}
403+
if (colorSpaceName) {
404+
bt2020pq = CGColorSpaceCreateWithName(colorSpaceName);
405+
} else {
406+
bt2020pq = defaultColorSpace;
407+
}
408+
});
409+
*ref = bt2020pq;
410+
*shouldRelease = FALSE;
411+
return;
412+
}
413+
if(colorPrimaries == AVIF_COLOR_PRIMARIES_BT2020 &&
414+
transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_HLG) {
415+
static CGColorSpaceRef bt2020hlg = NULL;
416+
static dispatch_once_t onceToken;
417+
dispatch_once(&onceToken, ^{
418+
CFStringRef colorSpaceName = NULL;
419+
if (@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)) {
420+
colorSpaceName = kCGColorSpaceITUR_2100_HLG;
421+
} else if (@available(macOS 10.15.6, iOS 12.6, tvOS 12.0, watchOS 5.0, *)) {
422+
colorSpaceName = kCGColorSpaceITUR_2020_HLG;
423+
}
424+
if (colorSpaceName) {
425+
bt2020hlg = CGColorSpaceCreateWithName(colorSpaceName);
426+
} else {
427+
bt2020hlg = defaultColorSpace;
428+
}
429+
});
430+
431+
*ref = bt2020hlg;
432+
*shouldRelease = FALSE;
433+
return;
434+
}
398435
if(colorPrimaries == AVIF_COLOR_PRIMARIES_BT2020 &&
399436
transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_LINEAR) {
400437
static CGColorSpaceRef bt2020linear = NULL;
401438
static dispatch_once_t onceToken;
402439
dispatch_once(&onceToken, ^{
403-
if (@available(macOS 10.14.3, iOS 12.3, tvOS 12.3, *)) {
440+
if (@available(macOS 10.14.3, iOS 12.3, tvOS 12.3, watchOS 5.0, *)) {
404441
bt2020linear = CGColorSpaceCreateWithName(kCGColorSpaceExtendedLinearITUR_2020);
405442
} else {
406443
bt2020linear = defaultColorSpace;
@@ -415,7 +452,7 @@ void SDAVIFCalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shoul
415452
static CGColorSpaceRef p3 = NULL;
416453
static dispatch_once_t onceToken;
417454
dispatch_once(&onceToken, ^{
418-
if (@available(macOS 10.11.2, iOS 9.3, tvOS 9.3, *)) {
455+
if (@available(macOS 10.11.2, iOS 9.3, tvOS 9.3, watchOS 2.2, *)) {
419456
p3 = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3);
420457
} else {
421458
p3 = defaultColorSpace;
@@ -425,12 +462,33 @@ void SDAVIFCalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shoul
425462
*shouldRelease = FALSE;
426463
return;
427464
}
465+
if(colorPrimaries == AVIF_COLOR_PRIMARIES_SMPTE432 /* Display P3 */ &&
466+
transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_SMPTE2084) {
467+
static CGColorSpaceRef p3pq = NULL;
468+
static dispatch_once_t onceToken;
469+
dispatch_once(&onceToken, ^{
470+
CFStringRef colorSpaceName = NULL;
471+
if (@available(macOS 10.15.4, iOS 13.4, tvOS 13.4, watchOS 6.2, *)) {
472+
colorSpaceName = kCGColorSpaceDisplayP3_PQ;
473+
} else if (@available(macOS 10.14.6, iOS 12.6, tvOS 12.0, watchOS 5.0, *)) {
474+
colorSpaceName = kCGColorSpaceDisplayP3_PQ_EOTF;
475+
}
476+
if (colorSpaceName) {
477+
p3pq = CGColorSpaceCreateWithName(colorSpaceName);
478+
} else {
479+
p3pq = defaultColorSpace;
480+
}
481+
});
482+
*ref = p3pq;
483+
*shouldRelease = FALSE;
484+
return;
485+
}
428486
if(colorPrimaries == AVIF_COLOR_PRIMARIES_SMPTE432 /* Display P3 */ &&
429487
transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_HLG) {
430488
static CGColorSpaceRef p3hlg = NULL;
431489
static dispatch_once_t onceToken;
432490
dispatch_once(&onceToken, ^{
433-
if (@available(macOS 10.14.6, iOS 13.0, tvOS 13.0, *)) {
491+
if (@available(macOS 10.14.6, iOS 13.0, tvOS 13.0, watchOS 5.0, *)) {
434492
p3hlg = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3_HLG);
435493
} else {
436494
p3hlg = defaultColorSpace;
@@ -446,7 +504,7 @@ void SDAVIFCalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shoul
446504
static CGColorSpaceRef p3linear = NULL;
447505
static dispatch_once_t onceToken;
448506
dispatch_once(&onceToken, ^{
449-
if (@available(macOS 10.14.3, iOS 12.3, tvOS 12.3, *)) {
507+
if (@available(macOS 10.14.3, iOS 12.3, tvOS 12.3, watchOS 5.0, *)) {
450508
p3linear = CGColorSpaceCreateWithName(kCGColorSpaceExtendedLinearDisplayP3);
451509
} else {
452510
p3linear = defaultColorSpace;

0 commit comments

Comments
 (0)