avutil/hwcontext_videotoolbox: Set CVBuffer CGColorSpace

In addition to the other properties, try to obtain the right
CGColorSpace and set it as well, else it could lead to a CVBuffer
tagged as BT.2020 but with a CGColorSpace indicating BT.709.

Therefore it is essential for consistency to set a colorspace
according to the other values, or if none can be obtained (for example
because the other values are all unspecified) unset it as well.

Fix #10884

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
Marvin Scholz 2024-05-20 03:12:01 +02:00 committed by Zhao Zhili
parent b4f9fcc63c
commit cd9ceaef22

View File

@ -535,6 +535,7 @@ CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteri
static int vt_pixbuf_set_colorspace(void *log_ctx,
CVPixelBufferRef pixbuf, const AVFrame *src)
{
CGColorSpaceRef colorspace = NULL;
CFStringRef colormatrix = NULL, colorpri = NULL, colortrc = NULL;
Float32 gamma = 0;
@ -587,6 +588,21 @@ static int vt_pixbuf_set_colorspace(void *log_ctx,
} else
CVBufferRemoveAttachment(pixbuf, kCVImageBufferGammaLevelKey);
if (__builtin_available(macOS 10.8, iOS 10, *)) {
CFDictionaryRef attachments = CVBufferCopyAttachments(pixbuf, kCVAttachmentMode_ShouldPropagate);
if (attachments) {
colorspace = CVImageBufferCreateColorSpaceFromAttachments(attachments);
CFRelease(attachments);
}
}
if (colorspace) {
CVBufferSetAttachment(pixbuf, kCVImageBufferCGColorSpaceKey,
colorspace, kCVAttachmentMode_ShouldPropagate);
CFRelease(colorspace);
} else
CVBufferRemoveAttachment(pixbuf, kCVImageBufferCGColorSpaceKey);
return 0;
}