From patchwork Wed Apr 3 15:43: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: 47752 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp485123pzb; Wed, 3 Apr 2024 08:43:45 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCV5ceht81wqVKb1B4etXTfxsmwDw/wWJUEibTr3pHncg3VxVx7MngMJz4Ix+RxPFRzx26hZgrxlO9LhzbOUJFwel16I3YEtwSs7cw== X-Google-Smtp-Source: AGHT+IHtwayxhuLiP4p13jOrwTzJY3WDe4Pksimw7dW+LCdz7nx3KynvsB+GLNOdONwqG1kBCJht X-Received: by 2002:ac2:5208:0:b0:516:a1f8:8283 with SMTP id a8-20020ac25208000000b00516a1f88283mr6219200lfl.2.1712159025131; Wed, 03 Apr 2024 08:43:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712159025; cv=none; d=google.com; s=arc-20160816; b=Kw1m0bVMyZDMDrGPo1fMHmeJotHdncW/2G0JM5QD6b/71GndJnuD/2N9UreJVpL6Ll DweHE1iYnpy9X3u0Jdp3VaLEdYmLR+Lf2ZnQ86ybWZiwAWR6ChCt4drB0Xr5/Euz73y+ Hi2v6C8TixjAipkgbT7aVcDUeALOkTapmX93AuDt4HwonVlQdQ5EQwW/HQLLYBTCkoKG L4UUPb2ACTlpAeY4ZM7a+l/hk66+6IqxBRKZKYPNfHPuLsYNW1vkfloT/lZwCVblGyZ8 F+V2Qd5GIwXuW0wE2v8sg4fBIM91NJ7YzY5nj4Yc6tvrcsS8u5YVlRoSEOQ2/NTPB3Gw YjTA== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=uCRt+NWneDE6PNGYVIYRo70Cb5zSVVRw45gdMKhiM9c=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=mm400wTa85654QYUmqA7vztlfnaf3tVjT6idCadPSmQLy6ykp/ONpgXHEeWZVIv88a 0lIXSU2/D7U+6QQrZKu2KjBEZoQn7+9KEazjBE2PKMFqSfbHXjQYThXRF0JYwnwHoDzk +OX5EfGJlkNorQeYflpS1WR91UVg4+X6bK8gmNtWTS0pke/UdPzyqE9AhdFzot9p3u04 wnqoZXMhKhpLKvP6TOwBBapTdmTi2IiDHyVvt3V+3rtLcBuWj3zkTB/FBWk4Bhd969rg BFLZuaQklzv88ofxRBnDD5trUUy4vNeUbqvmfmzC5HAQ/Yyl8b5a56JuInV5g84ILXau LnlQ==; 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="uY/3Bg7s"; 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 fj19-20020a0564022b9300b0056dc938aad5si4243023edb.117.2024.04.03.08.43.43; Wed, 03 Apr 2024 08:43: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="uY/3Bg7s"; 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 83DA968D15F; Wed, 3 Apr 2024 18:43:40 +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 AA3AE68CE36 for ; Wed, 3 Apr 2024 18:43:33 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712159013; bh=EtLIoShw5LrbqC2ir/+8zb4HM0lyOrhoxavuBMN1nkw=; h=From:To:Cc:Subject:Date:From; b=uY/3Bg7s+cCK7gG8rPxVgmlK/g4AXrXICC3kPX9NjjZMhosS0fFGwMDIJ0UOhUxq/ c/ENzCvdzuBTN0Wj5/Kpyk6TJ6Kfa4GeIMYDYMSgKao0cxcwCywTwOIv+gFKWapNGo GSObDKFHYMjcw+SzY5cjj3RpiZkpWYI57gxgds1w= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 742C04105D; Wed, 3 Apr 2024 17:43:33 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Apr 2024 17:43:21 +0200 Message-ID: <20240403154330.71585-1-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/10] avcodec: add dolbyvision option 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: J3AA7MjeFbmo From: Niklas Haas Tri-state yes/no/auto option. Allows users to set `dolbyvision` to `no` to suppress coding dolby vision even when supported by the target codec. --- doc/APIchanges | 3 +++ doc/codecs.texi | 12 ++++++++++++ libavcodec/avcodec.h | 11 +++++++++++ libavcodec/options_table.h | 2 ++ libavcodec/version.h | 2 +- 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index 7eda1321cb0..a4484ceb670 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2024-03-07 API changes, most recent first: +2024-03-23 - f17e18d2922 - lavc 61.6.100 - avcodec.h + Add AVCodecContext.dolbyvision option. + 2024-04-xx - xxxxxxxxxx - lavu 59.12.100 - dovi_meta.h Add AVDOVIMetadata.ext_block_{offset,size}, AVDOVIMetadata.num_ext_blocks, AVDOVIDmData and AVDOVIDmLevel{1..6,8..11,254..255}, av_dovi_get_ext() diff --git a/doc/codecs.texi b/doc/codecs.texi index 6bdeb664e72..7203adc0489 100644 --- a/doc/codecs.texi +++ b/doc/codecs.texi @@ -1018,6 +1018,18 @@ Note: The required alignment depends on if @code{AV_CODEC_FLAG_UNALIGNED} is set CPU. @code{AV_CODEC_FLAG_UNALIGNED} cannot be changed from the command line. Also hardware decoders will not apply left/top Cropping. +@item dolbyvision @var{integer} (@emph{encoding,video}) +Whether to encode Dolby Vision metadata when transcoding. +Possible values: +@table @samp +@item auto +Enable when coded frames contain Dolby Vision side data (default) +@item yes/on +Enable always, error out when frames do not contain metadata +@item no/off +Disable always, strip any tagged metadata +@end table + @end table diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 83dc487251c..f54f758608d 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2075,6 +2075,17 @@ typedef struct AVCodecContext { */ AVFrameSideData **decoded_side_data; int nb_decoded_side_data; + + /** + * Video encoding only. Whether to mark the coded stream as Dolby Vision. + * If set to FF_DOLBYVISION_AUTO, this will be enabled only if + * decoded_side_data contains a valid RPU. + * + * If enabled, sending frames without AV_FRAME_DATA_DOVI_METADATA is + * considered an error. + */ + int dolbyvision; +#define FF_DOLBYVISION_AUTO -1 } AVCodecContext; /** diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h index 7a2ef3474e7..d92269d2ff7 100644 --- a/libavcodec/options_table.h +++ b/libavcodec/options_table.h @@ -407,6 +407,8 @@ static const AVOption avcodec_options[] = { {"mastering_display_metadata", .default_val.i64 = AV_PKT_DATA_MASTERING_DISPLAY_METADATA, .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" }, {"content_light_level", .default_val.i64 = AV_PKT_DATA_CONTENT_LIGHT_LEVEL, .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" }, {"icc_profile", .default_val.i64 = AV_PKT_DATA_ICC_PROFILE, .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" }, +{"dolbyvision", "flag stream as Dolby Vision", OFFSET(dolbyvision), AV_OPT_TYPE_INT, {.i64 = FF_DOLBYVISION_AUTO }, -1, 1, V|E, .unit = "dolbyvision" }, +{"auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DOLBYVISION_AUTO }, .flags = V|E, .unit = "dolbyvision" }, {NULL}, }; diff --git a/libavcodec/version.h b/libavcodec/version.h index 7aa95fc3f1c..da54f878874 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #include "version_major.h" -#define LIBAVCODEC_VERSION_MINOR 5 +#define LIBAVCODEC_VERSION_MINOR 6 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ From patchwork Wed Apr 3 15:43:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47753 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp485189pzb; Wed, 3 Apr 2024 08:43:54 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWI5l4T9IMAPZzCAHkourhrFwwuYNsV5q8g7yH5FKa0XrwqCoGh8WPnwAB4weQm02/QdfOixeXC+vMgM21dux9H1YIEqGuFmmzbIQ== X-Google-Smtp-Source: AGHT+IEhtUsk1UfBTQqtF0zjCrRMF1tS7qeeUUtBoDDY4gq4Ovh21UfX/f01qu4rj2nkbunAWq2B X-Received: by 2002:a17:906:4685:b0:a51:80d9:56de with SMTP id a5-20020a170906468500b00a5180d956demr97876ejr.5.1712159033849; Wed, 03 Apr 2024 08:43:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712159033; cv=none; d=google.com; s=arc-20160816; b=NNA3oMNwNm/97HCf4V1WFvRnQ8CRsMv6gns1YN4WuRppAkL+rXaIT7pRVMXBVruBl7 lVbdHzahDt22OL4qeaeS6m5789HrIeuRCJaJMGr9iO0FTnmiP1xyh9VRnuiapLwGuOQ7 yjrbdkmYbytthw3oeqVNoddrOfX8F3S3HCVVw36QICRmULyJSh4j19kpI3zlu+4VYrxY CL6jaM5UcR+iZ+qKaIha6Fs+Dj+93aSujzelMdDgbr0EAnwMHMztcZftk0OLlole9AG/ 0z4EVEawyQFx+K+VkFHn27+1q7n65P8MnOoMGGZmnkU+fKS4pnWPEzMGJry6Lzz94UXi m+cg== 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=W+XNg0XMtRcfeo3ddIQWe94c8SFrFOY93o3X5el+KZA=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=KjjYp6RqjAMEnEXRW6/GnhgZm2yIcLoFOYa/zNo9WKW82USeYiYmL/HFTApP0Rd0Cg 1KiD1ATjZ9chIabI7QCNAct/jl84MLK+Pda4vUQ/8fkmm/UtW7taL+FzMhkO/BmaCqjF 8lqXxlRodXaZvQjW/pcY02bBp1BXnLX9A5O9HgangURf9hwjozNwaAbcOZTzc4LQB1+F s58cv3IFWeA/DgJ/Ug/Lr91vxbAjRDVHj/qlAzWcart5yrymvlcl+UICQuu+Lf6bzG7I cEt1i1Ll5hdZSo7j7fdBkkO9McWjXACN2hWAthGRviqoV0G6it0MTVl7bpLHnMlSi+mm f0mA==; 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=Tknzz8RT; 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 qu19-20020a170907111300b00a4df0d7789bsi6992169ejb.514.2024.04.03.08.43.53; Wed, 03 Apr 2024 08:43:53 -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=Tknzz8RT; 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 8793768D131; Wed, 3 Apr 2024 18:43:41 +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 4FB0668CE36 for ; Wed, 3 Apr 2024 18:43:34 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712159014; bh=nYFw/fg0gv1zW1Avp5DH84erwqua5au5RGGis94z1S4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Tknzz8RTTgmHbb8z9dMFx8xIrv9QoglFh9xz8rmsezjzyj8PAMDw5kaYm7YWehlsQ Yq0lF696VmOKGEqCWFKjjEcp5E9oS0h/F0AvWvx0rsyWGpZDe9SAMw9m4c8nDypgMV 4Em7nUkGbkNs18iXxHEhqxXO9MJDuACoujTymKZs= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id E01C741EC3; Wed, 3 Apr 2024 17:43:33 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Apr 2024 17:43:22 +0200 Message-ID: <20240403154330.71585-2-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240403154330.71585-1-ffmpeg@haasn.xyz> References: <20240403154330.71585-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/10] 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: ih5czSrNSJLl 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 f022a4ad05c..a2f44c65e34 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; } From patchwork Wed Apr 3 15:43:23 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47754 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp485274pzb; Wed, 3 Apr 2024 08:44:06 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCU5LqrSvFFXOPpoGOPPH/SUzMjSSi7tysH3YN7rRqQBOPwCHrx2QupWfNLs8mM6kupgs6UY4whZ5Mc4Ft+eXbvWckbw5Yuy9qBwMA== X-Google-Smtp-Source: AGHT+IFhLMdrwgMAsEuPLSUTHPwU8r1M7S/RCNMhWCCui9khgMHvn2WHjUUoYkIM4t3D3Z8pQ5Tg X-Received: by 2002:a50:d541:0:b0:56e:f36:3773 with SMTP id f1-20020a50d541000000b0056e0f363773mr388712edj.16.1712159042380; Wed, 03 Apr 2024 08:44:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712159042; cv=none; d=google.com; s=arc-20160816; b=gMTVPpV6nHeAo7SbBe4C9sqMeEqJa296Y3xZMDQqqJed2WjrdUALrrybZr89mT/FOR yBnNL1IFxA8PYwr1oUyIXf01/DhANuUgRKLS2UUWWXfWV8Kh+VIgJVtv419kq0dLqcnc P89Q1N/N+MstTBJcXWKp/eKQwxrftdCasYHduu5v9IMZlQDQ4dpb/sC/DbhJvUwIWrvw /FU/3kgtb3glJ3y4TGAJEcyG8yWdPFn+GqKwQlE5Tr9v9+aM3WuorV8oWMJmTH4+uWsa I3qeZ31JzweR6Qd7csaBSmXz3rdcPL2qKJYNGkBFjiCwbk3wjZWrTe843nYNPiiU7cNl EAwA== 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=iAhI5avL1F9G8teZCv3TamvCUeLJpT9gm9m0E0r90Qs=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=suZer5QPspKyiO1q9yrBUh1H0yXVObve4nLwRWW2Sy9RZ8T8NeMbL1IRtlsHdwTtf1 NCGXm+47tKJO6PfCKv0dV/mClnV4byFon8NwSykhs39YCow/EWgIx60sEh54++hLCIoE psjOuiYrXodaM4vfccRLClXIh5uxt12j1Sc253MDvuEVDoKO/uwQh6qDJ/ELU8QcbsBC 5jJs73OmJHhngYvZ9wVPtd2jNSc2zOVS6aBZ8XIiPOoEp5XdfE5mYAaUA/1jT4W+r118 4CszEtOpW259CAAUKXAUh/wSt/BToATlaIcWMSq36G6nRuILghOYitFTSl4vB01pHy/o 3loA==; 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=sDHJSR0W; 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 a19-20020a50c313000000b0056dfac75a17si1236818edb.180.2024.04.03.08.44.01; Wed, 03 Apr 2024 08:44:02 -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=sDHJSR0W; 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 7EF7C68D1A1; Wed, 3 Apr 2024 18:43:42 +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 9ED9168CE36 for ; Wed, 3 Apr 2024 18:43:34 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712159014; bh=yKfuFVTB9ej0iDXyPsTjxqOUjHXCIpAUSk2ratlfxyI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sDHJSR0WyFzFrNMV44qjclqMPsZo7Y8t28u58KcnsWNPX8XUXyU7mJ6WYhj9Xi51l yj5lWjkXM8pM7qNpEhEseP8MoqqyQNuMhGHAbOHruHi1d3HNooG59XdSF4YyOdVUrW 5W9m62XJXDco1RTAEcWD3jJaE6pdystISmguPXuU= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 4D37442548; Wed, 3 Apr 2024 17:43:34 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Apr 2024 17:43:23 +0200 Message-ID: <20240403154330.71585-3-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240403154330.71585-1-ffmpeg@haasn.xyz> References: <20240403154330.71585-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/10] avcodec/dovi_rpu: properly replace context header 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: GoaOUThxLPxW From: Niklas Haas This was never set in ff_dovi_ctx_replace(), leading to possibly out-of-date when copying from a sub-thread to the main thread. --- libavcodec/dovi_rpu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index d95c7e03af9..bfb7b9fe661 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -75,6 +75,7 @@ void ff_dovi_ctx_replace(DOVIContext *s, const DOVIContext *s0) { s->logctx = s0->logctx; s->cfg = s0->cfg; + s->header = s0->header; s->mapping = s0->mapping; s->color = s0->color; for (int i = 0; i <= DOVI_MAX_DM_ID; i++) From patchwork Wed Apr 3 15:43:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47755 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp485316pzb; Wed, 3 Apr 2024 08:44:11 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCU0xPRXFyOTgZ3q1gSfiSnG1aboOX51jzhFdp2yQQVbtF657m3jiN1lbCMjfKXS+8yP2PZFRFvQIee7oerdG+zOUERO7fhztexpuA== X-Google-Smtp-Source: AGHT+IGAwUb3W6dg/85+CVVcfmQQJm1ot/mDRNKUdpjeBEW6fmhn3ETrTB3unm86QSP93o6oo0u1 X-Received: by 2002:ac2:465e:0:b0:515:d100:1650 with SMTP id s30-20020ac2465e000000b00515d1001650mr10468539lfo.57.1712159051083; Wed, 03 Apr 2024 08:44:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712159051; cv=none; d=google.com; s=arc-20160816; b=IAxev7EiA6C3YQ9qf3pexORylQltgDxts5NSw/g6yeFI5DPz2recctw/mgyTZzi4Sz nvaFlJ59Bp/y1CX2lB8y7pmc6SdCBhBD8A+CV0URke8W02y0oGKyhWBxH8i2wN9RbPa5 A8MY3MVSag7L2fUBJ0KI1i6Qo9ZwR3LPeMGUkGfkT7KD/6ebEcmtSiojHpXZuSxGypHM XN0yvhY3NRJ+eP54iqgRR+EJ5bOQ06gNHhG6GD/ZjxS7f62ZkJBsaH7D5k/zt8PVke2K c91WGSCJdQXUGlyFCpD+otTcE0XuwKqJIXTc/kdxfs++iE21U4ZKY0ir2AUwwOUfbwnd ITHw== 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=EwmR47Yzu2TWBAIufKGL6iVR4ED040XE9w6ABZsoUL8=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=FVfUtNoK5OiSLoy/TfVbKWRHvE3hQIjW/VnpXochPWM7U/bCKOninIGCevP2Al6OaY NRQbXwHok9DMotMroK4HMl8+heNbJATjJfupaLN1IZQ3/192CTYs1cDo2yQZCjoIvO9F UCUjpHD0N4MUiz7KuvMrFRLqWqzYRGic+AONMYpAS54BHP/UXD3AmaQiZjVRGQEAa9yo KIcrvOygEnkNS005OZ3bx8FmMMsIo20ftz+399MtGHRgsGO2uMan3/V9U7QuII/K90ja jrcBnaTOAoRnoks2/kBHmP17n/l5W6BNSVOnudstgA0P3HUdTd7OqJq259hRsCOl6jcF LJMA==; 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=Vqi20H6D; 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 z20-20020a17090655d400b00a44ea0ed34esi6757496ejp.911.2024.04.03.08.44.10; Wed, 03 Apr 2024 08:44:11 -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=Vqi20H6D; 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 85BE668D1B0; Wed, 3 Apr 2024 18:43:43 +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 F272E68CE36 for ; Wed, 3 Apr 2024 18:43:34 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712159014; bh=7d78h44qfomf2wASovFHqpGHzlu1LfrAEiKMdkrspj0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Vqi20H6DXmtGYsKFGUTk3AbtISIxOXmxEF4SleNj3bS2V8vFF2R0gNL4s2+cU628X +K6ErJiRYcpmx9/L5rRfzz762T/1NjmMEz9gL7Hote3MVuM7m3PfVB7ObXrWqKgmKN pcTKuFZBoiiRM9KTxE8HCVOrAKLFR2ou5hOCq9U8= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id A82EE42835; Wed, 3 Apr 2024 17:43:34 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Apr 2024 17:43:24 +0200 Message-ID: <20240403154330.71585-4-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240403154330.71585-1-ffmpeg@haasn.xyz> References: <20240403154330.71585-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/10] avcodec/dovi_rpu: clarify error on missing RPU VDR 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: OtYz0GxMrLb1 From: Niklas Haas The code was written under the misguided assumption that these fields would only be present when the value changes, however this does not match the actual patent specification, which says that streams are required to either always signal this metadata, or never signal it. That said, the specification does not really clarify what the defaults of these fields should be in the event that this metadata is missing, so without any sample file or other reference I don't wish to hazard a guess at how to interpret these fields. Fix the current behavior by making sure we always throw this error, even for files that have the vdr sequence info in one frame but are missing it in the next frame. --- libavcodec/dovi_rpu.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index bfb7b9fe661..267e52ceb66 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -499,11 +499,11 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, hdr->el_spatial_resampling_filter_flag = get_bits1(gb); hdr->disable_residual_flag = get_bits1(gb); } - } - - if (!hdr->bl_bit_depth) { - av_log(s->logctx, AV_LOG_ERROR, "Missing RPU VDR sequence info?\n"); - goto fail; + } else { + /* lack of documentation/samples */ + avpriv_request_sample(s->logctx, "Missing RPU VDR sequence info\n"); + ff_dovi_ctx_unref(s); + return AVERROR_PATCHWELCOME; } vdr_dm_metadata_present = get_bits1(gb); From patchwork Wed Apr 3 15:43:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47756 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp485378pzb; Wed, 3 Apr 2024 08:44:19 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCW0IyAIr63ryDqAtwpTk7zxDbimOd+OMppzTYpGIAZI+DFc82+HTbZpDjDPMXgm7x/K7mgA8OCaJ/ET5iRZFw208bDNsg0Oa0zm5A== X-Google-Smtp-Source: AGHT+IHpjmnv3Qev/1WlXEBtHTw4bFh20NkaWHagqpM4HBU27Z48nvPwLytMxxR4+jUzxqqtPNoS X-Received: by 2002:a05:6512:2247:b0:516:be61:7688 with SMTP id i7-20020a056512224700b00516be617688mr2089294lfu.22.1712159059461; Wed, 03 Apr 2024 08:44:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712159059; cv=none; d=google.com; s=arc-20160816; b=Taw22GH99Qx5Q7zqkdxgzym1ErKHL/j5BSicCAMrTequEQpAGCktajDZ1EYNYPNBH9 N7AeQZ21t3H1dgsc+yb88HYfzHQGJG14QGfPML5zTl0GR90JnGmNKvKA1CIxtbCxJP5O w4xiLw6AsFXOvOfRaPRlljK3Z4fVAScR+5/6hfsato9CW2RCJNF6uzBSMvAbopPKRnb7 gGT4tVxaEO2RklbeEvnD1++bMc9jYmGfxF0vm3q4nl3Pktz6p8KQODM4SafXuhbnh/DM 8a8q62eVh7YQargh8QJeo8ojTSoFkWDMsXqKRz5xVrxNgYS/2HsKk1lPqOmtSEdwR1dn x+BA== 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=0kqXGZikehXhcIo84km/gbpgOMmsOIIFzF6X8yD/j5w=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=vIk69qRgNXLeFCLmMXUJDXKgo2bNU1a5lmVluwoT7/291i21cP0lNcK+WrgyaO2+us qppqXK3tNqUJFm11Pj20wZmGQd1Q9bZOIEq5qbnHPl+wk6w8NfHNJjvMcrXcb18nrpNb NuspYiWNYb/6yUoJDhEJqtzcNkIyHt1GhQamgO/OBegBzevQ361ctyy8JSkdJEhcPtFn HzRYut054CqqJYj9AEcVQxMo1KdZQ/ziiFpQwm3DHblP/Tng8yriOgkygM9uB7+UiwEo HshsuAb1pmnIvtFRkfzbJ1Kis12gV3ErC9lQQy8JAuIyv3ZifDO6vKbGM8y9EYOktabc lVNw==; 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=aPN0+BhN; 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 hq21-20020a1709073f1500b00a50d6be3f19si522515ejc.612.2024.04.03.08.44.19; Wed, 03 Apr 2024 08:44:19 -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=aPN0+BhN; 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 8007468D1CA; Wed, 3 Apr 2024 18:43:44 +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 527EE68D15F for ; Wed, 3 Apr 2024 18:43:35 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712159015; bh=Sjb4FWSjYqvNI8yanOsl3A5OdmxY1nscObMNBeLKAXg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aPN0+BhN/whBK1MudE2HNnMcG+xEEd46bUVDXFY3AqrVh+HezUV1lT7XJQ29gT0Er CnAe7u3dr36FJT6DBi08Pj1WIG8kd7Eqpc6MWMGNQHtVBgc/VO7uKt2vcFEsuTKhwn skv3Oiocr/d0zEU4M50TcHtCt+GCXlPeinN4DaZ8= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 03A64429F3; Wed, 3 Apr 2024 17:43:34 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Apr 2024 17:43:25 +0200 Message-ID: <20240403154330.71585-5-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240403154330.71585-1-ffmpeg@haasn.xyz> References: <20240403154330.71585-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/10] avcodec/dovi_rpu: clarify semantics of guess_profile() 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: 5RhNZQ5Vx6hf From: Niklas Haas This is based on HEVC only, H.264/AV1 use their own (hopefully correctly signalled) profiles. --- libavcodec/dovi_rpu.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index 267e52ceb66..4da711d763e 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -121,7 +121,8 @@ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame) return 0; } -static int guess_profile(const AVDOVIRpuDataHeader *hdr) +/* Note: Only works for HEVC */ +static int guess_hevc_profile(const AVDOVIRpuDataHeader *hdr) { switch (hdr->vdr_rpu_profile) { case 0: @@ -510,7 +511,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->cfg.dv_profile ? s->cfg.dv_profile : guess_profile(hdr); + profile = s->cfg.dv_profile ? s->cfg.dv_profile : guess_hevc_profile(hdr); if (profile == 5 && use_nlq) { av_log(s->logctx, AV_LOG_ERROR, "Profile 5 RPUs should not use NLQ\n"); goto fail; From patchwork Wed Apr 3 15:43:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47757 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp485456pzb; Wed, 3 Apr 2024 08:44:27 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVTWu2hjw61TyxeqGsUck+IxeJmvU11VeMnArTYunfRh2OnIP1OMdySFDjyFrCEay3puouxvUmsvCFSNrWStBF1qS95x7yHWkg5wQ== X-Google-Smtp-Source: AGHT+IGpHgF3WbTtAX1/I8QzpDMfwYMtNmdkHLYtTnZZo7cjzOeapcJDW+qUW0VUc7HAkO2+XPaq X-Received: by 2002:ac2:5208:0:b0:516:a1f8:8283 with SMTP id a8-20020ac25208000000b00516a1f88283mr6220228lfl.2.1712159067701; Wed, 03 Apr 2024 08:44:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712159067; cv=none; d=google.com; s=arc-20160816; b=FnBD50mL0yr0T4Yu0ufHYuBCcBHmtCkTCBjaVI5+7pSkspeSqglBTNBAYGneoJled7 30QbcqKH0IWCTDGNU8HaMjm918tbI99aLYf6EcGUYUvn9MsU8nFEICe/tJp90G0TgwOF UknPVnDAF7glR7jrTx38gMQf+GIMHQVF5zv2JRVKq8H49ZpNeJa/zy+XnMn2BrAWfPL4 TT2MX32q9Arq+UtDAqwJJIkkenvEGL4bj0cZM5JRC0DzbaSLzBMMW+ouLaj9azhO+s5A gfJ0f3qJSdqYfxe6bJioiyL8CO5XSchZ8k093Vsv/mOHFzZglTjBhR+r8qbCUkw4+xqf AeNA== 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=brg+Xm1i7C1tVS06gT8iB8dt3gR38kThDy97C8Q2omo=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=A9jLoYA0px+6fJYnqFyVLcFpIWRaGIN+03a5x79A1QX8m28dJ20aKSuBOGElos9Ao1 H9ZVeA66idg3Ac4uzjQ86DKI4Nt96BT2X+bcnfGbSPQi70dXkndY17MqE4vqwX/5Du56 0qrKej/514OPQ1WfZxtVApOjGSwreGGm3CeWUxDjQsJDli4bHd8TczoIBUegR/RpEvCd RWBZZm6FPvGA0m9/ArP2XN4k0wmOxFiLYDq6ZbCcZ+R4L/AzikM5YLbRtvYjxLtmlygM HeLgXv2Df8ci/64aIVGEPOVOxvhx7U6ZlvktzfQSH4I8aV/f8sl0gafb4Pi014ioH0aV E1BA==; 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=D5eGGkkH; 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 u23-20020a170906655700b00a474be847e1si7009441ejn.758.2024.04.03.08.44.27; Wed, 03 Apr 2024 08:44:27 -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=D5eGGkkH; 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 B2B3868D19B; Wed, 3 Apr 2024 18:43:45 +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 F419A68D1BC for ; Wed, 3 Apr 2024 18:43:38 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712159015; bh=/kwt6TXyy6QYrteGYB1Fzvj5cPHYs9UbqKWjc81sDQo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=D5eGGkkHya8p5IKO+/6vkF4Skt4UobEC1VeJsREGOAZl+ikyKxfUZwH9xU6otiwm3 3HUjyO6JgrhUMkK/4FGrSK1ztQv8RJ358o/hVXbwb4dmtuc8cr3nnRCYUmB5FkSaz2 pS8joEhgsKRbMn6TWuu5/Oq7eJr+UfMDYjOvZkzI= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 6043542A98; Wed, 3 Apr 2024 17:43:35 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Apr 2024 17:43:26 +0200 Message-ID: <20240403154330.71585-6-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240403154330.71585-1-ffmpeg@haasn.xyz> References: <20240403154330.71585-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/10] avcodec/dovi_rpu: add ff_dovi_configure() 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: oWVqurKydnqv From: Niklas Haas We need to set up the configuration struct appropriately based on the codec type, colorspace metadata, and presence/absence of an EL (though, we currently don't support an EL). When present, we use the signalled RPU data header to help infer (and validate) the right values. --- libavcodec/dovi_rpu.c | 176 ++++++++++++++++++++++++++++++++++++++++++ libavcodec/dovi_rpu.h | 14 +++- 2 files changed, 189 insertions(+), 1 deletion(-) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index 4da711d763e..b4e8d0cdea4 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -144,6 +144,182 @@ static int guess_hevc_profile(const AVDOVIRpuDataHeader *hdr) return 0; /* unknown */ } +static struct { + uint64_t pps; // maximum pixels per second + int width; // maximum width + int main; // maximum bitrate in main tier + int high; // maximum bitrate in high tier +} dv_levels[] = { + [1] = {1280*720*24, 1280, 20, 50}, + [2] = {1280*720*30, 1280, 20, 50}, + [3] = {1920*1080*24, 1920, 20, 70}, + [4] = {1920*1080*30, 2560, 20, 70}, + [5] = {1920*1080*60, 3840, 20, 70}, + [6] = {3840*2160*24, 3840, 25, 130}, + [7] = {3840*2160*30, 3840, 25, 130}, + [8] = {3840*2160*48, 3840, 40, 130}, + [9] = {3840*2160*60, 3840, 40, 130}, + [10] = {3840*2160*120, 3840, 60, 240}, + [11] = {3840*2160*120, 7680, 60, 240}, + [12] = {7680*4320*60, 7680, 120, 450}, + [13] = {7680*4320*120u, 7680, 240, 800}, +}; + +int ff_dovi_configure(DOVIContext *s, AVCodecContext *avctx) +{ + AVDOVIDecoderConfigurationRecord *cfg; + const AVDOVIRpuDataHeader *hdr = NULL; + const AVFrameSideData *sd; + int dv_profile, dv_level, bl_compat_id; + size_t cfg_size; + uint64_t pps; + + if (!avctx->dolbyvision) + goto skip; + + sd = av_frame_side_data_get(avctx->decoded_side_data, + avctx->nb_decoded_side_data, AV_FRAME_DATA_DOVI_METADATA); + + if (sd) + hdr = av_dovi_get_header((const AVDOVIMetadata *) sd->data); + + if (avctx->dolbyvision == FF_DOLBYVISION_AUTO && !hdr) + goto skip; + + switch (avctx->codec_id) { + case AV_CODEC_ID_AV1: dv_profile = 10; break; + case AV_CODEC_ID_H264: dv_profile = 9; break; + case AV_CODEC_ID_HEVC: dv_profile = hdr ? guess_hevc_profile(hdr) : 8; break; + default: + /* No other encoder should be calling this! */ + av_assert0(0); + return AVERROR_BUG; + } + + if (avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL) { + if (dv_profile == 9) { + if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) + dv_profile = 0; + } else { + if (avctx->pix_fmt != AV_PIX_FMT_YUV420P10) + dv_profile = 0; + } + } + + switch (dv_profile) { + case 0: /* None */ + bl_compat_id = -1; + break; + case 4: /* HEVC with enhancement layer */ + case 7: + if (avctx->dolbyvision > 0) { + av_log(s->logctx, AV_LOG_ERROR, "Coding of Dolby Vision enhancement " + "layers is currently unsupported."); + return AVERROR_PATCHWELCOME; + } else { + goto skip; + } + case 5: /* HEVC with proprietary IPTPQc2 */ + bl_compat_id = 0; + break; + case 10: + /* FIXME: check for proper H.273 tags once those are added */ + if (hdr && hdr->bl_video_full_range_flag) { + /* AV1 with proprietary IPTPQc2 */ + bl_compat_id = 0; + break; + } + /* fall through */ + case 8: /* HEVC (or AV1) with BL compatibility */ + if (avctx->colorspace == AVCOL_SPC_BT2020_NCL && + avctx->color_primaries == AVCOL_PRI_BT2020 && + avctx->color_trc == AVCOL_TRC_SMPTE2084) { + bl_compat_id = 1; + } else if (avctx->colorspace == AVCOL_SPC_BT2020_NCL && + avctx->color_primaries == AVCOL_PRI_BT2020 && + avctx->color_trc == AVCOL_TRC_ARIB_STD_B67) { + bl_compat_id = 4; + } else if (avctx->colorspace == AVCOL_SPC_BT709 && + avctx->color_primaries == AVCOL_PRI_BT709 && + avctx->color_trc == AVCOL_TRC_BT709) { + bl_compat_id = 2; + } else { + /* Not a valid colorspace combination */ + bl_compat_id = -1; + } + } + + if (!dv_profile || bl_compat_id < 0) { + if (avctx->dolbyvision > 0) { + av_log(s->logctx, AV_LOG_ERROR, "Dolby Vision enabled, but could " + "not determine profile and compaatibility mode. Double-check " + "colorspace and format settings for compatibility?\n"); + return AVERROR(EINVAL); + } + goto skip; + } + + pps = avctx->width * avctx->height; + if (avctx->framerate.num) { + pps = pps * avctx->framerate.num / avctx->framerate.den; + } else { + pps *= 25; /* sanity fallback */ + } + + dv_level = 0; + for (int i = 1; i < FF_ARRAY_ELEMS(dv_levels); i++) { + if (pps > dv_levels[i].pps) + continue; + if (avctx->width > dv_levels[i].width) + continue; + /* In theory, we should also test the bitrate when known, and + * distinguish between main and high tier. In practice, just ignore + * the bitrate constraints and hope they work out. This would ideally + * be handled by either the encoder or muxer directly. */ + dv_level = i; + break; + } + + if (!dv_level) { + if (avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT) { + av_log(s->logctx, AV_LOG_ERROR, "Coded PPS (%"PRIu64") and width (%d) " + "exceed Dolby Vision limitations\n", pps, avctx->width); + return AVERROR(EINVAL); + } else { + av_log(s->logctx, AV_LOG_WARNING, "Coded PPS (%"PRIu64") and width (%d) " + "exceed Dolby Vision limitations. Ignoring, resulting file " + "may be non-conforming.\n", pps, avctx->width); + dv_level = FF_ARRAY_ELEMS(dv_levels) - 1; + } + } + + cfg = av_dovi_alloc(&cfg_size); + if (!cfg) + return AVERROR(ENOMEM); + + if (!av_packet_side_data_add(&avctx->coded_side_data, &avctx->nb_coded_side_data, + AV_PKT_DATA_DOVI_CONF, cfg, cfg_size, 0)) { + av_free(cfg); + return AVERROR(ENOMEM); + } + + cfg->dv_version_major = 1; + cfg->dv_version_minor = 0; + cfg->dv_profile = dv_profile; + cfg->dv_level = dv_level; + cfg->rpu_present_flag = 1; + cfg->el_present_flag = 0; + cfg->bl_present_flag = 1; + cfg->dv_bl_signal_compatibility_id = bl_compat_id; + + s->cfg = *cfg; + return 0; + +skip: + s->cfg = (AVDOVIDecoderConfigurationRecord) {0}; + return 0; +} + static inline uint64_t get_ue_coef(GetBitContext *gb, const AVDOVIRpuDataHeader *hdr) { uint64_t ipart; diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 9a68e45bf1b..33e19dd037c 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -26,6 +26,7 @@ #include "libavutil/dovi_meta.h" #include "libavutil/frame.h" +#include "avcodec.h" #define DOVI_MAX_DM_ID 15 typedef struct DOVIContext { @@ -33,7 +34,8 @@ typedef struct DOVIContext { /** * Currently active dolby vision configuration, or {0} for none. - * Set by the user when decoding. + * Set by the user when decoding. Generated by ff_dovi_configure() + * when encoding. * * 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 @@ -96,4 +98,14 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, */ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame); +/** + * Configure the encoder for Dolby Vision encoding. Generates a configuration + * record in s->cfg, and attaches it to avctx->coded_side_data. Sets the correct + * profile and compatibility ID based on the tagged AVCodecContext colorspace + * metadata, and the correct level based on the resolution and tagged framerate. + * + * Returns 0 or a negative error code. + */ +int ff_dovi_configure(DOVIContext *s, AVCodecContext *avctx); + #endif /* AVCODEC_DOVI_RPU_H */ From patchwork Wed Apr 3 15:43:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47758 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp485494pzb; Wed, 3 Apr 2024 08:44:36 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVrHSp1ZBkwCk6UdcRQKDkyl35/tr2rbt79Ob7dFOM4zyV9QUDnQGuKhI2vjcv3KeWTkWkfy7cLqtqbXsmhfoX+7G7V0ieyjt7Fvg== X-Google-Smtp-Source: AGHT+IHUsMp0nNqzVP3m89gMBVw6dEtr1pnJ58PT3fqwIL7hr9i81OpVf/jXRGIWzzBikgNg25sH X-Received: by 2002:a17:907:38d:b0:a4e:8044:2319 with SMTP id ss13-20020a170907038d00b00a4e80442319mr3811254ejb.41.1712159076403; Wed, 03 Apr 2024 08:44:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712159076; cv=none; d=google.com; s=arc-20160816; b=ndFUi/jNRWrmXEXTIPjLhWbyocb5V5XZPjXAgb92SweJTBpboTbn6QxI4HlHj2Gd7M 4LU//EwsBGWM81kf3pacwi0S8MqqFdX6LE5GWQVBHQdq3EZji2TqMtreZb3veVX8tu+C QiJtmXNw7GUH2dLocoPxOdlJXdLbZnbtEd01awLYfw+NT/3d9hSIuA7P4MXGA16rUuvY JNvXUfLg+KyJtb48sjciZbvqkgSxqJEH5FZO6YGstqwiFvSlgGv196Ja4sEk/E/dcar/ ZAb7JSr6xgEtK7AU2ohrkwvlPdTp2WlheO+iPxN3XxQakEs3mTyO3Ky84TzDB0wz6nWm 0LZg== 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=iFficFh0hIfK6E/4RzsOlQSnxp2Dax7gCGNyBR1w1DI=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=lpTwVjarPB9k50XLY6BPD/MljcWLtZA/fxeAe+XTt2u7OINaA1i6+TxHJeKilI0M40 VxazgFlYodZyOdEM0srAX6zN2YNi+QmwqC1hdsMSsL4EU6frTQrwfZ+e4unZNVEuJFpl addhRCfxng8HzpLkiF9gx1rPlB4SDyp5QSb+JEs7GaQusqyqLgcgLo9cg+U2qmlpwFv1 jYYyrxtFYusrzU/vR90wbhsAutQx3PapIaPpKWV9iubGr40zBTbx5GHr3d0NI73poSxT jY5kDHqCc8JiIPUDZg8Ab4P7lSQmaWoTYtMZu2tVIQ6a3pkhWAgFJEKcEKkRBow5tD/O 9buQ==; 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=QP+OGmZ8; 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 q6-20020a17090622c600b00a4a393b47fbsi6690684eja.1042.2024.04.03.08.44.35; Wed, 03 Apr 2024 08:44:36 -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=QP+OGmZ8; 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 BEA3B68D1E6; Wed, 3 Apr 2024 18:43:46 +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 EC7BD68D1B6 for ; Wed, 3 Apr 2024 18:43:38 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712159015; bh=h+CBUkb/OieS1MXFApLLUPZuKFEq9hnix0CWRYdF1A4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QP+OGmZ8Sp5UE9v47IQH8ktBkBEI/gTvyyi1iUEZKn7oXaENZxFKiGTyV+wBzB+PR SEGXLUzvLT3OzjpJ7MWIkPAvr9HmkXP70O8DRsN3QKnMTEB4+tAafkoayeXPzPOy/4 0m6cGCuZYcrTlRf41AJKZwL8jETP1RJH/k2WX+LE= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id C424A42B62; Wed, 3 Apr 2024 17:43:35 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Apr 2024 17:43:27 +0200 Message-ID: <20240403154330.71585-7-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240403154330.71585-1-ffmpeg@haasn.xyz> References: <20240403154330.71585-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/10] avcodec/dovi_rpu: add ff_dovi_rpu_generate() 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: SEEj0xofjoAA From: Niklas Haas This function takes a decoded AVDOVIMetadata struct and turns it back into a binary RPU. Verified using existing tools, and matches the bitstream in official reference files. I decided to just roll the EMDF and NAL encapsulation into this function because the end user will need to do it otherwise anyways. --- libavcodec/dovi_rpu.c | 542 ++++++++++++++++++++++++++++++++++++++++++ libavcodec/dovi_rpu.h | 20 +- 2 files changed, 560 insertions(+), 2 deletions(-) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index b4e8d0cdea4..89353ccd1e4 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -29,6 +29,9 @@ #include "dovi_rpu.h" #include "golomb.h" #include "get_bits.h" +#include "itut35.h" +#include "put_bits.h" +#include "put_golomb.h" #include "refstruct.h" enum { @@ -358,6 +361,42 @@ static inline int64_t get_se_coef(GetBitContext *gb, const AVDOVIRpuDataHeader * return 0; /* unreachable */ } +static inline void put_ue_coef(PutBitContext *pb, const AVDOVIRpuDataHeader *hdr, + uint64_t coef) +{ + union { uint32_t u32; float f32; } fpart; + + switch (hdr->coef_data_type) { + case RPU_COEFF_FIXED: + set_ue_golomb(pb, coef >> hdr->coef_log2_denom); + put_bits64(pb, hdr->coef_log2_denom, + coef & ((1LL << hdr->coef_log2_denom) - 1)); + break; + case RPU_COEFF_FLOAT: + fpart.f32 = coef / (float) (1LL << hdr->coef_log2_denom); + put_bits64(pb, hdr->coef_log2_denom, fpart.u32); + break; + } +} + +static inline void put_se_coef(PutBitContext *pb, const AVDOVIRpuDataHeader *hdr, + uint64_t coef) +{ + union { uint32_t u32; float f32; } fpart; + + switch (hdr->coef_data_type) { + case RPU_COEFF_FIXED: + set_se_golomb(pb, coef >> hdr->coef_log2_denom); + put_bits64(pb, hdr->coef_log2_denom, + coef & ((1LL << hdr->coef_log2_denom) - 1)); + break; + case RPU_COEFF_FLOAT: + fpart.f32 = coef / (float) (1LL << hdr->coef_log2_denom); + put_bits64(pb, hdr->coef_log2_denom, fpart.u32); + break; + } +} + static inline unsigned get_variable_bits(GetBitContext *gb, int n) { unsigned int value = get_bits(gb, n); @@ -885,3 +924,506 @@ fail: ff_dovi_ctx_unref(s); /* don't leak potentially invalid state */ return AVERROR_INVALIDDATA; } + +static int av_q2den(AVRational q, int den) +{ + if (q.den == den) + return q.num; + q = av_mul_q(q, av_make_q(den, 1)); + return (q.num + (q.den >> 1)) / q.den; +} + +static void generate_ext_v1(PutBitContext *pb, const AVDOVIDmData *dm) +{ + int ext_block_length, start_pos, pad_bits; + + switch (dm->level) { + case 1: ext_block_length = 5; break; + case 2: ext_block_length = 11; break; + case 4: ext_block_length = 3; break; + case 5: ext_block_length = 7; break; + case 6: ext_block_length = 8; break; + case 255: ext_block_length = 6; break; + default: return; + } + + set_ue_golomb(pb, ext_block_length); + put_bits(pb, 8, dm->level); + start_pos = put_bits_count(pb); + + switch (dm->level) { + case 1: + put_bits(pb, 12, dm->l1.min_pq); + put_bits(pb, 12, dm->l1.max_pq); + put_bits(pb, 12, dm->l1.avg_pq); + break; + case 2: + put_bits(pb, 12, dm->l2.target_max_pq); + put_bits(pb, 12, dm->l2.trim_slope); + put_bits(pb, 12, dm->l2.trim_offset); + put_bits(pb, 12, dm->l2.trim_power); + put_bits(pb, 12, dm->l2.trim_chroma_weight); + put_bits(pb, 12, dm->l2.trim_saturation_gain); + put_bits(pb, 13, dm->l2.ms_weight + 8192); + break; + case 4: + put_bits(pb, 12, dm->l4.anchor_pq); + put_bits(pb, 12, dm->l4.anchor_power); + break; + case 5: + put_bits(pb, 13, dm->l5.left_offset); + put_bits(pb, 13, dm->l5.right_offset); + put_bits(pb, 13, dm->l5.top_offset); + put_bits(pb, 13, dm->l5.bottom_offset); + break; + case 6: + put_bits(pb, 16, dm->l6.max_luminance); + put_bits(pb, 16, dm->l6.min_luminance); + put_bits(pb, 16, dm->l6.max_cll); + put_bits(pb, 16, dm->l6.max_fall); + break; + case 255: + put_bits(pb, 8, dm->l255.dm_run_mode); + put_bits(pb, 8, dm->l255.dm_run_version); + for (int i = 0; i < 4; i++) + put_bits(pb, 8, dm->l255.dm_debug[i]); + break; + } + + pad_bits = ext_block_length * 8 - (put_bits_count(pb) - start_pos); + av_assert1(pad_bits >= 0); + put_bits(pb, pad_bits, 0); +} + +static void put_cie_xy(PutBitContext *pb, AVCIExy xy) +{ + const int denom = 32767; + put_sbits(pb, 16, av_q2den(xy.x, denom)); + put_sbits(pb, 16, av_q2den(xy.y, denom)); +} + +#define ANY6(arr) (arr[0] || arr[1] || arr[2] || arr[3] || arr[4] || arr[5]) +#define ANY_XY(xy) (xy.x.num || xy.y.num) +#define ANY_CSP(csp) (ANY_XY(csp.prim.r) || ANY_XY(csp.prim.g) || \ + ANY_XY(csp.prim.b) || ANY_XY(csp.wp)) + +static void generate_ext_v2(PutBitContext *pb, const AVDOVIDmData *dm) +{ + int ext_block_length, start_pos, pad_bits; + + switch (dm->level) { + case 3: ext_block_length = 5; break; + case 8: + if (ANY6(dm->l8.hue_vector_field)) { + ext_block_length = 25; + } else if (ANY6(dm->l8.saturation_vector_field)) { + ext_block_length = 19; + } else if (dm->l8.clip_trim) { + ext_block_length = 13; + } else if (dm->l8.target_mid_contrast) { + ext_block_length = 12; + } else { + ext_block_length = 10; + } + break; + case 9: + if (ANY_CSP(dm->l9.source_display_primaries)) { + ext_block_length = 17; + } else { + ext_block_length = 1; + } + break; + case 10: + if (ANY_CSP(dm->l10.target_display_primaries)) { + ext_block_length = 21; + } else { + ext_block_length = 5; + } + break; + case 11: ext_block_length = 5; break; + case 254: ext_block_length = 2; break; + default: return; + } + + set_ue_golomb(pb, ext_block_length); + put_bits(pb, 8, dm->level); + start_pos = put_bits_count(pb); + + switch (dm->level) { + case 3: + put_bits(pb, 12, dm->l3.min_pq_offset); + put_bits(pb, 12, dm->l3.max_pq_offset); + put_bits(pb, 12, dm->l3.avg_pq_offset); + break; + case 8: + put_bits(pb, 8, dm->l8.target_display_index); + put_bits(pb, 12, dm->l8.trim_slope); + put_bits(pb, 12, dm->l8.trim_offset); + put_bits(pb, 12, dm->l8.trim_power); + put_bits(pb, 12, dm->l8.trim_chroma_weight); + put_bits(pb, 12, dm->l8.trim_saturation_gain); + put_bits(pb, 12, dm->l8.ms_weight + 8192); + if (ext_block_length < 12) + break; + put_bits(pb, 12, dm->l8.target_mid_contrast); + if (ext_block_length < 13) + break; + put_bits(pb, 12, dm->l8.clip_trim); + if (ext_block_length < 19) + break; + for (int i = 0; i < 6; i++) + put_bits(pb, 8, dm->l8.saturation_vector_field[i]); + if (ext_block_length < 25) + break; + for (int i = 0; i < 6; i++) + put_bits(pb, 8, dm->l8.hue_vector_field[i]); + break; + case 9: + put_bits(pb, 8, dm->l9.source_primary_index); + if (ext_block_length < 17) + break; + put_cie_xy(pb, dm->l9.source_display_primaries.prim.r); + put_cie_xy(pb, dm->l9.source_display_primaries.prim.g); + put_cie_xy(pb, dm->l9.source_display_primaries.prim.b); + put_cie_xy(pb, dm->l9.source_display_primaries.wp); + break; + case 10: + put_bits(pb, 8, dm->l10.target_display_index); + put_bits(pb, 12, dm->l10.target_max_pq); + put_bits(pb, 12, dm->l10.target_min_pq); + put_bits(pb, 8, dm->l10.target_primary_index); + if (ext_block_length < 21) + break; + put_cie_xy(pb, dm->l10.target_display_primaries.prim.r); + put_cie_xy(pb, dm->l10.target_display_primaries.prim.g); + put_cie_xy(pb, dm->l10.target_display_primaries.prim.b); + put_cie_xy(pb, dm->l10.target_display_primaries.wp); + break; + case 11: + put_bits(pb, 8, dm->l11.content_type); + put_bits(pb, 4, dm->l11.whitepoint); + put_bits(pb, 1, dm->l11.reference_mode_flag); + put_bits(pb, 3, 0); /* reserved */ + put_bits(pb, 2, dm->l11.sharpness); + put_bits(pb, 2, dm->l11.noise_reduction); + put_bits(pb, 2, dm->l11.mpeg_noise_reduction); + put_bits(pb, 2, dm->l11.frame_rate_conversion); + put_bits(pb, 2, dm->l11.brightness); + put_bits(pb, 2, dm->l11.color); + break; + case 254: + put_bits(pb, 8, dm->l254.dm_mode); + put_bits(pb, 8, dm->l254.dm_version_index); + break; + } + + pad_bits = ext_block_length * 8 - (put_bits_count(pb) - start_pos); + av_assert1(pad_bits >= 0); + put_bits(pb, pad_bits, 0); +} + +int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, + uint8_t **out_rpu, int *out_size) +{ + PutBitContext *pb = &(PutBitContext){0}; + const AVDOVIRpuDataHeader *hdr; + const AVDOVIDataMapping *mapping; + const AVDOVIColorMetadata *color; + int vdr_dm_metadata_changed, vdr_rpu_id, use_prev_vdr_rpu, profile, + buffer_size, rpu_size, pad, zero_run; + int num_ext_blocks_v1, num_ext_blocks_v2; + uint32_t crc; + uint8_t *dst; + if (!metadata) { + *out_rpu = NULL; + *out_size = 0; + return 0; + } + + hdr = av_dovi_get_header(metadata); + mapping = av_dovi_get_mapping(metadata); + color = av_dovi_get_color(metadata); + av_assert0(s->cfg.dv_profile); + + if (hdr->rpu_type != 2) { + av_log(s->logctx, AV_LOG_ERROR, "Unhandled RPU type %"PRIu8"\n", + hdr->rpu_type); + return AVERROR_INVALIDDATA; + } + + vdr_rpu_id = -1; + for (int i = 0; i <= DOVI_MAX_DM_ID; i++) { + if (s->vdr[i] && !memcmp(&s->vdr[i]->mapping, mapping, sizeof(*mapping))) { + vdr_rpu_id = i; + break; + } else if (vdr_rpu_id < 0 && (!s->vdr[i] || i == DOVI_MAX_DM_ID)) { + vdr_rpu_id = i; + } + } + + if (!s->vdr[vdr_rpu_id]) { + s->vdr[vdr_rpu_id] = ff_refstruct_allocz(sizeof(DOVIVdr)); + if (!s->vdr[vdr_rpu_id]) + return AVERROR(ENOMEM); + } + + if (!s->vdr[color->dm_metadata_id]) { + s->vdr[color->dm_metadata_id] = ff_refstruct_allocz(sizeof(DOVIVdr)); + if (!s->vdr[color->dm_metadata_id]) + return AVERROR(ENOMEM); + } + + num_ext_blocks_v1 = num_ext_blocks_v2 = 0; + for (int i = 0; i < metadata->num_ext_blocks; i++) { + const AVDOVIDmData *dm = av_dovi_get_ext(metadata, i); + switch (dm->level) { + case 1: + case 2: + case 4: + case 5: + case 6: + case 255: + num_ext_blocks_v1++; + break; + case 3: + case 8: + case 9: + case 10: + case 11: + case 254: + num_ext_blocks_v2++; + break; + default: + av_log(s->logctx, AV_LOG_ERROR, "Invalid ext block level %d\n", + dm->level); + return AVERROR_INVALIDDATA; + } + } + + vdr_dm_metadata_changed = !s->color || memcmp(s->color, color, sizeof(*color)); + use_prev_vdr_rpu = !memcmp(&s->vdr[vdr_rpu_id]->mapping, mapping, sizeof(*mapping)); + + buffer_size = 12 /* vdr seq info */ + 5 /* CRC32 + terminator */; + buffer_size += num_ext_blocks_v1 * 13; + buffer_size += num_ext_blocks_v2 * 28; + if (!use_prev_vdr_rpu) { + buffer_size += 160; + for (int c = 0; c < 3; c++) { + for (int i = 0; i < mapping->curves[c].num_pivots - 1; i++) { + switch (mapping->curves[c].mapping_idc[i]) { + case AV_DOVI_MAPPING_POLYNOMIAL: buffer_size += 26; break; + case AV_DOVI_MAPPING_MMR: buffer_size += 177; break; + } + } + } + } + if (vdr_dm_metadata_changed) + buffer_size += 67; + + av_fast_padded_malloc(&s->rpu_buf, &s->rpu_buf_sz, buffer_size); + if (!s->rpu_buf) + return AVERROR(ENOMEM); + init_put_bits(pb, s->rpu_buf, s->rpu_buf_sz); + + /* RPU header */ + put_bits(pb, 6, hdr->rpu_type); + put_bits(pb, 11, hdr->rpu_format); + put_bits(pb, 4, hdr->vdr_rpu_profile); + put_bits(pb, 4, hdr->vdr_rpu_level); + put_bits(pb, 1, 1); /* vdr_seq_info_present */ + put_bits(pb, 1, hdr->chroma_resampling_explicit_filter_flag); + put_bits(pb, 2, hdr->coef_data_type); + if (hdr->coef_data_type == RPU_COEFF_FIXED) + set_ue_golomb(pb, hdr->coef_log2_denom); + put_bits(pb, 2, hdr->vdr_rpu_normalized_idc); + put_bits(pb, 1, hdr->bl_video_full_range_flag); + if ((hdr->rpu_format & 0x700) == 0) { + set_ue_golomb(pb, hdr->bl_bit_depth - 8); + set_ue_golomb(pb, hdr->el_bit_depth - 8); + set_ue_golomb(pb, hdr->vdr_bit_depth - 8); + put_bits(pb, 1, hdr->spatial_resampling_filter_flag); + put_bits(pb, 3, 0); /* reserved_zero_3bits */ + put_bits(pb, 1, hdr->el_spatial_resampling_filter_flag); + put_bits(pb, 1, hdr->disable_residual_flag); + } + s->header = *hdr; + + put_bits(pb, 1, vdr_dm_metadata_changed); + put_bits(pb, 1, use_prev_vdr_rpu); + set_ue_golomb(pb, vdr_rpu_id); + s->mapping = &s->vdr[vdr_rpu_id]->mapping; + + if (!use_prev_vdr_rpu) { + set_ue_golomb(pb, mapping->mapping_color_space); + set_ue_golomb(pb, mapping->mapping_chroma_format_idc); + for (int c = 0; c < 3; c++) { + const AVDOVIReshapingCurve *curve = &mapping->curves[c]; + int prev = 0; + set_ue_golomb(pb, curve->num_pivots - 2); + for (int i = 0; i < curve->num_pivots; i++) { + put_bits(pb, hdr->bl_bit_depth, curve->pivots[i] - prev); + prev = curve->pivots[i]; + } + } + + if (mapping->nlq_method_idc != AV_DOVI_NLQ_NONE) { + put_bits(pb, 3, mapping->nlq_method_idc); + put_bits(pb, hdr->bl_bit_depth, mapping->nlq_pivots[0]); + put_bits(pb, hdr->bl_bit_depth, mapping->nlq_pivots[1] - mapping->nlq_pivots[0]); + } + + set_ue_golomb(pb, mapping->num_x_partitions - 1); + set_ue_golomb(pb, mapping->num_y_partitions - 1); + + for (int c = 0; c < 3; c++) { + const AVDOVIReshapingCurve *curve = &mapping->curves[c]; + for (int i = 0; i < curve->num_pivots - 1; i++) { + set_ue_golomb(pb, curve->mapping_idc[i]); + switch (curve->mapping_idc[i]) { + case AV_DOVI_MAPPING_POLYNOMIAL: { + set_ue_golomb(pb, curve->poly_order[i] - 1); + if (curve->poly_order[i] == 1) + put_bits(pb, 1, 0); /* linear_interp_flag */ + for (int k = 0; k <= curve->poly_order[i]; k++) + put_se_coef(pb, hdr, curve->poly_coef[i][k]); + break; + } + case AV_DOVI_MAPPING_MMR: { + put_bits(pb, 2, curve->mmr_order[i] - 1); + put_se_coef(pb, hdr, curve->mmr_constant[i]); + for (int j = 0; j < curve->mmr_order[i]; j++) { + for (int k = 0; k < 7; k++) + put_se_coef(pb, hdr, curve->mmr_coef[i][j][k]); + } + break; + } + } + } + } + + if (mapping->nlq_method_idc != AV_DOVI_NLQ_NONE) { + for (int c = 0; c < 3; c++) { + const AVDOVINLQParams *nlq = &mapping->nlq[c]; + put_bits(pb, hdr->el_bit_depth, nlq->nlq_offset); + put_ue_coef(pb, hdr, nlq->vdr_in_max); + switch (mapping->nlq_method_idc) { + case AV_DOVI_NLQ_LINEAR_DZ: + put_ue_coef(pb, hdr, nlq->linear_deadzone_slope); + put_ue_coef(pb, hdr, nlq->linear_deadzone_threshold); + break; + } + } + } + + memcpy(&s->vdr[vdr_rpu_id]->mapping, mapping, sizeof(*mapping)); + } + + if (vdr_dm_metadata_changed) { + const int denom = profile == 4 ? (1 << 30) : (1 << 28); + set_ue_golomb(pb, color->dm_metadata_id); /* affected_dm_id */ + set_ue_golomb(pb, color->dm_metadata_id); /* current_dm_id */ + set_ue_golomb(pb, color->scene_refresh_flag); + for (int i = 0; i < 9; i++) + put_sbits(pb, 16, av_q2den(color->ycc_to_rgb_matrix[i], 1 << 13)); + for (int i = 0; i < 3; i++) + put_bits32(pb, av_q2den(color->ycc_to_rgb_offset[i], denom)); + for (int i = 0; i < 9; i++) + put_sbits(pb, 16, av_q2den(color->rgb_to_lms_matrix[i], 1 << 14)); + put_bits(pb, 16, color->signal_eotf); + put_bits(pb, 16, color->signal_eotf_param0); + put_bits(pb, 16, color->signal_eotf_param1); + put_bits32(pb, color->signal_eotf_param2); + put_bits(pb, 5, color->signal_bit_depth); + put_bits(pb, 2, color->signal_color_space); + put_bits(pb, 2, color->signal_chroma_format); + put_bits(pb, 2, color->signal_full_range_flag); + put_bits(pb, 12, color->source_min_pq); + put_bits(pb, 12, color->source_max_pq); + put_bits(pb, 10, color->source_diagonal); + + memcpy(&s->vdr[color->dm_metadata_id]->color, color, sizeof(*color)); + s->color = &s->vdr[color->dm_metadata_id]->color; + } + + set_ue_golomb(pb, num_ext_blocks_v1); + align_put_bits(pb); + for (int i = 0; i < metadata->num_ext_blocks; i++) + generate_ext_v1(pb, av_dovi_get_ext(metadata, i)); + + if (num_ext_blocks_v2) { + set_ue_golomb(pb, num_ext_blocks_v2); + align_put_bits(pb); + for (int i = 0; i < metadata->num_ext_blocks; i++) + generate_ext_v2(pb, av_dovi_get_ext(metadata, i)); + } + + flush_put_bits(pb); + crc = av_bswap32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, + s->rpu_buf, put_bytes_output(pb))); + put_bits32(pb, crc); + put_bits(pb, 8, 0x80); /* terminator */ + flush_put_bits(pb); + + rpu_size = put_bytes_output(pb); + switch (s->cfg.dv_profile) { + case 10: + /* AV1 uses T.35 OBU with EMDF header */ + *out_rpu = av_malloc(rpu_size + 15); + if (!*out_rpu) + return AVERROR(ENOMEM); + init_put_bits(pb, *out_rpu, rpu_size + 15); + put_bits(pb, 8, ITU_T_T35_COUNTRY_CODE_US); + put_bits(pb, 16, ITU_T_T35_PROVIDER_CODE_DOLBY); + put_bits32(pb, 0x800); /* provider_oriented_code */ + put_bits(pb, 27, 0x01be6841u); /* fixed EMDF header, see above */ + if (rpu_size > 0xFF) { + av_assert2(rpu_size <= 0x10000); + put_bits(pb, 8, (rpu_size >> 8) - 1); + put_bits(pb, 1, 1); /* read_more */ + put_bits(pb, 8, rpu_size & 0xFF); + put_bits(pb, 1, 0); + } else { + put_bits(pb, 8, rpu_size); + put_bits(pb, 1, 0); + } + ff_copy_bits(pb, s->rpu_buf, rpu_size * 8); + put_bits(pb, 17, 0x400); /* emdf payload id + emdf_protection */ + + pad = pb->bit_left & 7; + put_bits(pb, pad, (1 << pad) - 1); /* pad to next byte with 1 bits */ + flush_put_bits(pb); + *out_size = put_bytes_output(pb); + return 0; + + case 5: + case 8: + *out_rpu = dst = av_malloc(1 + rpu_size * 3 / 2); /* worst case */ + if (!*out_rpu) + return AVERROR(ENOMEM); + *dst++ = 25; /* NAL prefix */ + zero_run = 0; + for (int i = 0; i < rpu_size; i++) { + if (zero_run < 2) { + if (s->rpu_buf[i] == 0) { + zero_run++; + } else { + zero_run = 0; + } + } else { + if ((s->rpu_buf[i] & ~3) == 0) { + /* emulation prevention */ + *dst++ = 3; + } + zero_run = s->rpu_buf[i] == 0; + } + *dst++ = s->rpu_buf[i]; + } + *out_size = dst - *out_rpu; + return 0; + + default: + /* Should be unreachable */ + av_assert0(0); + return AVERROR_BUG; + } +} diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 33e19dd037c..64433b73e65 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -44,20 +44,22 @@ typedef struct DOVIContext { AVDOVIDecoderConfigurationRecord cfg; /** - * Currently active RPU data header, updates on every dovi_rpu_parse(). + * Currently active RPU data header, updates on every ff_dovi_rpu_parse() + * or ff_dovi_rpu_generate(). */ AVDOVIRpuDataHeader header; /** * Currently active data mappings, or NULL. Points into memory owned by the * corresponding rpu/vdr_ref, which becomes invalid on the next call to - * dovi_rpu_parse. + * ff_dovi_rpu_parse() or ff_dovi_rpu_generate(). */ const AVDOVIDataMapping *mapping; const AVDOVIColorMetadata *color; /** * Currently active extension blocks, updates on every ff_dovi_rpu_parse() + * or ff_dovi_rpu_generate(). */ AVDOVIDmData *ext_blocks; int num_ext_blocks; @@ -108,4 +110,18 @@ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame); */ int ff_dovi_configure(DOVIContext *s, AVCodecContext *avctx); +/** + * Synthesize a Dolby Vision RPU reflecting the current state. Note that this + * assumes all previous calls to `ff_dovi_rpu_generate` have been appropriately + * signalled, i.e. it will not re-send already transmitted redundant data. + * + * Mutates the internal state of DOVIContext to reflect the change. + * Returns 0 or a negative error code. + * + * This generates a fully formed RPU ready for inclusion in the bitstream, + * including the EMDF header (profile 10) or NAL encapsulation (otherwise). + */ +int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, + uint8_t **out_rpu, int *out_size); + #endif /* AVCODEC_DOVI_RPU_H */ From patchwork Wed Apr 3 15:43:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47760 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp485617pzb; Wed, 3 Apr 2024 08:44:53 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXp4ANY/5NpoPVbFEYwbjpsqAk5p4Rj27GXiZbDlQDx2lNR1rjEfSO6HwsD3wQGLj1sSRiG+atlZOCdQpj4yXWgreoY38SZg3aX7A== X-Google-Smtp-Source: AGHT+IEJQa6R/2poC2TyqKOAMCq5CjHxW17/8b1rxRnjQ1uGeZVoQ7GugcA1HJ+VOFDc7GuFYJGe X-Received: by 2002:a17:906:f207:b0:a4e:1597:eb39 with SMTP id gt7-20020a170906f20700b00a4e1597eb39mr9448138ejb.74.1712159093233; Wed, 03 Apr 2024 08:44:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712159093; cv=none; d=google.com; s=arc-20160816; b=ItOQ895UNQG0KYd3moZVhGWmx0XFVxwP7li4Bg+FjTShV3t0j146tOu8A0JW1ZR5fo sJHhAmeIGl6GjVMAKvOqJjjh4NIkyYBW54opSCNVvL50ogISQl8VdmjK0aaHxUcOBD8u 1cDFeVshprtjb3XXxtg0Lx3tEFCP9p85c5qB5v/t0u6oA5XmYvveEzkAUISMcEcF29X3 Rdm+Zaa1EJLV+P5Q1i92rw6qWMWMuQDYmGF8PxxLjQ9Z8mM4eMB0JdinWvTe6qxNHMlD 5bN1opLv/YlWPcCi70TtTFN+OKGgeulhorCivYYphlpzqZRv/qjcQEKUAd6ioiFumQLY zDTg== 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=k5B37fw31r7wWnpjIaCWi/+o2T727XXAgAr8TNaP9MI=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=ZbNkpHFhldMVM6YY2Cfv+y8II7WgX47fIwk5O80a95d+NFWZ7E23Se16wCgTFTQaLW ENQMDu51JTmScN/CCS1UoMQmSItn2QMns7ikuif7d6qyse3nuP8AX/1I9I5WkxpDdVUT 4DnupcGaqIxqE3jXEmDXHuzS6fvl/lJy7evwgLQMOgWs2VkUcyKiAl4Nwmg+LNqHLGey yUjyUdjGwzmMY2B1WWTpyN3U5BGW0DYa5UUTJmJ7dVvUq2L+IXpPtC2PMKHj3i2Xi8pW Is5TPiC9VPPbtJMj3lJn+de78N7X4OyICZYVq2d9p+VjZ2SrLQxpmJDQdMjsbkYG70pv E0WA==; 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=kyymERiQ; 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 b16-20020a17090636d000b00a4635b643afsi6647568ejc.985.2024.04.03.08.44.52; Wed, 03 Apr 2024 08:44:53 -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=kyymERiQ; 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 D5AE268D1FB; Wed, 3 Apr 2024 18:43:48 +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 7863E68D1C8 for ; Wed, 3 Apr 2024 18:43:39 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712159016; bh=lfFyYU4Fc421MxN5VnGFOyRCRKgE3MURMVIa/sC2iqg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kyymERiQbl3uvdyXgXCauNSewvfA9Q+8dJ1Lasuk890kVJZXpp27syhPNsDUKo4Pd y9BX3cxYUCIK/6DO80qR6/oajYPbADe5s3/UCkOkTYHux6tsqOw64DO1EGojh4cRkT nQO+lyLpkYD8TdQpMk14/zK3rjA2T9dHknFV5yrk= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 3C0A14301F; Wed, 3 Apr 2024 17:43:36 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Apr 2024 17:43:28 +0200 Message-ID: <20240403154330.71585-8-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240403154330.71585-1-ffmpeg@haasn.xyz> References: <20240403154330.71585-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/10] avcodec/libaomenc: 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: FsVRDr2sTL0D From: Niklas Haas --- libavcodec/libaomenc.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c index d660afab4ec..6bc46ec6e28 100644 --- a/libavcodec/libaomenc.c +++ b/libavcodec/libaomenc.c @@ -43,6 +43,7 @@ #include "avcodec.h" #include "bsf.h" #include "codec_internal.h" +#include "dovi_rpu.h" #include "encode.h" #include "internal.h" #include "libaom.h" @@ -70,6 +71,7 @@ struct FrameListData { typedef struct AOMEncoderContext { AVClass *class; AVBSFContext *bsf; + DOVIContext dovi; struct aom_codec_ctx encoder; struct aom_image rawimg; struct aom_fixed_buf twopass_stats; @@ -437,6 +439,7 @@ static av_cold int aom_free(AVCodecContext *avctx) av_freep(&avctx->stats_out); free_frame_list(ctx->coded_frame_list); av_bsf_free(&ctx->bsf); + ff_dovi_ctx_unref(&ctx->dovi); return 0; } @@ -1023,6 +1026,10 @@ static av_cold int aom_init(AVCodecContext *avctx, if (!cpb_props) return AVERROR(ENOMEM); + ctx->dovi.logctx = avctx; + if ((res = ff_dovi_configure(&ctx->dovi, avctx)) < 0) + return res; + if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) { const AVBitStreamFilter *filter = av_bsf_get_by_name("extract_extradata"); int ret; @@ -1282,6 +1289,7 @@ static int aom_encode(AVCodecContext *avctx, AVPacket *pkt, unsigned long duration = 0; int res, coded_size; aom_enc_frame_flags_t flags = 0; + AVFrameSideData *sd; if (frame) { rawimg = &ctx->rawimg; @@ -1319,6 +1327,24 @@ FF_ENABLE_DEPRECATION_WARNINGS break; } + sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DOVI_METADATA); + if (ctx->dovi.cfg.dv_profile && sd) { + const AVDOVIMetadata *metadata = (const AVDOVIMetadata *)sd->data; + uint8_t *t35; + int size; + if ((res = ff_dovi_rpu_generate(&ctx->dovi, metadata, &t35, &size)) < 0) + return res; + res = aom_img_add_metadata(rawimg, OBU_METADATA_TYPE_ITUT_T35, + t35, size, AOM_MIF_ANY_FRAME); + av_free(t35); + if (res != AOM_CODEC_OK) + return AVERROR(ENOMEM); + } else if (ctx->dovi.cfg.dv_profile) { + av_log(avctx, AV_LOG_ERROR, "Dolby Vision enabled, but received frame " + "without AV_FRAME_DATA_DOVI_METADATA"); + return AVERROR_INVALIDDATA; + } + if (frame->pict_type == AV_PICTURE_TYPE_I) flags |= AOM_EFLAG_FORCE_KF; } From patchwork Wed Apr 3 15:43:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47759 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp485544pzb; Wed, 3 Apr 2024 08:44:45 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUVFgs2GRQ7aB//inHdUulER4dD2MGi89u6BqQCshq9p/8lVQuHHpVOjmRu7lyeh9jkg+BG1AuUR9CZbzo6nXUHJMA0jlYAL0ad+A== X-Google-Smtp-Source: AGHT+IEPjuGTb54dAW9MAlFW3RZdy2tqnu4yJ4hvMVB1Wx9CbCW2kHT8Qsk+EFC4Ve6QH8/8ed7T X-Received: by 2002:a17:906:830d:b0:a51:585b:7996 with SMTP id j13-20020a170906830d00b00a51585b7996mr867847ejx.2.1712159085014; Wed, 03 Apr 2024 08:44:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712159085; cv=none; d=google.com; s=arc-20160816; b=ONMfWpjBCLet6Xiz2r1T84kisn98Y4X1SfmjnyhpfcS148ABPBjxcWxDuYzIzgtcfJ c0rDAE+2wCUIqQgvcK7k17U4j4A1NxhpvmS7mc1vt46TkyLQCtTjXzRBM1CJdtXpY6AW UiDIFNYZjKt5nXIUEuxVEnvsLm2MXB/NQl6ET0Nhe3+R/+wosPchVR2pKDRJYo1GPoKQ xZrFg/gNE3TQnM/Jxh+jky7kHxuDzkkOJI+sSsv/Ve0uq6tlrG/BoYBP+uQFwk/VX/04 CuBkif/BDzRU5ChUVgbh7lnBUjjXxvLv/qCNZhwXuxs/2gS45ZWkO3Pu7mgAYvqb+tKv KLCg== 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=xLDPFNT13whP/AQHgnI0+9mbP8NtxYZ5vNXFB5jgcZc=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=P48krrQeOBlNrPFhJvj6PoRUZkPk6JgkJp1/q/z8x0lpXWjMBw9I4oOOOAXko+YRF2 Lv3eG0eO9sSFUX+MFF5NKY/WRx3uuvRxgcqDwDSJk67tklvzWari2uYXIBLdRl5SGczw 0vzjtyqinRq0IW88TbtFi6nznGuq6A5Ca073xLe8ZfkeZLN1LSrQMNHvuQCQOzJIgvac 0JqZAIZL5UlY62ZnPXHQHHoZEBKGGQ2kbx+f+0hP4//sgnqMRddqfAuzcKW5w1jyXKab ivFeZ5aL3M32vftMBMVzUCr5KnLErNFzcav3Jwkd9+wpQ4bZUdiVkaynDjSZCNSasGrD 9t1g==; 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=C7LHjBZM; 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 hs14-20020a1709073e8e00b00a4e4e730f4dsi4764311ejc.710.2024.04.03.08.44.44; Wed, 03 Apr 2024 08:44: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=C7LHjBZM; 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 CB5C568D1F2; Wed, 3 Apr 2024 18:43:47 +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 7E3FC68D1C9 for ; Wed, 3 Apr 2024 18:43:39 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712159016; bh=C8EZIcVgsjSPb5LBbAhDhxww0WaTSSXR/IhDgfgFfog=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=C7LHjBZM4uls8K8MPr8Q1rhfSoX1XISSdLnY26Y/mFeoCQGaRKb7eNZkTA6pu1jYU tdvVHRfRMzeYiDyne+Jvx/YmZFFetHypfu2SbTbpDiuoF7Xx7yVPnZUplmO9eqsurp QzAObWGx2W8niePLezEdgIEDm81Ge/MV5JA6d4WY= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id A5B1443756; Wed, 3 Apr 2024 17:43:36 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Apr 2024 17:43:29 +0200 Message-ID: <20240403154330.71585-9-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240403154330.71585-1-ffmpeg@haasn.xyz> References: <20240403154330.71585-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/10] avcodec/libx265: 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: T73QPMkYU06S From: Niklas Haas libx265 supports these natively, we just need to attach the generated NALs to the x265picture, as well as setting the appropriate DV profile. --- libavcodec/libx265.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c index 40ddce60306..b525b4ed59f 100644 --- a/libavcodec/libx265.c +++ b/libavcodec/libx265.c @@ -36,6 +36,7 @@ #include "libavutil/pixdesc.h" #include "avcodec.h" #include "codec_internal.h" +#include "dovi_rpu.h" #include "encode.h" #include "packet_internal.h" #include "atsc_a53.h" @@ -78,6 +79,8 @@ typedef struct libx265Context { * encounter a frame with ROI side data. */ int roi_warned; + + DOVIContext dovi; } libx265Context; static int is_keyframe(NalUnitType naltype) @@ -143,6 +146,8 @@ static av_cold int libx265_encode_close(AVCodecContext *avctx) if (ctx->encoder) ctx->api->encoder_close(ctx->encoder); + ff_dovi_ctx_unref(&ctx->dovi); + return 0; } @@ -529,6 +534,14 @@ FF_ENABLE_DEPRECATION_WARNINGS } } +#if X265_BUILD >= 167 + ctx->dovi.logctx = avctx; + if ((ret = ff_dovi_configure(&ctx->dovi, avctx)) < 0) + return ret; + ctx->params->dolbyProfile = ctx->dovi.cfg.dv_profile * 10 + + ctx->dovi.cfg.dv_bl_signal_compatibility_id; +#endif + ctx->encoder = ctx->api->encoder_open(ctx->params); if (!ctx->encoder) { av_log(avctx, AV_LOG_ERROR, "Cannot open libx265 encoder.\n"); @@ -632,6 +645,10 @@ static void free_picture(libx265Context *ctx, x265_picture *pic) for (int i = 0; i < sei->numPayloads; i++) av_free(sei->payloads[i].payload); +#if X265_BUILD >= 167 + av_free(pic->rpu.payload); +#endif + if (pic->userData) { int idx = (int)(intptr_t)pic->userData - 1; rd_release(ctx, idx); @@ -663,6 +680,7 @@ static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt, sei->numPayloads = 0; if (pic) { + AVFrameSideData *sd; ReorderedData *rd; int rd_idx; @@ -763,6 +781,24 @@ static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt, sei->numPayloads++; } } + +#if X265_BUILD >= 167 + sd = av_frame_get_side_data(pic, AV_FRAME_DATA_DOVI_METADATA); + if (ctx->dovi.cfg.dv_profile && sd) { + const AVDOVIMetadata *metadata = (const AVDOVIMetadata *)sd->data; + ret = ff_dovi_rpu_generate(&ctx->dovi, metadata, &x265pic.rpu.payload, + &x265pic.rpu.payloadSize); + if (ret < 0) { + free_picture(ctx, &x265pic); + return ret; + } + } else if (ctx->dovi.cfg.dv_profile) { + av_log(avctx, AV_LOG_ERROR, "Dolby Vision enabled, but received frame " + "without AV_FRAME_DATA_DOVI_METADATA"); + free_picture(ctx, &x265pic); + return AVERROR_INVALIDDATA; + } +#endif } ret = ctx->api->encoder_encode(ctx->encoder, &nal, &nnal, From patchwork Wed Apr 3 15:43:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47761 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp485695pzb; Wed, 3 Apr 2024 08:45:01 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWnwCr+fjwFEZ+rgX42wL2SQhVvP0vxMSMx+vkSJFJS+mR4WexA0lWsPBnHpxayLsMozhiA9UG1G/WG1MbsxKHG9zXlid+ULxBO6Q== X-Google-Smtp-Source: AGHT+IEAK4ZEgChh1ReDLqk9lIGY7WF2Vyq6LFmryjDhFU169AVifxCSwVcPDrQRtJ4mChr7OnB9 X-Received: by 2002:a05:6402:50d0:b0:56c:62d0:2cb2 with SMTP id h16-20020a05640250d000b0056c62d02cb2mr11285922edb.3.1712159101433; Wed, 03 Apr 2024 08:45:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712159101; cv=none; d=google.com; s=arc-20160816; b=ftvf26cT1QX6nIrLg4qCO/jwylY82OpHRcyzskQ68PMJjVJEnn22ogRY9/bgqKnL6j iXop5d5AU3QAEK6pZm9bcOtY7ywvrjlEhbIHlrk+Rzg9++B4sjFpifsFxdrlvyapZDwa +PH7bquTUSoLBRwG9Z3FRMLhX0Z8EVFjVIpCgKUxJ1KzTsYoiZuMLUQYfbrlyuFueoCK COunNHvsMhm7mmygURC/lSrTHppamk7vZZgRgpLzwW7LdgHKRsrr4WDZ936pBliATscv 6SBXhTV5v8qAGc7zp92l2suwJpxHAI1PiakeYE1I4saEC0Pb62qbpQpdkb7Zzp0fL4nN je+Q== 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=3fxPBVRCY76DKwlSILK4O6x0vfw/agwKqucbGUJ8tHQ=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=ZFJBMkDrymBPUTSQEXmU/Yb7DonLSvpc0BuMnr4IeH33iLizIbsV5XwQOTe+k0t02e MD5cPk3aes8DdXYF5DXMTijuMl1FSi8yLwp5K6Nsjyvzpc/dh/6gCrs9R0Mtefv9Anoa LkuJKfxmfwP+9Y4erL7zgRJiUmicAj8BFXr0gMYN3Gfxzu9HdTnce87MjlgXE6jT6/LB ZBnvbQg/UFOxrTbOeeHDoa3X2KRRK/RkhnAPIJVxMQ+CJWZ2ON/VW/yRgIiRgGEemxfb UI+vd/oTonqVYzEvKM7kXDlk/lJf45FZIpBnDdBQvaYRNG3qScU3NoNKbu6i5XUOuRGG nxxQ==; 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=YUZPLjOT; 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 f20-20020a50d554000000b0056dffbce5basi1027071edj.405.2024.04.03.08.45.00; Wed, 03 Apr 2024 08:45:01 -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=YUZPLjOT; 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 CFB7968D202; Wed, 3 Apr 2024 18:43:49 +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 CE48F68D1C0 for ; Wed, 3 Apr 2024 18:43:39 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1712159017; bh=AEStckKVyU7tZ92H7sOZKCzIyc/boUg/jr6V6WIiRbc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YUZPLjOTJ8jJNlweUWA7sDxVugoilX+I8f6VNu64ZPZIK+ReWHBmLBbFjMj6YpaXT 4ADGEh3PlyykGWu6349gGKsyynrtsux+hMu7kOwK55/2ykpbYkNRhPG7pj/6lT6gDF XDqosIePK0jFNE3DFpDTXK+k6HLMWjVq8d3WOwWQ= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 09AE743961; Wed, 3 Apr 2024 17:43:37 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Apr 2024 17:43:30 +0200 Message-ID: <20240403154330.71585-10-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240403154330.71585-1-ffmpeg@haasn.xyz> References: <20240403154330.71585-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/10] avformat/movenc: warn if dovi cfg ignored 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: ecW0wi4dut+R From: Niklas Haas Since this is guarded behind strict unofficial, we should warn if the user feeds a dolby vision stream to this muxer, as it will otherwise result in a broken file. --- libavformat/movenc.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 15b65dcf96d..0f819214be9 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -2528,16 +2528,21 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex const AVPacketSideData *spherical_mapping = av_packet_side_data_get(track->st->codecpar->coded_side_data, track->st->codecpar->nb_coded_side_data, AV_PKT_DATA_SPHERICAL); - const AVPacketSideData *dovi = av_packet_side_data_get(track->st->codecpar->coded_side_data, - track->st->codecpar->nb_coded_side_data, - AV_PKT_DATA_DOVI_CONF); - if (stereo_3d) mov_write_st3d_tag(s, pb, (AVStereo3D*)stereo_3d->data); if (spherical_mapping) mov_write_sv3d_tag(mov->fc, pb, (AVSphericalMapping*)spherical_mapping->data); - if (dovi) + } + + if (track->mode == MODE_MP4) { + const AVPacketSideData *dovi = av_packet_side_data_get(track->st->codecpar->coded_side_data, + track->st->codecpar->nb_coded_side_data, + AV_PKT_DATA_DOVI_CONF); + if (dovi && mov->fc->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) { mov_write_dvcc_dvvc_tag(s, pb, (AVDOVIDecoderConfigurationRecord *)dovi->data); + } else if (dovi) { + av_log(mov->fc, AV_LOG_WARNING, "Not writing 'dvcC'/'dvvC' box. Requires -strict unofficial.\n"); + } } if (track->par->sample_aspect_ratio.den && track->par->sample_aspect_ratio.num) {