From patchwork Tue Jul 19 12:26:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 36838 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp1714823pzb; Tue, 19 Jul 2022 05:27:14 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vGxYoCLdkUGYOhk30qUszEiRFjZf18wzMyxiuetiJCkQhZdYpTaLy2k4musbQhn8Fc9Pkh X-Received: by 2002:a05:6402:1e94:b0:43a:9e92:bf2 with SMTP id f20-20020a0564021e9400b0043a9e920bf2mr43365765edf.248.1658233634479; Tue, 19 Jul 2022 05:27:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658233634; cv=none; d=google.com; s=arc-20160816; b=iqx9Rtls7gEmTWRgC5Q2OysW8IGhzILmqGwBGulqL6mOjZ907GUPioPkF3p6KAk+IO //3bCP/NIvBV89uW3N5AH7Prl/hxs3oolWG/DifR+o3WMJa1TZnjinDm1Q5qO3RpxK36 XSqr5Z3SiesuIqoT4FoyHUIDsHl8A9cYaroxnO/07F8KtedcHPy36K52oUmOEvSsz8zU xK7jJ8/P+GnUYyNJn5L2Lh4iNiNsg2GWg22+2h9oN00xLb7mMY8JGrQ3LMrnlbJTXE9w FV4nlrk9tEm163oGW7tSV4I1hlJJRfzf67rf5VvsLp8Gd/++7A3uubMvZ1r4+eAO/KFw lglA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=5zuMXp9W21+feCk617YcssrMLHB0/WV4H0TcFJDoHtM=; b=uB9ZgoA7bbjECl1Gdr9A/mn6mt9rEjppG6DM6NR1dVg3oq+dfOuE4qt3nbIWtDpzxl JpnefxDGCrSaJUPcjyZUjKKCmVu558b97xGpSkF4qOpEoMq/t35BugqM/a1RxPbF5ltD OLDU9ci3Y8e1GbRKkjRnUIz4I2iKF6m088zrgoRLwlcsNWS2GCPfkGdzYX5D0FB7I82a K1c9qdrm8M6Ie3eZ7c0zMjIyaPsszuPFLPHoNE558ukwLD9rvV26mr3Ih24lop/rLEcV PVltZpNxe/nb+rSW0qPsD3/sYz9g2bvzQzDJQdQPsECu8iQ7Of/aIHrvQ9HumId50dzL bokw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=vePTWLYr; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id mp27-20020a1709071b1b00b0072b1307863esi19961471ejc.122.2022.07.19.05.27.14; Tue, 19 Jul 2022 05:27:14 -0700 (PDT) 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=@haasn.xyz header.s=mail header.b=vePTWLYr; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CD84668B704; Tue, 19 Jul 2022 15:26:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from haasn.dev (haasn.dev [78.46.187.166]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 242DD68B687 for ; Tue, 19 Jul 2022 15:26:15 +0300 (EEST) Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id E9E7A4A9D2; Tue, 19 Jul 2022 14:26:10 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1658233571; bh=iFqvF3U3BuDklpCMX6gZa/dYI+aDcl6UfpXve6uOnSY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vePTWLYrGVaC/hGLtPvKEux4PFtA+kIo05kSdJnI7Uk9ZJjLcV+sLN8sBh2V7GG6y DSmdABJmlmIjdz/gHMpXeO9STBRA8gh8v8xDIv+ENZ41x3/6eCuzKxbczekox/APXC qHBMMjAmbHQwyq9bn8c1zLOPdVgX/F+zCgMxDgxU= From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 19 Jul 2022 14:26:08 +0200 Message-Id: <20220719122608.43974-7-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220719122608.43974-1-ffmpeg@haasn.xyz> References: <20220719122608.43974-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 6/6] avcodec/encode:: generate ICC profiles 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 Cc: Niklas Haas Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: p9PlPUvo6D3a From: Niklas Haas Only if requested, and only if the codec signals support for ICC profiles. Implementation roughly matches the functionality of the existing vf_iccgen filter, albeit with some reduced flexibility and no caching. Ideally, we'd also only do this on the first frame (e.g. mjpeg, apng), but there's no meaningful way for us to distinguish between this case and e.g. somebody using the image2 muxer, in which case we'd want to attach ICC profiles to every frame in the stream. Closes: #9672 Signed-off-by: Niklas Haas --- libavcodec/encode.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/libavcodec/encode.c b/libavcodec/encode.c index 310fe20777..7cf13bf6d6 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -308,6 +308,53 @@ static int encode_receive_packet_internal(AVCodecContext *avctx, AVPacket *avpkt return ret; } +#if CONFIG_LCMS2 +static int encode_generate_icc_profile(AVCodecContext *avctx, AVFrame *frame) +{ + enum AVColorTransferCharacteristic trc = frame->color_trc; + enum AVColorPrimaries prim = frame->color_primaries; + const FFCodec *const codec = ffcodec(avctx->codec); + AVCodecInternal *avci = avctx->internal; + cmsHPROFILE profile; + int ret; + + /* don't generate ICC profiles if disabled or unsupported */ + if (!(avctx->flags2 & AV_CODEC_FLAG2_ICC_PROFILES)) + return 0; + if (!(codec->caps_internal & FF_CODEC_CAP_ICC_PROFILES)) + return 0; + + if (trc == AVCOL_TRC_UNSPECIFIED) + trc = avctx->color_trc; + if (prim == AVCOL_PRI_UNSPECIFIED) + prim = avctx->color_primaries; + if (trc == AVCOL_TRC_UNSPECIFIED || prim == AVCOL_PRI_UNSPECIFIED) + return 0; /* can't generate ICC profile with missing csp tags */ + + if (av_frame_get_side_data(frame, AV_FRAME_DATA_ICC_PROFILE)) + return 0; /* don't overwrite existing ICC profile */ + + if (!avci->icc.avctx) { + ret = ff_icc_context_init(&avci->icc, avctx); + if (ret < 0) + return ret; + } + + ret = ff_icc_profile_generate(&avci->icc, prim, trc, &profile); + if (ret < 0) + return ret; + + ret = ff_icc_profile_attach(&avci->icc, profile, frame); + cmsCloseProfile(profile); + return ret; +} +#else /* !CONFIG_LCMS2 */ +static int encode_generate_icc_profile(av_unused AVCodecContext *c, av_unused AVFrame *f) +{ + return 0; +} +#endif + static int encode_send_frame_internal(AVCodecContext *avctx, const AVFrame *src) { AVCodecInternal *avci = avctx->internal; @@ -360,6 +407,12 @@ FF_DISABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS #endif + if (avctx->codec->type == AVMEDIA_TYPE_VIDEO) { + ret = encode_generate_icc_profile(avctx, dst); + if (ret < 0) + return ret; + } + return 0; }