diff options
author | Marvin Scholz <epirat07@gmail.com> | 2024-05-20 03:12:01 +0200 |
---|---|---|
committer | Zhao Zhili <zhilizhao@tencent.com> | 2024-07-05 19:13:43 +0800 |
commit | cd9ceaef22ecc25278c771169d179dbfdb24a355 (patch) | |
tree | efea9f6ed9b2aa79131d56da75706f37cf375509 /libavutil/hwcontext_videotoolbox.c | |
parent | b4f9fcc63c29827f3bd2822f0d6ba6af098c9cb7 (diff) | |
download | ffmpeg-cd9ceaef22ecc25278c771169d179dbfdb24a355.tar.gz |
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>
Diffstat (limited to 'libavutil/hwcontext_videotoolbox.c')
-rw-r--r-- | libavutil/hwcontext_videotoolbox.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/libavutil/hwcontext_videotoolbox.c b/libavutil/hwcontext_videotoolbox.c index 0af2ab822f..953155ce32 100644 --- a/libavutil/hwcontext_videotoolbox.c +++ b/libavutil/hwcontext_videotoolbox.c @@ -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; } |