From patchwork Tue Apr 9 12:57:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47976 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9c8d:b0:1a7:a0dc:8de5 with SMTP id mj13csp332870pzb; Tue, 9 Apr 2024 06:00:27 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVXBpZ9DtSH5LnyEcLE3sUkgmd/qMcJvqDf4kgoaNV8GeA3gZ0+xrtkUvGIsDA9NLBF/CE5y99I33dPfuh2rTxIxp+ZqgteYHUvCQ== X-Google-Smtp-Source: AGHT+IFZkof2b7Ups5RBhwV0Iegq8GmXOkphiddQUV3deH2pbKJqHZEebKN/TTnD49kglEOw/COs X-Received: by 2002:a17:907:da2:b0:a51:ee80:bae9 with SMTP id go34-20020a1709070da200b00a51ee80bae9mr2578154ejc.17.1712667626889; Tue, 09 Apr 2024 06:00:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712667626; cv=none; d=google.com; s=arc-20160816; b=00OBX7jPKcHysdfKEhNHIpN1eqMUSFUoVgjYm7BhFPoQrIyo/4bTdDQvCtBfdpnuQH vNIwfLoztTOym/Oi9FCGuDBtK/8J9a8fC7W7nS2xTSwmVXfOMTw9/SyAvrZvwwQTbGfM mGFMhqYKQ5Y6sBjYTkqaXNLZD9pDG+vDoaT0+0CJM6YStAjvXTfmo9pCSxFZP0Pm4tU3 SGd87OhH/jI9YDdygfTDFhdyGp8s4XW9Vr3K0+sS7rQiXqse5yJhtCmYI1HErpXVnpXA 6biDzwRnCL655W7yJ4zygBb+i9Fv8SZeAj0tjZOigaDhK5aMj7g9Ww+TxTKhGKaOcp0H eFPg== 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=zzTt4238m8iKexxudNiZuf4dhOJNwFnctHZmF+HcgV0=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=hg7922pkJ1bJo6ogoQP5ggjJPnE8T8kT7fNGLaoksywHe1bvflCYyAC5r5ZuYgO6oV bRWmoQYzCshqD0ywpQdphoIg7VgURzYDymNotcFuu6fxSDHXsMclXuV62JWgV+VAFn+k GDaPbt5RBnwDAsjXhQMkMq88NlNwESo4UckUvxZgBQU9kEHsc4XePuWme2Vl0zZ5xBRA gw/o1uQioEhMePMOwQlyMECzgOwpzSmo95KAyZjVcLR8RGUV4PbLJ3yisatl+qZUAGnw YfGV/MYDfeTvDm1DCDnrUNF46d3JI+pfUwZsUs7s3GrSNbdb994jrS8xYoYsOo1qCJgI u5ag==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=Pc+qG5Sb; 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 dt10-20020a170906b78a00b00a51d6337b52si2015142ejb.910.2024.04.09.06.00.26; Tue, 09 Apr 2024 06:00:26 -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=Pc+qG5Sb; 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 D924D68D1C9; Tue, 9 Apr 2024 15:59:28 +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 7C01F68D0A4 for ; Tue, 9 Apr 2024 15:59:22 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712667558; bh=IXMJJ50z0ADaWoB37Y/pzIk8sAAMbLPTdTfRisSC72w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Pc+qG5SbhxavdLCcuhPym3H16OsxCGwQcMqnE5VtMevS3yhy7EvOyIQ2lIGTIxMIO 7ChMGM1UTtCKWTxzBbpVzhXZK81srwO5u5+Zev+FBUZIeMJMbzjylFqzixo9ZczvE4 W4a0546E7l14B5iByJz92U3cECXMTLd7M3fslmIs= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id BA36E4367B; Tue, 9 Apr 2024 14:59:18 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 9 Apr 2024 14:57:31 +0200 Message-ID: <20240409125914.61149-12-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240409125914.61149-1-ffmpeg@haasn.xyz> References: <20240409125914.61149-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 11/11] avcodec/libsvtav1: implement dolby vision coding 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: IRAekEi7k4fE From: Niklas Haas --- libavcodec/libsvtav1.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c index 105c3369c0f..cd62103dba4 100644 --- a/libavcodec/libsvtav1.c +++ b/libavcodec/libsvtav1.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "libavutil/common.h" #include "libavutil/frame.h" @@ -35,6 +36,7 @@ #include "libavutil/avassert.h" #include "codec_internal.h" +#include "dovi_rpu.h" #include "encode.h" #include "packet_internal.h" #include "avcodec.h" @@ -62,6 +64,8 @@ typedef struct SvtContext { EOS_STATUS eos_flag; + DOVIContext dovi; + // User options. AVDictionary *svtav1_opts; int enc_mode; @@ -418,6 +422,7 @@ static int read_in_data(EbSvtAv1EncConfiguration *param, const AVFrame *frame, in_data->cr_stride = AV_CEIL_RSHIFT(frame->linesize[2], bytes_shift); header_ptr->n_filled_len = frame_size; + svt_metadata_array_free(&header_ptr->metadata); return 0; } @@ -451,6 +456,11 @@ static av_cold int eb_enc_init(AVCodecContext *avctx) return svt_print_error(avctx, svt_ret, "Error initializing encoder"); } + svt_enc->dovi.logctx = avctx; + ret = ff_dovi_configure(&svt_enc->dovi, avctx); + if (ret < 0) + return ret; + if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) { EbBufferHeaderType *headerPtr = NULL; @@ -486,6 +496,7 @@ static int eb_send_frame(AVCodecContext *avctx, const AVFrame *frame) { SvtContext *svt_enc = avctx->priv_data; EbBufferHeaderType *headerPtr = svt_enc->in_buf; + AVFrameSideData *sd; int ret; if (!frame) { @@ -524,6 +535,24 @@ static int eb_send_frame(AVCodecContext *avctx, const AVFrame *frame) if (avctx->gop_size == 1) headerPtr->pic_type = EB_AV1_KEY_PICTURE; + sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DOVI_METADATA); + if (svt_enc->dovi.cfg.dv_profile && sd) { + const AVDOVIMetadata *metadata = (const AVDOVIMetadata *)sd->data; + uint8_t *t35; + int size; + if ((ret = ff_dovi_rpu_generate(&svt_enc->dovi, metadata, &t35, &size)) < 0) + return ret; + ret = svt_add_metadata(headerPtr, EB_AV1_METADATA_TYPE_ITUT_T35, t35, size); + av_free(t35); + if (ret < 0) + return AVERROR(ENOMEM); + } else if (svt_enc->dovi.cfg.dv_profile) { + av_log(avctx, AV_LOG_ERROR, "Dolby Vision enabled, but received frame " + "without AV_FRAME_DATA_DOVI_METADATA\n"); + return AVERROR_INVALIDDATA; + } + + svt_av1_enc_send_picture(svt_enc->svt_handle, headerPtr); return 0; @@ -644,11 +673,13 @@ static av_cold int eb_enc_close(AVCodecContext *avctx) } if (svt_enc->in_buf) { av_free(svt_enc->in_buf->p_buffer); + svt_metadata_array_free(&svt_enc->in_buf->metadata); av_freep(&svt_enc->in_buf); } av_buffer_pool_uninit(&svt_enc->pool); av_frame_free(&svt_enc->frame); + ff_dovi_ctx_unref(&svt_enc->dovi); return 0; } @@ -695,6 +726,9 @@ static const AVOption options[] = { AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 63, VE }, { "svtav1-params", "Set the SVT-AV1 configuration using a :-separated list of key=value parameters", OFFSET(svtav1_opts), AV_OPT_TYPE_DICT, { 0 }, 0, 0, VE }, + { "dolbyvision", "Enable Dolby Vision RPU coding", OFFSET(dovi.enable), AV_OPT_TYPE_BOOL, {.i64 = FF_DOVI_AUTOMATIC }, -1, 1, VE, .unit = "dovi" }, + { "auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DOVI_AUTOMATIC}, .flags = VE, .unit = "dovi" }, + {NULL}, };