From patchwork Tue Apr 9 12:57:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47972 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9c8d:b0:1a7:a0dc:8de5 with SMTP id mj13csp332377pzb; Tue, 9 Apr 2024 05:59:46 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUIsICKOVlBd6b8ZJbCVfUg7YvT7OtJ/ks0Xi/VaxhXwrQZkGofwbrM5DchizeowyPiLjb4u2IXwcXqs7nGXOiZViQrN0RWJIElQg== X-Google-Smtp-Source: AGHT+IEIMZ0Lboa9FWSuOts0nYXvZZ4ZW/taV6Z/RW+ReXYuj3tX59mGIQw4K1uLkJnAA1YZSQtE X-Received: by 2002:a17:907:72c2:b0:a4e:4ed4:5efb with SMTP id du2-20020a17090772c200b00a4e4ed45efbmr9294576ejc.3.1712667585972; Tue, 09 Apr 2024 05:59:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712667585; cv=none; d=google.com; s=arc-20160816; b=WqZQZvnSwxv4ceHMJCxHcceO6dxBjaJc2+gs+0MeuvwlnaFapzDKgzaRrWFwQJgZB8 hZNor96bOginOAJ+0JoVmYuiQN3Sf4gHIWk0F2y1rJfot/EHBfDHypBm1LCgEA/ZiI7R 0YMhGoeFNamXRNK0VcpcP1fUCKK9eroubG2VmICq97f8NuZK8s7zgy9sfblbWgD2lrBg 6BuHzIa5vwYOy9iVaIbEPxS8w4zpUR2UIPpsTEF+D4Q9zYsvMQ2PBrmQvbKdQFlBovoi RVQrrgnw1gd/1TrRHkdp6942GjFmqBtnZ5CptG4WOmQ6msxgu6bAfRaEgft93iq9hTQu YLbw== 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=Nr60sPLLocu31//z42vwgAM67pj4HnQsh2tlSwHFx/g=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=ysjXrcHeceeAapy5VE9DrZT2TSwe5WDKehKjahZ64Ogkm4CuQdnMrZrQ0qGuGUiPTf iwdMvhtPMBGSH4ZDynUPMQvTxZj5T8nvlS2bCjMcWWxREZDhL917VrkhAsEcM+c6nSWp ymRUNDZ7/xN6TXBFr6o3RSoQiP4eg0Kf6kBylbkvK1wXD9PTpFj4G7WtCauUgwwHOhdW bFX9td/iYRiyO3Tk6MS3bKtIru5LuDwMoFzwd+bw1c6WzIsv4QEg+Yv6aFA/5cW3QSzR 8PIydpNY+3gNBgMHak7c5BmMNR+rso8mcne6TQRBxHEpHx1p3LqZ9fszHv1kVLAoJBAt ggOQ==; 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="F/BBfvzm"; 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 y21-20020a17090668d500b00a51d67119c5si1900481ejr.587.2024.04.09.05.59.45; Tue, 09 Apr 2024 05:59:45 -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="F/BBfvzm"; 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 C830168D158; Tue, 9 Apr 2024 15:59:24 +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 CB9F268D07E for ; Tue, 9 Apr 2024 15:59:16 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712667556; bh=ijv0Xrlxsq9W+vPwTlMVfK1siwcChBltlO7GF/HS00Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F/BBfvzmPqNbml8b3+53qske5dwvwYW2VhcNwT+ZuDkioBA0cWePP9WQ3xTV/CHZJ uY/BfT/1UEr+1o9mYSTbfKMUfjyDJ1iCt1u98pa6wz48S9N+MOKp+iwjDusW/mCQ0H qEE8OiT/YpdB234Gg7xaW8xCCXYn+idcQ5GQf/ic= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 9369540292; Tue, 9 Apr 2024 14:59:16 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 9 Apr 2024 14:57:21 +0200 Message-ID: <20240409125914.61149-2-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 01/11] avcodec/dovi_rpu: store entire config record 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: JlJ+BTUiSEyL From: Niklas Haas And make it public. For encoding, users may also be interested in the configured level and compatibility ID. So generalize the dv_profile field and just expose the whole configuration record. This makes the already rather reductive ff_dovi_update_cfg() function almost wholly redundant, since users can just directly assign DOVIContext.cfg. --- libavcodec/av1dec.c | 6 +++--- libavcodec/dovi_rpu.c | 16 ++++------------ libavcodec/dovi_rpu.h | 21 ++++++++++++--------- libavcodec/hevcdec.c | 13 ++++++------- libavcodec/libdav1d.c | 6 +++--- 5 files changed, 28 insertions(+), 34 deletions(-) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 824725c031f..4c1405df779 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -888,10 +888,10 @@ static av_cold int av1_decode_init(AVCodecContext *avctx) } s->dovi.logctx = avctx; - s->dovi.dv_profile = 10; // default for AV1 + s->dovi.cfg.dv_profile = 10; // default for AV1 sd = ff_get_coded_side_data(avctx, AV_PKT_DATA_DOVI_CONF); - if (sd && sd->size > 0) - ff_dovi_update_cfg(&s->dovi, (AVDOVIDecoderConfigurationRecord *) sd->data); + if (sd && sd->size >= sizeof(s->dovi.cfg)) + s->dovi.cfg = *(AVDOVIDecoderConfigurationRecord *) sd->data; return ret; } diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index 9f7a6b00664..d95c7e03af9 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -64,7 +64,7 @@ void ff_dovi_ctx_flush(DOVIContext *s) *s = (DOVIContext) { .logctx = s->logctx, - .dv_profile = s->dv_profile, + .cfg = s->cfg, /* preserve temporary buffer */ .rpu_buf = s->rpu_buf, .rpu_buf_sz = s->rpu_buf_sz, @@ -74,22 +74,14 @@ void ff_dovi_ctx_flush(DOVIContext *s) void ff_dovi_ctx_replace(DOVIContext *s, const DOVIContext *s0) { s->logctx = s0->logctx; + s->cfg = s0->cfg; s->mapping = s0->mapping; s->color = s0->color; - s->dv_profile = s0->dv_profile; for (int i = 0; i <= DOVI_MAX_DM_ID; i++) ff_refstruct_replace(&s->vdr[i], s0->vdr[i]); ff_refstruct_replace(&s->ext_blocks, s0->ext_blocks); } -void ff_dovi_update_cfg(DOVIContext *s, const AVDOVIDecoderConfigurationRecord *cfg) -{ - if (!cfg) - return; - - s->dv_profile = cfg->dv_profile; -} - int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame) { AVFrameSideData *sd; @@ -392,7 +384,7 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, goto fail; /* Container */ - if (s->dv_profile == 10 /* dav1.10 */) { + if (s->cfg.dv_profile == 10 /* dav1.10 */) { /* DV inside AV1 re-uses an EMDF container skeleton, but with fixed * values - so we can effectively treat this as a magic byte sequence. * @@ -517,7 +509,7 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, use_prev_vdr_rpu = get_bits1(gb); use_nlq = (hdr->rpu_format & 0x700) == 0 && !hdr->disable_residual_flag; - profile = s->dv_profile ? s->dv_profile : guess_profile(hdr); + profile = s->cfg.dv_profile ? s->cfg.dv_profile : guess_profile(hdr); if (profile == 5 && use_nlq) { av_log(s->logctx, AV_LOG_ERROR, "Profile 5 RPUs should not use NLQ\n"); goto fail; diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 9f26f332ceb..9a68e45bf1b 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -31,6 +31,16 @@ typedef struct DOVIContext { void *logctx; + /** + * Currently active dolby vision configuration, or {0} for none. + * Set by the user when decoding. + * + * Note: sizeof(cfg) is not part of the libavutil ABI, so users should + * never pass &cfg to any other library calls. This is included merely as + * a way to look up the values of fields known at compile time. + */ + AVDOVIDecoderConfigurationRecord cfg; + /** * Currently active RPU data header, updates on every dovi_rpu_parse(). */ @@ -56,7 +66,6 @@ typedef struct DOVIContext { struct DOVIVdr *vdr[DOVI_MAX_DM_ID+1]; ///< RefStruct references uint8_t *rpu_buf; ///< temporary buffer unsigned rpu_buf_sz; - uint8_t dv_profile; } DOVIContext; @@ -68,17 +77,11 @@ void ff_dovi_ctx_replace(DOVIContext *s, const DOVIContext *s0); void ff_dovi_ctx_unref(DOVIContext *s); /** - * Partially reset the internal state. Resets per-frame state while preserving - * fields parsed from the configuration record. + * Partially reset the internal state. Resets per-frame state, but preserves + * the stream-wide configuration record. */ void ff_dovi_ctx_flush(DOVIContext *s); -/** - * Read the contents of an AVDOVIDecoderConfigurationRecord (usually provided - * by stream side data) and update internal state accordingly. - */ -void ff_dovi_update_cfg(DOVIContext *s, const AVDOVIDecoderConfigurationRecord *cfg); - /** * Parse the contents of a Dovi RPU NAL and update the parsed values in the * DOVIContext struct. diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 727b02f0f40..4bc9e2afc1d 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -3364,14 +3364,13 @@ static int hevc_decode_frame(AVCodecContext *avctx, AVFrame *rframe, } sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF, &sd_size); - if (sd && sd_size > 0) { - int old = s->dovi_ctx.dv_profile; - - ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd); + if (sd && sd_size >= sizeof(s->dovi_ctx.cfg)) { + int old = s->dovi_ctx.cfg.dv_profile; + s->dovi_ctx.cfg = *(AVDOVIDecoderConfigurationRecord *) sd; if (old) av_log(avctx, AV_LOG_DEBUG, "New DOVI configuration record from input packet (profile %d -> %u).\n", - old, s->dovi_ctx.dv_profile); + old, s->dovi_ctx.cfg.dv_profile); } s->ref = s->collocated_ref = NULL; @@ -3661,8 +3660,8 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx) } sd = ff_get_coded_side_data(avctx, AV_PKT_DATA_DOVI_CONF); - if (sd && sd->size > 0) - ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd->data); + if (sd && sd->size >= sizeof(s->dovi_ctx.cfg)) + s->dovi_ctx.cfg = *(AVDOVIDecoderConfigurationRecord *) sd->data; } return 0; diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 93c77ed9c6c..09fe767fb86 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -290,10 +290,10 @@ static av_cold int libdav1d_init(AVCodecContext *c) #endif dav1d->dovi.logctx = c; - dav1d->dovi.dv_profile = 10; // default for AV1 + dav1d->dovi.cfg.dv_profile = 10; // default for AV1 sd = ff_get_coded_side_data(c, AV_PKT_DATA_DOVI_CONF); - if (sd && sd->size > 0) - ff_dovi_update_cfg(&dav1d->dovi, (AVDOVIDecoderConfigurationRecord *) sd->data); + if (sd && sd->size >= sizeof(dav1d->dovi.cfg)) + dav1d->dovi.cfg = *(AVDOVIDecoderConfigurationRecord *) sd->data; return 0; }