From patchwork Thu Aug 17 21:48:50 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: 43253 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4c9d:b0:130:ccc6:6c4b with SMTP id fq29csp2265889pzb; Thu, 17 Aug 2023 14:50:56 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEoMBXV3rkiafxKtQKkhi2/NlxSjQNj8DAcEa/WAC2JCdYM+SSFM2w3bt2gbZ4Dy/TW5fXa X-Received: by 2002:a05:6512:39c3:b0:4fe:c98:789a with SMTP id k3-20020a05651239c300b004fe0c98789amr516503lfu.37.1692309055711; Thu, 17 Aug 2023 14:50:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1692309055; cv=none; d=google.com; s=arc-20160816; b=c8gFnqUf0XFwnLisMMbHnasa6hN1BV6jVN4gkPHRa4XVMGi0AlJA67kmtMqTlG/BYV +umO4r5fR1n+unVaXVkSo387PK6TwbwQluGB2rdYnEd4Brd7Ne57di/voFOFaXFRqfLW Fd/uvjhUjdigqQQVd93vjzIh7t+SgCWRlqoBFsMuD0IDEFpE2Y/QOVtyCeeJDlsF6DS3 mx6qam86V6AIExRpdJgAhd726RSLyUpMVfu/JzOrvagyjbHpVSCOId/hgsrYNmu1sEMl MgAElxZuZR94A7VIIvG+BGSGS5yQCAWGzVZ0SgY13Xrmbrz9kuOhpJAlCnLIryMataF2 2TlA== 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=PbzoiPPDvG9piDh5CeX92I6XteD6mIKF4RV0AudhcFw=; fh=DpbP4OnC98Ct+zBdrpJgv1NgOvKTVLIsArQu/ER33Zc=; b=O/+XwsdMdRP+cMe6sadqJTUUd8TDur5MU2/g4Eia/2DLQU5miCBaQ1O5G5R0yhbxt+ PquYOGgYOcEVkQkUkUlRGqw5+pmdTs15Fu7gy7qCvMH146vCoGpBbegyqrTZqv6OLT16 mqOO27DEMmXaGMakfjOU1FW0eeZfJFc7gUl4YuW3SjZ2jDoo/Kk3Z3fizJRmbr4difa3 9VRWbOGqBzYuDeB9x43vH/E+nN2JRw8ymauPf+SyWU+wwyqC2iZpdjtlUKq/JPc28ZIY 3XOdX9wxH9VSOkGRpysEPSZlFCs8GrHsw64Rq/7NFc+ypinLGrzO7L7yvSh0/VeH0yjw bT4Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b="i/5RZrBg"; 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 ci12-20020a170906c34c00b0098df1cbe2aesi266630ejb.1008.2023.08.17.14.50.54; Thu, 17 Aug 2023 14:50:55 -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=20221208 header.b="i/5RZrBg"; 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 D829C68C7C0; Fri, 18 Aug 2023 00:49:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f53.google.com (mail-lf1-f53.google.com [209.85.167.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1160368C782 for ; Fri, 18 Aug 2023 00:49:05 +0300 (EEST) Received: by mail-lf1-f53.google.com with SMTP id 2adb3069b0e04-4fe8c16c1b4so296957e87.2 for ; Thu, 17 Aug 2023 14:49:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1692308944; x=1692913744; 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=WolH02WDN+H0riFen3m7L9TM2zmKoh5fIkK+ci9Gahk=; b=i/5RZrBgrVHMnpIXlhRisVK1wyMIJZbLMrTA5Q96i4/bms6skqfiesKeyf6QVZhwCP cKOPl3TcoRKPC+UfdBUnkH58A0dMTsKIP8INg1Wi7AVIcA/EYDC7US8oW9NYtkcG0u50 WwoclGdBIumQnDDTAkt4+9Z9hR5Vn4u4bYHSeUA0M/91LTNS/8U8wm6/pZtDDaY5Nj5Q 02iLiml4lJHZrWpfqOSNYQmtnYrwo8r+5D7+LO26p7u5d7V4aa/yvMYAq9K1mQXZtgCo /BaBzBpr186sH8RUZkwxgn13+w3bQryFj55ZNVYd6O6NrF2GLYUrCsLJIQaBPNHhAKcp bezQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692308944; x=1692913744; 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=WolH02WDN+H0riFen3m7L9TM2zmKoh5fIkK+ci9Gahk=; b=KyHipb9WUQ6e3aHS2BGpVVvON03ic5LGwii6WKNTmQ7/kUKpQr5Gc8HZd6gMFPaJlP ysrczHYhRWBMaFVIgTGcUyM8+VMOAuMzaEIywXglRTZ/o6SToF+frHGebfz92iN2oXQz B4zYP+6Uxy1uzKgxjGzrNL87WNA3AEmJGleXHAzZPcde9srm4d5/UKGsZoDsXPqkbPYP IyyWp7+NeOxSNgM5rK2yLxpbaPtLxeFsOKmV0A4TYYxaqj6RXj2kX5/i7/rEmAeO160e /VqSapNXIDkizG3gZl+OkxKyTddCjIT2qVIQKSOLwY5st+kpOqY/la+/zA98jzF7E6bf 2cdA== X-Gm-Message-State: AOJu0Yxrj7vz5HQriEJjYBXB1ZmMmQMFxO2W0Bz4aUJZINTp8FKhvUHK C/EFB1qesM7ALh8qQBDOrLE5MCJaW/I= X-Received: by 2002:a05:6512:1189:b0:4ff:881d:620 with SMTP id g9-20020a056512118900b004ff881d0620mr528363lfr.34.1692308944242; Thu, 17 Aug 2023 14:49:04 -0700 (PDT) Received: from hifumi.mshome.net (91-153-198-187.elisa-laajakaista.fi. [91.153.198.187]) by smtp.gmail.com with ESMTPSA id w2-20020ac25982000000b004fe20d1b288sm62813lfn.159.2023.08.17.14.49.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Aug 2023 14:49:03 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Fri, 18 Aug 2023 00:48:50 +0300 Message-ID: <20230817214858.184010-13-jeebjp@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230817214858.184010-1-jeebjp@gmail.com> References: <20230817214858.184010-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 12/12] 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: mOKEDn0t+sBH 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 ++++++++++++++++++++++++++++++++++++ tests/fate/enc_external.mak | 5 +++ tests/ref/fate/libx265-hdr10 | 16 +++++++ 3 files changed, 103 insertions(+) create mode 100644 tests/ref/fate/libx265-hdr10 diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c index 873b3021ee..2204b5146a 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->side_data_set; + const AVFrameSideData *cll_sd = + av_side_data_set_get_item(set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); + const AVFrameSideData *mdcv_sd = + av_side_data_set_get_item(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; @@ -339,6 +414,13 @@ FF_ENABLE_DEPRECATION_WARNINGS 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]; diff --git a/tests/fate/enc_external.mak b/tests/fate/enc_external.mak index 90d8894d04..8d6df2febd 100644 --- a/tests/fate/enc_external.mak +++ b/tests/fate/enc_external.mak @@ -12,5 +12,10 @@ FATE_ENC_EXTERNAL-$(call ENCDEC, LIBX264 HEVC, MOV, HEVC_DEMUXER H264_DECODER) + fate-libx264-hdr10: CMD = enc_external $(TARGET_SAMPLES)/hevc/hdr10_plus_h265_sample.hevc \ mp4 "-c:v libx264" "-show_frames -show_entries frame=side_data_list -of flat" +# test for x265 MDCV and CLL passthrough during encoding +FATE_ENC_EXTERNAL-$(call ENCDEC, LIBX265 HEVC, MOV, HEVC_DEMUXER) += fate-libx265-hdr10 +fate-libx265-hdr10: CMD = enc_external $(TARGET_SAMPLES)/hevc/hdr10_plus_h265_sample.hevc \ + mp4 "-c:v libx265" "-show_frames -show_entries frame=side_data_list -of flat" + FATE_SAMPLES_FFMPEG_FFPROBE += $(FATE_ENC_EXTERNAL-yes) fate-enc-external: $(FATE_ENC_EXTERNAL-yes) diff --git a/tests/ref/fate/libx265-hdr10 b/tests/ref/fate/libx265-hdr10 new file mode 100644 index 0000000000..571c837cac --- /dev/null +++ b/tests/ref/fate/libx265-hdr10 @@ -0,0 +1,16 @@ +frames.frame.0.side_data_list.side_data.0.side_data_type="H.26[45] User Data Unregistered SEI message" +frames.frame.0.side_data_list.side_data.1.side_data_type="H.26[45] User Data Unregistered SEI message" +frames.frame.0.side_data_list.side_data.2.side_data_type="Mastering display metadata" +frames.frame.0.side_data_list.side_data.2.red_x="13250/50000" +frames.frame.0.side_data_list.side_data.2.red_y="34500/50000" +frames.frame.0.side_data_list.side_data.2.green_x="7500/50000" +frames.frame.0.side_data_list.side_data.2.green_y="3000/50000" +frames.frame.0.side_data_list.side_data.2.blue_x="34000/50000" +frames.frame.0.side_data_list.side_data.2.blue_y="16000/50000" +frames.frame.0.side_data_list.side_data.2.white_point_x="15635/50000" +frames.frame.0.side_data_list.side_data.2.white_point_y="16450/50000" +frames.frame.0.side_data_list.side_data.2.min_luminance="50/10000" +frames.frame.0.side_data_list.side_data.2.max_luminance="10000000/10000" +frames.frame.0.side_data_list.side_data.3.side_data_type="Content light level metadata" +frames.frame.0.side_data_list.side_data.3.max_content=1000 +frames.frame.0.side_data_list.side_data.3.max_average=200