From patchwork Mon Mar 20 23:34:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 40748 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d046:b0:cd:afd7:272c with SMTP id hv6csp2166589pzb; Mon, 20 Mar 2023 16:36:25 -0700 (PDT) X-Google-Smtp-Source: AK7set8pI8LdXRInj8WmyjkElBIAVtUW73Gr64ttAiKN/i/kuz6FsWWfeB+y48usHb84SdzTj7i8 X-Received: by 2002:aa7:d384:0:b0:4fc:d837:2c44 with SMTP id x4-20020aa7d384000000b004fcd8372c44mr1253766edq.35.1679355385741; Mon, 20 Mar 2023 16:36:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679355385; cv=none; d=google.com; s=arc-20160816; b=jvnGaOJNyGKprJFQoUExvHu5n2IJzgSg2ADzOejeTZAC++u98P9HNq6sLxZgL7Y3EZ 5bvhWPD+efZCCznBhdMRmB2oLjACkxV9lBKo1A71uv3VyyPfyn96LFemrz/svumvCR1V RZL5agAXCcRbW+vpNkP9NC+6hsWZiRNtuTJFBFfHli0R3OJ2QFh0WmrOkCZgiyBp5Aqc eOkKO4b3qwgHWatcm5iwJKMjtxMU8IUPOa5P4x3Kpfjn5BGEr8jN+PvvxljDwTfJV+gd MFrT4/mIFrTIzYzDumVSq5qKJA50newL9Jo0/twpsuBBhS7lEMsyXjeYdZkryg+M+BnT CQ5g== 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:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=KbIsKbp+SSy8BZy9y/NqNq/TSY1slC9v2AEDKbf1nxY=; b=rdMN6Gkw0MUuDx2kBnej77XIwAyEYwSrMDmsP8p10f36EX/vEGUDYMVfd2Gcv1q4ca riKECXOvwvm2WmkTmgm4BK/tCwAUgPB+YsJobZhzoX6kAeSNYEftk4xEeUgOK129AHwS wMZ5T3Lkg25QI7QLWLhSC/JTCfYSzSi9m5C1loDSiJnDi0Ip7hDzGcZWho506saQCQQT 62gWQHdgq2DgQjssxBt31gd+qIyrOEcxj/nknF/6pPNh6azIuPZmm6FT2jXyiiDMSUsQ 1/QO2n6bxcZd2/WCpKuaDRRyev8mpkYu0Y2nqZA/cKQHzEHBjmaQywQ2XL7BlvZnUX6v JtRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=fCFqiwje; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id z5-20020aa7c645000000b004fc19199fd6si10687608edr.143.2023.03.20.16.36.25; Mon, 20 Mar 2023 16:36:25 -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=@gmail.com header.s=20210112 header.b=fCFqiwje; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A55BC68C631; Tue, 21 Mar 2023 01:34:36 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B99D568C5BA for ; Tue, 21 Mar 2023 01:34:21 +0200 (EET) Received: by mail-lf1-f49.google.com with SMTP id q16so6159751lfe.10 for ; Mon, 20 Mar 2023 16:34:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679355261; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=xq+da7dRC2sJCed1wnXK7YVe6AjhrLp3Y1p9FB4hC5A=; b=fCFqiwjeW70C4yyHwo7n+4UX3AB7Pu4yYK9tcKqoi0xo+qAK68L8AHIAnDdycuJAgj zfuEyglE4FhI83UTOzQt2uarpDWhVGj7N7gtG5TbdPYfsNv7MlYcvflyguuqTZUtQ6Dr 9y5iNm3vyjeeXyWswSK3kKKugyLYcGWYdNnsFE77IouVeHQJ5a2euVWCPeps7bgpw386 xtoSaiFGJJYkCpyM6HMVEQ0R5G9ZcpMlwKeM3xixqaxc8c4hAuSICdpPaQWhQvSwIRHH PJoegI+br2EYJxlU9X+nGYrcCMNu0QuLFv8mlxFGi83Jmp+wg59rtiq2K79GmUrqHM4p SQ/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679355261; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xq+da7dRC2sJCed1wnXK7YVe6AjhrLp3Y1p9FB4hC5A=; b=xL+Lq8PDDyj9164zEVWjkci9LB588/VQcu20Jlc3ZB/8oYPm9NrLktmO7hpzZXL/lB gjF/t6+1reSgl/ibciWHzijxcvp7Z9tzx/RytTNLH3R7HEEbK+q3sqxNSwo7ma85lOim gO5LFp6br53Q9IcPt/9bODAP/NbWxasxhD2Lqt2fVhFsAUY5oChDw90A01eW+TSoqXjZ 5Y2anKCPSqawt/HWZl3gWx5T1TbGzyMp7gR3FcQUm1uI11mqVku0doDLrZAaEjRv80IM M7VTQe4MGOEjFU+QfPfF6cIKKKD853qawcOp4//bG3xVYb7Pfl5ye3Km/Jjwk62NcJHv nNNQ== X-Gm-Message-State: AO0yUKVARAHdn6UY6ygdvpBsUfVdV9OqI8CZSTZuO7OwZzTBC0W2Avoh D6CzscYY6rGOBSf82hkeA/rAaxga2xg= X-Received: by 2002:ac2:5598:0:b0:4e9:d5e5:3ff2 with SMTP id v24-20020ac25598000000b004e9d5e53ff2mr195273lfg.40.1679355261097; Mon, 20 Mar 2023 16:34:21 -0700 (PDT) Received: from localhost.localdomain (91-153-198-187.elisa-laajakaista.fi. [91.153.198.187]) by smtp.gmail.com with ESMTPSA id j19-20020a19f513000000b004e84b79de9bsm1900701lfb.254.2023.03.20.16.34.20 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Mar 2023 16:34:20 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Tue, 21 Mar 2023 01:34:08 +0200 Message-Id: <20230320233408.134255-15-jeebjp@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230320233408.134255-1-jeebjp@gmail.com> References: <20230320233408.134255-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v0 14/14] avcodec/libx265: add support for writing out CLL and MDCV 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: gUuTtcE5kzhf The newer of these two are the separate integers for content light level, introduced in 3952bf3e98c76c31594529a3fe34e056d3e3e2ea , with X265_BUILD 75. As we already require X265_BUILD of at least 89, no further conditions are required. --- libavcodec/libx265.c | 82 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c index 420d0953af..497f31aa34 100644 --- a/libavcodec/libx265.c +++ b/libavcodec/libx265.c @@ -28,9 +28,11 @@ #include #include "libavutil/avassert.h" +#include "libavutil/bprint.h" #include "libavutil/buffer.h" #include "libavutil/internal.h" #include "libavutil/common.h" +#include "libavutil/mastering_display_metadata.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "avcodec.h" @@ -179,6 +181,79 @@ static av_cold int libx265_param_parse_int(AVCodecContext *avctx, return 0; } +static int handle_mdcv(AVCodecContext *avctx, const x265_api *api, + x265_param *params, + const AVMasteringDisplayMetadata *mdcv) +{ + int ret = AVERROR_BUG; + static const char *option = "master-display"; + AVBPrint buf; + av_bprint_init(&buf, 0, AV_BPRINT_SIZE_AUTOMATIC); + + // G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u) + av_bprintf( + &buf, + "G(%"PRId64",%"PRId64")B(%"PRId64",%"PRId64")R(%"PRId64",%"PRId64")" + "WP(%"PRId64",%"PRId64")L(%"PRId64",%"PRId64")", + av_rescale_q(1, mdcv->display_primaries[1][0], (AVRational){ 1, 50000 }), + av_rescale_q(1, mdcv->display_primaries[1][1], (AVRational){ 1, 50000 }), + av_rescale_q(1, mdcv->display_primaries[2][0], (AVRational){ 1, 50000 }), + av_rescale_q(1, mdcv->display_primaries[2][1], (AVRational){ 1, 50000 }), + av_rescale_q(1, mdcv->display_primaries[0][0], (AVRational){ 1, 50000 }), + av_rescale_q(1, mdcv->display_primaries[0][1], (AVRational){ 1, 50000 }), + av_rescale_q(1, mdcv->white_point[0], (AVRational){ 1, 50000 }), + av_rescale_q(1, mdcv->white_point[1], (AVRational){ 1, 50000 }), + av_rescale_q(1, mdcv->max_luminance, (AVRational){ 1, 10000 }), + av_rescale_q(1, mdcv->min_luminance, (AVRational){ 1, 10000 })); + + if (!av_bprint_is_complete(&buf)) { + ret = AVERROR(ENOMEM); + goto end; + } + + if (api->param_parse(params, option, buf.str) == + X265_PARAM_BAD_VALUE) { + av_log(avctx, AV_LOG_ERROR, + "Invalid value \"%s\" for param \"%s\".\n", + buf.str, option); + ret = AVERROR(EINVAL); + goto end; + } + + ret = 0; + +end: + av_bprint_finalize(&buf, NULL); + + return ret; +} + +static int handle_side_data(AVCodecContext *avctx, const x265_api *api, + x265_param *params) +{ + const AVFrameSideDataSet set = avctx->internal->side_data_set; + const AVFrameSideData *cll_sd = + av_get_side_data_from_set(set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); + const AVFrameSideData *mdcv_sd = + av_get_side_data_from_set(set, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA); + + if (cll_sd) { + const AVContentLightMetadata *cll = + (AVContentLightMetadata *)cll_sd->data; + + params->maxCLL = cll->MaxCLL; + params->maxFALL = cll->MaxFALL; + } + + if (mdcv_sd) { + int ret = handle_mdcv(avctx, api, params, (AVMasteringDisplayMetadata *)mdcv_sd->data); + if (ret < 0) + return ret; + } + + return 0; +} + static av_cold int libx265_encode_init(AVCodecContext *avctx) { libx265Context *ctx = avctx->priv_data; @@ -333,6 +408,13 @@ static av_cold int libx265_encode_init(AVCodecContext *avctx) return AVERROR_BUG; } + ret = handle_side_data(avctx, ctx->api, ctx->params); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Failed handling side data! (%s)\n", + av_err2str(ret)); + return ret; + } + if (ctx->crf >= 0) { char crf[6];