From patchwork Sat Dec 18 11:09:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 32703 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp2464401iog; Sat, 18 Dec 2021 03:10:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJyKhwv1XFJOeWJJvgLB6kRH/F8QtBhFABlonidBeM+0nlpIPu3vpZBJqjnDQQPfSUuYLv1X X-Received: by 2002:a17:906:6a14:: with SMTP id qw20mr5737311ejc.763.1639825823704; Sat, 18 Dec 2021 03:10:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639825823; cv=none; d=google.com; s=arc-20160816; b=hAHK2p0WLRHMwUWIA+QnTeLOTeQ0CzoP92y4JhmxlfWO07DxCxmXMdJJCnSx3hzx94 9rUM47JRqmQp/R3GyhGUYloX3U29tRnmFEw/y9SszFbISDuksEFDIifUnYwHDU8LGEvB VeA228SJu2uaV4OiF3BXN+3lmzUmB7obR1qcmVre/fhT1N5HcWPBeE2NGFgcWiwsuyYp xB/k0sPEVFlEcQ1JVYdiEuybdKJZ35tq73aeYRZSH7XpwOAr7fS90NvqLIZRN6/+V9Hx cq8QubGf283Z9dOYo041HvebgVPW75euIw+opGKQ4T8cix7p+9larYyD/3SP8HpowqWB RtBg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=bgmaZ1XJt9f9Y+BOrIW5VBLBYFrPUV6V5ctAAWrNyCc=; b=tmJ5OUDhCIi11BX6NDrPsZvk7bdojYVH0N+OsAY7p71Rb1pS+9xKdJUZJIr8aYvA8p lLDQZs4Uia1TCmugZdZ1b4EklMBWhW7XnifSyviHCat/gHbkiP7NBsy8HN83Soje7fXQ EG5asPbDEMuWwlXRXH6BwWQKbdfBBGRBHnxpmNnQDJwXCnVy1hO39x0wVXUePCR23rP3 eAGk8QLS8YbkIhX47afFuT3HdRgHDwfnS2dSsDAZHYY1+msIedxhA0dAKhvL2dRlEGte IMHo04KSLsMPgsDg8ztY6crJ+FBGuBIpCoUhceH6J+HvHYqXQFp6dXJPTxNhlxbs46KD HKrA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@rcombs.me header.s=google header.b=FmnQ3Lga; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q20si6875511ejb.638.2021.12.18.03.10.23; Sat, 18 Dec 2021 03:10:23 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@rcombs.me header.s=google header.b=FmnQ3Lga; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 56C8F68A6F6; Sat, 18 Dec 2021 13:10:20 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f43.google.com (mail-qv1-f43.google.com [209.85.219.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7C47868AEEC for ; Sat, 18 Dec 2021 13:10:13 +0200 (EET) Received: by mail-qv1-f43.google.com with SMTP id h5so3054614qvh.8 for ; Sat, 18 Dec 2021 03:10:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rcombs.me; s=google; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=OuHgalUL9IHLuVssh7+Au7LHNNkdCzmg11LUVTnn3XY=; b=FmnQ3Lga5evSeZ+7wxInfeC1c5ZgJtKOnNSN/XNwBvPx8QnMzJS88Jx9V6mrmH2NGV +hcv334dnhpkJx8C1aIvOLNcnjAOGRACCeFFPJrho4z4HL9TwtRlvDaVvb853ykmHCvQ VNxQKSB0yD6qxi5RjHOJ1+AxTg1fkd7WoWCefaUAZUIFvjMNkHjVNlzm0MkAU8bnjWdn +6iyTY+xnQRsu1U/Y/bUXmH500zOOMtIpWsdUqEVTSot53B7X+xRLum8HbTNRzdmJVX5 FUHNdF/CtU0Kb65gb8uC08JT4KYipywKPpNaySKTuOnSRslWiY+25IDuNDLDBkZpCWgx wg/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=OuHgalUL9IHLuVssh7+Au7LHNNkdCzmg11LUVTnn3XY=; b=aYKOaU2P6h0hppLfW4XiDheVFQf3k35QVBNYm2y09mAirIJDoJgI5yA/GxR1TjlvfP ppKFBGfwRpqP7CMaZWRYA4F7C0C/FagiTGt6n2g91aA+yAaWB/8vE8LSjkwrZj9SP40p WlRIedBFTTbsg7/saCZkCnPXPmuyi/cQUlRDIVAOR0vPKwuUneZsQb9p9aKXga+gJe6L kd0LifycrDWF1LTGtufLpNb3ivqj4p9kUNQD+3vtbLJ86Nnc0VMr8CixCqwB8lBZ9QXU JMTKpREJqCeP8Pg4eZdx5IF64omJxwIadAV6pfHPk5iH/Dz4QCv9P4M72mWWSyR2mckG 5Azg== X-Gm-Message-State: AOAM531/SuHdx0Jv04MHT+e9eg/OvQhPi8zD9L5qpgplU7uS93mBUlP1 MSRixDzkNocAUrKVzjU3yhSn35oiyvdE5q4= X-Received: by 2002:a05:6214:500a:: with SMTP id jo10mr5592669qvb.17.1639825811739; Sat, 18 Dec 2021 03:10:11 -0800 (PST) Received: from rcombs-mbp.localdomain ([2601:243:2000:5ac:70a5:b034:a3a1:e733]) by smtp.gmail.com with ESMTPSA id h19sm9571162qth.63.2021.12.18.03.10.11 for (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 18 Dec 2021 03:10:11 -0800 (PST) From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Dec 2021 05:09:51 -0600 Message-Id: <20211218110953.30751-1-rcombs@rcombs.me> X-Mailer: git-send-email 2.33.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] lavu/videotoolbox: expose conversion routines for color parameters X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 2YrdR5STxWOs Also fixes symbol lookup errors on older macOS when built with a newer SDK, introduced in 6cab5206b0ad94990c435cb7c5cf3b29675e0231 --- doc/APIchanges | 6 + libavutil/hwcontext_videotoolbox.c | 171 +++++++++++++++-------------- libavutil/hwcontext_videotoolbox.h | 25 +++++ 3 files changed, 119 insertions(+), 83 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 17aa664ca3..af2fbaafcf 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -14,6 +14,12 @@ libavutil: 2021-04-27 API changes, most recent first: +2021-12-xx - xxxxxxxxxx - lavu 57.12.100 - hwcontext_videotoolbox.h + Add av_map_videotoolbox_chroma_loc_from_av + Add av_map_videotoolbox_color_matrix_from_av + Add av_map_videotoolbox_color_primaries_from_av + Add av_map_videotoolbox_color_trc_from_av + 2021-12-xx - xxxxxxxxxx - lavf 59.10.100 - avformat.h Add AVFormatContext io_close2 which returns an int diff --git a/libavutil/hwcontext_videotoolbox.c b/libavutil/hwcontext_videotoolbox.c index e9567bbf44..4c6d37304c 100644 --- a/libavutil/hwcontext_videotoolbox.c +++ b/libavutil/hwcontext_videotoolbox.c @@ -318,7 +318,7 @@ static void vt_unmap(AVHWFramesContext *ctx, HWMapDescriptor *hwmap) CVPixelBufferUnlockBaseAddress(pixbuf, (uintptr_t)hwmap->priv); } -static int vt_pixbuf_set_par(AVHWFramesContext *hwfc, +static int vt_pixbuf_set_par(void *log_ctx, CVPixelBufferRef pixbuf, const AVFrame *src) { CFMutableDictionaryRef par = NULL; @@ -375,31 +375,30 @@ static int vt_pixbuf_set_par(AVHWFramesContext *hwfc, return 0; } -static int vt_pixbuf_set_chromaloc(AVHWFramesContext *hwfc, - CVPixelBufferRef pixbuf, const AVFrame *src) +CFStringRef av_map_videotoolbox_chroma_loc_from_av(enum AVChromaLocation loc) { - CFStringRef loc = NULL; - - switch (src->chroma_location) { + switch (loc) { case AVCHROMA_LOC_LEFT: - loc = kCVImageBufferChromaLocation_Left; - break; + return kCVImageBufferChromaLocation_Left; case AVCHROMA_LOC_CENTER: - loc = kCVImageBufferChromaLocation_Center; - break; + return kCVImageBufferChromaLocation_Center; case AVCHROMA_LOC_TOP: - loc = kCVImageBufferChromaLocation_Top; - break; + return kCVImageBufferChromaLocation_Top; case AVCHROMA_LOC_BOTTOM: - loc = kCVImageBufferChromaLocation_Bottom; - break; + return kCVImageBufferChromaLocation_Bottom; case AVCHROMA_LOC_TOPLEFT: - loc = kCVImageBufferChromaLocation_TopLeft; - break; + return kCVImageBufferChromaLocation_TopLeft; case AVCHROMA_LOC_BOTTOMLEFT: - loc = kCVImageBufferChromaLocation_BottomLeft; - break; + return kCVImageBufferChromaLocation_BottomLeft; + default: + return NULL; } +} + +static int vt_pixbuf_set_chromaloc(void *log_ctx, + CVPixelBufferRef pixbuf, const AVFrame *src) +{ + CFStringRef loc = av_map_videotoolbox_chroma_loc_from_av(src->chroma_location); if (loc) { CVBufferSetAttachment( @@ -412,109 +411,115 @@ static int vt_pixbuf_set_chromaloc(AVHWFramesContext *hwfc, return 0; } -static int vt_pixbuf_set_colorspace(AVHWFramesContext *hwfc, - CVPixelBufferRef pixbuf, const AVFrame *src) +CFStringRef av_map_videotoolbox_color_matrix_from_av(enum AVColorSpace space) { - CFStringRef colormatrix = NULL, colorpri = NULL, colortrc = NULL; - Float32 gamma = 0; - - switch (src->colorspace) { + switch (space) { case AVCOL_SPC_BT2020_CL: case AVCOL_SPC_BT2020_NCL: #if HAVE_KCVIMAGEBUFFERYCBCRMATRIX_ITU_R_2020 - colormatrix = kCVImageBufferYCbCrMatrix_ITU_R_2020; -#else - colormatrix = CFSTR("ITU_R_2020"); + if (__builtin_available(macOS 10.11, iOS 9, *)) + return kCVImageBufferYCbCrMatrix_ITU_R_2020; #endif - break; + return CFSTR("ITU_R_2020"); case AVCOL_SPC_BT470BG: case AVCOL_SPC_SMPTE170M: - colormatrix = kCVImageBufferYCbCrMatrix_ITU_R_601_4; - break; + return kCVImageBufferYCbCrMatrix_ITU_R_601_4; case AVCOL_SPC_BT709: - colormatrix = kCVImageBufferYCbCrMatrix_ITU_R_709_2; - break; + return kCVImageBufferYCbCrMatrix_ITU_R_709_2; case AVCOL_SPC_SMPTE240M: - colormatrix = kCVImageBufferYCbCrMatrix_SMPTE_240M_1995; - break; + return kCVImageBufferYCbCrMatrix_SMPTE_240M_1995; case AVCOL_SPC_UNSPECIFIED: - break; default: - av_log(hwfc, AV_LOG_WARNING, "Color space %s is not supported.\n", av_color_space_name(src->colorspace)); + return NULL; } +} - switch (src->color_primaries) { +CFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pri) +{ + switch (pri) { case AVCOL_PRI_BT2020: #if HAVE_KCVIMAGEBUFFERCOLORPRIMARIES_ITU_R_2020 - colorpri = kCVImageBufferColorPrimaries_ITU_R_2020; -#else - colorpri = CFSTR("ITU_R_2020"); + if (__builtin_available(macOS 10.11, iOS 9, *)) + return kCVImageBufferColorPrimaries_ITU_R_2020; #endif - break; + return CFSTR("ITU_R_2020"); case AVCOL_PRI_BT709: - colorpri = kCVImageBufferColorPrimaries_ITU_R_709_2; - break; + return kCVImageBufferColorPrimaries_ITU_R_709_2; case AVCOL_PRI_SMPTE170M: - colorpri = kCVImageBufferColorPrimaries_SMPTE_C; - break; + return kCVImageBufferColorPrimaries_SMPTE_C; case AVCOL_PRI_BT470BG: - colorpri = kCVImageBufferColorPrimaries_EBU_3213; - break; + return kCVImageBufferColorPrimaries_EBU_3213; case AVCOL_PRI_UNSPECIFIED: - break; default: - av_log(hwfc, AV_LOG_WARNING, "Color primaries %s is not supported.\n", av_color_primaries_name(src->color_primaries)); + return NULL; } +} + +CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc) +{ - switch (src->color_trc) { + switch (trc) { case AVCOL_TRC_SMPTE2084: #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ - colortrc = kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ; -#else - colortrc = CFSTR("SMPTE_ST_2084_PQ"); + if (__builtin_available(macOS 10.13, iOS 11, *)) + return kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ; #endif - break; + return CFSTR("SMPTE_ST_2084_PQ"); case AVCOL_TRC_BT2020_10: case AVCOL_TRC_BT2020_12: #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2020 - colortrc = kCVImageBufferTransferFunction_ITU_R_2020; -#else - colortrc = CFSTR("ITU_R_2020"); + if (__builtin_available(macOS 10.11, iOS 9, *)) + return kCVImageBufferTransferFunction_ITU_R_2020; #endif - break; + return CFSTR("ITU_R_2020"); case AVCOL_TRC_BT709: - colortrc = kCVImageBufferTransferFunction_ITU_R_709_2; - break; + return kCVImageBufferTransferFunction_ITU_R_709_2; case AVCOL_TRC_SMPTE240M: - colortrc = kCVImageBufferTransferFunction_SMPTE_240M_1995; - break; + return kCVImageBufferTransferFunction_SMPTE_240M_1995; case AVCOL_TRC_SMPTE428: #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_428_1 - colortrc = kCVImageBufferTransferFunction_SMPTE_ST_428_1; -#else - colortrc = CFSTR("SMPTE_ST_428_1"); + if (__builtin_available(macOS 10.12, *, iOS 10)) + return kCVImageBufferTransferFunction_SMPTE_ST_428_1; #endif - break; + return CFSTR("SMPTE_ST_428_1"); case AVCOL_TRC_ARIB_STD_B67: #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG - colortrc = kCVImageBufferTransferFunction_ITU_R_2100_HLG; -#else - colortrc = CFSTR("ITU_R_2100_HLG"); + if (__builtin_available(macOS 10.13, iOS 11, *)) + return kCVImageBufferTransferFunction_ITU_R_2100_HLG; #endif - break; + return CFSTR("ITU_R_2100_HLG"); case AVCOL_TRC_GAMMA22: - gamma = 2.2; - colortrc = kCVImageBufferTransferFunction_UseGamma; - break; + return kCVImageBufferTransferFunction_UseGamma; case AVCOL_TRC_GAMMA28: - gamma = 2.8; - colortrc = kCVImageBufferTransferFunction_UseGamma; - break; - case AVCOL_TRC_UNSPECIFIED: - break; + return kCVImageBufferTransferFunction_UseGamma; default: - av_log(hwfc, AV_LOG_WARNING, "Color transfer function %s is not supported.\n", av_color_transfer_name(src->color_trc)); + case AVCOL_TRC_UNSPECIFIED: + return NULL; } +} + +static int vt_pixbuf_set_colorspace(void *log_ctx, + CVPixelBufferRef pixbuf, const AVFrame *src) +{ + CFStringRef colormatrix = NULL, colorpri = NULL, colortrc = NULL; + Float32 gamma = 0; + + colormatrix = av_map_videotoolbox_color_matrix_from_av(src->colorspace); + if (!colormatrix && src->colorspace != AVCOL_SPC_UNSPECIFIED) + av_log(log_ctx, AV_LOG_WARNING, "Color space %s is not supported.\n", av_color_space_name(src->colorspace)); + + colorpri = av_map_videotoolbox_color_primaries_from_av(src->color_primaries); + if (!colorpri && src->color_primaries != AVCOL_PRI_UNSPECIFIED) + av_log(log_ctx, AV_LOG_WARNING, "Color primaries %s is not supported.\n", av_color_primaries_name(src->color_primaries)); + + colortrc = av_map_videotoolbox_color_trc_from_av(src->color_trc); + if (!colortrc && src->color_trc != AVCOL_TRC_UNSPECIFIED) + av_log(log_ctx, AV_LOG_WARNING, "Color transfer function %s is not supported.\n", av_color_transfer_name(src->color_trc)); + + if (src->color_trc == AVCOL_TRC_GAMMA22) + gamma = 2.2; + else if (src->color_trc == AVCOL_TRC_GAMMA28) + gamma = 2.8; if (colormatrix) { CVBufferSetAttachment( @@ -550,17 +555,17 @@ static int vt_pixbuf_set_colorspace(AVHWFramesContext *hwfc, return 0; } -static int vt_pixbuf_set_attachments(AVHWFramesContext *hwfc, +static int vt_pixbuf_set_attachments(void *log_ctx, CVPixelBufferRef pixbuf, const AVFrame *src) { int ret; - ret = vt_pixbuf_set_par(hwfc, pixbuf, src); + ret = vt_pixbuf_set_par(log_ctx, pixbuf, src); if (ret < 0) return ret; - ret = vt_pixbuf_set_colorspace(hwfc, pixbuf, src); + ret = vt_pixbuf_set_colorspace(log_ctx, pixbuf, src); if (ret < 0) return ret; - ret = vt_pixbuf_set_chromaloc(hwfc, pixbuf, src); + ret = vt_pixbuf_set_chromaloc(log_ctx, pixbuf, src); if (ret < 0) return ret; return 0; diff --git a/libavutil/hwcontext_videotoolbox.h b/libavutil/hwcontext_videotoolbox.h index 62cde07c51..916899e97d 100644 --- a/libavutil/hwcontext_videotoolbox.h +++ b/libavutil/hwcontext_videotoolbox.h @@ -60,4 +60,29 @@ uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt); */ uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range); +/** + * Convert an AVChromaLocation to a VideoToolbox/CoreVideo chroma location string. + * Returns 0 if no known equivalent was found. + */ +CFStringRef av_map_videotoolbox_chroma_loc_from_av(enum AVChromaLocation loc); + +/** + * Convert an AVColorSpace to a VideoToolbox/CoreVideo color matrix string. + * Returns 0 if no known equivalent was found. + */ +CFStringRef av_map_videotoolbox_color_matrix_from_av(enum AVColorSpace space); + +/** + * Convert an AVColorPrimaries to a VideoToolbox/CoreVideo color primaries string. + * Returns 0 if no known equivalent was found. + */ +CFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pri); + +/** + * Convert an AVColorTransferCharacteristic to a VideoToolbox/CoreVideo color transfer + * function string. + * Returns 0 if no known equivalent was found. + */ +CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc); + #endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */