From patchwork Tue Jul 19 12:26:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 36837 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp1714735pzb; Tue, 19 Jul 2022 05:27:05 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vYaablKAwSMbWedpTf3a8mJPBssjLqeJhsPdLt3U9R7Wm9nOJxuXY6r4msFZgSAYz82lqI X-Received: by 2002:a17:906:ef90:b0:72b:50d5:7383 with SMTP id ze16-20020a170906ef9000b0072b50d57383mr30616322ejb.485.1658233625379; Tue, 19 Jul 2022 05:27:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658233625; cv=none; d=google.com; s=arc-20160816; b=mzblgDu8k2rkwlwT+/+Or7qXIU1YLvHUuU2GVlmKjpNbwpVQBSbtDvNl6Z1mdp3c6X LAQLeInNvCgwJrLsZ5hJgdAJPKmd4mjcw+NMhr9eDfskgMKGGXvDIH7eR4ouGfCDBbj9 DYGSr0nQMmQPh+F15krluD9TAaiGkNcYB61mxL2mXQpH5ESaMQDqYhmLdU170Aqz1xeT jNLvHdzmq+5jIWRUfDJeXyTGZopwqv13WfzT4MjzgopB2kDRJLOTmkld7YGYmTuAtdBY y9ZkowRZM86tMD1h40ju9qDDpwUQEwnD1IWk8ZoktxhOjNsZr8ugHL4bBgOUjJfLHfgm jc+A== 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=6lJe2g3LXyU20uILkqRPkCYt8zMYxFcztDRqAJ+8SOE=; b=0gqMTZhiSd/PsTMAFGzEj9DMeh9aJsktUp93ucXtE3Uxl2LoeEQ6xGxPOw1pRICDex 5i0v4e6ObTqVor9le0/18YxxVGelAHGahCcUDAwrwBcUKAk3RzlPNjCSHdCIMfl4nFgm Li/53RUP7QLQY4dDeRPzyXCm/CqDt8b5a0NysjfQqP9VHoyb46XENzCJXtDVv5cEyeZs PJPmPbUzMywrW5aDkqr6wydUZ24H1mYyAb0Hz1eU8C1LW8v0dbv0nh4kbi7exiXVy0mf ry7u1THWwXpay1mdI867JgIUnzF8M1YilhS16EFwuynhGN6+CGRGUDMSPJbvChLoVB7t RXWw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=vAgbNLPb; 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 f24-20020a056402329800b0043a897d1de2si19119588eda.128.2022.07.19.05.27.05; Tue, 19 Jul 2022 05:27:05 -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=vAgbNLPb; 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 0408468B5A5; 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 1C2E268B682 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 B6FEF4A9D1; 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=1658233570; bh=7m3kbu4txKsgAtPIlgIq79+cMwDOEAhBa8d6xEA+Soc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vAgbNLPb3QdINuIPr2aDbNps07ypdMp2uN9ldyqZE1Ww025a5nSLMZ+pLJ8MwZ7wS 0f1vX/tzOuHJ6opdoL0b/E6G4hjquRsdumAO+4VtpeKoGcWtYSWmeQWFFu+OEsK/8o q8AgKs6K4pqu3DNNDT7JTefe7O/0tls8G5oGC0iE= From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 19 Jul 2022 14:26:07 +0200 Message-Id: <20220719122608.43974-6-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 5/6] avcodec/decode: parse 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: 7AMc4l7cXC74 From: Niklas Haas Implementation for the decode side of the ICC profile API, roughly matching the behavior of the existing vf_iccdetect filter. Closes: #9673 Signed-off-by: Niklas Haas --- libavcodec/decode.c | 61 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/libavcodec/decode.c b/libavcodec/decode.c index cc4fe3b1d5..9f37d36f78 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -49,10 +49,6 @@ #include "internal.h" #include "thread.h" -#if CONFIG_LCMS2 -# include "fflcms2.h" -#endif - static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt) { int ret; @@ -508,6 +504,54 @@ FF_ENABLE_DEPRECATION_WARNINGS return ret < 0 ? ret : 0; } +#if CONFIG_LCMS2 +static int detect_colorspace(AVCodecContext *avctx, AVFrame *frame) +{ + AVCodecInternal *avci = avctx->internal; + enum AVColorTransferCharacteristic trc; + AVColorPrimariesDesc coeffs; + enum AVColorPrimaries prim; + cmsHPROFILE profile; + AVFrameSideData *sd; + int ret; + if (!avctx->flags2 & AV_CODEC_FLAG2_ICC_PROFILES) + return 0; + + sd = av_frame_get_side_data(frame, AV_FRAME_DATA_ICC_PROFILE); + if (!sd || !sd->size) + return 0; + + if (!avci->icc.avctx) { + ret = ff_icc_context_init(&avci->icc, avctx); + if (ret < 0) + return ret; + } + + profile = cmsOpenProfileFromMemTHR(avci->icc.ctx, sd->data, sd->size); + if (!profile) + return AVERROR_INVALIDDATA; + + ret = ff_icc_profile_read_primaries(&avci->icc, profile, &coeffs); + if (!ret) + ret = ff_icc_profile_detect_transfer(&avci->icc, profile, &trc); + cmsCloseProfile(profile); + if (ret < 0) + return ret; + + prim = av_csp_primaries_id_from_desc(&coeffs); + if (prim != AVCOL_PRI_UNSPECIFIED) + frame->color_primaries = prim; + if (trc != AVCOL_TRC_UNSPECIFIED) + frame->color_trc = trc; + return 0; +} +#else /* !CONFIG_LCMS2 */ +static int detect_colorspace(av_unused AVCodecContext *c, av_unused AVFrame *f) +{ + return 0; +} +#endif + static int decode_simple_receive_frame(AVCodecContext *avctx, AVFrame *frame) { int ret; @@ -528,7 +572,7 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) { AVCodecInternal *avci = avctx->internal; const FFCodec *const codec = ffcodec(avctx->codec); - int ret; + int ret, ok; av_assert0(!frame->buf[0]); @@ -542,6 +586,13 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) if (ret == AVERROR_EOF) avci->draining_done = 1; + /* preserve ret */ + ok = detect_colorspace(avctx, frame); + if (ok < 0) { + av_frame_unref(frame); + return ok; + } + if (!(codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS) && IS_EMPTY(avci->last_pkt_props)) { // May fail if the FIFO is empty.