From patchwork Thu Jul 28 14:50:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 37021 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp326468pzb; Thu, 28 Jul 2022 07:50:45 -0700 (PDT) X-Google-Smtp-Source: AGRyM1ukGdQYgnilNKgrqguvhxEqGp8DX8FaojR5OCD9pBGeQxs9L0h3udhTeLURDWi/dihikFhe X-Received: by 2002:a17:906:cc45:b0:72b:313b:f3ee with SMTP id mm5-20020a170906cc4500b0072b313bf3eemr20546577ejb.362.1659019844723; Thu, 28 Jul 2022 07:50:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659019844; cv=none; d=google.com; s=arc-20160816; b=Zg0T2ggXFrOK567HkAM/KAb18g59rePFm8sXsc1382JeY90TJ9am8t9MGKSEIx4v9D 5d48Gq1KtXFG/tST3PLeoo36Nlmf06dg+fYNT2+atD/ZuVkx7WM99N/xsucM2q2DVgc8 0XlcUOfdSa4DJOkLDI+4seWLck8mD9Xyb1nOev+FcI5EtyMTOyy8Ic1DD4Jd+t59mCoq s01nGR8Ug46GGzaalOiPt8t7XbD4bcIpIVZgTKQXykNgm9iFRtVrDckHOQGd8pY8jLTH LbnYzBj3lgh4xb5SUbAzTfRNukKQVj/j9hZ66NaAiqLzCLg9hLPFt6K2UEicbzpMbjNe 3HNQ== 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=Us2rMuQbC22kx+W8GVvYA9YsIuf1k1H1dySe6VNeJhkx1l+aDvbYOPtWLOLB4vwGEr Tt3lLMc5b+tVkOsuw69I0qDPVKTxZzGwuRiHObh7wq274cWK7yZaW9opO5F89KVskKW4 GCf16TK8iimf5Lw79WpxwC6zJ+5NXOO9zmL1wImwhXox5spuEACbMiWrb5Fll3uTciiS WomAKNPb07GtFlMzLbQ3GdCgTMB/lFiKzdJXCd6u14XisE7+2f12w00IdG97f0HGl+H9 tvuKcYlPmU6WBB7DZwQ5PHU7SzRsiSnwEdDZ2aIlNqofVmPUiI5Prq5iRMYhniAQTdsM x59w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=cO7cT3Ym; 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 wu8-20020a170906eec800b0072ab4b5ffdcsi1008106ejb.96.2022.07.28.07.50.44; Thu, 28 Jul 2022 07:50:44 -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=cO7cT3Ym; 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 E00AD68B9AC; Thu, 28 Jul 2022 17:50:16 +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 21D9F68B8E9 for ; Thu, 28 Jul 2022 17:50:12 +0300 (EEST) Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 7E5564AAF9; Thu, 28 Jul 2022 16:50:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1659019807; bh=iFqvF3U3BuDklpCMX6gZa/dYI+aDcl6UfpXve6uOnSY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cO7cT3YmYagI0UuBKHll8t1cUnMg/a9rgcCoYiC1JPt3pDOkrpWimymKAXtE5eP10 DCotCZ854eZ47Lzn2LLoi/xIg4mqks4D6DjVRTPQ7xI371AQC2gIYVwnXnD5jDue/C TTjRq746OaUBd78oIeqNO+5iOQ9uvBH6X+ornzgY= From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Thu, 28 Jul 2022 16:50:01 +0200 Message-Id: <20220728145002.102600-7-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220728145002.102600-1-ffmpeg@haasn.xyz> References: <20220728145002.102600-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 6/7] 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: 6r640A3/5aD3 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; }