public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/ffmpeg] epel9-next: Rebase to 6.1
@ 2026-07-20 17:31 Neal Gompa
0 siblings, 0 replies; only message in thread
From: Neal Gompa @ 2026-07-20 17:31 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/ffmpeg
Branch : epel9-next
Commit : 37bbe8c93acc59886c441bae7515a010ebd2cbf6
Author : Neal Gompa <ngompa@fedoraproject.org>
Date : 2024-01-04T10:48:18-05:00
Stats : +142/-5542 in 11 file(s)
URL : https://src.fedoraproject.org/rpms/ffmpeg/c/37bbe8c93acc59886c441bae7515a010ebd2cbf6?branch=epel9-next
Log:
Rebase to 6.1
---
diff --git a/0001-avfilter-vf_libplacebo-remove-deprecated-field.patch b/0001-avfilter-vf_libplacebo-remove-deprecated-field.patch
deleted file mode 100644
index 0819af4..0000000
--- a/0001-avfilter-vf_libplacebo-remove-deprecated-field.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From 1231003c3c6d4839a9e838d06f8e16ee7690958f Mon Sep 17 00:00:00 2001
-From: Niklas Haas <git@haasn.dev>
-Date: Mon, 13 Mar 2023 14:33:16 +0100
-Subject: [PATCH] avfilter/vf_libplacebo: remove deprecated field
-
-This has not been functional since a year ago, including in our current
-minimum dependency of libplacebo (v4.192.0). It also causes build errors
-against libplacebo v6, so it needs to be removed from the code. We can
-keep the option around for now, but it should also be removed soon.
-
-Signed-off-by: Niklas Haas <git@haasn.dev>
-Signed-off-by: James Almer <jamrial@gmail.com>
----
- doc/filters.texi | 3 ---
- libavfilter/vf_libplacebo.c | 7 ++++---
- 2 files changed, 4 insertions(+), 6 deletions(-)
-
-diff --git a/doc/filters.texi b/doc/filters.texi
-index 7a7b2ba4e79e..77b594f69cb1 100644
---- a/doc/filters.texi
-+++ b/doc/filters.texi
-@@ -16242,9 +16242,6 @@ Disable linear light scaling.
- @item disable_builtin
- Disable built-in GPU sampling (forces LUT).
-
--@item force_icc_lut
--Force the use of a full ICC 3DLUT for gamut mapping.
--
- @item disable_fbos
- Forcibly disable FBOs, resulting in loss of almost all functionality, but
- offering the maximum possible speed.
-diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
-index d75723289069..757dc519e9ad 100644
---- a/libavfilter/vf_libplacebo.c
-+++ b/libavfilter/vf_libplacebo.c
-@@ -97,7 +97,6 @@ typedef struct LibplaceboContext {
- float polar_cutoff;
- int disable_linear;
- int disable_builtin;
-- int force_icc_lut;
- int force_dither;
- int disable_fbos;
-
-@@ -139,6 +138,7 @@ typedef struct LibplaceboContext {
- float desat_exp;
- int gamut_warning;
- int gamut_clipping;
-+ int force_icc_lut;
- #endif
-
- /* pl_dither_params */
-@@ -463,7 +463,6 @@ static int process_frames(AVFilterContext *avctx, AVFrame *out, AVFrame *in)
- .polar_cutoff = s->polar_cutoff,
- .disable_linear_scaling = s->disable_linear,
- .disable_builtin_scalers = s->disable_builtin,
-- .force_icc_lut = s->force_icc_lut,
- .force_dither = s->force_dither,
- .disable_fbos = s->disable_fbos,
- };
-@@ -855,7 +854,9 @@ static const AVOption libplacebo_options[] = {
- { "polar_cutoff", "Polar LUT cutoff", OFFSET(polar_cutoff), AV_OPT_TYPE_FLOAT, {.dbl = 0}, 0.0, 1.0, DYNAMIC },
- { "disable_linear", "Disable linear scaling", OFFSET(disable_linear), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DYNAMIC },
- { "disable_builtin", "Disable built-in scalers", OFFSET(disable_builtin), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DYNAMIC },
-- { "force_icc_lut", "Force the use of a full ICC 3DLUT for color mapping", OFFSET(force_icc_lut), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DYNAMIC },
-+#if FF_API_LIBPLACEBO_OPTS
-+ { "force_icc_lut", "Deprecated, does nothing", OFFSET(force_icc_lut), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DYNAMIC | AV_OPT_FLAG_DEPRECATED },
-+#endif
- { "force_dither", "Force dithering", OFFSET(force_dither), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DYNAMIC },
- { "disable_fbos", "Force-disable FBOs", OFFSET(disable_fbos), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DYNAMIC },
- { NULL },
---
-2.39.2
-
diff --git a/0001-avfilter-vf_libplacebo-wrap-deprecated-opts-in-FF_AP.patch b/0001-avfilter-vf_libplacebo-wrap-deprecated-opts-in-FF_AP.patch
deleted file mode 100644
index 2d2a939..0000000
--- a/0001-avfilter-vf_libplacebo-wrap-deprecated-opts-in-FF_AP.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From 11eca6018c40f5ebe6af93cbc4b4dce447d8b3bc Mon Sep 17 00:00:00 2001
-From: Niklas Haas <git@haasn.dev>
-Date: Mon, 13 Mar 2023 15:10:26 +0100
-Subject: [PATCH] avfilter/vf_libplacebo: wrap deprecated opts in FF_API define
-
-Signed-off-by: Niklas Haas <git@haasn.dev>
-Signed-off-by: James Almer <jamrial@gmail.com>
----
- libavfilter/version_major.h | 2 ++
- libavfilter/vf_libplacebo.c | 8 ++++++++
- 2 files changed, 10 insertions(+)
-
-diff --git a/libavfilter/version_major.h b/libavfilter/version_major.h
-index 899dfdb27dba..1decc4012ee0 100644
---- a/libavfilter/version_major.h
-+++ b/libavfilter/version_major.h
-@@ -35,4 +35,6 @@
- * the public API and may change, break or disappear at any time.
- */
-
-+#define FF_API_LIBPLACEBO_OPTS (LIBAVFILTER_VERSION_MAJOR < 10)
-+
- #endif /* AVFILTER_VERSION_MAJOR_H */
-diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
-index 7cd495de2619..d75723289069 100644
---- a/libavfilter/vf_libplacebo.c
-+++ b/libavfilter/vf_libplacebo.c
-@@ -132,11 +132,14 @@ typedef struct LibplaceboContext {
- int inverse_tonemapping;
- float crosstalk;
- int tonemapping_lut_size;
-+
-+#if FF_API_LIBPLACEBO_OPTS
- /* for backwards compatibility */
- float desat_str;
- float desat_exp;
- int gamut_warning;
- int gamut_clipping;
-+#endif
-
- /* pl_dither_params */
- int dithering;
-@@ -380,6 +383,7 @@ static int process_frames(AVFilterContext *avctx, AVFrame *out, AVFrame *in)
- pl_rect2df_aspect_set(&target.crop, aspect, s->pad_crop_ratio);
- }
-
-+#if FF_API_LIBPLACEBO_OPTS
- /* backwards compatibility with older API */
- if (!tonemapping_mode && (s->desat_str >= 0.0f || s->desat_exp >= 0.0f)) {
- float str = s->desat_str < 0.0f ? 0.9f : s->desat_str;
-@@ -397,6 +401,7 @@ static int process_frames(AVFilterContext *avctx, AVFrame *out, AVFrame *in)
- gamut_mode = PL_GAMUT_WARN;
- if (s->gamut_clipping)
- gamut_mode = PL_GAMUT_DESATURATE;
-+#endif
-
- /* Update render params */
- params = (struct pl_render_params) {
-@@ -818,11 +823,14 @@ static const AVOption libplacebo_options[] = {
- { "inverse_tonemapping", "Inverse tone mapping (range expansion)", OFFSET(inverse_tonemapping), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DYNAMIC },
- { "tonemapping_crosstalk", "Crosstalk factor for tone-mapping", OFFSET(crosstalk), AV_OPT_TYPE_FLOAT, {.dbl = 0.04}, 0.0, 0.30, DYNAMIC },
- { "tonemapping_lut_size", "Tone-mapping LUT size", OFFSET(tonemapping_lut_size), AV_OPT_TYPE_INT, {.i64 = 256}, 2, 1024, DYNAMIC },
-+
-+#if FF_API_LIBPLACEBO_OPTS
- /* deprecated options for backwards compatibility, defaulting to -1 to not override the new defaults */
- { "desaturation_strength", "Desaturation strength", OFFSET(desat_str), AV_OPT_TYPE_FLOAT, {.dbl = -1.0}, -1.0, 1.0, DYNAMIC | AV_OPT_FLAG_DEPRECATED },
- { "desaturation_exponent", "Desaturation exponent", OFFSET(desat_exp), AV_OPT_TYPE_FLOAT, {.dbl = -1.0}, -1.0, 10.0, DYNAMIC | AV_OPT_FLAG_DEPRECATED },
- { "gamut_warning", "Highlight out-of-gamut colors", OFFSET(gamut_warning), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DYNAMIC | AV_OPT_FLAG_DEPRECATED },
- { "gamut_clipping", "Enable colorimetric gamut clipping", OFFSET(gamut_clipping), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DYNAMIC | AV_OPT_FLAG_DEPRECATED },
-+#endif
-
- { "dithering", "Dither method to use", OFFSET(dithering), AV_OPT_TYPE_INT, {.i64 = PL_DITHER_BLUE_NOISE}, -1, PL_DITHER_METHOD_COUNT - 1, DYNAMIC, "dither" },
- { "none", "Disable dithering", 0, AV_OPT_TYPE_CONST, {.i64 = -1}, 0, 0, STATIC, "dither" },
---
-2.39.2
-
diff --git a/0001-fftools-ffmpeg_filter-initialize-the-o-to-silence-th.patch b/0001-fftools-ffmpeg_filter-initialize-the-o-to-silence-th.patch
deleted file mode 100644
index 85b43a4..0000000
--- a/0001-fftools-ffmpeg_filter-initialize-the-o-to-silence-th.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From a0a0a804998da8d1a397479c9bafeb000e6be088 Mon Sep 17 00:00:00 2001
-From: Jun Zhao <barryjzhao@tencent.com>
-Date: Sat, 25 Feb 2023 21:54:00 +0800
-Subject: [PATCH] fftools/ffmpeg_filter: initialize the 'o' to silence the
- warning
-
-silence the warning: variable 'o' is used uninitialized whenever
-'&&' condition is false
-
-Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
----
- fftools/ffmpeg_filter.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
-index 1f5bbf6c4d..3504a3cc0a 100644
---- a/fftools/ffmpeg_filter.c
-+++ b/fftools/ffmpeg_filter.c
-@@ -362,7 +362,7 @@ fail:
-
- static int filter_opt_apply(AVFilterContext *f, const char *key, const char *val)
- {
-- const AVOption *o;
-+ const AVOption *o = NULL;
- int ret;
-
- ret = av_opt_set(f, key, val, AV_OPT_SEARCH_CHILDREN);
---
-2.41.0
-
diff --git a/0001-lavc-Makefile-build-vulkan-decode-code-if-vulkan_av1.patch b/0001-lavc-Makefile-build-vulkan-decode-code-if-vulkan_av1.patch
new file mode 100644
index 0000000..021aaae
--- /dev/null
+++ b/0001-lavc-Makefile-build-vulkan-decode-code-if-vulkan_av1.patch
@@ -0,0 +1,27 @@
+From b7c696af10784110844cc3dbe0ec21538393f309 Mon Sep 17 00:00:00 2001
+From: Lynne <dev@lynne.ee>
+Date: Sun, 3 Dec 2023 21:02:13 +0100
+Subject: [PATCH] lavc/Makefile: build vulkan decode code if vulkan_av1 has
+ been enabled
+
+Forgotten.
+---
+ libavcodec/Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libavcodec/Makefile b/libavcodec/Makefile
+index 748806e702..fd9883d2ca 100644
+--- a/libavcodec/Makefile
++++ b/libavcodec/Makefile
+@@ -998,7 +998,7 @@ OBJS-$(CONFIG_AV1_DXVA2_HWACCEL) += dxva2_av1.o
+ OBJS-$(CONFIG_AV1_NVDEC_HWACCEL) += nvdec_av1.o
+ OBJS-$(CONFIG_AV1_VAAPI_HWACCEL) += vaapi_av1.o
+ OBJS-$(CONFIG_AV1_VDPAU_HWACCEL) += vdpau_av1.o
+-OBJS-$(CONFIG_AV1_VULKAN_HWACCEL) += vulkan_av1.o
++OBJS-$(CONFIG_AV1_VULKAN_HWACCEL) += vulkan_decode.o vulkan_av1.o
+ OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o
+ OBJS-$(CONFIG_H263_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
+ OBJS-$(CONFIG_H264_D3D11VA_HWACCEL) += dxva2_h264.o
+--
+2.43.0
+
diff --git a/FFmpeg-devel-v10-Support-enhanced-flv-in-FFmpeg.patch b/FFmpeg-devel-v10-Support-enhanced-flv-in-FFmpeg.patch
deleted file mode 100644
index 28ff7bb..0000000
--- a/FFmpeg-devel-v10-Support-enhanced-flv-in-FFmpeg.patch
+++ /dev/null
@@ -1,1230 +0,0 @@
-From patchwork Mon May 15 08:31:56 2023
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-X-Patchwork-Submitter: Steven Liu <lq@chinaffmpeg.org>
-X-Patchwork-Id: 41615
-Delivered-To: ffmpegpatchwork2@gmail.com
-Received: by 2002:a05:6a20:ba91:b0:105:feb:71f2 with SMTP id
- fb17csp1443896pzb;
- Mon, 15 May 2023 01:33:01 -0700 (PDT)
-X-Google-Smtp-Source:
- ACHHUZ69PgG6fq/KF6IIeKoVV29fkg7cAJfmPD3LnnTmI9YYVAPo/alZm7B+7f+FoOgn9rHdYUo5
-X-Received: by 2002:a17:907:97cb:b0:96a:4654:9a57 with SMTP id
- js11-20020a17090797cb00b0096a46549a57mr16869758ejc.54.1684139580951;
- Mon, 15 May 2023 01:33:00 -0700 (PDT)
-ARC-Seal: i=1; a=rsa-sha256; t=1684139580; cv=none;
- d=google.com; s=arc-20160816;
- b=iOREUkvWDLqSJl40trM7wg3ufEQ23FOBLjpslXsds5HWyK48b/76lFgQwRfHJbHqbh
- vc4N6DopB5msRi0VK/pJnDAdtuyQR2tqEgLvbZpHJzjK1zHUKRV5JHlmVhNvQOfYWpMR
- VL/1OMmbTctEza2Z7/VYsrVLHLy4QOlLh4w/JdRcx/7rhiOA1ixpMxC4qUb5IGMhnqen
- P2dDbAoqdmGUZtmA4VOfxkgkHnIaeFv+UffJGIZs1Lyb7c3zytwdpLLiezRzVLWQaStW
- TVdcDk45pOrA29lZ46Tq8YNJP7O5zfSevFIqrB85mUjSNoyZi24gz19yxJa/09O1qb+o
- thzw==
-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:feedback-id:mime-version:references
- :in-reply-to:message-id:date:to:from:delivered-to;
- bh=Qg7uugO6uqQCX67+SdNELVYF39/WDPRDFt1+H7toQ+s=;
- b=b1cxdqSVG1Oc157HlNUA+LfJhknU/nr3g5wnSLXmP7DrR+RQp2CFwGfjV+wTkfWLok
- WydumkYG2biOpmhMi+mG4ci5WvU2R9bv1qpKGreRpsImGmjubQxu5CC9gwmenz3c+1v8
- pu+qkw142w9uMerjOpaw6oWvaHq9hWGVy6Uni33AqMJhfj9WqSwBCezk62krxzBar/VN
- XNbzzpAMIuXcj0DcHS70oDHOTbtLq4uDLGpkQwnBpYbswfGD0h8N+B+BSCs3ZqN/l5Jc
- juIQY4i3ja2W1yHm6Zlze2qU8lFRPzRwVBZBv9vro88VyFic0UZx9wRuIqJB9BZIb0h/
- vkiA==
-ARC-Authentication-Results: i=1; mx.google.com;
- 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: <ffmpeg-devel-bounces@ffmpeg.org>
-Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100])
- by mx.google.com with ESMTP id
- gt37-20020a1709072da500b0096b1c38458dsi2828116ejc.409.2023.05.15.01.33.00;
- Mon, 15 May 2023 01:33:00 -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;
- 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 D930568BE0C;
- Mon, 15 May 2023 11:32:57 +0300 (EEST)
-X-Original-To: ffmpeg-devel@ffmpeg.org
-Delivered-To: ffmpeg-devel@ffmpeg.org
-Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.155.67.158])
- by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 522F7680274
- for <ffmpeg-devel@ffmpeg.org>; Mon, 15 May 2023 11:32:49 +0300 (EEST)
-X-QQ-mid: bizesmtp68t1684139564tg642pbl
-Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with
- id ; Mon, 15 May 2023 16:32:42 +0800 (CST)
-X-QQ-SSF: 01100000000000Z0Z000000A0000000
-X-QQ-FEAT: nCMT0YKS3i1MU7IXSsiS1Rwde6i/4Rq2kuPO2PoXw3OvtJB24MU+Y2GwdEg4Y
- pg0ZfSggM3VBmRCkHI3ioSOH2mvVyYG9LgwhhyfixPaFItcpF4EF6xoZepQpa1H5v1BDi7s
- iwCwF3shgH8dl96iJKKryT4TtjUTnYRoRhCPtLCGfUthaM/R44xdqxRvjDqIVn1BUMb5GPu
- DMuaskzO8QQCFxvduUvovkXjJc5v17Krm2lf945Tmm/pIpV/qLjAgAhYHqOoxrgBGHZDYWY
- 0XeS7RvYkKTR24z9m9Sk75veOTKtFzksnbLJYkIDYj+voAd1djXPJWtuB2elhm/DIa9+5lW
- 2DnKrJ/Bb2Ok13ggXoC600jHcxkLbuOqDuK5k5Dhub7ECOTPJythkMV+FYQCw==
-X-QQ-GoodBg: 0
-X-BIZMAIL-ID: 14547348156280638791
-From: Steven Liu <lq@chinaffmpeg.org>
-To: ffmpeg-devel@ffmpeg.org
-Date: Mon, 15 May 2023 16:31:56 +0800
-Message-Id: <20230515083201.48201-2-lq@chinaffmpeg.org>
-X-Mailer: git-send-email 2.40.0
-In-Reply-To: <20230515083201.48201-1-lq@chinaffmpeg.org>
-References:
- <CAEg-Je-vYD97KnbaqTkK5=UJ9T3htmtH3Qykcwo3+rNCx=w+jQ@mail.gmail.com>
- <20230515083201.48201-1-lq@chinaffmpeg.org>
-MIME-Version: 1.0
-X-QQ-SENDSIZE: 520
-Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3
-Subject: [FFmpeg-devel] [PATCH v10 1/6] avformat/flvenc: support mux hevc in
- enhanced flv
-X-BeenThere: ffmpeg-devel@ffmpeg.org
-X-Mailman-Version: 2.1.29
-Precedence: list
-List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
-List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
-List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
-List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
-List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
-List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
-Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
-Cc: Steven Liu <lq@chinaffmpeg.org>
-Errors-To: ffmpeg-devel-bounces@ffmpeg.org
-Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
-X-TUID: WUhHC4/dXuk+
-
-Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
----
- libavformat/Makefile | 2 +-
- libavformat/flv.h | 15 +++++++++++++++
- libavformat/flvenc.c | 38 +++++++++++++++++++++++++++++---------
- 3 files changed, 45 insertions(+), 10 deletions(-)
-
-diff --git a/libavformat/Makefile b/libavformat/Makefile
-index f8ad7c6a11..1ef3d15467 100644
---- a/libavformat/Makefile
-+++ b/libavformat/Makefile
-@@ -214,7 +214,7 @@ OBJS-$(CONFIG_FLAC_MUXER) += flacenc.o flacenc_header.o \
- OBJS-$(CONFIG_FLIC_DEMUXER) += flic.o
- OBJS-$(CONFIG_FLV_DEMUXER) += flvdec.o
- OBJS-$(CONFIG_LIVE_FLV_DEMUXER) += flvdec.o
--OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o
-+OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o
- OBJS-$(CONFIG_FOURXM_DEMUXER) += 4xm.o
- OBJS-$(CONFIG_FRAMECRC_MUXER) += framecrcenc.o framehash.o
- OBJS-$(CONFIG_FRAMEHASH_MUXER) += hashenc.o framehash.o
-diff --git a/libavformat/flv.h b/libavformat/flv.h
-index 3571b90279..91e0a4140c 100644
---- a/libavformat/flv.h
-+++ b/libavformat/flv.h
-@@ -35,6 +35,12 @@
-
- #define FLV_VIDEO_FRAMETYPE_OFFSET 4
-
-+/* Extended VideoTagHeader
-+ * defined in reference link:
-+ * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
-+ * */
-+#define FLV_IS_EX_HEADER 0x80
-+
- /* bitmasks to isolate specific values */
- #define FLV_AUDIO_CHANNEL_MASK 0x01
- #define FLV_AUDIO_SAMPLESIZE_MASK 0x02
-@@ -112,6 +118,15 @@ enum {
- FLV_CODECID_MPEG4 = 9,
- };
-
-+enum {
-+ PacketTypeSequenceStart = 0,
-+ PacketTypeCodedFrames = 1,
-+ PacketTypeSequenceEnd = 2,
-+ PacketTypeCodedFramesX = 3,
-+ PacketTypeMetadata = 4,
-+ PacketTypeMPEG2TSSequenceStart = 5,
-+};
-+
- enum {
- FLV_FRAME_KEY = 1 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< key frame (for AVC, a seekable frame)
- FLV_FRAME_INTER = 2 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< inter frame (for AVC, a non-seekable frame)
-diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
-index 721f062811..35e198fa15 100644
---- a/libavformat/flvenc.c
-+++ b/libavformat/flvenc.c
-@@ -28,6 +28,7 @@
- #include "libavcodec/mpeg4audio.h"
- #include "avio.h"
- #include "avc.h"
-+#include "hevc.h"
- #include "avformat.h"
- #include "flv.h"
- #include "internal.h"
-@@ -46,6 +47,7 @@ static const AVCodecTag flv_video_codec_ids[] = {
- { AV_CODEC_ID_VP6, FLV_CODECID_VP6 },
- { AV_CODEC_ID_VP6A, FLV_CODECID_VP6A },
- { AV_CODEC_ID_H264, FLV_CODECID_H264 },
-+ { AV_CODEC_ID_HEVC, MKBETAG('h', 'v', 'c', '1') },
- { AV_CODEC_ID_NONE, 0 }
- };
-
-@@ -489,7 +491,7 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
- FLVContext *flv = s->priv_data;
-
- if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264
-- || par->codec_id == AV_CODEC_ID_MPEG4) {
-+ || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) {
- int64_t pos;
- avio_w8(pb,
- par->codec_type == AVMEDIA_TYPE_VIDEO ?
-@@ -532,10 +534,19 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
- }
- avio_write(pb, par->extradata, par->extradata_size);
- } else {
-- avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags
-- avio_w8(pb, 0); // AVC sequence header
-- avio_wb24(pb, 0); // composition time
-- ff_isom_write_avcc(pb, par->extradata, par->extradata_size);
-+ if (par->codec_id == AV_CODEC_ID_HEVC) {
-+ avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart); // ExVideoTagHeader mode with PacketTypeSequenceStart
-+ avio_write(pb, "hvc1", 4);
-+ } else {
-+ avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags
-+ avio_w8(pb, 0); // AVC sequence header
-+ avio_wb24(pb, 0); // composition time
-+ }
-+
-+ if (par->codec_id == AV_CODEC_ID_HEVC)
-+ ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0);
-+ else
-+ ff_isom_write_avcc(pb, par->extradata, par->extradata_size);
- }
- data_size = avio_tell(pb) - pos;
- avio_seek(pb, -data_size - 10, SEEK_CUR);
-@@ -832,13 +843,13 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
- if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A ||
- par->codec_id == AV_CODEC_ID_VP6 || par->codec_id == AV_CODEC_ID_AAC)
- flags_size = 2;
-- else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4)
-+ else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC)
- flags_size = 5;
- else
- flags_size = 1;
-
- if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264
-- || par->codec_id == AV_CODEC_ID_MPEG4) {
-+ || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) {
- size_t side_size;
- uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size);
- if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) {
-@@ -858,7 +869,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
- "Packets are not in the proper order with respect to DTS\n");
- return AVERROR(EINVAL);
- }
-- if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) {
-+ if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) {
- if (pkt->pts == AV_NOPTS_VALUE) {
- av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n");
- return AVERROR(EINVAL);
-@@ -903,6 +914,10 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
- if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1)
- if ((ret = ff_avc_parse_nal_units_buf(pkt->data, &data, &size)) < 0)
- return ret;
-+ } else if (par->codec_id == AV_CODEC_ID_HEVC) {
-+ if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1)
-+ if ((ret = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL)) < 0)
-+ return ret;
- } else if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 &&
- (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) {
- if (!s->streams[pkt->stream_index]->nb_frames) {
-@@ -964,7 +979,12 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
- avio_wb32(pb, data_size + 11);
- } else {
- av_assert1(flags>=0);
-- avio_w8(pb,flags);
-+ if (par->codec_id == AV_CODEC_ID_HEVC) {
-+ avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFramesX); // ExVideoTagHeader mode with PacketTypeCodedFramesX
-+ avio_write(pb, "hvc1", 4);
-+ } else {
-+ avio_w8(pb, flags);
-+ }
- if (par->codec_id == AV_CODEC_ID_VP6)
- avio_w8(pb,0);
- if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A) {
-
-From patchwork Mon May 15 08:31:57 2023
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-X-Patchwork-Submitter: Steven Liu <lq@chinaffmpeg.org>
-X-Patchwork-Id: 41616
-Delivered-To: ffmpegpatchwork2@gmail.com
-Received: by 2002:a05:6a20:ba91:b0:105:feb:71f2 with SMTP id
- fb17csp1444123pzb;
- Mon, 15 May 2023 01:33:22 -0700 (PDT)
-X-Google-Smtp-Source:
- ACHHUZ4qSqnHARATYvNTOiXhMIIgGWUHo612wN3Ui1r3cYPQd57E+B9kiCRYijDhzgObKMKkDm54
-X-Received: by 2002:a17:907:6e8e:b0:94f:3521:396 with SMTP id
- sh14-20020a1709076e8e00b0094f35210396mr35740883ejc.23.1684139602011;
- Mon, 15 May 2023 01:33:22 -0700 (PDT)
-ARC-Seal: i=1; a=rsa-sha256; t=1684139601; cv=none;
- d=google.com; s=arc-20160816;
- b=EFJgx9cm5ew2+PIpTeHi7QCzos//oOs5q/HndQxc0+dHYlju5X4rVSACmfk9L0DH3j
- +cG0n2/3wAsguA1rC3B8a+qXkRfAXC1ropuhDwKCZCdw0Iv40Vm4JeHolEQWRni8Ko+F
- MhWY7AvxrX4GsO0pp4SfKsVFaJdo18dlpn+BUd9FX5N7V6lUTadQsVcJYJBd2B2MIRUi
- mJaEPp8WpRkiS92DgWhPzUC9ELnwrySnNL0mOo9DCd9cjFXQ9KXW6qjRoP0blbL8N2ws
- BlY2dJVmSM36n/GK9gZb+6fUg3xVufDUfdRr0m4jpa/ILD93/nwAZsqhk3k4j00se+CO
- 7Vrw==
-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:feedback-id:mime-version:references
- :in-reply-to:message-id:date:to:from:delivered-to;
- bh=ygUb60Tr5LbPnhiS1As+hL+qX45KII+ocpY9X3Jq4TI=;
- b=UpGhqbfo/+m9WW5qE92LKOdOlxkCWyy2QVqiXCjXpxepdDd0IKkhGqSspte9zJrUT8
- QWg8IiDK6JTnGnvp+hO6doZjhXc1GyyTx6cMQQX+2JzqTtbWF03S94GwBgmN/U2RIK9M
- f980SSgfNZRSJF5kJ+dO2ix4M5WIWhxEYB/MRzn/RbxAvYkwLNG1gMMBTNimogbFsXRo
- h5WgGxO4k8mx/x8PBrtNv1aPZ86FAcXC3Aieao7aVnRDvWjepEus5jEfGu2QuqnvM2qK
- WIjUyFrppJL/crANtgR+tFcL8395bRGYObYtIBblUQ/g5ddHzjsaClJ/42r3h1vez39q
- nPjQ==
-ARC-Authentication-Results: i=1; mx.google.com;
- 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: <ffmpeg-devel-bounces@ffmpeg.org>
-Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100])
- by mx.google.com with ESMTP id
- v21-20020a1709060b5500b0095ec54a22bcsi10907595ejg.106.2023.05.15.01.33.21;
- Mon, 15 May 2023 01:33:21 -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;
- 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 D3F7668C092;
- Mon, 15 May 2023 11:33:18 +0300 (EEST)
-X-Original-To: ffmpeg-devel@ffmpeg.org
-Delivered-To: ffmpeg-devel@ffmpeg.org
-Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.155.67.158])
- by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8180368C004
- for <ffmpeg-devel@ffmpeg.org>; Mon, 15 May 2023 11:33:11 +0300 (EEST)
-X-QQ-mid: bizesmtp62t1684139585txhp32ou
-Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with
- id ; Mon, 15 May 2023 16:33:04 +0800 (CST)
-X-QQ-SSF: 01100000000000Z0Z000000A0000000
-X-QQ-FEAT: 6ArnuSDJ+inVC06MH1nrJeu56+35diptW3dCdHt3bMayFZoCyE8QyUO0QY9zm
- iY62JCSpSKYEK4ca2kpxkB99PI50FiWfNtzLDZ+VzUTy013GMpLwh1CWeVX5cF15RyEAIC9
- u3Ozg7IY8mv+GiDtf6FDgSyumE1D93qxV1R2sJ5v38V3NbNPcikg0aDxZXOlC+Hr+LdhsZi
- 4X5tDi3NovhpCf+8Wo+ZaejHOrE8MUcUGpbh8dHRew6dnmkdkK5ytSHSZEye8RsXZnMdp4A
- mqBZqIDGw1a4e04JAc/NDCs7qq4qthxMFB1skhaOv6DLcL+EqV2QFwnJn7V5Oof7BwfjaTG
- mEAVpiZDnQhFvOgHemH1v61Blub2nCnAurrGhGMaywIzFXT87aOSLCDlFprSg==
-X-QQ-GoodBg: 0
-X-BIZMAIL-ID: 11210839191292587357
-From: Steven Liu <lq@chinaffmpeg.org>
-To: ffmpeg-devel@ffmpeg.org
-Date: Mon, 15 May 2023 16:31:57 +0800
-Message-Id: <20230515083201.48201-3-lq@chinaffmpeg.org>
-X-Mailer: git-send-email 2.40.0
-In-Reply-To: <20230515083201.48201-1-lq@chinaffmpeg.org>
-References:
- <CAEg-Je-vYD97KnbaqTkK5=UJ9T3htmtH3Qykcwo3+rNCx=w+jQ@mail.gmail.com>
- <20230515083201.48201-1-lq@chinaffmpeg.org>
-MIME-Version: 1.0
-X-QQ-SENDSIZE: 520
-Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3
-Subject: [FFmpeg-devel] [PATCH v10 2/6] avformat/flvdec: support demux hevc
- in enhanced flv
-X-BeenThere: ffmpeg-devel@ffmpeg.org
-X-Mailman-Version: 2.1.29
-Precedence: list
-List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
-List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
-List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
-List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
-List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
-List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
-Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
-Cc: Steven Liu <lq@chinaffmpeg.org>
-Errors-To: ffmpeg-devel-bounces@ffmpeg.org
-Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
-X-TUID: SFsjHMHu2ISl
-
-Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
----
- libavformat/flvdec.c | 58 ++++++++++++++++++++++++++++++++++++++------
- 1 file changed, 50 insertions(+), 8 deletions(-)
-
-diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
-index d83edff727..c8e6cadf1c 100644
---- a/libavformat/flvdec.c
-+++ b/libavformat/flvdec.c
-@@ -79,6 +79,8 @@ typedef struct FLVContext {
- int64_t last_ts;
- int64_t time_offset;
- int64_t time_pos;
-+
-+ uint8_t exheader;
- } FLVContext;
-
- /* AMF date type */
-@@ -302,13 +304,25 @@ static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream,
- }
- }
-
--static int flv_same_video_codec(AVCodecParameters *vpar, int flags)
-+static int flv_same_video_codec(AVFormatContext *s, AVCodecParameters *vpar, int flags)
- {
- int flv_codecid = flags & FLV_VIDEO_CODECID_MASK;
-+ FLVContext *flv = s->priv_data;
-
- if (!vpar->codec_id && !vpar->codec_tag)
- return 1;
-
-+ if (flv->exheader) {
-+ uint8_t *codec_id_str = (uint8_t *)s->pb->buf_ptr;
-+ uint32_t codec_id = codec_id_str[3] | codec_id_str[2] << 8 | codec_id_str[1] << 16 | codec_id_str[0] << 24;
-+ switch(codec_id) {
-+ case MKBETAG('h', 'v', 'c', '1'):
-+ return vpar->codec_id == AV_CODEC_ID_HEVC;
-+ default:
-+ break;
-+ }
-+ }
-+
- switch (flv_codecid) {
- case FLV_CODECID_H263:
- return vpar->codec_id == AV_CODEC_ID_FLV1;
-@@ -331,9 +345,24 @@ static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream,
- int flv_codecid, int read)
- {
- FFStream *const vstreami = ffstream(vstream);
-+ FLVContext *flv = s->priv_data;
- int ret = 0;
- AVCodecParameters *par = vstream->codecpar;
- enum AVCodecID old_codec_id = vstream->codecpar->codec_id;
-+ flv_codecid &= FLV_VIDEO_CODECID_MASK;
-+
-+ if (flv->exheader) {
-+ uint32_t codec_id = avio_rb32(s->pb);
-+
-+ switch(codec_id) {
-+ case MKBETAG('h', 'v', 'c', '1'):
-+ par->codec_id = AV_CODEC_ID_HEVC;
-+ vstreami->need_parsing = AVSTREAM_PARSE_HEADERS;
-+ return 4;
-+ default:
-+ break;
-+ }
-+ }
- switch (flv_codecid) {
- case FLV_CODECID_H263:
- par->codec_id = AV_CODEC_ID_FLV1;
-@@ -796,6 +825,7 @@ static int flv_read_header(AVFormatContext *s)
- s->start_time = 0;
- flv->sum_flv_tag_size = 0;
- flv->last_keyframe_stream_index = -1;
-+ flv->exheader = 0;
-
- return 0;
- }
-@@ -1071,6 +1101,11 @@ retry:
- } else if (type == FLV_TAG_TYPE_VIDEO) {
- stream_type = FLV_STREAM_TYPE_VIDEO;
- flags = avio_r8(s->pb);
-+ /*
-+ * Reference Enhancing FLV 2023-03-v1.0.0-B.8
-+ * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
-+ * */
-+ flv->exheader = (flags >> 7) & 1;
- size--;
- if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_VIDEO_INFO_CMD)
- goto skip;
-@@ -1129,7 +1164,7 @@ skip:
- break;
- } else if (stream_type == FLV_STREAM_TYPE_VIDEO) {
- if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
-- (s->video_codec_id || flv_same_video_codec(st->codecpar, flags)))
-+ (s->video_codec_id || flv_same_video_codec(s, st->codecpar, flags)))
- break;
- } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) {
- if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
-@@ -1230,7 +1265,7 @@ retry_duration:
- avcodec_parameters_free(&par);
- }
- } else if (stream_type == FLV_STREAM_TYPE_VIDEO) {
-- int ret = flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK, 1);
-+ int ret = flv_set_video_codec(s, st, flags, 1);
- if (ret < 0)
- return ret;
- size -= ret;
-@@ -1242,16 +1277,23 @@ retry_duration:
-
- if (st->codecpar->codec_id == AV_CODEC_ID_AAC ||
- st->codecpar->codec_id == AV_CODEC_ID_H264 ||
-- st->codecpar->codec_id == AV_CODEC_ID_MPEG4) {
-- int type = avio_r8(s->pb);
-- size--;
-+ st->codecpar->codec_id == AV_CODEC_ID_MPEG4 ||
-+ st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
-+ int type = 0;
-+ if (flv->exheader && stream_type == FLV_STREAM_TYPE_VIDEO) {
-+ type = flags & 0x0F;
-+ } else {
-+ type = avio_r8(s->pb);
-+ size--;
-+ }
-
- if (size < 0) {
- ret = AVERROR_INVALIDDATA;
- goto leave;
- }
-
-- if (st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_MPEG4) {
-+ if (st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_MPEG4 ||
-+ (st->codecpar->codec_id == AV_CODEC_ID_HEVC && type == PacketTypeCodedFrames)) {
- // sign extension
- int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000;
- pts = av_sat_add64(dts, cts);
-@@ -1267,7 +1309,7 @@ retry_duration:
- }
- }
- if (type == 0 && (!st->codecpar->extradata || st->codecpar->codec_id == AV_CODEC_ID_AAC ||
-- st->codecpar->codec_id == AV_CODEC_ID_H264)) {
-+ st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC)) {
- AVDictionaryEntry *t;
-
- if (st->codecpar->extradata) {
-
-From patchwork Mon May 15 08:31:58 2023
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-X-Patchwork-Submitter: Steven Liu <lq@chinaffmpeg.org>
-X-Patchwork-Id: 41617
-Delivered-To: ffmpegpatchwork2@gmail.com
-Received: by 2002:a05:6a20:ba91:b0:105:feb:71f2 with SMTP id
- fb17csp1444209pzb;
- Mon, 15 May 2023 01:33:31 -0700 (PDT)
-X-Google-Smtp-Source:
- ACHHUZ5N/MWld9fXzokkRVS1e13AYakkRyH/RvyBiJ7xA512EWdWgrGE4ferugcTRoHNahvjayC9
-X-Received: by 2002:a17:907:9724:b0:96a:1260:dbf5 with SMTP id
- jg36-20020a170907972400b0096a1260dbf5mr18082554ejc.45.1684139611447;
- Mon, 15 May 2023 01:33:31 -0700 (PDT)
-ARC-Seal: i=1; a=rsa-sha256; t=1684139611; cv=none;
- d=google.com; s=arc-20160816;
- b=op6Xl3YinOSd8d/Ya4YpQjHSbJx0t7fHaCHvvqvkJgTbKfjmTJjDFsMWkeT/ceA1lA
- xV9Y1JGrAlZmudpgaJtXHukLJessnBrqaBy5gm0lX6bJ0X4AKJt/F7GB3FR3OPISq79w
- 7djeHUx2VAxfWn1awCcFrcyyMPrGB2GPMdoXxcUVmySNNK0ohuroQ2JhVRajwj0sIBFg
- f0pu7vXX9ct499tFl5rHEd//2Xl3rY6kNHfPlMOcJEclT+35TUaTWE88+rJODaiMArcZ
- RaFK8xqfAOJjw0X9t6YiwBk1Kl/sFKEj71Fxu5khg7IvhF7kzRDSZXLCkKW9UvPYhGOl
- 25Bw==
-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:feedback-id:mime-version:references
- :in-reply-to:message-id:date:to:from:delivered-to;
- bh=0O0kUGD5r8lgXEiC2RUfiZ1ccVRPd03lWds0dqdVEq0=;
- b=OAvZATeoNq/BI3pJd21Xz2nKh+ZI8Zkofe4Ob6USu1ZEOyZzK2xxgtxL6SjJAxecG6
- NfECg8e13DLbnVAB5OnMK8TY/HV/4N/iqPksn6PbJSkCyafRqg477+SRs7tOl89c3isr
- Cp8o+j7t+gW2fkV9Y6L8MZa9etJpusa0LYXVBLPDs+tHNgXNec9UTA1YnoSyMqErrh58
- chMh6B6P+5aRcKrBfKZY1F8WAzMjphdQ78c3YZ+ikgGfkoPgRKTEUq+xQAMm7UXirMcn
- qtndeDiQypN1eg7LiEbAsLhj7K2jibIlDmwUk+6JDE1ASz05FViAbk3nFfWydNP8iUlh
- z+CQ==
-ARC-Authentication-Results: i=1; mx.google.com;
- 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: <ffmpeg-devel-bounces@ffmpeg.org>
-Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100])
- by mx.google.com with ESMTP id
- rv22-20020a17090710d600b00965e8c67d7dsi11399192ejb.285.2023.05.15.01.33.31;
- Mon, 15 May 2023 01:33:31 -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;
- 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 CAF3668C08B;
- Mon, 15 May 2023 11:33:22 +0300 (EEST)
-X-Original-To: ffmpeg-devel@ffmpeg.org
-Delivered-To: ffmpeg-devel@ffmpeg.org
-Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.155.67.158])
- by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5613068C08B
- for <ffmpeg-devel@ffmpeg.org>; Mon, 15 May 2023 11:33:16 +0300 (EEST)
-X-QQ-mid: bizesmtp62t1684139591t5vf5iss
-Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with
- id ; Mon, 15 May 2023 16:33:09 +0800 (CST)
-X-QQ-SSF: 01100000000000Z0Z000000A0000000
-X-QQ-FEAT: 0VYWLLCf4rd8sf4B0xdI45yO9pa7cA5LkUN5r8jryl/9HUTcEOcDnq6sEFLpU
- pZ/JnwSIqfqFtRB8Bq8+032WcwZIBdGWmOUpIZLcDlBPHVtS9YwSO56p7te0932mhQHQVWr
- 2MJ60EhPcxfhXG3M89QSysYDgLjUIRbb/cP/Br05mCJ05c+Q4NzWwlRwweOG0lUJ4aMNli9
- i3Qf8lSAK8hK3JWYZP0Fg66JaFkZvw6Yz6N4ESVf4Vp85rwWKPfpBz538IiCze/ePbVgZWB
- zvbU1mVAkapT05cTLyqAlv7tefflgoYcrW79Z+Opy2wSYDZLpCkRIe+w4yWG7eCg71dUgnc
- 79D+MVyHSJjuXS/sQLaeFanS1V55WK4izy9J/bFHdSprmySwmpk8hf5zhIZOQ==
-X-QQ-GoodBg: 0
-X-BIZMAIL-ID: 5377996165340525619
-From: Steven Liu <lq@chinaffmpeg.org>
-To: ffmpeg-devel@ffmpeg.org
-Date: Mon, 15 May 2023 16:31:58 +0800
-Message-Id: <20230515083201.48201-4-lq@chinaffmpeg.org>
-X-Mailer: git-send-email 2.40.0
-In-Reply-To: <20230515083201.48201-1-lq@chinaffmpeg.org>
-References:
- <CAEg-Je-vYD97KnbaqTkK5=UJ9T3htmtH3Qykcwo3+rNCx=w+jQ@mail.gmail.com>
- <20230515083201.48201-1-lq@chinaffmpeg.org>
-MIME-Version: 1.0
-X-QQ-SENDSIZE: 520
-Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3
-Subject: [FFmpeg-devel] [PATCH v10 3/6] avformat/flvenc: support mux av1 in
- enhanced flv
-X-BeenThere: ffmpeg-devel@ffmpeg.org
-X-Mailman-Version: 2.1.29
-Precedence: list
-List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
-List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
-List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
-List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
-List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
-List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
-Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
-Cc: Steven Liu <lq@chinaffmpeg.org>
-Errors-To: ffmpeg-devel-bounces@ffmpeg.org
-Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
-X-TUID: dRfPdsIvexzh
-
-Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
----
- libavformat/Makefile | 2 +-
- libavformat/flvenc.c | 22 ++++++++++++++++++----
- 2 files changed, 19 insertions(+), 5 deletions(-)
-
-diff --git a/libavformat/Makefile b/libavformat/Makefile
-index 1ef3d15467..c868e1626c 100644
---- a/libavformat/Makefile
-+++ b/libavformat/Makefile
-@@ -214,7 +214,7 @@ OBJS-$(CONFIG_FLAC_MUXER) += flacenc.o flacenc_header.o \
- OBJS-$(CONFIG_FLIC_DEMUXER) += flic.o
- OBJS-$(CONFIG_FLV_DEMUXER) += flvdec.o
- OBJS-$(CONFIG_LIVE_FLV_DEMUXER) += flvdec.o
--OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o
-+OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o av1.o
- OBJS-$(CONFIG_FOURXM_DEMUXER) += 4xm.o
- OBJS-$(CONFIG_FRAMECRC_MUXER) += framecrcenc.o framehash.o
- OBJS-$(CONFIG_FRAMEHASH_MUXER) += hashenc.o framehash.o
-diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
-index 35e198fa15..c1784b332d 100644
---- a/libavformat/flvenc.c
-+++ b/libavformat/flvenc.c
-@@ -28,6 +28,7 @@
- #include "libavcodec/mpeg4audio.h"
- #include "avio.h"
- #include "avc.h"
-+#include "av1.h"
- #include "hevc.h"
- #include "avformat.h"
- #include "flv.h"
-@@ -48,6 +49,7 @@ static const AVCodecTag flv_video_codec_ids[] = {
- { AV_CODEC_ID_VP6A, FLV_CODECID_VP6A },
- { AV_CODEC_ID_H264, FLV_CODECID_H264 },
- { AV_CODEC_ID_HEVC, MKBETAG('h', 'v', 'c', '1') },
-+ { AV_CODEC_ID_AV1, MKBETAG('a', 'v', '0', '1') },
- { AV_CODEC_ID_NONE, 0 }
- };
-
-@@ -491,7 +493,8 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
- FLVContext *flv = s->priv_data;
-
- if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264
-- || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) {
-+ || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC
-+ || par->codec_id == AV_CODEC_ID_AV1) {
- int64_t pos;
- avio_w8(pb,
- par->codec_type == AVMEDIA_TYPE_VIDEO ?
-@@ -537,6 +540,9 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
- if (par->codec_id == AV_CODEC_ID_HEVC) {
- avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart); // ExVideoTagHeader mode with PacketTypeSequenceStart
- avio_write(pb, "hvc1", 4);
-+ } else if (par->codec_id == AV_CODEC_ID_AV1) {
-+ avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart);
-+ avio_write(pb, "av01", 4);
- } else {
- avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags
- avio_w8(pb, 0); // AVC sequence header
-@@ -545,6 +551,8 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
-
- if (par->codec_id == AV_CODEC_ID_HEVC)
- ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0);
-+ else if (par->codec_id == AV_CODEC_ID_AV1)
-+ ff_isom_write_av1c(pb, par->extradata, par->extradata_size, 1);
- else
- ff_isom_write_avcc(pb, par->extradata, par->extradata_size);
- }
-@@ -843,13 +851,15 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
- if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A ||
- par->codec_id == AV_CODEC_ID_VP6 || par->codec_id == AV_CODEC_ID_AAC)
- flags_size = 2;
-- else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC)
-+ else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 ||
-+ par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1)
- flags_size = 5;
- else
- flags_size = 1;
-
- if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264
-- || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) {
-+ || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC
-+ || par->codec_id == AV_CODEC_ID_AV1) {
- size_t side_size;
- uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size);
- if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) {
-@@ -869,7 +879,8 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
- "Packets are not in the proper order with respect to DTS\n");
- return AVERROR(EINVAL);
- }
-- if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) {
-+ if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 ||
-+ par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1) {
- if (pkt->pts == AV_NOPTS_VALUE) {
- av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n");
- return AVERROR(EINVAL);
-@@ -982,6 +993,9 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
- if (par->codec_id == AV_CODEC_ID_HEVC) {
- avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFramesX); // ExVideoTagHeader mode with PacketTypeCodedFramesX
- avio_write(pb, "hvc1", 4);
-+ } else if (par->codec_id == AV_CODEC_ID_AV1) {
-+ avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFrames);
-+ avio_write(pb, "av01", 4);
- } else {
- avio_w8(pb, flags);
- }
-
-From patchwork Mon May 15 08:31:59 2023
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-X-Patchwork-Submitter: Steven Liu <lq@chinaffmpeg.org>
-X-Patchwork-Id: 41618
-Delivered-To: ffmpegpatchwork2@gmail.com
-Received: by 2002:a05:6a20:ba91:b0:105:feb:71f2 with SMTP id
- fb17csp1444290pzb;
- Mon, 15 May 2023 01:33:41 -0700 (PDT)
-X-Google-Smtp-Source:
- ACHHUZ7k5HSYVpKlutDCH3BVN03oQ1eQ9NWjKwBebLGv5fK0d2qVGGgCtBo3XdEGlDTDUuvlDzRX
-X-Received: by 2002:a17:907:9347:b0:94f:322d:909c with SMTP id
- bv7-20020a170907934700b0094f322d909cmr26994118ejc.34.1684139620986;
- Mon, 15 May 2023 01:33:40 -0700 (PDT)
-ARC-Seal: i=1; a=rsa-sha256; t=1684139620; cv=none;
- d=google.com; s=arc-20160816;
- b=BBSgegXR1u0K767R9MAxQddt49hZNhDS+YgCHGYo0B07ClteK018739TK9tupVh7pK
- wuvk/gzkEpIZpf2I3LQnpaxvQx0ZnllSKyz+x+560wEVKkQw5tlwpgr4qA3m0ApBBmQR
- 2ZUu6WRpBnVeXJbT5n+ymITrLd1NVXLNPqoz7kL0iDML0b2iC9PqCoGRTHF6zJZFtCH2
- ZYUq4OdcbflvqqLBvKvSgEwuVof0bqDwD8kfq9noKTf7wrx5bcdIbq6XMYG1n6AnPq7R
- R+ekmhosFoZ7IgohAkj9k8j6l4ipCc6yVN2M8TN1TfTwRC01vzz+SRYOXZWLNb0eqZzh
- Zp2A==
-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:feedback-id:mime-version:references
- :in-reply-to:message-id:date:to:from:delivered-to;
- bh=J5hIt8/6l7983HWQOAGA1qy6mjWmMWu6DJ2RZRfJeuQ=;
- b=rX88kWHJtUiqnNutEQCOwUvfl5lV/FVHviaDHIsiatvB92XG71pgeFVXopTjJ+st3F
- lu+/rKnYKAVXFqF4WHMP6bu0VT5bFE2A9806gTD5Rf1D2yGVjKWRH8fhY6Jl2KhEhQA+
- Efc6fMZ2qZRmdx5S2INE2k+sY3zgWZsFkv2NDowFLnjnpmTGneVW82ybCbL06DRH7Jts
- wxWDfFfTqnp2VNwD0C462f5ogLB8cH7f9uoFviTovEYcXc8iLpHP38cJa3hdAuJg972S
- cgjJSuZUaQ38bqmw7th2MDkaFSzryck0wafneRdJUxyKG7ltbwk4hgAz89yzUB7nZeU6
- yucA==
-ARC-Authentication-Results: i=1; mx.google.com;
- 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: <ffmpeg-devel-bounces@ffmpeg.org>
-Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100])
- by mx.google.com with ESMTP id
- gv41-20020a1709072be900b00965f171543esi11575148ejc.148.2023.05.15.01.33.40;
- Mon, 15 May 2023 01:33:40 -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;
- 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 D65AD68C0A8;
- Mon, 15 May 2023 11:33:29 +0300 (EEST)
-X-Original-To: ffmpeg-devel@ffmpeg.org
-Delivered-To: ffmpeg-devel@ffmpeg.org
-Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.155.67.158])
- by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5AA6768C09F
- for <ffmpeg-devel@ffmpeg.org>; Mon, 15 May 2023 11:33:22 +0300 (EEST)
-X-QQ-mid: bizesmtp75t1684139596t4okf86m
-Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with
- id ; Mon, 15 May 2023 16:33:15 +0800 (CST)
-X-QQ-SSF: 01100000000000Z0Z000000A0000000
-X-QQ-FEAT: KvvwR/hcPA3wY6H84uX1Z4OhW9I2bQ1QV35znBz44h8GZ/oUuMaFpDcrT3dSg
- MUkTVTMEyhXhHNx2JIMxfw5+q/3TCUtvnKXsxLZtQsy/0Nq/y+p0xVsHJzQmM8CvbT6L6Q3
- OmxwvGAO6ljvI/iA+SXU+3+HUNyetDE8UTRW1ZGCtG9iJRbK9wXPoiAMzLepT2+CHGO2brq
- CwH6RA/e9/I4xOHLleywtC4oDlPuyHovxzzedsBTrXYic5tb0+D65abc6NjfHr7zrYD/DQu
- HY0NNweX9YP/jE8jJ0TPLhcx7wighw+KDFbYf+UcUuaPHhzfAZh2f6aplibzVuvV78OPq2S
- thQ/XeMGf/W9C/Oy4Eq145+G+pUQ7zx/OKY8Jj/33dmvwZkUr8=
-X-QQ-GoodBg: 0
-X-BIZMAIL-ID: 9530387995930120932
-From: Steven Liu <lq@chinaffmpeg.org>
-To: ffmpeg-devel@ffmpeg.org
-Date: Mon, 15 May 2023 16:31:59 +0800
-Message-Id: <20230515083201.48201-5-lq@chinaffmpeg.org>
-X-Mailer: git-send-email 2.40.0
-In-Reply-To: <20230515083201.48201-1-lq@chinaffmpeg.org>
-References:
- <CAEg-Je-vYD97KnbaqTkK5=UJ9T3htmtH3Qykcwo3+rNCx=w+jQ@mail.gmail.com>
- <20230515083201.48201-1-lq@chinaffmpeg.org>
-MIME-Version: 1.0
-X-QQ-SENDSIZE: 520
-Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3
-Subject: [FFmpeg-devel] [PATCH v10 4/6] avformat/flvdec: support demux av1
- in enhanced flv
-X-BeenThere: ffmpeg-devel@ffmpeg.org
-X-Mailman-Version: 2.1.29
-Precedence: list
-List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
-List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
-List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
-List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
-List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
-List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
-Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
-Cc: Steven Liu <lq@chinaffmpeg.org>
-Errors-To: ffmpeg-devel-bounces@ffmpeg.org
-Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
-X-TUID: MKqjViniwIy+
-
-Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
----
- libavformat/flvdec.c | 12 ++++++++++--
- 1 file changed, 10 insertions(+), 2 deletions(-)
-
-diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
-index c8e6cadf1c..a0362ff11c 100644
---- a/libavformat/flvdec.c
-+++ b/libavformat/flvdec.c
-@@ -318,6 +318,8 @@ static int flv_same_video_codec(AVFormatContext *s, AVCodecParameters *vpar, int
- switch(codec_id) {
- case MKBETAG('h', 'v', 'c', '1'):
- return vpar->codec_id == AV_CODEC_ID_HEVC;
-+ case MKBETAG('a', 'v', '0', '1'):
-+ return vpar->codec_id == AV_CODEC_ID_AV1;
- default:
- break;
- }
-@@ -359,6 +361,10 @@ static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream,
- par->codec_id = AV_CODEC_ID_HEVC;
- vstreami->need_parsing = AVSTREAM_PARSE_HEADERS;
- return 4;
-+ case MKBETAG('a', 'v', '0', '1'):
-+ par->codec_id = AV_CODEC_ID_AV1;
-+ vstreami->need_parsing = AVSTREAM_PARSE_HEADERS;
-+ return 4;
- default:
- break;
- }
-@@ -1278,7 +1284,8 @@ retry_duration:
- if (st->codecpar->codec_id == AV_CODEC_ID_AAC ||
- st->codecpar->codec_id == AV_CODEC_ID_H264 ||
- st->codecpar->codec_id == AV_CODEC_ID_MPEG4 ||
-- st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
-+ st->codecpar->codec_id == AV_CODEC_ID_HEVC ||
-+ st->codecpar->codec_id == AV_CODEC_ID_AV1) {
- int type = 0;
- if (flv->exheader && stream_type == FLV_STREAM_TYPE_VIDEO) {
- type = flags & 0x0F;
-@@ -1309,7 +1316,8 @@ retry_duration:
- }
- }
- if (type == 0 && (!st->codecpar->extradata || st->codecpar->codec_id == AV_CODEC_ID_AAC ||
-- st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC)) {
-+ st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC ||
-+ st->codecpar->codec_id == AV_CODEC_ID_AV1)) {
- AVDictionaryEntry *t;
-
- if (st->codecpar->extradata) {
-
-From patchwork Mon May 15 08:32:00 2023
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-X-Patchwork-Submitter: Steven Liu <lq@chinaffmpeg.org>
-X-Patchwork-Id: 41619
-Delivered-To: ffmpegpatchwork2@gmail.com
-Received: by 2002:a05:6a20:ba91:b0:105:feb:71f2 with SMTP id
- fb17csp1444532pzb;
- Mon, 15 May 2023 01:34:10 -0700 (PDT)
-X-Google-Smtp-Source:
- ACHHUZ4QlFqXMa0WNHK3Z3HLgPm2UskuQZX2wmbFhYm+ZL0BsDRPhLxJboG0YhDPFi999aVCQZE+
-X-Received: by 2002:a05:6402:14c3:b0:50d:fcfb:8633 with SMTP id
- f3-20020a05640214c300b0050dfcfb8633mr9613789edx.9.1684139650196;
- Mon, 15 May 2023 01:34:10 -0700 (PDT)
-ARC-Seal: i=1; a=rsa-sha256; t=1684139650; cv=none;
- d=google.com; s=arc-20160816;
- b=sjfm4xhTPqjGNyHlxS3/kMPilx13EB+7S0YxjOI5lR9MMg8Sy3KgL187C6tuZqUwoZ
- dJo7A3q41EK4WJyWTTUyqUOr8q8JPjbBTCJpVsERuMuMWpHrhQxvwEDibvfuDI0ZI2vK
- y5pqRZ23OMNZLCC+fsc85gQDKPgvkYZTYisSOsWVRiZQGl04TipfZE1Uza8R7ZEXRgdH
- ZW770YcfzVXmKKzralH4thSFhGfMZRpX7kj6oBtmpUco4Z6iu42o3iBTcaioGBzdWdPY
- KL94WAIaMnCyO1JJaUAJGzEcQTGhPbXUzG7JvmqEwSa168GBSEjQJ3qJc8oOr+UVWcvn
- HvaQ==
-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:feedback-id:mime-version:references
- :in-reply-to:message-id:date:to:from:delivered-to;
- bh=b1Sp5oqZAMwakI7a3Zvw4MdnKPyomZo8cXqDnyJamjg=;
- b=jcFJOli16NPqGPnMDcJVER3TEkWreNJ2Vu7711GhJhFkmXLNFhS2FUAoT9QBTy+JWm
- jxaBjiVvs1MMQ+a3k3yT7AzVSUMMDDSagiE/jWzQ+vBN9dr/jQOMtJWxwfm4oTbBc0/r
- GcHTgPKB2HvEiLOWaJ4CSfZcYBvosoew/IfPgKm06P2Btmc+faSXLCZ63nKEVTq7NCpx
- qllJPkFmvlwB/+soxN7nZgTzXm/uurSOBMajImRGPOZUOZQE1I5Tk8OtJXZP6QtlSvXT
- ZcglewhTYuHlAXbpT4sYyddMwKg9yPu6/Wmrol/wg3QpXPZ0lVtLeTozus/2UTISJrR5
- Lp3Q==
-ARC-Authentication-Results: i=1; mx.google.com;
- 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: <ffmpeg-devel-bounces@ffmpeg.org>
-Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100])
- by mx.google.com with ESMTP id
- f25-20020a056402151900b0050bd37278d9si11856925edw.435.2023.05.15.01.34.09;
- Mon, 15 May 2023 01:34:10 -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;
- 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 0DB6568C092;
- Mon, 15 May 2023 11:34:07 +0300 (EEST)
-X-Original-To: ffmpeg-devel@ffmpeg.org
-Delivered-To: ffmpeg-devel@ffmpeg.org
-Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.154.221.58])
- by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 96A14680274
- for <ffmpeg-devel@ffmpeg.org>; Mon, 15 May 2023 11:33:59 +0300 (EEST)
-X-QQ-mid: bizesmtp76t1684139634tg83beu0
-Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with
- id ; Mon, 15 May 2023 16:33:52 +0800 (CST)
-X-QQ-SSF: 01100000000000Z0Z000000A0000000
-X-QQ-FEAT: DWSCcwW/aQb83U5Bq9N00w3kkIuofNiUvlQbgR0sgGjFEas+vh7wXyRycFT/z
- w33SH7uNRX8lmP+8+iy6jQH/gsaQRVAau2z8K0utdx9GuZMvY0e5SZfB0zBfncb1NdBZJxB
- Ptvibavnj2rDlqrGLO9dvFEfmYj1K48HYp6rdjCb+xRPfyOtnct3Zq6ST7F1DxU1+Kmt8cw
- 2qVgeA79DNHm1JbcDzi/2W/SpzWHWk/jamN4cAQfKyP9B4AvMPaFd8kdl6akYbR0Q84H73M
- Pcx8UXz6iw4sCTSPFzf0zrsI4+shly9KFp4UESTfRbDEJ46pcyw8+6Uz+Q7w+7CRtPlOsms
- K6IAbcLwicf/v8Rm2nHdrNPotcaMgY5p7IqmkY/Y/b2feqKiAM=
-X-QQ-GoodBg: 0
-X-BIZMAIL-ID: 4611718483056789364
-From: Steven Liu <lq@chinaffmpeg.org>
-To: ffmpeg-devel@ffmpeg.org
-Date: Mon, 15 May 2023 16:32:00 +0800
-Message-Id: <20230515083201.48201-6-lq@chinaffmpeg.org>
-X-Mailer: git-send-email 2.40.0
-In-Reply-To: <20230515083201.48201-1-lq@chinaffmpeg.org>
-References:
- <CAEg-Je-vYD97KnbaqTkK5=UJ9T3htmtH3Qykcwo3+rNCx=w+jQ@mail.gmail.com>
- <20230515083201.48201-1-lq@chinaffmpeg.org>
-MIME-Version: 1.0
-X-QQ-SENDSIZE: 520
-Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3
-Subject: [FFmpeg-devel] [PATCH v10 5/6] avformat/flvenc: support mux vp9 in
- enhanced flv
-X-BeenThere: ffmpeg-devel@ffmpeg.org
-X-Mailman-Version: 2.1.29
-Precedence: list
-List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
-List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
-List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
-List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
-List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
-List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
-Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
-Cc: Steven Liu <lq@chinaffmpeg.org>
-Errors-To: ffmpeg-devel-bounces@ffmpeg.org
-Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
-X-TUID: appcyLUJeeFW
-
-Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
----
- libavformat/Makefile | 2 +-
- libavformat/flvenc.c | 22 ++++++++++++++--------
- 2 files changed, 15 insertions(+), 9 deletions(-)
-
-diff --git a/libavformat/Makefile b/libavformat/Makefile
-index c868e1626c..16cfe107ea 100644
---- a/libavformat/Makefile
-+++ b/libavformat/Makefile
-@@ -214,7 +214,7 @@ OBJS-$(CONFIG_FLAC_MUXER) += flacenc.o flacenc_header.o \
- OBJS-$(CONFIG_FLIC_DEMUXER) += flic.o
- OBJS-$(CONFIG_FLV_DEMUXER) += flvdec.o
- OBJS-$(CONFIG_LIVE_FLV_DEMUXER) += flvdec.o
--OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o av1.o
-+OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o av1.o vpcc.o
- OBJS-$(CONFIG_FOURXM_DEMUXER) += 4xm.o
- OBJS-$(CONFIG_FRAMECRC_MUXER) += framecrcenc.o framehash.o
- OBJS-$(CONFIG_FRAMEHASH_MUXER) += hashenc.o framehash.o
-diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
-index c1784b332d..475dd0bf44 100644
---- a/libavformat/flvenc.c
-+++ b/libavformat/flvenc.c
-@@ -29,6 +29,7 @@
- #include "avio.h"
- #include "avc.h"
- #include "av1.h"
-+#include "vpcc.h"
- #include "hevc.h"
- #include "avformat.h"
- #include "flv.h"
-@@ -50,6 +51,7 @@ static const AVCodecTag flv_video_codec_ids[] = {
- { AV_CODEC_ID_H264, FLV_CODECID_H264 },
- { AV_CODEC_ID_HEVC, MKBETAG('h', 'v', 'c', '1') },
- { AV_CODEC_ID_AV1, MKBETAG('a', 'v', '0', '1') },
-+ { AV_CODEC_ID_VP9, MKBETAG('v', 'p', '0', '9') },
- { AV_CODEC_ID_NONE, 0 }
- };
-
-@@ -494,7 +496,7 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
-
- if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264
- || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC
-- || par->codec_id == AV_CODEC_ID_AV1) {
-+ || par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) {
- int64_t pos;
- avio_w8(pb,
- par->codec_type == AVMEDIA_TYPE_VIDEO ?
-@@ -540,9 +542,9 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
- if (par->codec_id == AV_CODEC_ID_HEVC) {
- avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart); // ExVideoTagHeader mode with PacketTypeSequenceStart
- avio_write(pb, "hvc1", 4);
-- } else if (par->codec_id == AV_CODEC_ID_AV1) {
-+ } else if (par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) {
- avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart);
-- avio_write(pb, "av01", 4);
-+ avio_write(pb, par->codec_id == AV_CODEC_ID_AV1 ? "av01" : "vp09", 4);
- } else {
- avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags
- avio_w8(pb, 0); // AVC sequence header
-@@ -553,6 +555,8 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
- ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0);
- else if (par->codec_id == AV_CODEC_ID_AV1)
- ff_isom_write_av1c(pb, par->extradata, par->extradata_size, 1);
-+ else if (par->codec_id == AV_CODEC_ID_VP9)
-+ ff_isom_write_vpcc(s, pb, par->extradata, par->extradata_size, par);
- else
- ff_isom_write_avcc(pb, par->extradata, par->extradata_size);
- }
-@@ -852,14 +856,15 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
- par->codec_id == AV_CODEC_ID_VP6 || par->codec_id == AV_CODEC_ID_AAC)
- flags_size = 2;
- else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 ||
-- par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1)
-+ par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1 ||
-+ par->codec_id == AV_CODEC_ID_VP9)
- flags_size = 5;
- else
- flags_size = 1;
-
- if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264
- || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC
-- || par->codec_id == AV_CODEC_ID_AV1) {
-+ || par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) {
- size_t side_size;
- uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size);
- if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) {
-@@ -880,7 +885,8 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
- return AVERROR(EINVAL);
- }
- if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 ||
-- par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1) {
-+ par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1 ||
-+ par->codec_id == AV_CODEC_ID_VP9) {
- if (pkt->pts == AV_NOPTS_VALUE) {
- av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n");
- return AVERROR(EINVAL);
-@@ -993,9 +999,9 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
- if (par->codec_id == AV_CODEC_ID_HEVC) {
- avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFramesX); // ExVideoTagHeader mode with PacketTypeCodedFramesX
- avio_write(pb, "hvc1", 4);
-- } else if (par->codec_id == AV_CODEC_ID_AV1) {
-+ } else if (par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) {
- avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFrames);
-- avio_write(pb, "av01", 4);
-+ avio_write(pb, par->codec_id == AV_CODEC_ID_AV1 ? "av01" : "vp09", 4);
- } else {
- avio_w8(pb, flags);
- }
-
-From patchwork Mon May 15 08:32:01 2023
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-X-Patchwork-Submitter: Steven Liu <lq@chinaffmpeg.org>
-X-Patchwork-Id: 41620
-Delivered-To: ffmpegpatchwork2@gmail.com
-Received: by 2002:a05:6a20:ba91:b0:105:feb:71f2 with SMTP id
- fb17csp1444616pzb;
- Mon, 15 May 2023 01:34:19 -0700 (PDT)
-X-Google-Smtp-Source:
- ACHHUZ4K6eOJwwn7jPfy0dhTP4IQr2XzDB8PfB7Er6aQtrCrxnddiRIgdBqZB72dHhyqfbILXd5E
-X-Received: by 2002:a17:906:ee8e:b0:95e:c549:9ace with SMTP id
- wt14-20020a170906ee8e00b0095ec5499acemr28082182ejb.62.1684139659496;
- Mon, 15 May 2023 01:34:19 -0700 (PDT)
-ARC-Seal: i=1; a=rsa-sha256; t=1684139659; cv=none;
- d=google.com; s=arc-20160816;
- b=FM9SQbkYmqWaOAa8YRKsdoj3BSoNN/SsDqXgEaRL8lCygJuahCT1ybocV1IqmUSTxS
- l5AcUJGbZbl2BeNhK5mX43aCfKBSSF3DLhmRCMBC8pU2iPmv7TuSV58kRfLY6r83j8Ic
- dV56QUYYtN+Ve0BWnaHFOzivSNAgHxwePstQL043LHD2rn+B5CyNvq7l2CahnhMJ8JUG
- zJNSBe/LFF0Lhkymqd877vkJ+x+UjSWEIdomIJdAcAt2D06jDxwIF/nnLDDHmvQeny2N
- 8xqssE401QcYCq6GtRi0UTAyMrYiDU4RUPOh8Kjb5YoMXYpbI+BCsr6VJlh6/F6cFD58
- YStw==
-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:feedback-id:mime-version:references
- :in-reply-to:message-id:date:to:from:delivered-to;
- bh=JCKfqtynP85UyN4OG5PQuC2GOM45EC75rPa/TN9Pkis=;
- b=MF78hg+0KkjUNq5Bjz6b4rjcJDJqrFufWHhDWzKgWCGo15fvnVg3UY8PDvpsUYxxSA
- SXQJP1urvuxLvJ9m6N20/mBCgrN9Cqca537oiWWNbayAOBLuihXPNDPZLqYgD9yg+03U
- Qo46rKs8BxkuzTKsqfFu1cf8b3qgqp2wt2mOFFnRU8p9J5foA5HCpHoEB1SWo8KqKjqz
- NeFoyh4k/CHk8Qy2rhQ/ahuNo0zByXEVuGqBEK1GakW8bC6DpX/gX9PnsE7BvpOrO/+z
- iEJxUd1RyUFDRETjdcqfLeRlEBO0NbFi9GTRjg0oY7m2OM8gh9zw7TIOoKfKaCVepa+1
- zs+g==
-ARC-Authentication-Results: i=1; mx.google.com;
- 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: <ffmpeg-devel-bounces@ffmpeg.org>
-Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100])
- by mx.google.com with ESMTP id
- f21-20020a170906825500b00965c55c71d9si10492876ejx.988.2023.05.15.01.34.19;
- Mon, 15 May 2023 01:34: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;
- 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 3486468C072;
- Mon, 15 May 2023 11:34:13 +0300 (EEST)
-X-Original-To: ffmpeg-devel@ffmpeg.org
-Delivered-To: ffmpeg-devel@ffmpeg.org
-Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.154.221.58])
- by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6482B68C0A0
- for <ffmpeg-devel@ffmpeg.org>; Mon, 15 May 2023 11:34:05 +0300 (EEST)
-X-QQ-mid: bizesmtp71t1684139639tsfp6osq
-Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with
- id ; Mon, 15 May 2023 16:33:58 +0800 (CST)
-X-QQ-SSF: 01100000000000Z0Z000000A0000000
-X-QQ-FEAT: v2TBAhtyi5HmOI8RH62YXWVaml0uNXxcsJwtXrqVzXdpJwJpkYcpKS0jOn5b8
- vputCYK1FNClBNOmv9AzELjT/K26cFOsUYKBpAudrf8Al/Kmwl8CjyT6nDK06QByrHu67A4
- sX8VQrazIXO6ZPIrfA9ElusXtssmR22e8ju0nXX7oNy/AS4t0bZkuJRVmYCoHSCnLqnvF9r
- YboVdmg0ZbLovrXBy26bgQr944G/tQRTeAGorAwE61Lf9tqlRKuT8TO8/BA/V7zBuaZTSxA
- nghl61awPoduY4vd9Nepw43V2Cun4wfPTvAMJn9EQhrdUge4sIN0Q4EuWkBd9dC/nTOwVKV
- WsjLxbyL6apFe08XmyeS9MDJkL+bFN3ykpDJqblBg8C1AYOjVyYFS2Yt/atcQ==
-X-QQ-GoodBg: 0
-X-BIZMAIL-ID: 14221595051603022987
-From: Steven Liu <lq@chinaffmpeg.org>
-To: ffmpeg-devel@ffmpeg.org
-Date: Mon, 15 May 2023 16:32:01 +0800
-Message-Id: <20230515083201.48201-7-lq@chinaffmpeg.org>
-X-Mailer: git-send-email 2.40.0
-In-Reply-To: <20230515083201.48201-1-lq@chinaffmpeg.org>
-References:
- <CAEg-Je-vYD97KnbaqTkK5=UJ9T3htmtH3Qykcwo3+rNCx=w+jQ@mail.gmail.com>
- <20230515083201.48201-1-lq@chinaffmpeg.org>
-MIME-Version: 1.0
-X-QQ-SENDSIZE: 520
-Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3
-Subject: [FFmpeg-devel] [PATCH v10 6/6] avformat/flvdec: support demux vp9
- in enhanced flv
-X-BeenThere: ffmpeg-devel@ffmpeg.org
-X-Mailman-Version: 2.1.29
-Precedence: list
-List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
-List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
-List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
-List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
-List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
-List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
- <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
-Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
-Cc: Steven Liu <lq@chinaffmpeg.org>
-Errors-To: ffmpeg-devel-bounces@ffmpeg.org
-Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
-X-TUID: wOtvTzk+zhdw
-
-Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
----
- libavformat/flvdec.c | 11 +++++++++--
- 1 file changed, 9 insertions(+), 2 deletions(-)
-
-diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
-index a0362ff11c..a6a94a4021 100644
---- a/libavformat/flvdec.c
-+++ b/libavformat/flvdec.c
-@@ -320,6 +320,8 @@ static int flv_same_video_codec(AVFormatContext *s, AVCodecParameters *vpar, int
- return vpar->codec_id == AV_CODEC_ID_HEVC;
- case MKBETAG('a', 'v', '0', '1'):
- return vpar->codec_id == AV_CODEC_ID_AV1;
-+ case MKBETAG('v', 'p', '0', '9'):
-+ return vpar->codec_id == AV_CODEC_ID_VP9;
- default:
- break;
- }
-@@ -365,6 +367,10 @@ static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream,
- par->codec_id = AV_CODEC_ID_AV1;
- vstreami->need_parsing = AVSTREAM_PARSE_HEADERS;
- return 4;
-+ case MKBETAG('v', 'p', '0', '9'):
-+ par->codec_id = AV_CODEC_ID_VP9;
-+ vstreami->need_parsing = AVSTREAM_PARSE_HEADERS;
-+ return 4;
- default:
- break;
- }
-@@ -1285,7 +1291,8 @@ retry_duration:
- st->codecpar->codec_id == AV_CODEC_ID_H264 ||
- st->codecpar->codec_id == AV_CODEC_ID_MPEG4 ||
- st->codecpar->codec_id == AV_CODEC_ID_HEVC ||
-- st->codecpar->codec_id == AV_CODEC_ID_AV1) {
-+ st->codecpar->codec_id == AV_CODEC_ID_AV1 ||
-+ st->codecpar->codec_id == AV_CODEC_ID_VP9) {
- int type = 0;
- if (flv->exheader && stream_type == FLV_STREAM_TYPE_VIDEO) {
- type = flags & 0x0F;
-@@ -1317,7 +1324,7 @@ retry_duration:
- }
- if (type == 0 && (!st->codecpar->extradata || st->codecpar->codec_id == AV_CODEC_ID_AAC ||
- st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC ||
-- st->codecpar->codec_id == AV_CODEC_ID_AV1)) {
-+ st->codecpar->codec_id == AV_CODEC_ID_AV1 || st->codecpar->codec_id == AV_CODEC_ID_VP9)) {
- AVDictionaryEntry *t;
-
- if (st->codecpar->extradata) {
diff --git a/ffmpeg-dlopen-openh264.patch b/ffmpeg-dlopen-openh264.patch
index a283f85..329606b 100644
--- a/ffmpeg-dlopen-openh264.patch
+++ b/ffmpeg-dlopen-openh264.patch
@@ -1,7 +1,7 @@
-From 1f48740db0dda8d6ec1b97a7f4a794e381a65636 Mon Sep 17 00:00:00 2001
+From 3daa49cae0bfc3de434dd28c3a23ae877f0639db Mon Sep 17 00:00:00 2001
From: Neal Gompa <ngompa@fedoraproject.org>
-Date: Wed, 12 Oct 2022 09:41:27 -0400
-Subject: [PATCH] avcodec/openh264: Add the ability to dlopen() OpenH264
+Date: Thu, 4 Jan 2024 10:21:17 -0500
+Subject: [PATCH] lavc/openh264: Add the ability to dlopen() OpenH264
We can't directly depend on OpenH264, but we can weakly link to it
and gracefully expose the capability.
@@ -24,10 +24,10 @@ Signed-off-by: Neal Gompa <ngompa@fedoraproject.org>
create mode 100644 libavcodec/libopenh264_dlopen.h
diff --git a/configure b/configure
-index ba5793b2ff..8855c1a908 100755
+index 1f0b9497cb..97fa4a5d6a 100755
--- a/configure
+++ b/configure
-@@ -251,6 +251,7 @@ External library support:
+@@ -249,6 +249,7 @@ External library support:
--enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
--enable-libopencv enable video filtering via libopencv [no]
--enable-libopenh264 enable H.264 encoding via OpenH264 [no]
@@ -35,7 +35,7 @@ index ba5793b2ff..8855c1a908 100755
--enable-libopenjpeg enable JPEG 2000 de/encoding via OpenJPEG [no]
--enable-libopenmpt enable decoding tracked files via libopenmpt [no]
--enable-libopenvino enable OpenVINO as a DNN module backend
-@@ -1844,6 +1845,7 @@ EXTERNAL_LIBRARY_LIST="
+@@ -1871,6 +1872,7 @@ EXTERNAL_LIBRARY_LIST="
libmysofa
libopencv
libopenh264
@@ -43,7 +43,7 @@ index ba5793b2ff..8855c1a908 100755
libopenjpeg
libopenmpt
libopenvino
-@@ -6596,6 +6598,7 @@ enabled libopencv && { check_headers opencv2/core/core_c.h &&
+@@ -6765,6 +6767,7 @@ enabled libopencv && { check_headers opencv2/core/core_c.h &&
require libopencv opencv2/core/core_c.h cvCreateImageHeader -lopencv_core -lopencv_imgproc; } ||
require_pkg_config libopencv opencv opencv/cxcore.h cvCreateImageHeader; }
enabled libopenh264 && require_pkg_config libopenh264 openh264 wels/codec_api.h WelsGetCodecVersion
@@ -52,17 +52,17 @@ index ba5793b2ff..8855c1a908 100755
{ require_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } }
enabled libopenmpt && require_pkg_config libopenmpt "libopenmpt >= 0.2.6557" libopenmpt/libopenmpt.h openmpt_module_create -lstdc++ && append libopenmpt_extralibs "-lstdc++"
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
-index 457ec58377..08a26fba5f 100644
+index 580a8d6b54..c27d229f6d 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
-@@ -1075,6 +1075,7 @@ OBJS-$(CONFIG_LIBMP3LAME_ENCODER) += libmp3lame.o
+@@ -1115,6 +1115,7 @@ OBJS-$(CONFIG_LIBMP3LAME_ENCODER) += libmp3lame.o
OBJS-$(CONFIG_LIBOPENCORE_AMRNB_DECODER) += libopencore-amr.o
OBJS-$(CONFIG_LIBOPENCORE_AMRNB_ENCODER) += libopencore-amr.o
OBJS-$(CONFIG_LIBOPENCORE_AMRWB_DECODER) += libopencore-amr.o
+OBJS-$(CONFIG_LIBOPENH264_DLOPEN) += libopenh264_dlopen.o
OBJS-$(CONFIG_LIBOPENH264_DECODER) += libopenh264dec.o libopenh264.o
OBJS-$(CONFIG_LIBOPENH264_ENCODER) += libopenh264enc.o libopenh264.o
- OBJS-$(CONFIG_LIBOPENJPEG_DECODER) += libopenjpegdec.o
+ OBJS-$(CONFIG_LIBOPENJPEG_ENCODER) += libopenjpegenc.o
diff --git a/libavcodec/libopenh264.c b/libavcodec/libopenh264.c
index c80c85ea8b..128c3d9846 100644
--- a/libavcodec/libopenh264.c
@@ -299,7 +299,7 @@ index 0000000000..d7d8bb7cad
+
+#endif /* HAVE_LIBOPENH264_DLOPEN_H */
diff --git a/libavcodec/libopenh264dec.c b/libavcodec/libopenh264dec.c
-index 7e14d4dd7d..a805598446 100644
+index b6a9bba2dc..e042189161 100644
--- a/libavcodec/libopenh264dec.c
+++ b/libavcodec/libopenh264dec.c
@@ -19,8 +19,12 @@
@@ -329,7 +329,7 @@ index 7e14d4dd7d..a805598446 100644
av_log(avctx, AV_LOG_ERROR, "Unable to create decoder\n");
return AVERROR_UNKNOWN;
diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
-index 5257906567..80481f3d0a 100644
+index 6f231d22b2..3f0e990d80 100644
--- a/libavcodec/libopenh264enc.c
+++ b/libavcodec/libopenh264enc.c
@@ -19,8 +19,12 @@
@@ -359,5 +359,5 @@ index 5257906567..80481f3d0a 100644
av_log(avctx, AV_LOG_ERROR, "Unable to create encoder\n");
return AVERROR_UNKNOWN;
--
-2.36.1
+2.43.0
diff --git a/ffmpeg-ge-av1-vaapi-encode-support.patch b/ffmpeg-ge-av1-vaapi-encode-support.patch
deleted file mode 100644
index 6ae8258..0000000
--- a/ffmpeg-ge-av1-vaapi-encode-support.patch
+++ /dev/null
@@ -1,3984 +0,0 @@
-From 7c2ea45053b7a3d4193bb0abb9c0f3b0cdbeec7a Mon Sep 17 00:00:00 2001
-From: GloriousEggroll <gloriouseggroll@gmail.com>
-Date: Thu, 9 Nov 2023 17:51:19 -0700
-Subject: [PATCH] backport av1 encode support
-
-Adapted from https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=9594
-
----
- configure | 3 +
- doc/encoders.texi | 14 +
- libavcodec/Makefile | 2 +
- libavcodec/allcodecs.c | 1 +
- libavcodec/av1.h | 7 +
- libavcodec/av1_levels.c | 92 +++
- libavcodec/av1_levels.h | 58 ++
- libavcodec/cbs.c | 155 +++--
- libavcodec/cbs.h | 88 ++-
- libavcodec/cbs_av1.c | 262 +++-----
- libavcodec/cbs_av1.h | 1 +
- libavcodec/cbs_av1_syntax_template.c | 4 +-
- libavcodec/cbs_bsf.c | 5 +
- libavcodec/cbs_h2645.c | 149 ++---
- libavcodec/cbs_internal.h | 96 ++-
- libavcodec/cbs_mpeg2.c | 15 +-
- libavcodec/cbs_vp9.c | 122 ++--
- libavcodec/extract_extradata_bsf.c | 7 +-
- libavcodec/trace_headers_bsf.c | 2 +
- libavcodec/vaapi_encode.c | 370 ++++++++---
- libavcodec/vaapi_encode.h | 39 +-
- libavcodec/vaapi_encode_av1.c | 949 +++++++++++++++++++++++++++
- libavcodec/vaapi_encode_h264.c | 94 +--
- libavcodec/vaapi_encode_h265.c | 76 ++-
- libavcodec/vaapi_encode_mpeg2.c | 6 +-
- libavcodec/vaapi_encode_vp8.c | 6 +-
- libavcodec/vaapi_encode_vp9.c | 26 +-
- 27 files changed, 2054 insertions(+), 595 deletions(-)
- create mode 100644 libavcodec/av1_levels.c
- create mode 100644 libavcodec/av1_levels.h
- create mode 100644 libavcodec/vaapi_encode_av1.c
-
-diff --git a/configure b/configure
-index b6616f0..f5a91b6 100755
---- a/configure
-+++ b/configure
-@@ -3259,6 +3259,8 @@ av1_qsv_decoder_select="qsvdec"
- av1_qsv_encoder_select="qsvenc"
- av1_qsv_encoder_deps="libvpl"
- av1_amf_encoder_deps="amf"
-+av1_vaapi_encoder_deps="VAEncPictureParameterBufferAV1"
-+av1_vaapi_encoder_select="cbs_av1 vaapi_encode"
-
- # parsers
- aac_parser_select="adts_header mpeg4audio"
-@@ -6973,6 +6975,7 @@ if enabled vaapi; then
- check_type "va/va.h va/va_enc_jpeg.h" "VAEncPictureParameterBufferJPEG"
- check_type "va/va.h va/va_enc_vp8.h" "VAEncPictureParameterBufferVP8"
- check_type "va/va.h va/va_enc_vp9.h" "VAEncPictureParameterBufferVP9"
-+ check_type "va/va.h va/va_enc_av1.h" "VAEncPictureParameterBufferAV1"
- fi
-
- if enabled_all opencl libdrm ; then
-diff --git a/doc/encoders.texi b/doc/encoders.texi
-index b02737b..994e27f 100644
---- a/doc/encoders.texi
-+++ b/doc/encoders.texi
-@@ -3965,6 +3965,20 @@ Average variable bitrate.
- Each encoder also has its own specific options:
- @table @option
-
-+@item av1_vaapi
-+@option{profile} sets the value of @emph{seq_profile}.
-+@option{tier} sets the value of @emph{seq_tier}.
-+@option{level} sets the value of @emph{seq_level_idx}.
-+
-+@table @option
-+@item tiles
-+Set the number of tiles to encode the input video with, as columns x rows.
-+(default is auto, which means use minimal tile column/row number).
-+@item tile_groups
-+Set tile groups number. All the tiles will be distributed as evenly as possible to
-+each tile group. (default is 1).
-+@end table
-+
- @item h264_vaapi
- @option{profile} sets the value of @emph{profile_idc} and the @emph{constraint_set*_flag}s.
- @option{level} sets the value of @emph{level_idc}.
-diff --git a/libavcodec/Makefile b/libavcodec/Makefile
-index 389253f..5f620e6 100644
---- a/libavcodec/Makefile
-+++ b/libavcodec/Makefile
-@@ -255,6 +255,7 @@ OBJS-$(CONFIG_AV1_CUVID_DECODER) += cuviddec.o
- OBJS-$(CONFIG_AV1_MEDIACODEC_DECODER) += mediacodecdec.o
- OBJS-$(CONFIG_AV1_NVENC_ENCODER) += nvenc_av1.o nvenc.o
- OBJS-$(CONFIG_AV1_QSV_ENCODER) += qsvenc_av1.o
-+OBJS-$(CONFIG_AV1_VAAPI_ENCODER) += vaapi_encode_av1.o av1_levels.o
- OBJS-$(CONFIG_AVRN_DECODER) += avrndec.o
- OBJS-$(CONFIG_AVRP_DECODER) += r210dec.o
- OBJS-$(CONFIG_AVRP_ENCODER) += r210enc.o
-@@ -1298,6 +1299,7 @@ TESTPROGS = avcodec \
- jpeg2000dwt \
- mathops \
-
-+TESTPROGS-$(CONFIG_AV1_VAAPI_ENCODER) += av1_levels
- TESTPROGS-$(CONFIG_CABAC) += cabac
- TESTPROGS-$(CONFIG_DCT) += avfft
- TESTPROGS-$(CONFIG_FFT) += fft fft-fixed32
-diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
-index e593ad1..4706fc3 100644
---- a/libavcodec/allcodecs.c
-+++ b/libavcodec/allcodecs.c
-@@ -838,6 +838,7 @@ extern const FFCodec ff_av1_nvenc_encoder;
- extern const FFCodec ff_av1_qsv_decoder;
- extern const FFCodec ff_av1_qsv_encoder;
- extern const FFCodec ff_av1_amf_encoder;
-+extern const FFCodec ff_av1_vaapi_encoder;
- extern const FFCodec ff_libopenh264_encoder;
- extern const FFCodec ff_libopenh264_decoder;
- extern const FFCodec ff_h264_amf_encoder;
-diff --git a/libavcodec/av1.h b/libavcodec/av1.h
-index 384f7cd..8704bc4 100644
---- a/libavcodec/av1.h
-+++ b/libavcodec/av1.h
-@@ -175,6 +175,13 @@ enum {
- AV1_RESTORE_SWITCHABLE = 3,
- };
-
-+// TX mode (section 6.8.21)
-+enum {
-+ AV1_ONLY_4X4 = 0,
-+ AV1_TX_MODE_LARGEST = 1,
-+ AV1_TX_MODE_SELECT = 2,
-+};
-+
- // Sequence Headers are actually unbounded because one can use
- // an arbitrary number of leading zeroes when encoding via uvlc.
- // The following estimate is based around using the lowest number
-diff --git a/libavcodec/av1_levels.c b/libavcodec/av1_levels.c
-new file mode 100644
-index 0000000..19b6ee1
---- /dev/null
-+++ b/libavcodec/av1_levels.c
-@@ -0,0 +1,92 @@
-+/*
-+ * Copyright (c) 2023 Intel Corporation
-+ *
-+ * This file is part of FFmpeg.
-+ *
-+ * FFmpeg is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * FFmpeg is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with FFmpeg; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#include <stddef.h>
-+#include "libavutil/macros.h"
-+#include "av1_levels.h"
-+
-+/** ignore entries which named in spec but no details. Like level 2.2 and 7.0. */
-+static const AV1LevelDescriptor av1_levels[] = {
-+ // Name MaxVSize MainMbps MaxTiles
-+ // | level_idx | MaxDisplayRate | HighMbps | MaxTileCols
-+ // | | MaxPicSize | | MaxDecodeRate | | MainCR | |
-+ // | | | MaxHSize | | | MaxHeaderRate | | | HighCR| |
-+ // | | | | | | | | | | | | | |
-+ { "2.0", 0, 147456, 2048, 1152, 4423680, 5529600, 150, 1.5, 0, 2, 0, 8, 4 },
-+ { "2.1", 1, 278784, 2816, 1584, 8363520, 10454400, 150, 3.0, 0, 2, 0, 8, 4 },
-+ { "3.0", 4, 665856, 4352, 2448, 19975680, 24969600, 150, 6.0, 0, 2, 0, 16, 6 },
-+ { "3.1", 5, 1065024, 5504, 3096, 31950720, 39938400, 150, 10.0, 0, 2, 0, 16, 6 },
-+ { "4.0", 8, 2359296, 6144, 3456, 70778880, 77856768, 300, 12.0, 30.0, 4, 4, 32, 8 },
-+ { "4.1", 9, 2359296, 6144, 3456, 141557760, 155713536, 300, 20.0, 50.0, 4, 4, 32, 8 },
-+ { "5.0", 12, 8912896, 8192, 4352, 267386880, 273715200, 300, 30.0, 100.0, 6, 4, 64, 8 },
-+ { "5.1", 13, 8912896, 8192, 4352, 534773760, 547430400, 300, 40.0, 160.0, 8, 4, 64, 8 },
-+ { "5.2", 14, 8912896, 8192, 4352, 1069547520, 1094860800, 300, 60.0, 240.0, 8, 4, 64, 8 },
-+ { "5.3", 15, 8912896, 8192, 4352, 1069547520, 1176502272, 300, 60.0, 240.0, 8, 4, 64, 8 },
-+ { "6.0", 16, 35651584, 16384, 8704, 1069547520, 1176502272, 300, 60.0, 240.0, 8, 4, 128, 16 },
-+ { "6.1", 17, 35651584, 16384, 8704, 2139095040, 2189721600, 300, 100.0, 480.0, 8, 4, 128, 16 },
-+ { "6.2", 18, 35651584, 16384, 8704, 4278190080, 4379443200, 300, 160.0, 800.0, 8, 4, 128, 16 },
-+ { "6.3", 19, 35651584, 16384, 8704, 4278190080, 4706009088, 300, 160.0, 800.0, 8, 4, 128, 16 },
-+};
-+
-+const AV1LevelDescriptor *ff_av1_guess_level(int64_t bitrate,
-+ int tier,
-+ int width,
-+ int height,
-+ int tiles,
-+ int tile_cols,
-+ float fps)
-+{
-+ int pic_size;
-+ uint64_t display_rate;
-+ float max_br;
-+
-+ pic_size = width * height;
-+ display_rate = (uint64_t)pic_size * fps;
-+
-+ for (int i = 0; i < FF_ARRAY_ELEMS(av1_levels); i++) {
-+ const AV1LevelDescriptor *level = &av1_levels[i];
-+ // Limitation: decode rate, header rate, compress rate, etc. are not considered.
-+ if (pic_size > level->max_pic_size)
-+ continue;
-+ if (width > level->max_h_size)
-+ continue;
-+ if (height > level->max_v_size)
-+ continue;
-+ if (display_rate > level->max_display_rate)
-+ continue;
-+
-+ if (tier)
-+ max_br = level->high_mbps;
-+ else
-+ max_br = level->main_mbps;
-+ if (!max_br)
-+ continue;
-+ if (bitrate > (int64_t)(1000000.0 * max_br))
-+ continue;
-+
-+ if (tiles > level->max_tiles)
-+ continue;
-+ if (tile_cols > level->max_tile_cols)
-+ continue;
-+ return level;
-+ }
-+
-+ return NULL;
-+}
-diff --git a/libavcodec/av1_levels.h b/libavcodec/av1_levels.h
-new file mode 100644
-index 0000000..164cb87
---- /dev/null
-+++ b/libavcodec/av1_levels.h
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (c) 2023 Intel Corporation
-+ *
-+ * This file is part of FFmpeg.
-+ *
-+ * FFmpeg is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * FFmpeg is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with FFmpeg; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#ifndef AVCODEC_AV1_LEVELS_H
-+#define AVCODEC_AV1_LEVELS_H
-+
-+#include <stdint.h>
-+
-+typedef struct AV1LevelDescriptor {
-+ char name[4];
-+ uint8_t level_idx;
-+
-+ uint32_t max_pic_size;
-+ uint32_t max_h_size;
-+ uint32_t max_v_size;
-+ uint64_t max_display_rate;
-+ uint64_t max_decode_rate;
-+
-+ uint32_t max_header_rate;
-+ float main_mbps;
-+ float high_mbps;
-+ uint32_t main_cr;
-+ uint32_t high_cr;
-+ uint32_t max_tiles;
-+ uint32_t max_tile_cols;
-+} AV1LevelDescriptor;
-+
-+/**
-+ * Guess the level of a stream from some parameters.
-+ *
-+ * Unknown parameters may be zero, in which case they will be ignored.
-+ */
-+const AV1LevelDescriptor *ff_av1_guess_level(int64_t bitrate,
-+ int tier,
-+ int width,
-+ int height,
-+ int tile_rows,
-+ int tile_cols,
-+ float fps);
-+
-+#endif /* AVCODEC_AV1_LEVELS_H */
-diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c
-index 504197e..64b9aee 100644
---- a/libavcodec/cbs.c
-+++ b/libavcodec/cbs.c
-@@ -111,8 +111,9 @@ av_cold int ff_cbs_init(CodedBitstreamContext **ctx_ptr,
-
- ctx->decompose_unit_types = NULL;
-
-- ctx->trace_enable = 0;
-- ctx->trace_level = AV_LOG_TRACE;
-+ ctx->trace_enable = 0;
-+ ctx->trace_level = AV_LOG_TRACE;
-+ ctx->trace_context = ctx;
-
- *ctx_ptr = ctx;
- return 0;
-@@ -490,19 +491,27 @@ void ff_cbs_trace_header(CodedBitstreamContext *ctx,
- av_log(ctx->log_ctx, ctx->trace_level, "%s\n", name);
- }
-
--void ff_cbs_trace_syntax_element(CodedBitstreamContext *ctx, int position,
-- const char *str, const int *subscripts,
-- const char *bits, int64_t value)
-+void ff_cbs_trace_read_log(void *trace_context,
-+ GetBitContext *gbc, int length,
-+ const char *str, const int *subscripts,
-+ int64_t value)
- {
-+ CodedBitstreamContext *ctx = trace_context;
- char name[256];
-+ char bits[256];
- size_t name_len, bits_len;
- int pad, subs, i, j, k, n;
--
-- if (!ctx->trace_enable)
-- return;
-+ int position;
-
- av_assert0(value >= INT_MIN && value <= UINT32_MAX);
-
-+ position = get_bits_count(gbc);
-+
-+ av_assert0(length < 256);
-+ for (i = 0; i < length; i++)
-+ bits[i] = get_bits1(gbc) ? '1' : '0';
-+ bits[length] = 0;
-+
- subs = subscripts ? subscripts[0] : 0;
- n = 0;
- for (i = j = 0; str[i];) {
-@@ -529,7 +538,7 @@ void ff_cbs_trace_syntax_element(CodedBitstreamContext *ctx, int position,
- av_assert0(n == subs);
-
- name_len = strlen(name);
-- bits_len = strlen(bits);
-+ bits_len = length;
-
- if (name_len + bits_len > 60)
- pad = bits_len + 2;
-@@ -540,14 +549,48 @@ void ff_cbs_trace_syntax_element(CodedBitstreamContext *ctx, int position,
- position, name, pad, bits, value);
- }
-
--int ff_cbs_read_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc,
-- int width, const char *name,
-- const int *subscripts, uint32_t *write_to,
-- uint32_t range_min, uint32_t range_max)
-+void ff_cbs_trace_write_log(void *trace_context,
-+ PutBitContext *pbc, int length,
-+ const char *str, const int *subscripts,
-+ int64_t value)
- {
-- uint32_t value;
-+ CodedBitstreamContext *ctx = trace_context;
-+
-+ // Ensure that the syntax element is written to the output buffer,
-+ // make a GetBitContext pointed at the start position, then call the
-+ // read log function which can read the bits back to log them.
-+
-+ GetBitContext gbc;
- int position;
-
-+ if (length > 0) {
-+ PutBitContext flush;
-+ flush = *pbc;
-+ flush_put_bits(&flush);
-+ }
-+
-+ position = put_bits_count(pbc);
-+ av_assert0(position >= length);
-+
-+ init_get_bits(&gbc, pbc->buf, position);
-+
-+ skip_bits_long(&gbc, position - length);
-+
-+ ff_cbs_trace_read_log(ctx, &gbc, length, str, subscripts, value);
-+}
-+
-+static av_always_inline int cbs_read_unsigned(CodedBitstreamContext *ctx,
-+ GetBitContext *gbc,
-+ int width, const char *name,
-+ const int *subscripts,
-+ uint32_t *write_to,
-+ uint32_t range_min,
-+ uint32_t range_max)
-+{
-+ uint32_t value;
-+
-+ CBS_TRACE_READ_START();
-+
- av_assert0(width > 0 && width <= 32);
-
- if (get_bits_left(gbc) < width) {
-@@ -556,21 +599,9 @@ int ff_cbs_read_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc,
- return AVERROR_INVALIDDATA;
- }
-
-- if (ctx->trace_enable)
-- position = get_bits_count(gbc);
--
- value = get_bits_long(gbc, width);
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (i = 0; i < width; i++)
-- bits[i] = value >> (width - i - 1) & 1 ? '1' : '0';
-- bits[i] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, position, name, subscripts,
-- bits, value);
-- }
-+ CBS_TRACE_READ_END();
-
- if (value < range_min || value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
-@@ -583,11 +614,29 @@ int ff_cbs_read_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc,
- return 0;
- }
-
-+int ff_cbs_read_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc,
-+ int width, const char *name,
-+ const int *subscripts, uint32_t *write_to,
-+ uint32_t range_min, uint32_t range_max)
-+{
-+ return cbs_read_unsigned(ctx, gbc, width, name, subscripts,
-+ write_to, range_min, range_max);
-+}
-+
-+int ff_cbs_read_simple_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc,
-+ int width, const char *name, uint32_t *write_to)
-+{
-+ return cbs_read_unsigned(ctx, gbc, width, name, NULL,
-+ write_to, 0, UINT32_MAX);
-+}
-+
- int ff_cbs_write_unsigned(CodedBitstreamContext *ctx, PutBitContext *pbc,
- int width, const char *name,
- const int *subscripts, uint32_t value,
- uint32_t range_min, uint32_t range_max)
- {
-+ CBS_TRACE_WRITE_START();
-+
- av_assert0(width > 0 && width <= 32);
-
- if (value < range_min || value > range_max) {
-@@ -600,32 +649,31 @@ int ff_cbs_write_unsigned(CodedBitstreamContext *ctx, PutBitContext *pbc,
- if (put_bits_left(pbc) < width)
- return AVERROR(ENOSPC);
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (i = 0; i < width; i++)
-- bits[i] = value >> (width - i - 1) & 1 ? '1' : '0';
-- bits[i] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
-- name, subscripts, bits, value);
-- }
--
- if (width < 32)
- put_bits(pbc, width, value);
- else
- put_bits32(pbc, value);
-
-+ CBS_TRACE_WRITE_END();
-+
- return 0;
- }
-
-+int ff_cbs_write_simple_unsigned(CodedBitstreamContext *ctx, PutBitContext *pbc,
-+ int width, const char *name, uint32_t value)
-+{
-+ return ff_cbs_write_unsigned(ctx, pbc, width, name, NULL,
-+ value, 0, MAX_UINT_BITS(width));
-+}
-+
- int ff_cbs_read_signed(CodedBitstreamContext *ctx, GetBitContext *gbc,
- int width, const char *name,
- const int *subscripts, int32_t *write_to,
- int32_t range_min, int32_t range_max)
- {
- int32_t value;
-- int position;
-+
-+ CBS_TRACE_READ_START();
-
- av_assert0(width > 0 && width <= 32);
-
-@@ -635,21 +683,9 @@ int ff_cbs_read_signed(CodedBitstreamContext *ctx, GetBitContext *gbc,
- return AVERROR_INVALIDDATA;
- }
-
-- if (ctx->trace_enable)
-- position = get_bits_count(gbc);
--
- value = get_sbits_long(gbc, width);
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (i = 0; i < width; i++)
-- bits[i] = value & (1U << (width - i - 1)) ? '1' : '0';
-- bits[i] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, position, name, subscripts,
-- bits, value);
-- }
-+ CBS_TRACE_READ_END();
-
- if (value < range_min || value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
-@@ -667,6 +703,8 @@ int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc,
- const int *subscripts, int32_t value,
- int32_t range_min, int32_t range_max)
- {
-+ CBS_TRACE_WRITE_START();
-+
- av_assert0(width > 0 && width <= 32);
-
- if (value < range_min || value > range_max) {
-@@ -679,22 +717,13 @@ int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc,
- if (put_bits_left(pbc) < width)
- return AVERROR(ENOSPC);
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (i = 0; i < width; i++)
-- bits[i] = value & (1U << (width - i - 1)) ? '1' : '0';
-- bits[i] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
-- name, subscripts, bits, value);
-- }
--
- if (width < 32)
- put_sbits(pbc, width, value);
- else
- put_bits32(pbc, value);
-
-+ CBS_TRACE_WRITE_END();
-+
- return 0;
- }
-
-diff --git a/libavcodec/cbs.h b/libavcodec/cbs.h
-index ee21623..f6509a2 100644
---- a/libavcodec/cbs.h
-+++ b/libavcodec/cbs.h
-@@ -167,6 +167,51 @@ typedef struct CodedBitstreamFragment {
- CodedBitstreamUnit *units;
- } CodedBitstreamFragment;
-
-+
-+struct CodedBitstreamContext;
-+struct GetBitContext;
-+struct PutBitContext;
-+
-+/**
-+ * Callback type for read tracing.
-+ *
-+ * @param ctx User-set trace context.
-+ * @param gbc A GetBitContext set at the start of the syntax
-+ * element. This is a copy, the callee does not
-+ * need to preserve it.
-+ * @param length Length in bits of the syntax element.
-+ * @param name String name of the syntax elements.
-+ * @param subscripts If the syntax element is an array, a pointer to
-+ * an array of subscripts into the array.
-+ * @param value Parsed value of the syntax element.
-+ */
-+typedef void (*CBSTraceReadCallback)(void *trace_context,
-+ struct GetBitContext *gbc,
-+ int start_position,
-+ const char *name,
-+ const int *subscripts,
-+ int64_t value);
-+
-+/**
-+ * Callback type for write tracing.
-+ *
-+ * @param ctx User-set trace context.
-+ * @param pbc A PutBitContext set at the end of the syntax
-+ * element. The user must not modify this, but may
-+ * inspect it to determine state.
-+ * @param length Length in bits of the syntax element.
-+ * @param name String name of the syntax elements.
-+ * @param subscripts If the syntax element is an array, a pointer to
-+ * an array of subscripts into the array.
-+ * @param value Written value of the syntax element.
-+ */
-+typedef void (*CBSTraceWriteCallback)(void *trace_context,
-+ struct PutBitContext *pbc,
-+ int start_position,
-+ const char *name,
-+ const int *subscripts,
-+ int64_t value);
-+
- /**
- * Context structure for coded bitstream operations.
- */
-@@ -210,11 +255,29 @@ typedef struct CodedBitstreamContext {
- */
- int trace_enable;
- /**
-- * Log level to use for trace output.
-+ * Log level to use for default trace output.
- *
- * From AV_LOG_*; defaults to AV_LOG_TRACE.
- */
- int trace_level;
-+ /**
-+ * User context pointer to pass to trace callbacks.
-+ */
-+ void *trace_context;
-+ /**
-+ * Callback for read tracing.
-+ *
-+ * If tracing is enabled then this is called once for each syntax
-+ * element parsed.
-+ */
-+ CBSTraceReadCallback trace_read_callback;
-+ /**
-+ * Callback for write tracing.
-+ *
-+ * If tracing is enabled then this is called once for each syntax
-+ * element written.
-+ */
-+ CBSTraceWriteCallback trace_write_callback;
-
- /**
- * Write buffer. Used as intermediate buffer when writing units.
-@@ -433,4 +496,27 @@ int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx,
- CodedBitstreamUnit *unit);
-
-
-+
-+/**
-+ * Helper function for read tracing which formats the syntax element
-+ * and logs the result.
-+ *
-+ * Trace context should be set to the CodedBitstreamContext.
-+ */
-+void ff_cbs_trace_read_log(void *trace_context,
-+ struct GetBitContext *gbc, int length,
-+ const char *str, const int *subscripts,
-+ int64_t value);
-+
-+/**
-+ * Helper function for write tracing which formats the syntax element
-+ * and logs the result.
-+ *
-+ * Trace context should be set to the CodedBitstreamContext.
-+ */
-+void ff_cbs_trace_write_log(void *trace_context,
-+ struct PutBitContext *pbc, int length,
-+ const char *str, const int *subscripts,
-+ int64_t value);
-+
- #endif /* AVCODEC_CBS_H */
-diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
-index 45e1288..6098c97 100644
---- a/libavcodec/cbs_av1.c
-+++ b/libavcodec/cbs_av1.c
-@@ -31,10 +31,8 @@ static int cbs_av1_read_uvlc(CodedBitstreamContext *ctx, GetBitContext *gbc,
- uint32_t range_min, uint32_t range_max)
- {
- uint32_t zeroes, bits_value, value;
-- int position;
-
-- if (ctx->trace_enable)
-- position = get_bits_count(gbc);
-+ CBS_TRACE_READ_START();
-
- zeroes = 0;
- while (1) {
-@@ -50,6 +48,9 @@ static int cbs_av1_read_uvlc(CodedBitstreamContext *ctx, GetBitContext *gbc,
- }
-
- if (zeroes >= 32) {
-+ // Note that the spec allows an arbitrarily large number of
-+ // zero bits followed by a one bit in this case, but the
-+ // libaom implementation does not support it.
- value = MAX_UINT_BITS(32);
- } else {
- if (get_bits_left(gbc) < zeroes) {
-@@ -62,36 +63,7 @@ static int cbs_av1_read_uvlc(CodedBitstreamContext *ctx, GetBitContext *gbc,
- value = bits_value + (UINT32_C(1) << zeroes) - 1;
- }
-
-- if (ctx->trace_enable) {
-- char bits[65];
-- int i, j, k;
--
-- if (zeroes >= 32) {
-- while (zeroes > 32) {
-- k = FFMIN(zeroes - 32, 32);
-- for (i = 0; i < k; i++)
-- bits[i] = '0';
-- bits[i] = 0;
-- ff_cbs_trace_syntax_element(ctx, position, name,
-- NULL, bits, 0);
-- zeroes -= k;
-- position += k;
-- }
-- }
--
-- for (i = 0; i < zeroes; i++)
-- bits[i] = '0';
-- bits[i++] = '1';
--
-- if (zeroes < 32) {
-- for (j = 0; j < zeroes; j++)
-- bits[i++] = (bits_value >> (zeroes - j - 1) & 1) ? '1' : '0';
-- }
--
-- bits[i] = 0;
-- ff_cbs_trace_syntax_element(ctx, position, name,
-- NULL, bits, value);
-- }
-+ CBS_TRACE_READ_END_NO_SUBSCRIPTS();
-
- if (value < range_min || value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
-@@ -109,7 +81,9 @@ static int cbs_av1_write_uvlc(CodedBitstreamContext *ctx, PutBitContext *pbc,
- uint32_t range_min, uint32_t range_max)
- {
- uint32_t v;
-- int position, zeroes;
-+ int zeroes;
-+
-+ CBS_TRACE_WRITE_START();
-
- if (value < range_min || value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
-@@ -118,28 +92,17 @@ static int cbs_av1_write_uvlc(CodedBitstreamContext *ctx, PutBitContext *pbc,
- return AVERROR_INVALIDDATA;
- }
-
-- if (ctx->trace_enable)
-- position = put_bits_count(pbc);
--
- zeroes = av_log2(value + 1);
- v = value - (1U << zeroes) + 1;
-+
-+ if (put_bits_left(pbc) < 2 * zeroes + 1)
-+ return AVERROR(ENOSPC);
-+
- put_bits(pbc, zeroes, 0);
- put_bits(pbc, 1, 1);
- put_bits(pbc, zeroes, v);
-
-- if (ctx->trace_enable) {
-- char bits[65];
-- int i, j;
-- i = 0;
-- for (j = 0; j < zeroes; j++)
-- bits[i++] = '0';
-- bits[i++] = '1';
-- for (j = 0; j < zeroes; j++)
-- bits[i++] = (v >> (zeroes - j - 1) & 1) ? '1' : '0';
-- bits[i++] = 0;
-- ff_cbs_trace_syntax_element(ctx, position, name, NULL,
-- bits, value);
-- }
-+ CBS_TRACE_WRITE_END_NO_SUBSCRIPTS();
-
- return 0;
- }
-@@ -148,20 +111,19 @@ static int cbs_av1_read_leb128(CodedBitstreamContext *ctx, GetBitContext *gbc,
- const char *name, uint64_t *write_to)
- {
- uint64_t value;
-- int position, err, i;
-+ uint32_t byte;
-+ int i;
-
-- if (ctx->trace_enable)
-- position = get_bits_count(gbc);
-+ CBS_TRACE_READ_START();
-
- value = 0;
- for (i = 0; i < 8; i++) {
-- int subscript[2] = { 1, i };
-- uint32_t byte;
-- err = ff_cbs_read_unsigned(ctx, gbc, 8, "leb128_byte[i]", subscript,
-- &byte, 0x00, 0xff);
-- if (err < 0)
-- return err;
--
-+ if (get_bits_left(gbc) < 8) {
-+ av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid leb128 at "
-+ "%s: bitstream ended.\n", name);
-+ return AVERROR_INVALIDDATA;
-+ }
-+ byte = get_bits(gbc, 8);
- value |= (uint64_t)(byte & 0x7f) << (i * 7);
- if (!(byte & 0x80))
- break;
-@@ -170,39 +132,38 @@ static int cbs_av1_read_leb128(CodedBitstreamContext *ctx, GetBitContext *gbc,
- if (value > UINT32_MAX)
- return AVERROR_INVALIDDATA;
-
-- if (ctx->trace_enable)
-- ff_cbs_trace_syntax_element(ctx, position, name, NULL, "", value);
-+ CBS_TRACE_READ_END_NO_SUBSCRIPTS();
-
- *write_to = value;
- return 0;
- }
-
-+/** Minimum byte length will be used to indicate the len128 of value if byte_len is 0. */
- static int cbs_av1_write_leb128(CodedBitstreamContext *ctx, PutBitContext *pbc,
-- const char *name, uint64_t value)
-+ const char *name, uint64_t value, uint8_t byte_len)
- {
-- int position, err, len, i;
-+ int len, i;
- uint8_t byte;
-
-- len = (av_log2(value) + 7) / 7;
-+ CBS_TRACE_WRITE_START();
-+
-+ if (byte_len)
-+ av_assert0(byte_len >= (av_log2(value) + 7) / 7);
-
-- if (ctx->trace_enable)
-- position = put_bits_count(pbc);
-+ len = byte_len ? byte_len : (av_log2(value) + 7) / 7;
-
- for (i = 0; i < len; i++) {
-- int subscript[2] = { 1, i };
-+ if (put_bits_left(pbc) < 8)
-+ return AVERROR(ENOSPC);
-
- byte = value >> (7 * i) & 0x7f;
- if (i < len - 1)
- byte |= 0x80;
-
-- err = ff_cbs_write_unsigned(ctx, pbc, 8, "leb128_byte[i]", subscript,
-- byte, 0x00, 0xff);
-- if (err < 0)
-- return err;
-+ put_bits(pbc, 8, byte);
- }
-
-- if (ctx->trace_enable)
-- ff_cbs_trace_syntax_element(ctx, position, name, NULL, "", value);
-+ CBS_TRACE_WRITE_END_NO_SUBSCRIPTS();
-
- return 0;
- }
-@@ -212,12 +173,11 @@ static int cbs_av1_read_ns(CodedBitstreamContext *ctx, GetBitContext *gbc,
- const int *subscripts, uint32_t *write_to)
- {
- uint32_t m, v, extra_bit, value;
-- int position, w;
-+ int w;
-
-- av_assert0(n > 0);
-+ CBS_TRACE_READ_START();
-
-- if (ctx->trace_enable)
-- position = get_bits_count(gbc);
-+ av_assert0(n > 0);
-
- w = av_log2(n) + 1;
- m = (1 << w) - n;
-@@ -240,18 +200,7 @@ static int cbs_av1_read_ns(CodedBitstreamContext *ctx, GetBitContext *gbc,
- value = (v << 1) - m + extra_bit;
- }
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (i = 0; i < w - 1; i++)
-- bits[i] = (v >> i & 1) ? '1' : '0';
-- if (v >= m)
-- bits[i++] = extra_bit ? '1' : '0';
-- bits[i] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, position,
-- name, subscripts, bits, value);
-- }
-+ CBS_TRACE_READ_END();
-
- *write_to = value;
- return 0;
-@@ -262,7 +211,8 @@ static int cbs_av1_write_ns(CodedBitstreamContext *ctx, PutBitContext *pbc,
- const int *subscripts, uint32_t value)
- {
- uint32_t w, m, v, extra_bit;
-- int position;
-+
-+ CBS_TRACE_WRITE_START();
-
- if (value > n) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
-@@ -271,9 +221,6 @@ static int cbs_av1_write_ns(CodedBitstreamContext *ctx, PutBitContext *pbc,
- return AVERROR_INVALIDDATA;
- }
-
-- if (ctx->trace_enable)
-- position = put_bits_count(pbc);
--
- w = av_log2(n) + 1;
- m = (1 << w) - n;
-
-@@ -290,18 +237,7 @@ static int cbs_av1_write_ns(CodedBitstreamContext *ctx, PutBitContext *pbc,
- put_bits(pbc, 1, extra_bit);
- }
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (i = 0; i < w - 1; i++)
-- bits[i] = (v >> i & 1) ? '1' : '0';
-- if (value >= m)
-- bits[i++] = extra_bit ? '1' : '0';
-- bits[i] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, position,
-- name, subscripts, bits, value);
-- }
-+ CBS_TRACE_WRITE_END();
-
- return 0;
- }
-@@ -311,33 +247,24 @@ static int cbs_av1_read_increment(CodedBitstreamContext *ctx, GetBitContext *gbc
- const char *name, uint32_t *write_to)
- {
- uint32_t value;
-- int position, i;
-- char bits[33];
-
-- av_assert0(range_min <= range_max && range_max - range_min < sizeof(bits) - 1);
-- if (ctx->trace_enable)
-- position = get_bits_count(gbc);
-+ CBS_TRACE_READ_START();
-+
-+ av_assert0(range_min <= range_max && range_max - range_min < 32);
-
-- for (i = 0, value = range_min; value < range_max;) {
-+ for (value = range_min; value < range_max;) {
- if (get_bits_left(gbc) < 1) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid increment value at "
- "%s: bitstream ended.\n", name);
- return AVERROR_INVALIDDATA;
- }
-- if (get_bits1(gbc)) {
-- bits[i++] = '1';
-+ if (get_bits1(gbc))
- ++value;
-- } else {
-- bits[i++] = '0';
-+ else
- break;
-- }
- }
-
-- if (ctx->trace_enable) {
-- bits[i] = 0;
-- ff_cbs_trace_syntax_element(ctx, position,
-- name, NULL, bits, value);
-- }
-+ CBS_TRACE_READ_END_NO_SUBSCRIPTS();
-
- *write_to = value;
- return 0;
-@@ -349,6 +276,8 @@ static int cbs_av1_write_increment(CodedBitstreamContext *ctx, PutBitContext *pb
- {
- int len;
-
-+ CBS_TRACE_WRITE_START();
-+
- av_assert0(range_min <= range_max && range_max - range_min < 32);
- if (value < range_min || value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
-@@ -364,23 +293,11 @@ static int cbs_av1_write_increment(CodedBitstreamContext *ctx, PutBitContext *pb
- if (put_bits_left(pbc) < len)
- return AVERROR(ENOSPC);
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (i = 0; i < len; i++) {
-- if (range_min + i == value)
-- bits[i] = '0';
-- else
-- bits[i] = '1';
-- }
-- bits[i] = 0;
-- ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
-- name, NULL, bits, value);
-- }
--
- if (len > 0)
- put_bits(pbc, len, (1 << len) - 1 - (value != range_max));
-
-+ CBS_TRACE_WRITE_END_NO_SUBSCRIPTS();
-+
- return 0;
- }
-
-@@ -388,12 +305,10 @@ static int cbs_av1_read_subexp(CodedBitstreamContext *ctx, GetBitContext *gbc,
- uint32_t range_max, const char *name,
- const int *subscripts, uint32_t *write_to)
- {
-- uint32_t value;
-- int position, err;
-- uint32_t max_len, len, range_offset, range_bits;
-+ uint32_t value, max_len, len, range_offset, range_bits;
-+ int err;
-
-- if (ctx->trace_enable)
-- position = get_bits_count(gbc);
-+ CBS_TRACE_READ_START();
-
- av_assert0(range_max > 0);
- max_len = av_log2(range_max - 1) - 3;
-@@ -412,9 +327,8 @@ static int cbs_av1_read_subexp(CodedBitstreamContext *ctx, GetBitContext *gbc,
- }
-
- if (len < max_len) {
-- err = ff_cbs_read_unsigned(ctx, gbc, range_bits,
-- "subexp_bits", NULL, &value,
-- 0, MAX_UINT_BITS(range_bits));
-+ err = ff_cbs_read_simple_unsigned(ctx, gbc, range_bits,
-+ "subexp_bits", &value);
- if (err < 0)
- return err;
-
-@@ -426,9 +340,7 @@ static int cbs_av1_read_subexp(CodedBitstreamContext *ctx, GetBitContext *gbc,
- }
- value += range_offset;
-
-- if (ctx->trace_enable)
-- ff_cbs_trace_syntax_element(ctx, position,
-- name, subscripts, "", value);
-+ CBS_TRACE_READ_END_VALUE_ONLY();
-
- *write_to = value;
- return err;
-@@ -438,9 +350,11 @@ static int cbs_av1_write_subexp(CodedBitstreamContext *ctx, PutBitContext *pbc,
- uint32_t range_max, const char *name,
- const int *subscripts, uint32_t value)
- {
-- int position, err;
-+ int err;
- uint32_t max_len, len, range_offset, range_bits;
-
-+ CBS_TRACE_WRITE_START();
-+
- if (value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
- "%"PRIu32", but must be in [0,%"PRIu32"].\n",
-@@ -448,9 +362,6 @@ static int cbs_av1_write_subexp(CodedBitstreamContext *ctx, PutBitContext *pbc,
- return AVERROR_INVALIDDATA;
- }
-
-- if (ctx->trace_enable)
-- position = put_bits_count(pbc);
--
- av_assert0(range_max > 0);
- max_len = av_log2(range_max - 1) - 3;
-
-@@ -476,10 +387,9 @@ static int cbs_av1_write_subexp(CodedBitstreamContext *ctx, PutBitContext *pbc,
- return err;
-
- if (len < max_len) {
-- err = ff_cbs_write_unsigned(ctx, pbc, range_bits,
-- "subexp_bits", NULL,
-- value - range_offset,
-- 0, MAX_UINT_BITS(range_bits));
-+ err = ff_cbs_write_simple_unsigned(ctx, pbc, range_bits,
-+ "subexp_bits",
-+ value - range_offset);
- if (err < 0)
- return err;
-
-@@ -491,9 +401,7 @@ static int cbs_av1_write_subexp(CodedBitstreamContext *ctx, PutBitContext *pbc,
- return err;
- }
-
-- if (ctx->trace_enable)
-- ff_cbs_trace_syntax_element(ctx, position,
-- name, subscripts, "", value);
-+ CBS_TRACE_WRITE_END_VALUE_ONLY();
-
- return err;
- }
-@@ -546,8 +454,6 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc)
-
- #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
-
--#define fb(width, name) \
-- xf(width, name, current->name, 0, MAX_UINT_BITS(width), 0, )
- #define fc(width, name, range_min, range_max) \
- xf(width, name, current->name, range_min, range_max, 0, )
- #define flag(name) fb(1, name)
-@@ -573,6 +479,13 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc)
- #define READWRITE read
- #define RWContext GetBitContext
-
-+#define fb(width, name) do { \
-+ uint32_t value; \
-+ CHECK(ff_cbs_read_simple_unsigned(ctx, rw, width, \
-+ #name, &value)); \
-+ current->name = value; \
-+ } while (0)
-+
- #define xf(width, name, var, range_min, range_max, subs, ...) do { \
- uint32_t value; \
- CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
-@@ -645,6 +558,7 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc)
- #undef READ
- #undef READWRITE
- #undef RWContext
-+#undef fb
- #undef xf
- #undef xsu
- #undef uvlc
-@@ -661,6 +575,11 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc)
- #define READWRITE write
- #define RWContext PutBitContext
-
-+#define fb(width, name) do { \
-+ CHECK(ff_cbs_write_simple_unsigned(ctx, rw, width, #name, \
-+ current->name)); \
-+ } while (0)
-+
- #define xf(width, name, var, range_min, range_max, subs, ...) do { \
- CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
- SUBSCRIPTS(subs, __VA_ARGS__), \
-@@ -703,7 +622,7 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc)
- } while (0)
-
- #define leb128(name) do { \
-- CHECK(cbs_av1_write_leb128(ctx, rw, #name, current->name)); \
-+ CHECK(cbs_av1_write_leb128(ctx, rw, #name, current->name, 0)); \
- } while (0)
-
- #define infer(name, value) do { \
-@@ -723,6 +642,7 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc)
- #undef WRITE
- #undef READWRITE
- #undef RWContext
-+#undef fb
- #undef xf
- #undef xsu
- #undef uvlc
-@@ -1086,9 +1006,14 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx,
-
- if (obu->header.obu_has_size_field) {
- pbc_tmp = *pbc;
-- // Add space for the size field to fill later.
-- put_bits32(pbc, 0);
-- put_bits32(pbc, 0);
-+ if (obu->obu_size_byte_len) {
-+ for (int i = 0; i < obu->obu_size_byte_len; i++)
-+ put_bits(pbc, 8, 0);
-+ } else {
-+ // Add space for the size field to fill later.
-+ put_bits32(pbc, 0);
-+ put_bits32(pbc, 0);
-+ }
- }
-
- td = NULL;
-@@ -1208,7 +1133,7 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx,
- end_pos /= 8;
-
- *pbc = pbc_tmp;
-- err = cbs_av1_write_leb128(ctx, pbc, "obu_size", obu->obu_size);
-+ err = cbs_av1_write_leb128(ctx, pbc, "obu_size", obu->obu_size, obu->obu_size_byte_len);
- if (err < 0)
- goto error;
-
-@@ -1225,8 +1150,11 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx,
- }
-
- if (obu->obu_size > 0) {
-- memmove(pbc->buf + data_pos,
-- pbc->buf + start_pos, header_size);
-+ if (!obu->obu_size_byte_len) {
-+ obu->obu_size_byte_len = start_pos - data_pos;
-+ memmove(pbc->buf + data_pos,
-+ pbc->buf + start_pos, header_size);
-+ }
- skip_put_bytes(pbc, header_size);
-
- if (td) {
-diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h
-index 1fc80dc..c5dae3c 100644
---- a/libavcodec/cbs_av1.h
-+++ b/libavcodec/cbs_av1.h
-@@ -392,6 +392,7 @@ typedef struct AV1RawOBU {
- AV1RawOBUHeader header;
-
- size_t obu_size;
-+ uint8_t obu_size_byte_len;
-
- union {
- AV1RawSequenceHeader sequence_header;
-diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c
-index e95925a..cf2e259 100644
---- a/libavcodec/cbs_av1_syntax_template.c
-+++ b/libavcodec/cbs_av1_syntax_template.c
-@@ -1018,9 +1018,9 @@ static int FUNC(read_tx_mode)(CodedBitstreamContext *ctx, RWContext *rw,
- int err;
-
- if (priv->coded_lossless)
-- infer(tx_mode, 0);
-+ infer(tx_mode, AV1_ONLY_4X4);
- else
-- increment(tx_mode, 1, 2);
-+ increment(tx_mode, AV1_TX_MODE_LARGEST, AV1_TX_MODE_SELECT);
-
- return 0;
- }
-diff --git a/libavcodec/cbs_bsf.c b/libavcodec/cbs_bsf.c
-index 069f6e9..b252854 100644
---- a/libavcodec/cbs_bsf.c
-+++ b/libavcodec/cbs_bsf.c
-@@ -123,6 +123,11 @@ int ff_cbs_bsf_generic_init(AVBSFContext *bsf, const CBSBSFType *type)
- if (err < 0)
- return err;
-
-+ ctx->output->trace_enable = 1;
-+ ctx->output->trace_level = AV_LOG_TRACE;
-+ ctx->output->trace_context = ctx->output;
-+ ctx->output->trace_write_callback = ff_cbs_trace_write_log;
-+
- if (bsf->par_in->extradata) {
- err = ff_cbs_read_extradata(ctx->input, frag, bsf->par_in);
- if (err < 0) {
-diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
-index 80e4882..355f4d5 100644
---- a/libavcodec/cbs_h2645.c
-+++ b/libavcodec/cbs_h2645.c
-@@ -34,41 +34,38 @@ static int cbs_read_ue_golomb(CodedBitstreamContext *ctx, GetBitContext *gbc,
- uint32_t *write_to,
- uint32_t range_min, uint32_t range_max)
- {
-- uint32_t value;
-- int position, i, j;
-- unsigned int k;
-- char bits[65];
-+ uint32_t leading_bits, value;
-+ int max_length, leading_zeroes;
-
-- position = get_bits_count(gbc);
-+ CBS_TRACE_READ_START();
-
-- for (i = 0; i < 32; i++) {
-- if (get_bits_left(gbc) < i + 1) {
-+ max_length = FFMIN(get_bits_left(gbc), 32);
-+
-+ leading_bits = show_bits_long(gbc, max_length);
-+ if (leading_bits == 0) {
-+ if (max_length >= 32) {
-+ av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid ue-golomb code at "
-+ "%s: more than 31 zeroes.\n", name);
-+ return AVERROR_INVALIDDATA;
-+ } else {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid ue-golomb code at "
- "%s: bitstream ended.\n", name);
- return AVERROR_INVALIDDATA;
- }
-- k = get_bits1(gbc);
-- bits[i] = k ? '1' : '0';
-- if (k)
-- break;
- }
-- if (i >= 32) {
-+
-+ leading_zeroes = max_length - 1 - av_log2(leading_bits);
-+ skip_bits_long(gbc, leading_zeroes);
-+
-+ if (get_bits_left(gbc) < leading_zeroes + 1) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid ue-golomb code at "
-- "%s: more than 31 zeroes.\n", name);
-+ "%s: bitstream ended.\n", name);
- return AVERROR_INVALIDDATA;
- }
-- value = 1;
-- for (j = 0; j < i; j++) {
-- k = get_bits1(gbc);
-- bits[i + j + 1] = k ? '1' : '0';
-- value = value << 1 | k;
-- }
-- bits[i + j + 1] = 0;
-- --value;
-
-- if (ctx->trace_enable)
-- ff_cbs_trace_syntax_element(ctx, position, name, subscripts,
-- bits, value);
-+ value = get_bits_long(gbc, leading_zeroes + 1) - 1;
-+
-+ CBS_TRACE_READ_END();
-
- if (value < range_min || value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
-@@ -86,45 +83,44 @@ static int cbs_read_se_golomb(CodedBitstreamContext *ctx, GetBitContext *gbc,
- int32_t *write_to,
- int32_t range_min, int32_t range_max)
- {
-+ uint32_t leading_bits, unsigned_value;
-+ int max_length, leading_zeroes;
- int32_t value;
-- int position, i, j;
-- unsigned int k;
-- uint32_t v;
-- char bits[65];
-
-- position = get_bits_count(gbc);
-+ CBS_TRACE_READ_START();
-
-- for (i = 0; i < 32; i++) {
-- if (get_bits_left(gbc) < i + 1) {
-+ max_length = FFMIN(get_bits_left(gbc), 32);
-+
-+ leading_bits = show_bits_long(gbc, max_length);
-+ if (leading_bits == 0) {
-+ if (max_length >= 32) {
-+ av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid se-golomb code at "
-+ "%s: more than 31 zeroes.\n", name);
-+ return AVERROR_INVALIDDATA;
-+ } else {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid se-golomb code at "
- "%s: bitstream ended.\n", name);
- return AVERROR_INVALIDDATA;
- }
-- k = get_bits1(gbc);
-- bits[i] = k ? '1' : '0';
-- if (k)
-- break;
- }
-- if (i >= 32) {
-+
-+ leading_zeroes = max_length - 1 - av_log2(leading_bits);
-+ skip_bits_long(gbc, leading_zeroes);
-+
-+ if (get_bits_left(gbc) < leading_zeroes + 1) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid se-golomb code at "
-- "%s: more than 31 zeroes.\n", name);
-+ "%s: bitstream ended.\n", name);
- return AVERROR_INVALIDDATA;
- }
-- v = 1;
-- for (j = 0; j < i; j++) {
-- k = get_bits1(gbc);
-- bits[i + j + 1] = k ? '1' : '0';
-- v = v << 1 | k;
-- }
-- bits[i + j + 1] = 0;
-- if (v & 1)
-- value = -(int32_t)(v / 2);
-+
-+ unsigned_value = get_bits_long(gbc, leading_zeroes + 1);
-+
-+ if (unsigned_value & 1)
-+ value = -(int32_t)(unsigned_value / 2);
- else
-- value = v / 2;
-+ value = unsigned_value / 2;
-
-- if (ctx->trace_enable)
-- ff_cbs_trace_syntax_element(ctx, position, name, subscripts,
-- bits, value);
-+ CBS_TRACE_READ_END();
-
- if (value < range_min || value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
-@@ -144,6 +140,8 @@ static int cbs_write_ue_golomb(CodedBitstreamContext *ctx, PutBitContext *pbc,
- {
- int len;
-
-+ CBS_TRACE_WRITE_START();
-+
- if (value < range_min || value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
- "%"PRIu32", but must be in [%"PRIu32",%"PRIu32"].\n",
-@@ -156,27 +154,14 @@ static int cbs_write_ue_golomb(CodedBitstreamContext *ctx, PutBitContext *pbc,
- if (put_bits_left(pbc) < 2 * len + 1)
- return AVERROR(ENOSPC);
-
-- if (ctx->trace_enable) {
-- char bits[65];
-- int i;
--
-- for (i = 0; i < len; i++)
-- bits[i] = '0';
-- bits[len] = '1';
-- for (i = 0; i < len; i++)
-- bits[len + i + 1] = (value + 1) >> (len - i - 1) & 1 ? '1' : '0';
-- bits[len + len + 1] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
-- name, subscripts, bits, value);
-- }
--
- put_bits(pbc, len, 0);
- if (len + 1 < 32)
- put_bits(pbc, len + 1, value + 1);
- else
- put_bits32(pbc, value + 1);
-
-+ CBS_TRACE_WRITE_END();
-+
- return 0;
- }
-
-@@ -188,6 +173,8 @@ static int cbs_write_se_golomb(CodedBitstreamContext *ctx, PutBitContext *pbc,
- int len;
- uint32_t uvalue;
-
-+ CBS_TRACE_WRITE_START();
-+
- if (value < range_min || value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
- "%"PRId32", but must be in [%"PRId32",%"PRId32"].\n",
-@@ -207,27 +194,14 @@ static int cbs_write_se_golomb(CodedBitstreamContext *ctx, PutBitContext *pbc,
- if (put_bits_left(pbc) < 2 * len + 1)
- return AVERROR(ENOSPC);
-
-- if (ctx->trace_enable) {
-- char bits[65];
-- int i;
--
-- for (i = 0; i < len; i++)
-- bits[i] = '0';
-- bits[len] = '1';
-- for (i = 0; i < len; i++)
-- bits[len + i + 1] = (uvalue + 1) >> (len - i - 1) & 1 ? '1' : '0';
-- bits[len + len + 1] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
-- name, subscripts, bits, value);
-- }
--
- put_bits(pbc, len, 0);
- if (len + 1 < 32)
- put_bits(pbc, len + 1, uvalue + 1);
- else
- put_bits32(pbc, uvalue + 1);
-
-+ CBS_TRACE_WRITE_END();
-+
- return 0;
- }
-
-@@ -261,8 +235,6 @@ static int cbs_h265_payload_extension_present(GetBitContext *gbc, uint32_t paylo
-
- #define u(width, name, range_min, range_max) \
- xu(width, name, current->name, range_min, range_max, 0, )
--#define ub(width, name) \
-- xu(width, name, current->name, 0, MAX_UINT_BITS(width), 0, )
- #define flag(name) ub(1, name)
- #define ue(name, range_min, range_max) \
- xue(name, current->name, range_min, range_max, 0, )
-@@ -298,6 +270,12 @@ static int cbs_h265_payload_extension_present(GetBitContext *gbc, uint32_t paylo
- #define READWRITE read
- #define RWContext GetBitContext
-
-+#define ub(width, name) do { \
-+ uint32_t value; \
-+ CHECK(ff_cbs_read_simple_unsigned(ctx, rw, width, #name, \
-+ &value)); \
-+ current->name = value; \
-+ } while (0)
- #define xu(width, name, var, range_min, range_max, subs, ...) do { \
- uint32_t value; \
- CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
-@@ -372,6 +350,7 @@ static int cbs_h2645_read_more_rbsp_data(GetBitContext *gbc)
- #undef READ
- #undef READWRITE
- #undef RWContext
-+#undef ub
- #undef xu
- #undef xi
- #undef xue
-@@ -387,6 +366,11 @@ static int cbs_h2645_read_more_rbsp_data(GetBitContext *gbc)
- #define READWRITE write
- #define RWContext PutBitContext
-
-+#define ub(width, name) do { \
-+ uint32_t value = current->name; \
-+ CHECK(ff_cbs_write_simple_unsigned(ctx, rw, width, #name, \
-+ value)); \
-+ } while (0)
- #define xu(width, name, var, range_min, range_max, subs, ...) do { \
- uint32_t value = var; \
- CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
-@@ -450,6 +434,7 @@ static int cbs_h2645_read_more_rbsp_data(GetBitContext *gbc)
- #undef WRITE
- #undef READWRITE
- #undef RWContext
-+#undef ub
- #undef xu
- #undef xi
- #undef xue
-diff --git a/libavcodec/cbs_internal.h b/libavcodec/cbs_internal.h
-index e585c77..60e31eb 100644
---- a/libavcodec/cbs_internal.h
-+++ b/libavcodec/cbs_internal.h
-@@ -151,24 +151,29 @@ typedef struct CodedBitstreamType {
- void ff_cbs_trace_header(CodedBitstreamContext *ctx,
- const char *name);
-
--void ff_cbs_trace_syntax_element(CodedBitstreamContext *ctx, int position,
-- const char *name, const int *subscripts,
-- const char *bitstring, int64_t value);
--
-
- // Helper functions for read/write of common bitstream elements, including
--// generation of trace output.
-+// generation of trace output. The simple functions are equivalent to
-+// their non-simple counterparts except that their range is unrestricted
-+// (i.e. only limited by the amount of bits used) and they lack
-+// the ability to use subscripts.
-
- int ff_cbs_read_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc,
- int width, const char *name,
- const int *subscripts, uint32_t *write_to,
- uint32_t range_min, uint32_t range_max);
-
-+int ff_cbs_read_simple_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc,
-+ int width, const char *name, uint32_t *write_to);
-+
- int ff_cbs_write_unsigned(CodedBitstreamContext *ctx, PutBitContext *pbc,
- int width, const char *name,
- const int *subscripts, uint32_t value,
- uint32_t range_min, uint32_t range_max);
-
-+int ff_cbs_write_simple_unsigned(CodedBitstreamContext *ctx, PutBitContext *pbc,
-+ int width, const char *name, uint32_t value);
-+
- int ff_cbs_read_signed(CodedBitstreamContext *ctx, GetBitContext *gbc,
- int width, const char *name,
- const int *subscripts, int32_t *write_to,
-@@ -191,6 +196,87 @@ int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc,
- // range_min in the above functions.
- #define MIN_INT_BITS(length) (-(INT64_C(1) << ((length) - 1)))
-
-+
-+// Start of a syntax element during read tracing.
-+#define CBS_TRACE_READ_START() \
-+ GetBitContext trace_start; \
-+ do { \
-+ if (ctx->trace_enable) \
-+ trace_start = *gbc; \
-+ } while (0)
-+
-+// End of a syntax element for tracing, make callback.
-+#define CBS_TRACE_READ_END() \
-+ do { \
-+ if (ctx->trace_enable) { \
-+ int start_position = get_bits_count(&trace_start); \
-+ int end_position = get_bits_count(gbc); \
-+ av_assert0(start_position <= end_position); \
-+ ctx->trace_read_callback(ctx->trace_context, &trace_start, \
-+ end_position - start_position, \
-+ name, subscripts, value); \
-+ } \
-+ } while (0)
-+
-+// End of a syntax element with no subscript entries.
-+#define CBS_TRACE_READ_END_NO_SUBSCRIPTS() \
-+ do { \
-+ const int *subscripts = NULL; \
-+ CBS_TRACE_READ_END(); \
-+ } while (0)
-+
-+// End of a syntax element which is made up of subelements which
-+// are aleady traced, so we are only showing the value.
-+#define CBS_TRACE_READ_END_VALUE_ONLY() \
-+ do { \
-+ if (ctx->trace_enable) { \
-+ ctx->trace_read_callback(ctx->trace_context, &trace_start, 0, \
-+ name, subscripts, value); \
-+ } \
-+ } while (0)
-+
-+// Start of a syntax element during write tracing.
-+#define CBS_TRACE_WRITE_START() \
-+ int start_position; \
-+ do { \
-+ if (ctx->trace_enable) \
-+ start_position = put_bits_count(pbc);; \
-+ } while (0)
-+
-+// End of a syntax element for tracing, make callback.
-+#define CBS_TRACE_WRITE_END() \
-+ do { \
-+ if (ctx->trace_enable) { \
-+ int end_position = put_bits_count(pbc); \
-+ av_assert0(start_position <= end_position); \
-+ ctx->trace_write_callback(ctx->trace_context, pbc, \
-+ end_position - start_position, \
-+ name, subscripts, value); \
-+ } \
-+ } while (0)
-+
-+// End of a syntax element with no subscript entries.
-+#define CBS_TRACE_WRITE_END_NO_SUBSCRIPTS() \
-+ do { \
-+ const int *subscripts = NULL; \
-+ CBS_TRACE_WRITE_END(); \
-+ } while (0)
-+
-+// End of a syntax element which is made up of subelements which are
-+// aleady traced, so we are only showing the value. This forges a
-+// PutBitContext to point to the position of the start of the syntax
-+// element, but the other state doesn't matter because length is zero.
-+#define CBS_TRACE_WRITE_END_VALUE_ONLY() \
-+ do { \
-+ if (ctx->trace_enable) { \
-+ PutBitContext tmp; \
-+ init_put_bits(&tmp, pbc->buf, start_position); \
-+ skip_put_bits(&tmp, start_position); \
-+ ctx->trace_write_callback(ctx->trace_context, &tmp, 0, \
-+ name, subscripts, value); \
-+ } \
-+ } while (0)
-+
- #define TYPE_LIST(...) { __VA_ARGS__ }
- #define CBS_UNIT_TYPE_POD(type_, structure) { \
- .nb_unit_types = 1, \
-diff --git a/libavcodec/cbs_mpeg2.c b/libavcodec/cbs_mpeg2.c
-index 04b0c7f..37fc28a 100644
---- a/libavcodec/cbs_mpeg2.c
-+++ b/libavcodec/cbs_mpeg2.c
-@@ -40,8 +40,6 @@
-
- #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
-
--#define ui(width, name) \
-- xui(width, name, current->name, 0, MAX_UINT_BITS(width), 0, )
- #define uir(width, name) \
- xui(width, name, current->name, 1, MAX_UINT_BITS(width), 0, )
- #define uis(width, name, subs, ...) \
-@@ -65,6 +63,12 @@
- #define READWRITE read
- #define RWContext GetBitContext
-
-+#define ui(width, name) do { \
-+ uint32_t value; \
-+ CHECK(ff_cbs_read_simple_unsigned(ctx, rw, width, #name, \
-+ &value)); \
-+ current->name = value; \
-+ } while (0)
- #define xuia(width, string, var, range_min, range_max, subs, ...) do { \
- uint32_t value; \
- CHECK(ff_cbs_read_unsigned(ctx, rw, width, string, \
-@@ -95,6 +99,7 @@
- #undef READ
- #undef READWRITE
- #undef RWContext
-+#undef ui
- #undef xuia
- #undef xsi
- #undef nextbits
-@@ -105,6 +110,11 @@
- #define READWRITE write
- #define RWContext PutBitContext
-
-+#define ui(width, name) do { \
-+ CHECK(ff_cbs_write_simple_unsigned(ctx, rw, width, #name, \
-+ current->name)); \
-+ } while (0)
-+
- #define xuia(width, string, var, range_min, range_max, subs, ...) do { \
- CHECK(ff_cbs_write_unsigned(ctx, rw, width, string, \
- SUBSCRIPTS(subs, __VA_ARGS__), \
-@@ -134,6 +144,7 @@
- #undef WRITE
- #undef READWRITE
- #undef RWContext
-+#undef ui
- #undef xuia
- #undef xsi
- #undef nextbits
-diff --git a/libavcodec/cbs_vp9.c b/libavcodec/cbs_vp9.c
-index 184fdca..816d06d 100644
---- a/libavcodec/cbs_vp9.c
-+++ b/libavcodec/cbs_vp9.c
-@@ -28,11 +28,10 @@ static int cbs_vp9_read_s(CodedBitstreamContext *ctx, GetBitContext *gbc,
- const int *subscripts, int32_t *write_to)
- {
- uint32_t magnitude;
-- int position, sign;
-+ int sign;
- int32_t value;
-
-- if (ctx->trace_enable)
-- position = get_bits_count(gbc);
-+ CBS_TRACE_READ_START();
-
- if (get_bits_left(gbc) < width + 1) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid signed value at "
-@@ -44,17 +43,7 @@ static int cbs_vp9_read_s(CodedBitstreamContext *ctx, GetBitContext *gbc,
- sign = get_bits1(gbc);
- value = sign ? -(int32_t)magnitude : magnitude;
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (i = 0; i < width; i++)
-- bits[i] = magnitude >> (width - i - 1) & 1 ? '1' : '0';
-- bits[i] = sign ? '1' : '0';
-- bits[i + 1] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, position, name, subscripts,
-- bits, value);
-- }
-+ CBS_TRACE_READ_END();
-
- *write_to = value;
- return 0;
-@@ -67,27 +56,19 @@ static int cbs_vp9_write_s(CodedBitstreamContext *ctx, PutBitContext *pbc,
- uint32_t magnitude;
- int sign;
-
-+ CBS_TRACE_WRITE_START();
-+
- if (put_bits_left(pbc) < width + 1)
- return AVERROR(ENOSPC);
-
- sign = value < 0;
- magnitude = sign ? -value : value;
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (i = 0; i < width; i++)
-- bits[i] = magnitude >> (width - i - 1) & 1 ? '1' : '0';
-- bits[i] = sign ? '1' : '0';
-- bits[i + 1] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
-- name, subscripts, bits, value);
-- }
--
- put_bits(pbc, width, magnitude);
- put_bits(pbc, 1, sign);
-
-+ CBS_TRACE_WRITE_END();
-+
- return 0;
- }
-
-@@ -96,32 +77,24 @@ static int cbs_vp9_read_increment(CodedBitstreamContext *ctx, GetBitContext *gbc
- const char *name, uint32_t *write_to)
- {
- uint32_t value;
-- int position, i;
-- char bits[8];
-
-- av_assert0(range_min <= range_max && range_max - range_min < sizeof(bits) - 1);
-- if (ctx->trace_enable)
-- position = get_bits_count(gbc);
-+ CBS_TRACE_READ_START();
-+
-+ av_assert0(range_min <= range_max && range_max - range_min < 32);
-
-- for (i = 0, value = range_min; value < range_max;) {
-+ for (value = range_min; value < range_max;) {
- if (get_bits_left(gbc) < 1) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid increment value at "
- "%s: bitstream ended.\n", name);
- return AVERROR_INVALIDDATA;
- }
-- if (get_bits1(gbc)) {
-- bits[i++] = '1';
-+ if (get_bits1(gbc))
- ++value;
-- } else {
-- bits[i++] = '0';
-+ else
- break;
-- }
- }
-
-- if (ctx->trace_enable) {
-- bits[i] = 0;
-- ff_cbs_trace_syntax_element(ctx, position, name, NULL, bits, value);
-- }
-+ CBS_TRACE_READ_END_NO_SUBSCRIPTS();
-
- *write_to = value;
- return 0;
-@@ -133,6 +106,8 @@ static int cbs_vp9_write_increment(CodedBitstreamContext *ctx, PutBitContext *pb
- {
- int len;
-
-+ CBS_TRACE_WRITE_START();
-+
- av_assert0(range_min <= range_max && range_max - range_min < 8);
- if (value < range_min || value > range_max) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
-@@ -148,23 +123,11 @@ static int cbs_vp9_write_increment(CodedBitstreamContext *ctx, PutBitContext *pb
- if (put_bits_left(pbc) < len)
- return AVERROR(ENOSPC);
-
-- if (ctx->trace_enable) {
-- char bits[8];
-- int i;
-- for (i = 0; i < len; i++) {
-- if (range_min + i == value)
-- bits[i] = '0';
-- else
-- bits[i] = '1';
-- }
-- bits[i] = 0;
-- ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
-- name, NULL, bits, value);
-- }
--
- if (len > 0)
- put_bits(pbc, len, (1 << len) - 1 - (value != range_max));
-
-+ CBS_TRACE_WRITE_END_NO_SUBSCRIPTS();
-+
- return 0;
- }
-
-@@ -173,12 +136,11 @@ static int cbs_vp9_read_le(CodedBitstreamContext *ctx, GetBitContext *gbc,
- const int *subscripts, uint32_t *write_to)
- {
- uint32_t value;
-- int position, b;
-+ int b;
-
-- av_assert0(width % 8 == 0);
-+ CBS_TRACE_READ_START();
-
-- if (ctx->trace_enable)
-- position = get_bits_count(gbc);
-+ av_assert0(width % 8 == 0);
-
- if (get_bits_left(gbc) < width) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid le value at "
-@@ -190,17 +152,7 @@ static int cbs_vp9_read_le(CodedBitstreamContext *ctx, GetBitContext *gbc,
- for (b = 0; b < width; b += 8)
- value |= get_bits(gbc, 8) << b;
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (b = 0; b < width; b += 8)
-- for (i = 0; i < 8; i++)
-- bits[b + i] = value >> (b + i) & 1 ? '1' : '0';
-- bits[b] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, position, name, subscripts,
-- bits, value);
-- }
-+ CBS_TRACE_READ_END();
-
- *write_to = value;
- return 0;
-@@ -212,26 +164,18 @@ static int cbs_vp9_write_le(CodedBitstreamContext *ctx, PutBitContext *pbc,
- {
- int b;
-
-+ CBS_TRACE_WRITE_START();
-+
- av_assert0(width % 8 == 0);
-
- if (put_bits_left(pbc) < width)
- return AVERROR(ENOSPC);
-
-- if (ctx->trace_enable) {
-- char bits[33];
-- int i;
-- for (b = 0; b < width; b += 8)
-- for (i = 0; i < 8; i++)
-- bits[b + i] = value >> (b + i) & 1 ? '1' : '0';
-- bits[b] = 0;
--
-- ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
-- name, subscripts, bits, value);
-- }
--
- for (b = 0; b < width; b += 8)
- put_bits(pbc, 8, value >> b & 0xff);
-
-+ CBS_TRACE_WRITE_END();
-+
- return 0;
- }
-
-@@ -251,8 +195,6 @@ static int cbs_vp9_write_le(CodedBitstreamContext *ctx, PutBitContext *pbc,
-
- #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
-
--#define f(width, name) \
-- xf(width, name, current->name, 0, )
- #define s(width, name) \
- xs(width, name, current->name, 0, )
- #define fs(width, name, subs, ...) \
-@@ -264,6 +206,12 @@ static int cbs_vp9_write_le(CodedBitstreamContext *ctx, PutBitContext *pbc,
- #define READWRITE read
- #define RWContext GetBitContext
-
-+#define f(width, name) do { \
-+ uint32_t value; \
-+ CHECK(ff_cbs_read_simple_unsigned(ctx, rw, width, #name, \
-+ &value)); \
-+ current->name = value; \
-+ } while (0)
- #define xf(width, name, var, subs, ...) do { \
- uint32_t value; \
- CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
-@@ -329,6 +277,7 @@ static int cbs_vp9_write_le(CodedBitstreamContext *ctx, PutBitContext *pbc,
- #undef READ
- #undef READWRITE
- #undef RWContext
-+#undef f
- #undef xf
- #undef xs
- #undef increment
-@@ -344,6 +293,10 @@ static int cbs_vp9_write_le(CodedBitstreamContext *ctx, PutBitContext *pbc,
- #define READWRITE write
- #define RWContext PutBitContext
-
-+#define f(width, name) do { \
-+ CHECK(ff_cbs_write_simple_unsigned(ctx, rw, width, #name, \
-+ current->name)); \
-+ } while (0)
- #define xf(width, name, var, subs, ...) do { \
- CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
- SUBSCRIPTS(subs, __VA_ARGS__), \
-@@ -396,6 +349,7 @@ static int cbs_vp9_write_le(CodedBitstreamContext *ctx, PutBitContext *pbc,
- #undef WRITE
- #undef READWRITE
- #undef RWContext
-+#undef f
- #undef xf
- #undef xs
- #undef increment
-diff --git a/libavcodec/extract_extradata_bsf.c b/libavcodec/extract_extradata_bsf.c
-index 329b1a6..7eedb16 100644
---- a/libavcodec/extract_extradata_bsf.c
-+++ b/libavcodec/extract_extradata_bsf.c
-@@ -48,10 +48,9 @@ typedef struct ExtractExtradataContext {
- int remove;
- } ExtractExtradataContext;
-
--static int val_in_array(const int *arr, int len, int val)
-+static int val_in_array(const int *arr, size_t len, int val)
- {
-- int i;
-- for (i = 0; i < len; i++)
-+ for (size_t i = 0; i < len; i++)
- if (arr[i] == val)
- return 1;
- return 0;
-@@ -145,7 +144,7 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
-
- int extradata_size = 0, filtered_size = 0;
- const int *extradata_nal_types;
-- int nb_extradata_nal_types;
-+ size_t nb_extradata_nal_types;
- int i, has_sps = 0, has_vps = 0, ret = 0;
-
- if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
-diff --git a/libavcodec/trace_headers_bsf.c b/libavcodec/trace_headers_bsf.c
-index 028b0a1..8781f5f 100644
---- a/libavcodec/trace_headers_bsf.c
-+++ b/libavcodec/trace_headers_bsf.c
-@@ -44,6 +44,8 @@ static int trace_headers_init(AVBSFContext *bsf)
-
- ctx->cbc->trace_enable = 1;
- ctx->cbc->trace_level = AV_LOG_INFO;
-+ ctx->cbc->trace_context = ctx->cbc;
-+ ctx->cbc->trace_read_callback = ff_cbs_trace_read_log;
-
- if (bsf->par_in->extradata) {
- CodedBitstreamFragment *frag = &ctx->fragment;
-diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
-index bfca315..f5bf5ab 100644
---- a/libavcodec/vaapi_encode.c
-+++ b/libavcodec/vaapi_encode.c
-@@ -276,21 +276,34 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
- av_log(avctx, AV_LOG_DEBUG, "Issuing encode for pic %"PRId64"/%"PRId64" "
- "as type %s.\n", pic->display_order, pic->encode_order,
- picture_type_name[pic->type]);
-- if (pic->nb_refs == 0) {
-+ if (pic->nb_refs[0] == 0 && pic->nb_refs[1] == 0) {
- av_log(avctx, AV_LOG_DEBUG, "No reference pictures.\n");
- } else {
-- av_log(avctx, AV_LOG_DEBUG, "Refers to:");
-- for (i = 0; i < pic->nb_refs; i++) {
-+ av_log(avctx, AV_LOG_DEBUG, "L0 refers to");
-+ for (i = 0; i < pic->nb_refs[0]; i++) {
- av_log(avctx, AV_LOG_DEBUG, " %"PRId64"/%"PRId64,
-- pic->refs[i]->display_order, pic->refs[i]->encode_order);
-+ pic->refs[0][i]->display_order, pic->refs[0][i]->encode_order);
- }
- av_log(avctx, AV_LOG_DEBUG, ".\n");
-+
-+ if (pic->nb_refs[1]) {
-+ av_log(avctx, AV_LOG_DEBUG, "L1 refers to");
-+ for (i = 0; i < pic->nb_refs[1]; i++) {
-+ av_log(avctx, AV_LOG_DEBUG, " %"PRId64"/%"PRId64,
-+ pic->refs[1][i]->display_order, pic->refs[1][i]->encode_order);
-+ }
-+ av_log(avctx, AV_LOG_DEBUG, ".\n");
-+ }
- }
-
- av_assert0(!pic->encode_issued);
-- for (i = 0; i < pic->nb_refs; i++) {
-- av_assert0(pic->refs[i]);
-- av_assert0(pic->refs[i]->encode_issued);
-+ for (i = 0; i < pic->nb_refs[0]; i++) {
-+ av_assert0(pic->refs[0][i]);
-+ av_assert0(pic->refs[0][i]->encode_issued);
-+ }
-+ for (i = 0; i < pic->nb_refs[1]; i++) {
-+ av_assert0(pic->refs[1][i]);
-+ av_assert0(pic->refs[1][i]->encode_issued);
- }
-
- av_log(avctx, AV_LOG_DEBUG, "Input surface is %#x.\n", pic->input_surface);
-@@ -650,79 +663,200 @@ fail_at_end:
- return err;
- }
-
--static int vaapi_encode_output(AVCodecContext *avctx,
-- VAAPIEncodePicture *pic, AVPacket *pkt)
-+static int vaapi_encode_set_output_property(AVCodecContext *avctx,
-+ VAAPIEncodePicture *pic,
-+ AVPacket *pkt)
-+{
-+ VAAPIEncodeContext *ctx = avctx->priv_data;
-+
-+ if (pic->type == PICTURE_TYPE_IDR)
-+ pkt->flags |= AV_PKT_FLAG_KEY;
-+
-+ pkt->pts = pic->pts;
-+ pkt->duration = pic->duration;
-+
-+ // for no-delay encoders this is handled in generic codec
-+ if (avctx->codec->capabilities & AV_CODEC_CAP_DELAY &&
-+ avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
-+ pkt->opaque = pic->opaque;
-+ pkt->opaque_ref = pic->opaque_ref;
-+ pic->opaque_ref = NULL;
-+ }
-+
-+ if (ctx->codec->flags & FLAG_TIMESTAMP_NO_DELAY) {
-+ pkt->dts = pkt->pts;
-+ return 0;
-+ }
-+
-+ if (ctx->output_delay == 0) {
-+ pkt->dts = pkt->pts;
-+ } else if (pic->encode_order < ctx->decode_delay) {
-+ if (ctx->ts_ring[pic->encode_order] < INT64_MIN + ctx->dts_pts_diff)
-+ pkt->dts = INT64_MIN;
-+ else
-+ pkt->dts = ctx->ts_ring[pic->encode_order] - ctx->dts_pts_diff;
-+ } else {
-+ pkt->dts = ctx->ts_ring[(pic->encode_order - ctx->decode_delay) %
-+ (3 * ctx->output_delay + ctx->async_depth)];
-+ }
-+
-+ return 0;
-+}
-+
-+static int vaapi_encode_get_coded_buffer_size(AVCodecContext *avctx, VABufferID buf_id)
- {
- VAAPIEncodeContext *ctx = avctx->priv_data;
- VACodedBufferSegment *buf_list, *buf;
-+ int size = 0;
- VAStatus vas;
-- int total_size = 0;
-- uint8_t *ptr;
- int err;
-
-- err = vaapi_encode_wait(avctx, pic);
-- if (err < 0)
-- return err;
--
-- buf_list = NULL;
-- vas = vaMapBuffer(ctx->hwctx->display, pic->output_buffer,
-+ vas = vaMapBuffer(ctx->hwctx->display, buf_id,
- (void**)&buf_list);
- if (vas != VA_STATUS_SUCCESS) {
- av_log(avctx, AV_LOG_ERROR, "Failed to map output buffers: "
- "%d (%s).\n", vas, vaErrorStr(vas));
- err = AVERROR(EIO);
-- goto fail;
-+ return err;
- }
-
- for (buf = buf_list; buf; buf = buf->next)
-- total_size += buf->size;
-+ size += buf->size;
-
-- err = ff_get_encode_buffer(avctx, pkt, total_size, 0);
-- ptr = pkt->data;
-+ vas = vaUnmapBuffer(ctx->hwctx->display, buf_id);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to unmap output buffers: "
-+ "%d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ return err;
-+ }
-
-- if (err < 0)
-- goto fail_mapped;
-+ return size;
-+}
-+
-+static int vaapi_encode_get_coded_buffer_data(AVCodecContext *avctx,
-+ VABufferID buf_id, uint8_t **dst)
-+{
-+ VAAPIEncodeContext *ctx = avctx->priv_data;
-+ VACodedBufferSegment *buf_list, *buf;
-+ VAStatus vas;
-+ int err;
-+
-+ vas = vaMapBuffer(ctx->hwctx->display, buf_id,
-+ (void**)&buf_list);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to map output buffers: "
-+ "%d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ return err;
-+ }
-
- for (buf = buf_list; buf; buf = buf->next) {
- av_log(avctx, AV_LOG_DEBUG, "Output buffer: %u bytes "
- "(status %08x).\n", buf->size, buf->status);
-
-- memcpy(ptr, buf->buf, buf->size);
-- ptr += buf->size;
-+ memcpy(*dst, buf->buf, buf->size);
-+ *dst += buf->size;
- }
-
-- if (pic->type == PICTURE_TYPE_IDR)
-- pkt->flags |= AV_PKT_FLAG_KEY;
--
-- pkt->pts = pic->pts;
-- pkt->duration = pic->duration;
--
-- vas = vaUnmapBuffer(ctx->hwctx->display, pic->output_buffer);
-+ vas = vaUnmapBuffer(ctx->hwctx->display, buf_id);
- if (vas != VA_STATUS_SUCCESS) {
- av_log(avctx, AV_LOG_ERROR, "Failed to unmap output buffers: "
- "%d (%s).\n", vas, vaErrorStr(vas));
- err = AVERROR(EIO);
-- goto fail;
-+ return err;
- }
-
-- // for no-delay encoders this is handled in generic codec
-- if (avctx->codec->capabilities & AV_CODEC_CAP_DELAY &&
-- avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
-- pkt->opaque = pic->opaque;
-- pkt->opaque_ref = pic->opaque_ref;
-- pic->opaque_ref = NULL;
-+ return 0;
-+}
-+
-+static int vaapi_encode_get_coded_data(AVCodecContext *avctx,
-+ VAAPIEncodePicture *pic, AVPacket *pkt)
-+{
-+ VAAPIEncodeContext *ctx = avctx->priv_data;
-+ VABufferID output_buffer_prev;
-+ int total_size = 0;
-+ uint8_t *ptr;
-+ int ret;
-+
-+ if (ctx->coded_buffer_ref) {
-+ output_buffer_prev = (VABufferID)(uintptr_t)ctx->coded_buffer_ref->data;
-+ ret = vaapi_encode_get_coded_buffer_size(avctx, output_buffer_prev);
-+ if (ret < 0)
-+ goto end;
-+ total_size += ret;
-+ }
-+
-+ ret = vaapi_encode_get_coded_buffer_size(avctx, pic->output_buffer);
-+ if (ret < 0)
-+ goto end;
-+ total_size += ret;
-+
-+ ret = ff_get_encode_buffer(avctx, pkt, total_size, 0);
-+ if (ret < 0)
-+ goto end;
-+ ptr = pkt->data;
-+
-+ if (ctx->coded_buffer_ref) {
-+ ret = vaapi_encode_get_coded_buffer_data(avctx, output_buffer_prev, &ptr);
-+ if (ret < 0)
-+ goto end;
- }
-
-+ ret = vaapi_encode_get_coded_buffer_data(avctx, pic->output_buffer, &ptr);
-+ if (ret < 0)
-+ goto end;
-+
-+end:
-+ if (ctx->coded_buffer_ref) {
-+ av_buffer_unref(&ctx->coded_buffer_ref);
-+ }
- av_buffer_unref(&pic->output_buffer_ref);
- pic->output_buffer = VA_INVALID_ID;
-
-+ return ret;
-+}
-+
-+static int vaapi_encode_output(AVCodecContext *avctx,
-+ VAAPIEncodePicture *pic, AVPacket *pkt)
-+{
-+ VAAPIEncodeContext *ctx = avctx->priv_data;
-+ AVPacket *pkt_ptr = pkt;
-+ int err;
-+
-+ err = vaapi_encode_wait(avctx, pic);
-+ if (err < 0)
-+ return err;
-+
-+ if (pic->non_independent_frame) {
-+ av_assert0(!ctx->coded_buffer_ref);
-+ ctx->coded_buffer_ref = av_buffer_ref(pic->output_buffer_ref);
-+
-+ if (pic->tail_size) {
-+ if (ctx->tail_pkt->size) {
-+ err = AVERROR(AVERROR_BUG);
-+ goto end;
-+ }
-+
-+ err = ff_get_encode_buffer(avctx, ctx->tail_pkt, pic->tail_size, 0);
-+ if (err < 0)
-+ goto end;
-+
-+ memcpy(ctx->tail_pkt->data, pic->tail_data, pic->tail_size);
-+ pkt_ptr = ctx->tail_pkt;
-+ }
-+ } else {
-+ err = vaapi_encode_get_coded_data(avctx, pic, pkt);
-+ if (err < 0)
-+ goto end;
-+ }
-+
- av_log(avctx, AV_LOG_DEBUG, "Output read for pic %"PRId64"/%"PRId64".\n",
- pic->display_order, pic->encode_order);
-- return 0;
-
--fail_mapped:
-- vaUnmapBuffer(ctx->hwctx->display, pic->output_buffer);
--fail:
-+ vaapi_encode_set_output_property(avctx, pic, pkt_ptr);
-+
-+end:
- av_buffer_unref(&pic->output_buffer_ref);
- pic->output_buffer = VA_INVALID_ID;
- return err;
-@@ -811,8 +945,12 @@ static void vaapi_encode_add_ref(AVCodecContext *avctx,
-
- if (is_ref) {
- av_assert0(pic != target);
-- av_assert0(pic->nb_refs < MAX_PICTURE_REFERENCES);
-- pic->refs[pic->nb_refs++] = target;
-+ av_assert0(pic->nb_refs[0] < MAX_PICTURE_REFERENCES &&
-+ pic->nb_refs[1] < MAX_PICTURE_REFERENCES);
-+ if (target->display_order < pic->display_order)
-+ pic->refs[0][pic->nb_refs[0]++] = target;
-+ else
-+ pic->refs[1][pic->nb_refs[1]++] = target;
- ++refs;
- }
-
-@@ -841,10 +979,16 @@ static void vaapi_encode_remove_refs(AVCodecContext *avctx,
- if (pic->ref_removed[level])
- return;
-
-- for (i = 0; i < pic->nb_refs; i++) {
-- av_assert0(pic->refs[i]);
-- --pic->refs[i]->ref_count[level];
-- av_assert0(pic->refs[i]->ref_count[level] >= 0);
-+ for (i = 0; i < pic->nb_refs[0]; i++) {
-+ av_assert0(pic->refs[0][i]);
-+ --pic->refs[0][i]->ref_count[level];
-+ av_assert0(pic->refs[0][i]->ref_count[level] >= 0);
-+ }
-+
-+ for (i = 0; i < pic->nb_refs[1]; i++) {
-+ av_assert0(pic->refs[1][i]);
-+ --pic->refs[1][i]->ref_count[level];
-+ av_assert0(pic->refs[1][i]->ref_count[level] >= 0);
- }
-
- for (i = 0; i < pic->nb_dpb_pics; i++) {
-@@ -889,7 +1033,7 @@ static void vaapi_encode_set_b_pictures(AVCodecContext *avctx,
- vaapi_encode_add_ref(avctx, pic, end, 1, 1, 0);
- vaapi_encode_add_ref(avctx, pic, prev, 0, 0, 1);
-
-- for (ref = end->refs[1]; ref; ref = ref->refs[1])
-+ for (ref = end->refs[1][0]; ref; ref = ref->refs[1][0])
- vaapi_encode_add_ref(avctx, pic, ref, 0, 1, 0);
- }
- *last = prev;
-@@ -912,7 +1056,7 @@ static void vaapi_encode_set_b_pictures(AVCodecContext *avctx,
- vaapi_encode_add_ref(avctx, pic, end, 1, 1, 0);
- vaapi_encode_add_ref(avctx, pic, prev, 0, 0, 1);
-
-- for (ref = end->refs[1]; ref; ref = ref->refs[1])
-+ for (ref = end->refs[1][0]; ref; ref = ref->refs[1][0])
- vaapi_encode_add_ref(avctx, pic, ref, 0, 1, 0);
-
- if (i > 1)
-@@ -926,11 +1070,44 @@ static void vaapi_encode_set_b_pictures(AVCodecContext *avctx,
- }
- }
-
-+static void vaapi_encode_add_next_prev(AVCodecContext *avctx,
-+ VAAPIEncodePicture *pic)
-+{
-+ VAAPIEncodeContext *ctx = avctx->priv_data;
-+ int i;
-+
-+ if (!pic)
-+ return;
-+
-+ if (pic->type == PICTURE_TYPE_IDR) {
-+ for (i = 0; i < ctx->nb_next_prev; i++) {
-+ --ctx->next_prev[i]->ref_count[0];
-+ ctx->next_prev[i] = NULL;
-+ }
-+ ctx->next_prev[0] = pic;
-+ ++pic->ref_count[0];
-+ ctx->nb_next_prev = 1;
-+
-+ return;
-+ }
-+
-+ if (ctx->nb_next_prev < MAX_PICTURE_REFERENCES) {
-+ ctx->next_prev[ctx->nb_next_prev++] = pic;
-+ ++pic->ref_count[0];
-+ } else {
-+ --ctx->next_prev[0]->ref_count[0];
-+ for (i = 0; i < MAX_PICTURE_REFERENCES - 1; i++)
-+ ctx->next_prev[i] = ctx->next_prev[i + 1];
-+ ctx->next_prev[i] = pic;
-+ ++pic->ref_count[0];
-+ }
-+}
-+
- static int vaapi_encode_pick_next(AVCodecContext *avctx,
- VAAPIEncodePicture **pic_out)
- {
- VAAPIEncodeContext *ctx = avctx->priv_data;
-- VAAPIEncodePicture *pic = NULL, *next, *start;
-+ VAAPIEncodePicture *pic = NULL, *prev = NULL, *next, *start;
- int i, b_counter, closed_gop_end;
-
- // If there are any B-frames already queued, the next one to encode
-@@ -941,11 +1118,18 @@ static int vaapi_encode_pick_next(AVCodecContext *avctx,
- continue;
- if (pic->type != PICTURE_TYPE_B)
- continue;
-- for (i = 0; i < pic->nb_refs; i++) {
-- if (!pic->refs[i]->encode_issued)
-+ for (i = 0; i < pic->nb_refs[0]; i++) {
-+ if (!pic->refs[0][i]->encode_issued)
-+ break;
-+ }
-+ if (i != pic->nb_refs[0])
-+ continue;
-+
-+ for (i = 0; i < pic->nb_refs[1]; i++) {
-+ if (!pic->refs[1][i]->encode_issued)
- break;
- }
-- if (i == pic->nb_refs)
-+ if (i == pic->nb_refs[1])
- break;
- }
-
-@@ -1044,21 +1228,30 @@ static int vaapi_encode_pick_next(AVCodecContext *avctx,
-
- vaapi_encode_add_ref(avctx, pic, pic, 0, 1, 0);
- if (pic->type != PICTURE_TYPE_IDR) {
-- vaapi_encode_add_ref(avctx, pic, start,
-- pic->type == PICTURE_TYPE_P,
-- b_counter > 0, 0);
-- vaapi_encode_add_ref(avctx, pic, ctx->next_prev, 0, 0, 1);
-+ // TODO: apply both previous and forward multi reference for all vaapi encoders.
-+ // And L0/L1 reference frame number can be set dynamically through query
-+ // VAConfigAttribEncMaxRefFrames attribute.
-+ if (avctx->codec_id == AV_CODEC_ID_AV1) {
-+ for (i = 0; i < ctx->nb_next_prev; i++)
-+ vaapi_encode_add_ref(avctx, pic, ctx->next_prev[i],
-+ pic->type == PICTURE_TYPE_P,
-+ b_counter > 0, 0);
-+ } else
-+ vaapi_encode_add_ref(avctx, pic, start,
-+ pic->type == PICTURE_TYPE_P,
-+ b_counter > 0, 0);
-+
-+ vaapi_encode_add_ref(avctx, pic, ctx->next_prev[ctx->nb_next_prev - 1], 0, 0, 1);
- }
-- if (ctx->next_prev)
-- --ctx->next_prev->ref_count[0];
-
- if (b_counter > 0) {
- vaapi_encode_set_b_pictures(avctx, start, pic, pic, 1,
-- &ctx->next_prev);
-+ &prev);
- } else {
-- ctx->next_prev = pic;
-+ prev = pic;
- }
-- ++ctx->next_prev->ref_count[0];
-+ vaapi_encode_add_next_prev(avctx, prev);
-+
- return 0;
- }
-
-@@ -1205,10 +1398,23 @@ fail:
- int ff_vaapi_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
- {
- VAAPIEncodeContext *ctx = avctx->priv_data;
-- VAAPIEncodePicture *pic;
-+ VAAPIEncodePicture *pic = NULL;
- AVFrame *frame = ctx->frame;
- int err;
-
-+start:
-+ /** if no B frame before repeat P frame, sent repeat P frame out. */
-+ if (ctx->tail_pkt->size) {
-+ for (VAAPIEncodePicture *tmp = ctx->pic_start; tmp; tmp = tmp->next) {
-+ if (tmp->type == PICTURE_TYPE_B && tmp->pts < ctx->tail_pkt->pts)
-+ break;
-+ else if (!tmp->next) {
-+ av_packet_move_ref(pkt, ctx->tail_pkt);
-+ goto end;
-+ }
-+ }
-+ }
-+
- err = ff_encode_get_frame(avctx, frame);
- if (err < 0 && err != AVERROR_EOF)
- return err;
-@@ -1228,8 +1434,6 @@ int ff_vaapi_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
- }
-
- if (ctx->has_sync_buffer_func) {
-- pic = NULL;
--
- if (av_fifo_can_write(ctx->encode_fifo)) {
- err = vaapi_encode_pick_next(avctx, &pic);
- if (!err) {
-@@ -1255,7 +1459,6 @@ int ff_vaapi_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
- av_fifo_read(ctx->encode_fifo, &pic, 1);
- ctx->encode_order = pic->encode_order + 1;
- } else {
-- pic = NULL;
- err = vaapi_encode_pick_next(avctx, &pic);
- if (err < 0)
- return err;
-@@ -1276,27 +1479,21 @@ int ff_vaapi_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
- return err;
- }
-
-- if (ctx->output_delay == 0) {
-- pkt->dts = pkt->pts;
-- } else if (pic->encode_order < ctx->decode_delay) {
-- if (ctx->ts_ring[pic->encode_order] < INT64_MIN + ctx->dts_pts_diff)
-- pkt->dts = INT64_MIN;
-- else
-- pkt->dts = ctx->ts_ring[pic->encode_order] - ctx->dts_pts_diff;
-- } else {
-- pkt->dts = ctx->ts_ring[(pic->encode_order - ctx->decode_delay) %
-- (3 * ctx->output_delay + ctx->async_depth)];
-- }
-- av_log(avctx, AV_LOG_DEBUG, "Output packet: pts %"PRId64" dts %"PRId64".\n",
-- pkt->pts, pkt->dts);
--
- ctx->output_order = pic->encode_order;
- vaapi_encode_clear_old(avctx);
-
-+ /** loop to get an available pkt in encoder flushing. */
-+ if (ctx->end_of_stream && !pkt->size)
-+ goto start;
-+
-+end:
-+ if (pkt->size)
-+ av_log(avctx, AV_LOG_DEBUG, "Output packet: pts %"PRId64", dts %"PRId64", "
-+ "size %d bytes.\n", pkt->pts, pkt->dts, pkt->size);
-+
- return 0;
- }
-
--
- static av_cold void vaapi_encode_add_global_param(AVCodecContext *avctx, int type,
- void *buffer, size_t size)
- {
-@@ -2597,6 +2794,12 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
- ctx->device = (AVHWDeviceContext*)ctx->device_ref->data;
- ctx->hwctx = ctx->device->hwctx;
-
-+ ctx->tail_pkt = av_packet_alloc();
-+ if (!ctx->tail_pkt) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+
- err = vaapi_encode_profile_entrypoint(avctx);
- if (err < 0)
- goto fail;
-@@ -2789,6 +2992,7 @@ av_cold int ff_vaapi_encode_close(AVCodecContext *avctx)
- }
-
- av_frame_free(&ctx->frame);
-+ av_packet_free(&ctx->tail_pkt);
-
- av_freep(&ctx->codec_sequence_params);
- av_freep(&ctx->codec_picture_params);
-diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
-index a1e639f..416a3ce 100644
---- a/libavcodec/vaapi_encode.h
-+++ b/libavcodec/vaapi_encode.h
-@@ -49,6 +49,7 @@ enum {
- // A.4.1: table A.6 allows at most 20 tile columns for any level.
- MAX_TILE_COLS = 20,
- MAX_ASYNC_DEPTH = 64,
-+ MAX_REFERENCE_LIST_NUM = 2,
- };
-
- extern const AVCodecHWConfigInternal *const ff_vaapi_encode_hw_configs[];
-@@ -116,10 +117,11 @@ typedef struct VAAPIEncodePicture {
- // but not if it isn't.
- int nb_dpb_pics;
- struct VAAPIEncodePicture *dpb[MAX_DPB_SIZE];
-- // The reference pictures used in decoding this picture. If they are
-- // used by later pictures they will also appear in the DPB.
-- int nb_refs;
-- struct VAAPIEncodePicture *refs[MAX_PICTURE_REFERENCES];
-+ // The reference pictures used in decoding this picture. If they are
-+ // used by later pictures they will also appear in the DPB. ref[0][] for
-+ // previous reference frames. ref[1][] for future reference frames.
-+ int nb_refs[MAX_REFERENCE_LIST_NUM];
-+ struct VAAPIEncodePicture *refs[MAX_REFERENCE_LIST_NUM][MAX_PICTURE_REFERENCES];
- // The previous reference picture in encode order. Must be in at least
- // one of the reference list and DPB list.
- struct VAAPIEncodePicture *prev;
-@@ -131,6 +133,17 @@ typedef struct VAAPIEncodePicture {
-
- int nb_slices;
- VAAPIEncodeSlice *slices;
-+
-+ /**
-+ * indicate if current frame is an independent frame that the coded data
-+ * can be pushed to downstream directly. Coded of non-independent frame
-+ * data will be concatenated into next independent frame.
-+ */
-+ int non_independent_frame;
-+ /** Tail data of current pic, used only for repeat header of AV1. */
-+ char tail_data[MAX_PARAM_BUFFER_SIZE];
-+ /** Byte length of tail_data. */
-+ size_t tail_size;
- } VAAPIEncodePicture;
-
- typedef struct VAAPIEncodeProfile {
-@@ -290,8 +303,9 @@ typedef struct VAAPIEncodeContext {
- // Current encoding window, in display (input) order.
- VAAPIEncodePicture *pic_start, *pic_end;
- // The next picture to use as the previous reference picture in
-- // encoding order.
-- VAAPIEncodePicture *next_prev;
-+ // encoding order. Order from small to large in encoding order.
-+ VAAPIEncodePicture *next_prev[MAX_PICTURE_REFERENCES];
-+ int nb_next_prev;
-
- // Next input order index (display order).
- int64_t input_order;
-@@ -364,6 +378,16 @@ typedef struct VAAPIEncodeContext {
- AVFifo *encode_fifo;
- // Max number of frame buffered in encoder.
- int async_depth;
-+
-+ /** Head data for current output pkt, used only for AV1. */
-+ //void *header_data;
-+ //size_t header_data_size;
-+
-+ /** Buffered coded data of a pic if it is an non-independent frame. */
-+ AVBufferRef *coded_buffer_ref;
-+
-+ /** Tail data of a pic, now only used for av1 repeat frame header. */
-+ AVPacket *tail_pkt;
- } VAAPIEncodeContext;
-
- enum {
-@@ -380,6 +404,9 @@ enum {
- // Codec supports non-IDR key pictures (that is, key pictures do
- // not necessarily empty the DPB).
- FLAG_NON_IDR_KEY_PICTURES = 1 << 5,
-+ // Codec output packet without timestamp delay, which means the
-+ // output packet has same PTS and DTS.
-+ FLAG_TIMESTAMP_NO_DELAY = 1 << 6,
- };
-
- typedef struct VAAPIEncodeType {
-diff --git a/libavcodec/vaapi_encode_av1.c b/libavcodec/vaapi_encode_av1.c
-new file mode 100644
-index 0000000..9d101fa
---- /dev/null
-+++ b/libavcodec/vaapi_encode_av1.c
-@@ -0,0 +1,949 @@
-+/*
-+ * Copyright (c) 2023 Intel Corporation
-+ *
-+ * This file is part of FFmpeg.
-+ *
-+ * FFmpeg is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * FFmpeg is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with FFmpeg; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#include <va/va.h>
-+#include <va/va_enc_av1.h>
-+
-+#include "libavutil/pixdesc.h"
-+#include "libavutil/opt.h"
-+
-+#include "cbs_av1.h"
-+#include "put_bits.h"
-+#include "codec_internal.h"
-+#include "av1_levels.h"
-+#include "vaapi_encode.h"
-+
-+#define AV1_MAX_QUANT 255
-+
-+typedef struct VAAPIEncodeAV1Picture {
-+ int64_t last_idr_frame;
-+ int slot;
-+} VAAPIEncodeAV1Picture;
-+
-+typedef struct VAAPIEncodeAV1Context {
-+ VAAPIEncodeContext common;
-+ AV1RawOBU sh; /**< sequence header.*/
-+ AV1RawOBU fh; /**< frame header.*/
-+ CodedBitstreamContext *cbc;
-+ CodedBitstreamFragment current_obu;
-+ VAConfigAttribValEncAV1 attr;
-+ VAConfigAttribValEncAV1Ext1 attr_ext1;
-+ VAConfigAttribValEncAV1Ext2 attr_ext2;
-+
-+ char sh_data[MAX_PARAM_BUFFER_SIZE]; /**< coded sequence header data. */
-+ size_t sh_data_len; /**< bit length of sh_data. */
-+ char fh_data[MAX_PARAM_BUFFER_SIZE]; /**< coded frame header data. */
-+ size_t fh_data_len; /**< bit length of fh_data. */
-+
-+ uint8_t uniform_tile;
-+ uint8_t use_128x128_superblock;
-+ int sb_cols;
-+ int sb_rows;
-+ int tile_cols_log2;
-+ int tile_rows_log2;
-+ int max_tile_width_sb;
-+ int max_tile_height_sb;
-+ uint8_t width_in_sbs_minus_1[AV1_MAX_TILE_COLS];
-+ uint8_t height_in_sbs_minus_1[AV1_MAX_TILE_ROWS];
-+
-+ int min_log2_tile_cols;
-+ int max_log2_tile_cols;
-+ int min_log2_tile_rows;
-+ int max_log2_tile_rows;
-+
-+ int q_idx_idr;
-+ int q_idx_p;
-+ int q_idx_b;
-+
-+ /** bit positions in current frame header */
-+ int qindex_offset;
-+ int loopfilter_offset;
-+ int cdef_start_offset;
-+ int cdef_param_size;
-+
-+ /** user options */
-+ int profile;
-+ int level;
-+ int tier;
-+ int tile_cols, tile_rows;
-+ int tile_groups;
-+} VAAPIEncodeAV1Context;
-+
-+static void vaapi_encode_av1_trace_write_log(void *ctx,
-+ PutBitContext *pbc, int length,
-+ const char *str, const int *subscripts,
-+ int64_t value)
-+{
-+ VAAPIEncodeAV1Context *priv = ctx;
-+ int position;
-+
-+ position = put_bits_count(pbc);
-+ av_assert0(position >= length);
-+
-+ if (!strcmp(str, "base_q_idx"))
-+ priv->qindex_offset = position - length;
-+ else if (!strcmp(str, "loop_filter_level[0]"))
-+ priv->loopfilter_offset = position - length;
-+ else if (!strcmp(str, "cdef_damping_minus_3"))
-+ priv->cdef_start_offset = position - length;
-+ else if (!strcmp(str, "cdef_uv_sec_strength[i]"))
-+ priv->cdef_param_size = position - priv->cdef_start_offset;
-+}
-+
-+static av_cold int vaapi_encode_av1_get_encoder_caps(AVCodecContext *avctx)
-+{
-+ VAAPIEncodeContext *ctx = avctx->priv_data;
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+
-+ // Surfaces must be aligned to superblock boundaries.
-+ ctx->surface_width = FFALIGN(avctx->width, priv->use_128x128_superblock ? 128 : 64);
-+ ctx->surface_height = FFALIGN(avctx->height, priv->use_128x128_superblock ? 128 : 64);
-+
-+ return 0;
-+}
-+
-+static av_cold int vaapi_encode_av1_configure(AVCodecContext *avctx)
-+{
-+ VAAPIEncodeContext *ctx = avctx->priv_data;
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+ int ret;
-+
-+ ret = ff_cbs_init(&priv->cbc, AV_CODEC_ID_AV1, avctx);
-+ if (ret < 0)
-+ return ret;
-+ priv->cbc->trace_enable = 1;
-+ priv->cbc->trace_level = AV_LOG_DEBUG;
-+ priv->cbc->trace_context = ctx;
-+ priv->cbc->trace_write_callback = vaapi_encode_av1_trace_write_log;
-+
-+ if (ctx->rc_mode->quality) {
-+ priv->q_idx_p = av_clip(ctx->rc_quality, 0, AV1_MAX_QUANT);
-+ if (fabs(avctx->i_quant_factor) > 0.0)
-+ priv->q_idx_idr =
-+ av_clip((fabs(avctx->i_quant_factor) * priv->q_idx_p +
-+ avctx->i_quant_offset) + 0.5,
-+ 0, AV1_MAX_QUANT);
-+ else
-+ priv->q_idx_idr = priv->q_idx_p;
-+
-+ if (fabs(avctx->b_quant_factor) > 0.0)
-+ priv->q_idx_b =
-+ av_clip((fabs(avctx->b_quant_factor) * priv->q_idx_p +
-+ avctx->b_quant_offset) + 0.5,
-+ 0, AV1_MAX_QUANT);
-+ else
-+ priv->q_idx_b = priv->q_idx_p;
-+ } else {
-+ /** Arbitrary value */
-+ priv->q_idx_idr = priv->q_idx_p = priv->q_idx_b = 128;
-+ }
-+
-+ return 0;
-+}
-+
-+static int vaapi_encode_av1_add_obu(AVCodecContext *avctx,
-+ CodedBitstreamFragment *au,
-+ uint8_t type,
-+ void *obu_unit)
-+{
-+ int ret;
-+
-+ ret = ff_cbs_insert_unit_content(au, -1,
-+ type, obu_unit, NULL);
-+ if (ret < 0) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to add OBU unit: "
-+ "type = %d.\n", type);
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int vaapi_encode_av1_write_obu(AVCodecContext *avctx,
-+ char *data, size_t *data_len,
-+ CodedBitstreamFragment *bs)
-+{
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+ int ret;
-+
-+ ret = ff_cbs_write_fragment_data(priv->cbc, bs);
-+ if (ret < 0) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
-+ return ret;
-+ }
-+
-+ if ((size_t)8 * MAX_PARAM_BUFFER_SIZE < 8 * bs->data_size - bs->data_bit_padding) {
-+ av_log(avctx, AV_LOG_ERROR, "Access unit too large: "
-+ "%zu < %zu.\n", (size_t)8 * MAX_PARAM_BUFFER_SIZE,
-+ 8 * bs->data_size - bs->data_bit_padding);
-+ return AVERROR(ENOSPC);
-+ }
-+
-+ memcpy(data, bs->data, bs->data_size);
-+ *data_len = 8 * bs->data_size - bs->data_bit_padding;
-+
-+ return 0;
-+}
-+
-+static int tile_log2(int blkSize, int target) {
-+ int k;
-+ for (k = 0; (blkSize << k) < target; k++);
-+ return k;
-+}
-+
-+static int vaapi_encode_av1_set_tile(AVCodecContext *avctx)
-+{
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+ int mi_cols, mi_rows, sb_shift, sb_size;
-+ int max_tile_area_sb, max_tile_area_sb_varied;
-+ int tile_width_sb, tile_height_sb, widest_tile_sb;
-+ int tile_cols, tile_rows;
-+ int min_log2_tiles;
-+ int i;
-+
-+ if (priv->tile_cols > AV1_MAX_TILE_COLS ||
-+ priv->tile_rows > AV1_MAX_TILE_ROWS) {
-+ av_log(avctx, AV_LOG_ERROR, "Invalid tile number %dx%d, should less than %dx%d.\n",
-+ priv->tile_cols, priv->tile_rows, AV1_MAX_TILE_COLS, AV1_MAX_TILE_ROWS);
-+ return AVERROR(EINVAL);
-+ }
-+
-+ mi_cols = 2 * ((avctx->width + 7) >> 3);
-+ mi_rows = 2 * ((avctx->height + 7) >> 3);
-+ priv->sb_cols = priv->use_128x128_superblock ?
-+ ((mi_cols + 31) >> 5) : ((mi_cols + 15) >> 4);
-+ priv->sb_rows = priv->use_128x128_superblock ?
-+ ((mi_rows + 31) >> 5) : ((mi_rows + 15) >> 4);
-+ sb_shift = priv->use_128x128_superblock ? 5 : 4;
-+ sb_size = sb_shift + 2;
-+ priv->max_tile_width_sb = AV1_MAX_TILE_WIDTH >> sb_size;
-+ max_tile_area_sb = AV1_MAX_TILE_AREA >> (2 * sb_size);
-+
-+ priv->min_log2_tile_cols = tile_log2(priv->max_tile_width_sb, priv->sb_cols);
-+ priv->max_log2_tile_cols = tile_log2(1, FFMIN(priv->sb_cols, AV1_MAX_TILE_COLS));
-+ priv->max_log2_tile_rows = tile_log2(1, FFMIN(priv->sb_rows, AV1_MAX_TILE_ROWS));
-+ min_log2_tiles = FFMAX(priv->min_log2_tile_cols,
-+ tile_log2(max_tile_area_sb, priv->sb_rows * priv->sb_cols));
-+
-+ tile_cols = av_clip(priv->tile_cols, (priv->sb_cols + priv->max_tile_width_sb - 1) / priv->max_tile_width_sb, priv->sb_cols);
-+
-+ if (!priv->tile_cols)
-+ priv->tile_cols = tile_cols;
-+ else if (priv->tile_cols != tile_cols){
-+ av_log(avctx, AV_LOG_ERROR, "Invalid tile cols %d, should be in range of %d~%d\n",
-+ priv->tile_cols,
-+ (priv->sb_cols + priv->max_tile_width_sb - 1) / priv->max_tile_width_sb,
-+ priv->sb_cols);
-+ return AVERROR(EINVAL);
-+ }
-+
-+ priv->tile_cols_log2 = tile_log2(1, priv->tile_cols);
-+ tile_width_sb = (priv->sb_cols + (1 << priv->tile_cols_log2) - 1) >>
-+ priv->tile_cols_log2;
-+
-+ if (priv->tile_rows > priv->sb_rows) {
-+ av_log(avctx, AV_LOG_ERROR, "Invalid tile rows %d, should be less than %d.\n",
-+ priv->tile_rows, priv->sb_rows);
-+ return AVERROR(EINVAL);
-+ }
-+
-+ /** Try user setting tile rows number first. */
-+ tile_rows = priv->tile_rows ? priv->tile_rows : 1;
-+ for (; tile_rows <= priv->sb_rows && tile_rows <= AV1_MAX_TILE_ROWS; tile_rows++) {
-+ /** try uniformed tile. */
-+ priv->tile_rows_log2 = tile_log2(1, tile_rows);
-+ if ((priv->sb_cols + tile_width_sb - 1) / tile_width_sb == priv->tile_cols) {
-+ for (i = 0; i < priv->tile_cols - 1; i++)
-+ priv->width_in_sbs_minus_1[i] = tile_width_sb - 1;
-+ priv->width_in_sbs_minus_1[i] = priv->sb_cols - (priv->tile_cols - 1) * tile_width_sb - 1;
-+
-+ tile_height_sb = (priv->sb_rows + (1 << priv->tile_rows_log2) - 1) >>
-+ priv->tile_rows_log2;
-+
-+ if ((priv->sb_rows + tile_height_sb - 1) / tile_height_sb == tile_rows &&
-+ tile_height_sb <= max_tile_area_sb / tile_width_sb) {
-+ for (i = 0; i < tile_rows - 1; i++)
-+ priv->height_in_sbs_minus_1[i] = tile_height_sb - 1;
-+ priv->height_in_sbs_minus_1[i] = priv->sb_rows - (tile_rows - 1) * tile_height_sb - 1;
-+
-+ priv->uniform_tile = 1;
-+ priv->min_log2_tile_rows = FFMAX(min_log2_tiles - priv->tile_cols_log2, 0);
-+
-+ break;
-+ }
-+ }
-+
-+ /** try non-uniformed tile. */
-+ widest_tile_sb = 0;
-+ for (i = 0; i < priv->tile_cols; i++) {
-+ priv->width_in_sbs_minus_1[i] = (i + 1) * priv->sb_cols / priv->tile_cols - i * priv->sb_cols / priv->tile_cols - 1;
-+ widest_tile_sb = FFMAX(widest_tile_sb, priv->width_in_sbs_minus_1[i] + 1);
-+ }
-+
-+ if (min_log2_tiles)
-+ max_tile_area_sb_varied = (priv->sb_rows * priv->sb_cols) >> (min_log2_tiles + 1);
-+ else
-+ max_tile_area_sb_varied = priv->sb_rows * priv->sb_cols;
-+ priv->max_tile_height_sb = FFMAX(1, max_tile_area_sb_varied / widest_tile_sb);
-+
-+ if (tile_rows == av_clip(tile_rows, (priv->sb_rows + priv->max_tile_height_sb - 1) / priv->max_tile_height_sb, priv->sb_rows)) {
-+ for (i = 0; i < tile_rows; i++)
-+ priv->height_in_sbs_minus_1[i] = (i + 1) * priv->sb_rows / tile_rows - i * priv->sb_rows / tile_rows - 1;
-+
-+ break;
-+ }
-+
-+ /** Return invalid parameter if explicit tile rows is set. */
-+ if (priv->tile_rows) {
-+ av_log(avctx, AV_LOG_ERROR, "Invalid tile rows %d.\n", priv->tile_rows);
-+ return AVERROR(EINVAL);
-+ }
-+ }
-+
-+ priv->tile_rows = tile_rows;
-+ av_log(avctx, AV_LOG_DEBUG, "Setting tile cols/rows to %d/%d.\n",
-+ priv->tile_cols, priv->tile_rows);
-+
-+ /** check if tile cols/rows is supported by driver. */
-+ if (priv->attr_ext2.bits.max_tile_num_minus1) {
-+ if ((priv->tile_cols * priv->tile_rows - 1) > priv->attr_ext2.bits.max_tile_num_minus1) {
-+ av_log(avctx, AV_LOG_ERROR, "Unsupported tile num %d * %d = %d by driver, "
-+ "should be at most %d.\n", priv->tile_cols, priv->tile_rows,
-+ priv->tile_cols * priv->tile_rows,
-+ priv->attr_ext2.bits.max_tile_num_minus1 + 1);
-+ return AVERROR(EINVAL);
-+ }
-+ }
-+
-+ /** check if tile group numbers is valid. */
-+ if (priv->tile_groups > priv->tile_cols * priv->tile_rows) {
-+ av_log(avctx, AV_LOG_WARNING, "Invalid tile groups number %d, "
-+ "correct to %d.\n", priv->tile_groups, priv->tile_cols * priv->tile_rows);
-+ priv->tile_groups = priv->tile_cols * priv->tile_rows;
-+ }
-+
-+ return 0;
-+}
-+
-+static int vaapi_encode_av1_write_sequence_header(AVCodecContext *avctx,
-+ char *data, size_t *data_len)
-+{
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+
-+ memcpy(data, &priv->sh_data, MAX_PARAM_BUFFER_SIZE * sizeof(char));
-+ *data_len = priv->sh_data_len;
-+
-+ return 0;
-+}
-+
-+static int vaapi_encode_av1_init_sequence_params(AVCodecContext *avctx)
-+{
-+ VAAPIEncodeContext *ctx = avctx->priv_data;
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+ AV1RawOBU *sh_obu = &priv->sh;
-+ AV1RawSequenceHeader *sh = &sh_obu->obu.sequence_header;
-+ VAEncSequenceParameterBufferAV1 *vseq = ctx->codec_sequence_params;
-+ CodedBitstreamFragment *obu = &priv->current_obu;
-+ const AVPixFmtDescriptor *desc;
-+ int ret;
-+
-+ memset(sh_obu, 0, sizeof(*sh_obu));
-+ sh_obu->header.obu_type = AV1_OBU_SEQUENCE_HEADER;
-+
-+ desc = av_pix_fmt_desc_get(priv->common.input_frames->sw_format);
-+ av_assert0(desc);
-+
-+ sh->seq_profile = avctx->profile;
-+ if (!sh->seq_force_screen_content_tools)
-+ sh->seq_force_integer_mv = AV1_SELECT_INTEGER_MV;
-+ sh->frame_width_bits_minus_1 = av_log2(avctx->width);
-+ sh->frame_height_bits_minus_1 = av_log2(avctx->height);
-+ sh->max_frame_width_minus_1 = avctx->width - 1;
-+ sh->max_frame_height_minus_1 = avctx->height - 1;
-+ sh->seq_tier[0] = priv->tier;
-+ /** enable order hint and reserve maximum 8 bits for it by default. */
-+ sh->enable_order_hint = 1;
-+ sh->order_hint_bits_minus_1 = 7;
-+
-+ sh->color_config = (AV1RawColorConfig) {
-+ .high_bitdepth = desc->comp[0].depth == 8 ? 0 : 1,
-+ .color_primaries = avctx->color_primaries,
-+ .transfer_characteristics = avctx->color_trc,
-+ .matrix_coefficients = avctx->colorspace,
-+ .color_description_present_flag = (avctx->color_primaries != AVCOL_PRI_UNSPECIFIED ||
-+ avctx->color_trc != AVCOL_TRC_UNSPECIFIED ||
-+ avctx->colorspace != AVCOL_SPC_UNSPECIFIED),
-+ .color_range = avctx->color_range == AVCOL_RANGE_JPEG,
-+ .subsampling_x = desc->log2_chroma_w,
-+ .subsampling_y = desc->log2_chroma_h,
-+ };
-+
-+ switch (avctx->chroma_sample_location) {
-+ case AVCHROMA_LOC_LEFT:
-+ sh->color_config.chroma_sample_position = AV1_CSP_VERTICAL;
-+ break;
-+ case AVCHROMA_LOC_TOPLEFT:
-+ sh->color_config.chroma_sample_position = AV1_CSP_COLOCATED;
-+ break;
-+ default:
-+ sh->color_config.chroma_sample_position = AV1_CSP_UNKNOWN;
-+ break;
-+ }
-+
-+ if (avctx->level != FF_PROFILE_UNKNOWN) {
-+ sh->seq_level_idx[0] = avctx->level;
-+ } else {
-+ const AV1LevelDescriptor *level;
-+ float framerate;
-+
-+ if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
-+ framerate = avctx->framerate.num / avctx->framerate.den;
-+ else
-+ framerate = 0;
-+
-+ level = ff_av1_guess_level(avctx->bit_rate, priv->tier,
-+ ctx->surface_width, ctx->surface_height,
-+ priv->tile_rows * priv->tile_cols,
-+ priv->tile_cols, framerate);
-+ if (level) {
-+ av_log(avctx, AV_LOG_VERBOSE, "Using level %s.\n", level->name);
-+ sh->seq_level_idx[0] = level->level_idx;
-+ } else {
-+ av_log(avctx, AV_LOG_VERBOSE, "Stream will not conform to "
-+ "any normal level, using maximum parameters level by default.\n");
-+ sh->seq_level_idx[0] = 31;
-+ sh->seq_tier[0] = 1;
-+ }
-+ }
-+ vseq->seq_profile = sh->seq_profile;
-+ vseq->seq_level_idx = sh->seq_level_idx[0];
-+ vseq->seq_tier = sh->seq_tier[0];
-+ vseq->order_hint_bits_minus_1 = sh->order_hint_bits_minus_1;
-+ vseq->intra_period = ctx->gop_size;
-+ vseq->ip_period = ctx->b_per_p + 1;
-+
-+ vseq->seq_fields.bits.enable_order_hint = sh->enable_order_hint;
-+
-+ if (!(ctx->va_rc_mode & VA_RC_CQP)) {
-+ vseq->bits_per_second = ctx->va_bit_rate;
-+ vseq->seq_fields.bits.enable_cdef = sh->enable_cdef = 1;
-+ }
-+
-+ ret = vaapi_encode_av1_add_obu(avctx, obu, AV1_OBU_SEQUENCE_HEADER, &priv->sh);
-+ if (ret < 0)
-+ goto end;
-+
-+ ret = vaapi_encode_av1_write_obu(avctx, priv->sh_data, &priv->sh_data_len, obu);
-+ if (ret < 0)
-+ goto end;
-+
-+end:
-+ ff_cbs_fragment_reset(obu);
-+ return ret;
-+}
-+
-+static int vaapi_encode_av1_init_picture_params(AVCodecContext *avctx,
-+ VAAPIEncodePicture *pic)
-+{
-+ VAAPIEncodeContext *ctx = avctx->priv_data;
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+ VAAPIEncodeAV1Picture *hpic = pic->priv_data;
-+ AV1RawOBU *fh_obu = &priv->fh;
-+ AV1RawFrameHeader *fh = &fh_obu->obu.frame.header;
-+ VAEncPictureParameterBufferAV1 *vpic = pic->codec_picture_params;
-+ CodedBitstreamFragment *obu = &priv->current_obu;
-+ VAAPIEncodePicture *ref;
-+ VAAPIEncodeAV1Picture *href;
-+ int slot, i;
-+ int ret;
-+ static const int8_t default_loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME] =
-+ { 1, 0, 0, 0, -1, 0, -1, -1 };
-+
-+ memset(fh_obu, 0, sizeof(*fh_obu));
-+ pic->nb_slices = priv->tile_groups;
-+ pic->non_independent_frame = pic->encode_order < pic->display_order;
-+ fh_obu->header.obu_type = AV1_OBU_FRAME_HEADER;
-+ fh_obu->header.obu_has_size_field = 1;
-+
-+ switch (pic->type) {
-+ case PICTURE_TYPE_IDR:
-+ av_assert0(pic->nb_refs[0] == 0 || pic->nb_refs[1]);
-+ fh->frame_type = AV1_FRAME_KEY;
-+ fh->refresh_frame_flags = 0xFF;
-+ fh->base_q_idx = priv->q_idx_idr;
-+ hpic->slot = 0;
-+ hpic->last_idr_frame = pic->display_order;
-+ break;
-+ case PICTURE_TYPE_P:
-+ av_assert0(pic->nb_refs[0]);
-+ fh->frame_type = AV1_FRAME_INTER;
-+ fh->base_q_idx = priv->q_idx_p;
-+ ref = pic->refs[0][pic->nb_refs[0] - 1];
-+ href = ref->priv_data;
-+ hpic->slot = !href->slot;
-+ hpic->last_idr_frame = href->last_idr_frame;
-+ fh->refresh_frame_flags = 1 << hpic->slot;
-+
-+ /** set the nearest frame in L0 as all reference frame. */
-+ for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
-+ fh->ref_frame_idx[i] = href->slot;
-+ }
-+ fh->primary_ref_frame = href->slot;
-+ fh->ref_order_hint[href->slot] = ref->display_order - href->last_idr_frame;
-+ vpic->ref_frame_ctrl_l0.fields.search_idx0 = AV1_REF_FRAME_LAST;
-+
-+ /** set the 2nd nearest frame in L0 as Golden frame. */
-+ if (pic->nb_refs[0] > 1) {
-+ ref = pic->refs[0][pic->nb_refs[0] - 2];
-+ href = ref->priv_data;
-+ fh->ref_frame_idx[3] = href->slot;
-+ fh->ref_order_hint[href->slot] = ref->display_order - href->last_idr_frame;
-+ vpic->ref_frame_ctrl_l0.fields.search_idx1 = AV1_REF_FRAME_GOLDEN;
-+ }
-+ break;
-+ case PICTURE_TYPE_B:
-+ av_assert0(pic->nb_refs[0] && pic->nb_refs[1]);
-+ fh->frame_type = AV1_FRAME_INTER;
-+ fh->base_q_idx = priv->q_idx_b;
-+ fh->refresh_frame_flags = 0x0;
-+ fh->reference_select = 1;
-+
-+ /** B frame will not be referenced, disable its recon frame. */
-+ vpic->picture_flags.bits.disable_frame_recon = 1;
-+
-+ /** Use LAST_FRAME and BWDREF_FRAME for reference. */
-+ vpic->ref_frame_ctrl_l0.fields.search_idx0 = AV1_REF_FRAME_LAST;
-+ vpic->ref_frame_ctrl_l1.fields.search_idx0 = AV1_REF_FRAME_BWDREF;
-+
-+ ref = pic->refs[0][pic->nb_refs[0] - 1];
-+ href = ref->priv_data;
-+ hpic->last_idr_frame = href->last_idr_frame;
-+ fh->primary_ref_frame = href->slot;
-+ fh->ref_order_hint[href->slot] = ref->display_order - href->last_idr_frame;
-+ for (i = 0; i < AV1_REF_FRAME_GOLDEN; i++) {
-+ fh->ref_frame_idx[i] = href->slot;
-+ }
-+
-+ ref = pic->refs[1][pic->nb_refs[1] - 1];
-+ href = ref->priv_data;
-+ fh->ref_order_hint[href->slot] = ref->display_order - href->last_idr_frame;
-+ for (i = AV1_REF_FRAME_GOLDEN; i < AV1_REFS_PER_FRAME; i++) {
-+ fh->ref_frame_idx[i] = href->slot;
-+ }
-+ break;
-+ default:
-+ av_assert0(0 && "invalid picture type");
-+ }
-+
-+ fh->show_frame = pic->display_order <= pic->encode_order;
-+ fh->showable_frame = fh->frame_type != AV1_FRAME_KEY;
-+ fh->frame_width_minus_1 = avctx->width - 1;
-+ fh->frame_height_minus_1 = avctx->height - 1;
-+ fh->render_width_minus_1 = fh->frame_width_minus_1;
-+ fh->render_height_minus_1 = fh->frame_height_minus_1;
-+ fh->order_hint = pic->display_order - hpic->last_idr_frame;
-+ fh->tile_cols = priv->tile_cols;
-+ fh->tile_rows = priv->tile_rows;
-+ fh->tile_cols_log2 = priv->tile_cols_log2;
-+ fh->tile_rows_log2 = priv->tile_rows_log2;
-+ fh->uniform_tile_spacing_flag = priv->uniform_tile;
-+ fh->tile_size_bytes_minus1 = priv->attr_ext2.bits.tile_size_bytes_minus1;
-+
-+ /** ignore ONLY_4x4 mode for codedlossless is not fully implemented. */
-+ if (priv->attr_ext2.bits.tx_mode_support & 0x04)
-+ fh->tx_mode = AV1_TX_MODE_SELECT;
-+ else if (priv->attr_ext2.bits.tx_mode_support & 0x02)
-+ fh->tx_mode = AV1_TX_MODE_LARGEST;
-+ else {
-+ av_log(avctx, AV_LOG_ERROR, "No available tx mode found.\n");
-+ return AVERROR(EINVAL);
-+ }
-+
-+ for (i = 0; i < fh->tile_cols; i++)
-+ fh->width_in_sbs_minus_1[i] = vpic->width_in_sbs_minus_1[i] = priv->width_in_sbs_minus_1[i];
-+
-+ for (i = 0; i < fh->tile_rows; i++)
-+ fh->height_in_sbs_minus_1[i] = vpic->height_in_sbs_minus_1[i] = priv->height_in_sbs_minus_1[i];
-+
-+ memcpy(fh->loop_filter_ref_deltas, default_loop_filter_ref_deltas,
-+ AV1_TOTAL_REFS_PER_FRAME * sizeof(int8_t));
-+
-+ if (fh->frame_type == AV1_FRAME_KEY && fh->show_frame) {
-+ fh->error_resilient_mode = 1;
-+ }
-+
-+ if (fh->frame_type == AV1_FRAME_KEY || fh->error_resilient_mode)
-+ fh->primary_ref_frame = AV1_PRIMARY_REF_NONE;
-+
-+ vpic->base_qindex = fh->base_q_idx;
-+ vpic->frame_width_minus_1 = fh->frame_width_minus_1;
-+ vpic->frame_height_minus_1 = fh->frame_height_minus_1;
-+ vpic->primary_ref_frame = fh->primary_ref_frame;
-+ vpic->reconstructed_frame = pic->recon_surface;
-+ vpic->coded_buf = pic->output_buffer;
-+ vpic->tile_cols = fh->tile_cols;
-+ vpic->tile_rows = fh->tile_rows;
-+ vpic->order_hint = fh->order_hint;
-+#if VA_CHECK_VERSION(1, 15, 0)
-+ vpic->refresh_frame_flags = fh->refresh_frame_flags;
-+#endif
-+
-+ vpic->picture_flags.bits.enable_frame_obu = 0;
-+ vpic->picture_flags.bits.frame_type = fh->frame_type;
-+ vpic->picture_flags.bits.reduced_tx_set = fh->reduced_tx_set;
-+ vpic->picture_flags.bits.error_resilient_mode = fh->error_resilient_mode;
-+
-+ /** let driver decide to use single or compound reference prediction mode. */
-+ vpic->mode_control_flags.bits.reference_mode = fh->reference_select ? 2 : 0;
-+ vpic->mode_control_flags.bits.tx_mode = fh->tx_mode;
-+
-+ vpic->tile_group_obu_hdr_info.bits.obu_has_size_field = 1;
-+
-+ /** set reference. */
-+ for (i = 0; i < AV1_REFS_PER_FRAME; i++)
-+ vpic->ref_frame_idx[i] = fh->ref_frame_idx[i];
-+
-+ for (i = 0; i < FF_ARRAY_ELEMS(vpic->reference_frames); i++)
-+ vpic->reference_frames[i] = VA_INVALID_SURFACE;
-+
-+ for (i = 0; i < MAX_REFERENCE_LIST_NUM; i++) {
-+ for (int j = 0; j < pic->nb_refs[i]; j++) {
-+ VAAPIEncodePicture *ref_pic = pic->refs[i][j];
-+
-+ slot = ((VAAPIEncodeAV1Picture*)ref_pic->priv_data)->slot;
-+ av_assert0(vpic->reference_frames[slot] == VA_INVALID_SURFACE);
-+
-+ vpic->reference_frames[slot] = ref_pic->recon_surface;
-+ }
-+ }
-+
-+ fh_obu->obu_size_byte_len = priv->attr_ext2.bits.obu_size_bytes_minus1 + 1;
-+ ret = vaapi_encode_av1_add_obu(avctx, obu, AV1_OBU_FRAME_HEADER, &priv->fh);
-+ if (ret < 0)
-+ goto end;
-+
-+ ret = vaapi_encode_av1_write_obu(avctx, priv->fh_data, &priv->fh_data_len, obu);
-+ if (ret < 0)
-+ goto end;
-+
-+ if (!(ctx->va_rc_mode & VA_RC_CQP)) {
-+ vpic->min_base_qindex = av_clip(avctx->qmin, 1, AV1_MAX_QUANT);
-+ vpic->max_base_qindex = av_clip(avctx->qmax, 1, AV1_MAX_QUANT);
-+
-+ vpic->bit_offset_qindex = priv->qindex_offset;
-+ vpic->bit_offset_loopfilter_params = priv->loopfilter_offset;
-+ vpic->bit_offset_cdef_params = priv->cdef_start_offset;
-+ vpic->size_in_bits_cdef_params = priv->cdef_param_size;
-+ vpic->size_in_bits_frame_hdr_obu = priv->fh_data_len;
-+ vpic->byte_offset_frame_hdr_obu_size = (((pic->type == PICTURE_TYPE_IDR) ?
-+ priv->sh_data_len / 8 : 0) +
-+ (fh_obu->header.obu_extension_flag ?
-+ 2 : 1));
-+ }
-+
-+end:
-+ ff_cbs_fragment_reset(obu);
-+ return ret;
-+}
-+
-+static int vaapi_encode_av1_init_slice_params(AVCodecContext *avctx,
-+ VAAPIEncodePicture *pic,
-+ VAAPIEncodeSlice *slice)
-+{
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+ VAEncTileGroupBufferAV1 *vslice = slice->codec_slice_params;
-+ CodedBitstreamAV1Context *cbctx = priv->cbc->priv_data;
-+ int div;
-+
-+ /** Set tile group info. */
-+ div = priv->tile_cols * priv->tile_rows / priv->tile_groups;
-+ vslice->tg_start = slice->index * div;
-+ if (slice->index == (priv->tile_groups - 1)) {
-+ vslice->tg_end = priv->tile_cols * priv->tile_rows - 1;
-+ cbctx->seen_frame_header = 0;
-+ } else {
-+ vslice->tg_end = (slice->index + 1) * div - 1;
-+ }
-+
-+ return 0;
-+}
-+
-+static int vaapi_encode_av1_write_picture_header(AVCodecContext *avctx,
-+ VAAPIEncodePicture *pic,
-+ char *data, size_t *data_len)
-+{
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+ CodedBitstreamFragment *obu = &priv->current_obu;
-+ CodedBitstreamAV1Context *cbctx = priv->cbc->priv_data;
-+ AV1RawOBU *fh_obu = &priv->fh;
-+ AV1RawFrameHeader *rep_fh = &fh_obu->obu.frame_header;
-+ VAAPIEncodeAV1Picture *href;
-+ int ret = 0;
-+
-+ pic->tail_size = 0;
-+ /** Pack repeat frame header. */
-+ if (pic->display_order > pic->encode_order) {
-+ memset(fh_obu, 0, sizeof(*fh_obu));
-+ href = pic->refs[0][pic->nb_refs[0] - 1]->priv_data;
-+ fh_obu->header.obu_type = AV1_OBU_FRAME_HEADER;
-+ fh_obu->header.obu_has_size_field = 1;
-+
-+ rep_fh->show_existing_frame = 1;
-+ rep_fh->frame_to_show_map_idx = href->slot == 0;
-+ rep_fh->frame_type = AV1_FRAME_INTER;
-+ rep_fh->frame_width_minus_1 = avctx->width - 1;
-+ rep_fh->frame_height_minus_1 = avctx->height - 1;
-+ rep_fh->render_width_minus_1 = rep_fh->frame_width_minus_1;
-+ rep_fh->render_height_minus_1 = rep_fh->frame_height_minus_1;
-+
-+ cbctx->seen_frame_header = 0;
-+
-+ ret = vaapi_encode_av1_add_obu(avctx, obu, AV1_OBU_FRAME_HEADER, &priv->fh);
-+ if (ret < 0)
-+ goto end;
-+
-+ ret = vaapi_encode_av1_write_obu(avctx, pic->tail_data, &pic->tail_size, obu);
-+ if (ret < 0)
-+ goto end;
-+
-+ pic->tail_size /= 8;
-+ }
-+
-+ memcpy(data, &priv->fh_data, MAX_PARAM_BUFFER_SIZE * sizeof(char));
-+ *data_len = priv->fh_data_len;
-+
-+end:
-+ ff_cbs_fragment_reset(obu);
-+ return ret;
-+}
-+
-+static const VAAPIEncodeProfile vaapi_encode_av1_profiles[] = {
-+ { FF_PROFILE_AV1_MAIN, 8, 3, 1, 1, VAProfileAV1Profile0 },
-+ { FF_PROFILE_AV1_MAIN, 10, 3, 1, 1, VAProfileAV1Profile0 },
-+ { FF_PROFILE_UNKNOWN }
-+};
-+
-+static const VAAPIEncodeType vaapi_encode_type_av1 = {
-+ .profiles = vaapi_encode_av1_profiles,
-+ .flags = FLAG_B_PICTURES | FLAG_TIMESTAMP_NO_DELAY,
-+ .default_quality = 25,
-+
-+ .get_encoder_caps = &vaapi_encode_av1_get_encoder_caps,
-+ .configure = &vaapi_encode_av1_configure,
-+
-+ .sequence_header_type = VAEncPackedHeaderSequence,
-+ .sequence_params_size = sizeof(VAEncSequenceParameterBufferAV1),
-+ .init_sequence_params = &vaapi_encode_av1_init_sequence_params,
-+ .write_sequence_header = &vaapi_encode_av1_write_sequence_header,
-+
-+ .picture_priv_data_size = sizeof(VAAPIEncodeAV1Picture),
-+ .picture_header_type = VAEncPackedHeaderPicture,
-+ .picture_params_size = sizeof(VAEncPictureParameterBufferAV1),
-+ .init_picture_params = &vaapi_encode_av1_init_picture_params,
-+ .write_picture_header = &vaapi_encode_av1_write_picture_header,
-+
-+ .slice_params_size = sizeof(VAEncTileGroupBufferAV1),
-+ .init_slice_params = &vaapi_encode_av1_init_slice_params,
-+};
-+
-+static av_cold int vaapi_encode_av1_init(AVCodecContext *avctx)
-+{
-+ VAAPIEncodeContext *ctx = avctx->priv_data;
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+ VAConfigAttrib attr;
-+ VAStatus vas;
-+ int ret;
-+
-+ ctx->codec = &vaapi_encode_type_av1;
-+
-+ ctx->desired_packed_headers =
-+ VA_ENC_PACKED_HEADER_SEQUENCE |
-+ VA_ENC_PACKED_HEADER_PICTURE;
-+
-+ if (avctx->profile == FF_PROFILE_UNKNOWN)
-+ avctx->profile = priv->profile;
-+ if (avctx->level == FF_PROFILE_UNKNOWN)
-+ avctx->level = priv->level;
-+
-+ if (avctx->level != FF_PROFILE_UNKNOWN && avctx->level & ~0x1f) {
-+ av_log(avctx, AV_LOG_ERROR, "Invalid level %d\n", avctx->level);
-+ return AVERROR(EINVAL);
-+ }
-+
-+ ret = ff_vaapi_encode_init(avctx);
-+ if (ret < 0)
-+ return ret;
-+
-+ attr.type = VAConfigAttribEncAV1;
-+ vas = vaGetConfigAttributes(ctx->hwctx->display,
-+ ctx->va_profile,
-+ ctx->va_entrypoint,
-+ &attr, 1);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to query "
-+ "config attribute: %d (%s).\n", vas, vaErrorStr(vas));
-+ return AVERROR_EXTERNAL;
-+ } else if (attr.value == VA_ATTRIB_NOT_SUPPORTED) {
-+ priv->attr.value = 0;
-+ av_log(avctx, AV_LOG_WARNING, "Attribute type:%d is not "
-+ "supported.\n", attr.type);
-+ } else {
-+ priv->attr.value = attr.value;
-+ }
-+
-+ attr.type = VAConfigAttribEncAV1Ext1;
-+ vas = vaGetConfigAttributes(ctx->hwctx->display,
-+ ctx->va_profile,
-+ ctx->va_entrypoint,
-+ &attr, 1);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to query "
-+ "config attribute: %d (%s).\n", vas, vaErrorStr(vas));
-+ return AVERROR_EXTERNAL;
-+ } else if (attr.value == VA_ATTRIB_NOT_SUPPORTED) {
-+ priv->attr_ext1.value = 0;
-+ av_log(avctx, AV_LOG_WARNING, "Attribute type:%d is not "
-+ "supported.\n", attr.type);
-+ } else {
-+ priv->attr_ext1.value = attr.value;
-+ }
-+
-+ /** This attr provides essential indicators, return error if not support. */
-+ attr.type = VAConfigAttribEncAV1Ext2;
-+ vas = vaGetConfigAttributes(ctx->hwctx->display,
-+ ctx->va_profile,
-+ ctx->va_entrypoint,
-+ &attr, 1);
-+ if (vas != VA_STATUS_SUCCESS || attr.value == VA_ATTRIB_NOT_SUPPORTED) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to query "
-+ "config attribute: %d (%s).\n", vas, vaErrorStr(vas));
-+ return AVERROR_EXTERNAL;
-+ } else {
-+ priv->attr_ext2.value = attr.value;
-+ }
-+
-+ ret = vaapi_encode_av1_set_tile(avctx);
-+ if (ret < 0)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static av_cold int vaapi_encode_av1_close(AVCodecContext *avctx)
-+{
-+ VAAPIEncodeAV1Context *priv = avctx->priv_data;
-+
-+ ff_cbs_fragment_free(&priv->current_obu);
-+ ff_cbs_close(&priv->cbc);
-+
-+ return ff_vaapi_encode_close(avctx);
-+}
-+
-+#define OFFSET(x) offsetof(VAAPIEncodeAV1Context, x)
-+#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
-+
-+static const AVOption vaapi_encode_av1_options[] = {
-+ VAAPI_ENCODE_COMMON_OPTIONS,
-+ VAAPI_ENCODE_RC_OPTIONS,
-+ { "profile", "Set profile (seq_profile)",
-+ OFFSET(profile), AV_OPT_TYPE_INT,
-+ { .i64 = FF_PROFILE_UNKNOWN }, FF_PROFILE_UNKNOWN, 0xff, FLAGS, "profile" },
-+
-+#define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
-+ { .i64 = value }, 0, 0, FLAGS, "profile"
-+ { PROFILE("main", FF_PROFILE_AV1_MAIN) },
-+ { PROFILE("high", FF_PROFILE_AV1_HIGH) },
-+ { PROFILE("professional", FF_PROFILE_AV1_PROFESSIONAL) },
-+#undef PROFILE
-+
-+ { "tier", "Set tier (seq_tier)",
-+ OFFSET(tier), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, "tier" },
-+ { "main", NULL, 0, AV_OPT_TYPE_CONST,
-+ { .i64 = 0 }, 0, 0, FLAGS, "tier" },
-+ { "high", NULL, 0, AV_OPT_TYPE_CONST,
-+ { .i64 = 1 }, 0, 0, FLAGS, "tier" },
-+ { "level", "Set level (seq_level_idx)",
-+ OFFSET(level), AV_OPT_TYPE_INT,
-+ { .i64 = FF_PROFILE_UNKNOWN }, FF_PROFILE_UNKNOWN, 0x1f, FLAGS, "level" },
-+
-+#define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
-+ { .i64 = value }, 0, 0, FLAGS, "level"
-+ { LEVEL("2.0", 0) },
-+ { LEVEL("2.1", 1) },
-+ { LEVEL("3.0", 4) },
-+ { LEVEL("3.1", 5) },
-+ { LEVEL("4.0", 8) },
-+ { LEVEL("4.1", 9) },
-+ { LEVEL("5.0", 12) },
-+ { LEVEL("5.1", 13) },
-+ { LEVEL("5.2", 14) },
-+ { LEVEL("5.3", 15) },
-+ { LEVEL("6.0", 16) },
-+ { LEVEL("6.1", 17) },
-+ { LEVEL("6.2", 18) },
-+ { LEVEL("6.3", 19) },
-+#undef LEVEL
-+
-+ { "tiles", "Tile columns x rows (Use minimal tile column/row number automatically by default)",
-+ OFFSET(tile_cols), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, FLAGS },
-+ { "tile_groups", "Number of tile groups for encoding",
-+ OFFSET(tile_groups), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, AV1_MAX_TILE_ROWS * AV1_MAX_TILE_COLS, FLAGS },
-+
-+ { NULL },
-+};
-+
-+static const FFCodecDefault vaapi_encode_av1_defaults[] = {
-+ { "b", "0" },
-+ { "bf", "2" },
-+ { "g", "120" },
-+ { "qmin", "1" },
-+ { "qmax", "255" },
-+ { NULL },
-+};
-+
-+static const AVClass vaapi_encode_av1_class = {
-+ .class_name = "av1_vaapi",
-+ .item_name = av_default_item_name,
-+ .option = vaapi_encode_av1_options,
-+ .version = LIBAVUTIL_VERSION_INT,
-+};
-+
-+const FFCodec ff_av1_vaapi_encoder = {
-+ .p.name = "av1_vaapi",
-+ CODEC_LONG_NAME("AV1 (VAAPI)"),
-+ .p.type = AVMEDIA_TYPE_VIDEO,
-+ .p.id = AV_CODEC_ID_AV1,
-+ .priv_data_size = sizeof(VAAPIEncodeAV1Context),
-+ .init = &vaapi_encode_av1_init,
-+ FF_CODEC_RECEIVE_PACKET_CB(&ff_vaapi_encode_receive_packet),
-+ .close = &vaapi_encode_av1_close,
-+ .p.priv_class = &vaapi_encode_av1_class,
-+ .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE |
-+ AV_CODEC_CAP_DR1 | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
-+ .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE |
-+ FF_CODEC_CAP_INIT_CLEANUP,
-+ .defaults = vaapi_encode_av1_defaults,
-+ .p.pix_fmts = (const enum AVPixelFormat[]) {
-+ AV_PIX_FMT_VAAPI,
-+ AV_PIX_FMT_NONE,
-+ },
-+ .hw_configs = ff_vaapi_encode_hw_configs,
-+ .p.wrapper_name = "vaapi",
-+};
-diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
-index 645f6a9..c205d1e 100644
---- a/libavcodec/vaapi_encode_h264.c
-+++ b/libavcodec/vaapi_encode_h264.c
-@@ -614,7 +614,7 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx,
- VAAPIEncodePicture *prev = pic->prev;
- VAAPIEncodeH264Picture *hprev = prev ? prev->priv_data : NULL;
- VAEncPictureParameterBufferH264 *vpic = pic->codec_picture_params;
-- int i;
-+ int i, j = 0;
-
- if (pic->type == PICTURE_TYPE_IDR) {
- av_assert0(pic->display_order == pic->encode_order);
-@@ -715,24 +715,26 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx,
- .TopFieldOrderCnt = hpic->pic_order_cnt,
- .BottomFieldOrderCnt = hpic->pic_order_cnt,
- };
--
-- for (i = 0; i < pic->nb_refs; i++) {
-- VAAPIEncodePicture *ref = pic->refs[i];
-- VAAPIEncodeH264Picture *href;
--
-- av_assert0(ref && ref->encode_order < pic->encode_order);
-- href = ref->priv_data;
--
-- vpic->ReferenceFrames[i] = (VAPictureH264) {
-- .picture_id = ref->recon_surface,
-- .frame_idx = href->frame_num,
-- .flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE,
-- .TopFieldOrderCnt = href->pic_order_cnt,
-- .BottomFieldOrderCnt = href->pic_order_cnt,
-- };
-+ for (int k = 0; k < MAX_REFERENCE_LIST_NUM; k++) {
-+ for (i = 0; i < pic->nb_refs[k]; i++) {
-+ VAAPIEncodePicture *ref = pic->refs[k][i];
-+ VAAPIEncodeH264Picture *href;
-+
-+ av_assert0(ref && ref->encode_order < pic->encode_order);
-+ href = ref->priv_data;
-+
-+ vpic->ReferenceFrames[j++] = (VAPictureH264) {
-+ .picture_id = ref->recon_surface,
-+ .frame_idx = href->frame_num,
-+ .flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE,
-+ .TopFieldOrderCnt = href->pic_order_cnt,
-+ .BottomFieldOrderCnt = href->pic_order_cnt,
-+ };
-+ }
- }
-- for (; i < FF_ARRAY_ELEMS(vpic->ReferenceFrames); i++) {
-- vpic->ReferenceFrames[i] = (VAPictureH264) {
-+
-+ for (; j < FF_ARRAY_ELEMS(vpic->ReferenceFrames); j++) {
-+ vpic->ReferenceFrames[j] = (VAPictureH264) {
- .picture_id = VA_INVALID_ID,
- .flags = VA_PICTURE_H264_INVALID,
- };
-@@ -934,17 +936,17 @@ static int vaapi_encode_h264_init_slice_params(AVCodecContext *avctx,
-
- if (pic->type == PICTURE_TYPE_P) {
- int need_rplm = 0;
-- for (i = 0; i < pic->nb_refs; i++) {
-- av_assert0(pic->refs[i]);
-- if (pic->refs[i] != def_l0[i])
-+ for (i = 0; i < pic->nb_refs[0]; i++) {
-+ av_assert0(pic->refs[0][i]);
-+ if (pic->refs[0][i] != def_l0[i])
- need_rplm = 1;
- }
-
- sh->ref_pic_list_modification_flag_l0 = need_rplm;
- if (need_rplm) {
- int pic_num = hpic->frame_num;
-- for (i = 0; i < pic->nb_refs; i++) {
-- href = pic->refs[i]->priv_data;
-+ for (i = 0; i < pic->nb_refs[0]; i++) {
-+ href = pic->refs[0][i]->priv_data;
- av_assert0(href->frame_num != pic_num);
- if (href->frame_num < pic_num) {
- sh->rplm_l0[i].modification_of_pic_nums_idc = 0;
-@@ -963,28 +965,29 @@ static int vaapi_encode_h264_init_slice_params(AVCodecContext *avctx,
- } else {
- int need_rplm_l0 = 0, need_rplm_l1 = 0;
- int n0 = 0, n1 = 0;
-- for (i = 0; i < pic->nb_refs; i++) {
-- av_assert0(pic->refs[i]);
-- href = pic->refs[i]->priv_data;
-- av_assert0(href->pic_order_cnt != hpic->pic_order_cnt);
-- if (href->pic_order_cnt < hpic->pic_order_cnt) {
-- if (pic->refs[i] != def_l0[n0])
-- need_rplm_l0 = 1;
-- ++n0;
-- } else {
-- if (pic->refs[i] != def_l1[n1])
-- need_rplm_l1 = 1;
-- ++n1;
-- }
-+ for (i = 0; i < pic->nb_refs[0]; i++) {
-+ av_assert0(pic->refs[0][i]);
-+ href = pic->refs[0][i]->priv_data;
-+ av_assert0(href->pic_order_cnt < hpic->pic_order_cnt);
-+ if (pic->refs[0][i] != def_l0[n0])
-+ need_rplm_l0 = 1;
-+ ++n0;
-+ }
-+
-+ for (i = 0; i < pic->nb_refs[1]; i++) {
-+ av_assert0(pic->refs[1][i]);
-+ href = pic->refs[1][i]->priv_data;
-+ av_assert0(href->pic_order_cnt > hpic->pic_order_cnt);
-+ if (pic->refs[1][i] != def_l1[n1])
-+ need_rplm_l1 = 1;
-+ ++n1;
- }
-
- sh->ref_pic_list_modification_flag_l0 = need_rplm_l0;
- if (need_rplm_l0) {
- int pic_num = hpic->frame_num;
-- for (i = j = 0; i < pic->nb_refs; i++) {
-- href = pic->refs[i]->priv_data;
-- if (href->pic_order_cnt > hpic->pic_order_cnt)
-- continue;
-+ for (i = j = 0; i < pic->nb_refs[0]; i++) {
-+ href = pic->refs[0][i]->priv_data;
- av_assert0(href->frame_num != pic_num);
- if (href->frame_num < pic_num) {
- sh->rplm_l0[j].modification_of_pic_nums_idc = 0;
-@@ -1005,10 +1008,8 @@ static int vaapi_encode_h264_init_slice_params(AVCodecContext *avctx,
- sh->ref_pic_list_modification_flag_l1 = need_rplm_l1;
- if (need_rplm_l1) {
- int pic_num = hpic->frame_num;
-- for (i = j = 0; i < pic->nb_refs; i++) {
-- href = pic->refs[i]->priv_data;
-- if (href->pic_order_cnt < hpic->pic_order_cnt)
-- continue;
-+ for (i = j = 0; i < pic->nb_refs[1]; i++) {
-+ href = pic->refs[1][i]->priv_data;
- av_assert0(href->frame_num != pic_num);
- if (href->frame_num < pic_num) {
- sh->rplm_l1[j].modification_of_pic_nums_idc = 0;
-@@ -1048,14 +1049,13 @@ static int vaapi_encode_h264_init_slice_params(AVCodecContext *avctx,
- vslice->RefPicList1[i].flags = VA_PICTURE_H264_INVALID;
- }
-
-- av_assert0(pic->nb_refs <= 2);
-- if (pic->nb_refs >= 1) {
-+ if (pic->nb_refs[0]) {
- // Backward reference for P- or B-frame.
- av_assert0(pic->type == PICTURE_TYPE_P ||
- pic->type == PICTURE_TYPE_B);
- vslice->RefPicList0[0] = vpic->ReferenceFrames[0];
- }
-- if (pic->nb_refs >= 2) {
-+ if (pic->nb_refs[1]) {
- // Forward reference for B-frame.
- av_assert0(pic->type == PICTURE_TYPE_B);
- vslice->RefPicList1[0] = vpic->ReferenceFrames[1];
-diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c
-index aa7e532..f015e6f 100644
---- a/libavcodec/vaapi_encode_h265.c
-+++ b/libavcodec/vaapi_encode_h265.c
-@@ -764,7 +764,7 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
- VAAPIEncodePicture *prev = pic->prev;
- VAAPIEncodeH265Picture *hprev = prev ? prev->priv_data : NULL;
- VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params;
-- int i;
-+ int i, j = 0;
-
- if (pic->type == PICTURE_TYPE_IDR) {
- av_assert0(pic->display_order == pic->encode_order);
-@@ -789,8 +789,8 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
- hpic->pic_type = 1;
- } else {
- VAAPIEncodePicture *irap_ref;
-- av_assert0(pic->refs[0] && pic->refs[1]);
-- for (irap_ref = pic; irap_ref; irap_ref = irap_ref->refs[1]) {
-+ av_assert0(pic->refs[0][0] && pic->refs[1][0]);
-+ for (irap_ref = pic; irap_ref; irap_ref = irap_ref->refs[1][0]) {
- if (irap_ref->type == PICTURE_TYPE_I)
- break;
- }
-@@ -915,24 +915,27 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
- .flags = 0,
- };
-
-- for (i = 0; i < pic->nb_refs; i++) {
-- VAAPIEncodePicture *ref = pic->refs[i];
-- VAAPIEncodeH265Picture *href;
--
-- av_assert0(ref && ref->encode_order < pic->encode_order);
-- href = ref->priv_data;
--
-- vpic->reference_frames[i] = (VAPictureHEVC) {
-- .picture_id = ref->recon_surface,
-- .pic_order_cnt = href->pic_order_cnt,
-- .flags = (ref->display_order < pic->display_order ?
-- VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE : 0) |
-- (ref->display_order > pic->display_order ?
-- VA_PICTURE_HEVC_RPS_ST_CURR_AFTER : 0),
-- };
-+ for (int k = 0; k < MAX_REFERENCE_LIST_NUM; k++) {
-+ for (i = 0; i < pic->nb_refs[k]; i++) {
-+ VAAPIEncodePicture *ref = pic->refs[k][i];
-+ VAAPIEncodeH265Picture *href;
-+
-+ av_assert0(ref && ref->encode_order < pic->encode_order);
-+ href = ref->priv_data;
-+
-+ vpic->reference_frames[j++] = (VAPictureHEVC) {
-+ .picture_id = ref->recon_surface,
-+ .pic_order_cnt = href->pic_order_cnt,
-+ .flags = (ref->display_order < pic->display_order ?
-+ VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE : 0) |
-+ (ref->display_order > pic->display_order ?
-+ VA_PICTURE_HEVC_RPS_ST_CURR_AFTER : 0),
-+ };
-+ }
- }
-- for (; i < FF_ARRAY_ELEMS(vpic->reference_frames); i++) {
-- vpic->reference_frames[i] = (VAPictureHEVC) {
-+
-+ for (; j < FF_ARRAY_ELEMS(vpic->reference_frames); j++) {
-+ vpic->reference_frames[j] = (VAPictureHEVC) {
- .picture_id = VA_INVALID_ID,
- .flags = VA_PICTURE_HEVC_INVALID,
- };
-@@ -1016,21 +1019,33 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
- memset(rps, 0, sizeof(*rps));
-
- rps_pics = 0;
-- for (i = 0; i < pic->nb_refs; i++) {
-- strp = pic->refs[i]->priv_data;
-- rps_poc[rps_pics] = strp->pic_order_cnt;
-- rps_used[rps_pics] = 1;
-- ++rps_pics;
-+ for (i = 0; i < MAX_REFERENCE_LIST_NUM; i++) {
-+ for (j = 0; j < pic->nb_refs[i]; j++) {
-+ strp = pic->refs[i][j]->priv_data;
-+ rps_poc[rps_pics] = strp->pic_order_cnt;
-+ rps_used[rps_pics] = 1;
-+ ++rps_pics;
-+ }
- }
-+
- for (i = 0; i < pic->nb_dpb_pics; i++) {
- if (pic->dpb[i] == pic)
- continue;
-- for (j = 0; j < pic->nb_refs; j++) {
-- if (pic->dpb[i] == pic->refs[j])
-+
-+ for (j = 0; j < pic->nb_refs[0]; j++) {
-+ if (pic->dpb[i] == pic->refs[0][j])
-+ break;
-+ }
-+ if (j < pic->nb_refs[0])
-+ continue;
-+
-+ for (j = 0; j < pic->nb_refs[1]; j++) {
-+ if (pic->dpb[i] == pic->refs[1][j])
- break;
- }
-- if (j < pic->nb_refs)
-+ if (j < pic->nb_refs[1])
- continue;
-+
- strp = pic->dpb[i]->priv_data;
- rps_poc[rps_pics] = strp->pic_order_cnt;
- rps_used[rps_pics] = 0;
-@@ -1155,8 +1170,7 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
- vslice->ref_pic_list1[i].flags = VA_PICTURE_HEVC_INVALID;
- }
-
-- av_assert0(pic->nb_refs <= 2);
-- if (pic->nb_refs >= 1) {
-+ if (pic->nb_refs[0]) {
- // Backward reference for P- or B-frame.
- av_assert0(pic->type == PICTURE_TYPE_P ||
- pic->type == PICTURE_TYPE_B);
-@@ -1165,7 +1179,7 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
- // Reference for GPB B-frame, L0 == L1
- vslice->ref_pic_list1[0] = vpic->reference_frames[0];
- }
-- if (pic->nb_refs >= 2) {
-+ if (pic->nb_refs[1]) {
- // Forward reference for B-frame.
- av_assert0(pic->type == PICTURE_TYPE_B);
- vslice->ref_pic_list1[0] = vpic->reference_frames[1];
-diff --git a/libavcodec/vaapi_encode_mpeg2.c b/libavcodec/vaapi_encode_mpeg2.c
-index 9261d19..8000ae1 100644
---- a/libavcodec/vaapi_encode_mpeg2.c
-+++ b/libavcodec/vaapi_encode_mpeg2.c
-@@ -458,12 +458,12 @@ static int vaapi_encode_mpeg2_init_picture_params(AVCodecContext *avctx,
- break;
- case PICTURE_TYPE_P:
- vpic->picture_type = VAEncPictureTypePredictive;
-- vpic->forward_reference_picture = pic->refs[0]->recon_surface;
-+ vpic->forward_reference_picture = pic->refs[0][0]->recon_surface;
- break;
- case PICTURE_TYPE_B:
- vpic->picture_type = VAEncPictureTypeBidirectional;
-- vpic->forward_reference_picture = pic->refs[0]->recon_surface;
-- vpic->backward_reference_picture = pic->refs[1]->recon_surface;
-+ vpic->forward_reference_picture = pic->refs[0][0]->recon_surface;
-+ vpic->backward_reference_picture = pic->refs[1][0]->recon_surface;
- break;
- default:
- av_assert0(0 && "invalid picture type");
-diff --git a/libavcodec/vaapi_encode_vp8.c b/libavcodec/vaapi_encode_vp8.c
-index ae6a8d3..b96e4cd 100644
---- a/libavcodec/vaapi_encode_vp8.c
-+++ b/libavcodec/vaapi_encode_vp8.c
-@@ -86,7 +86,7 @@ static int vaapi_encode_vp8_init_picture_params(AVCodecContext *avctx,
- switch (pic->type) {
- case PICTURE_TYPE_IDR:
- case PICTURE_TYPE_I:
-- av_assert0(pic->nb_refs == 0);
-+ av_assert0(pic->nb_refs[0] == 0 && pic->nb_refs[1] == 0);
- vpic->ref_flags.bits.force_kf = 1;
- vpic->ref_last_frame =
- vpic->ref_gf_frame =
-@@ -94,14 +94,14 @@ static int vaapi_encode_vp8_init_picture_params(AVCodecContext *avctx,
- VA_INVALID_SURFACE;
- break;
- case PICTURE_TYPE_P:
-- av_assert0(pic->nb_refs == 1);
-+ av_assert0(!pic->nb_refs[1]);
- vpic->ref_flags.bits.no_ref_last = 0;
- vpic->ref_flags.bits.no_ref_gf = 1;
- vpic->ref_flags.bits.no_ref_arf = 1;
- vpic->ref_last_frame =
- vpic->ref_gf_frame =
- vpic->ref_arf_frame =
-- pic->refs[0]->recon_surface;
-+ pic->refs[0][0]->recon_surface;
- break;
- default:
- av_assert0(0 && "invalid picture type");
-diff --git a/libavcodec/vaapi_encode_vp9.c b/libavcodec/vaapi_encode_vp9.c
-index af1353c..d9e8ba6 100644
---- a/libavcodec/vaapi_encode_vp9.c
-+++ b/libavcodec/vaapi_encode_vp9.c
-@@ -96,15 +96,15 @@ static int vaapi_encode_vp9_init_picture_params(AVCodecContext *avctx,
-
- switch (pic->type) {
- case PICTURE_TYPE_IDR:
-- av_assert0(pic->nb_refs == 0);
-+ av_assert0(pic->nb_refs[0] == 0 && pic->nb_refs[1] == 0);
- vpic->ref_flags.bits.force_kf = 1;
- vpic->refresh_frame_flags = 0xff;
- hpic->slot = 0;
- break;
- case PICTURE_TYPE_P:
-- av_assert0(pic->nb_refs == 1);
-+ av_assert0(!pic->nb_refs[1]);
- {
-- VAAPIEncodeVP9Picture *href = pic->refs[0]->priv_data;
-+ VAAPIEncodeVP9Picture *href = pic->refs[0][0]->priv_data;
- av_assert0(href->slot == 0 || href->slot == 1);
-
- if (ctx->max_b_depth > 0) {
-@@ -120,10 +120,10 @@ static int vaapi_encode_vp9_init_picture_params(AVCodecContext *avctx,
- }
- break;
- case PICTURE_TYPE_B:
-- av_assert0(pic->nb_refs == 2);
-+ av_assert0(pic->nb_refs[0] && pic->nb_refs[1]);
- {
-- VAAPIEncodeVP9Picture *href0 = pic->refs[0]->priv_data,
-- *href1 = pic->refs[1]->priv_data;
-+ VAAPIEncodeVP9Picture *href0 = pic->refs[0][0]->priv_data,
-+ *href1 = pic->refs[1][0]->priv_data;
- av_assert0(href0->slot < pic->b_depth + 1 &&
- href1->slot < pic->b_depth + 1);
-
-@@ -157,12 +157,14 @@ static int vaapi_encode_vp9_init_picture_params(AVCodecContext *avctx,
- for (i = 0; i < FF_ARRAY_ELEMS(vpic->reference_frames); i++)
- vpic->reference_frames[i] = VA_INVALID_SURFACE;
-
-- for (i = 0; i < pic->nb_refs; i++) {
-- VAAPIEncodePicture *ref_pic = pic->refs[i];
-- int slot;
-- slot = ((VAAPIEncodeVP9Picture*)ref_pic->priv_data)->slot;
-- av_assert0(vpic->reference_frames[slot] == VA_INVALID_SURFACE);
-- vpic->reference_frames[slot] = ref_pic->recon_surface;
-+ for (i = 0; i < MAX_REFERENCE_LIST_NUM; i++) {
-+ for (int j = 0; j < pic->nb_refs[i]; j++) {
-+ VAAPIEncodePicture *ref_pic = pic->refs[i][j];
-+ int slot;
-+ slot = ((VAAPIEncodeVP9Picture*)ref_pic->priv_data)->slot;
-+ av_assert0(vpic->reference_frames[slot] == VA_INVALID_SURFACE);
-+ vpic->reference_frames[slot] = ref_pic->recon_surface;
-+ }
- }
-
- vpic->pic_flags.bits.frame_type = (pic->type != PICTURE_TYPE_IDR);
---
-2.41.0
-
diff --git a/ffmpeg-new-coder-errors.patch b/ffmpeg-new-coder-errors.patch
deleted file mode 100644
index a08b6a9..0000000
--- a/ffmpeg-new-coder-errors.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From: Jan Engelhardt <jengelh@inai.de>
-Date: 2016-04-10 23:23:53.138440254 +0200
-
-Improve the error messages a bit to say what's really going on
-(in light of a reduced build).
-
----
- fftools/ffmpeg.c | 2 +-
- fftools/ffmpeg_filter.c | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-Index: ffmpeg-6.0/fftools/ffmpeg.c
-===================================================================
---- ffmpeg-6.0.orig/fftools/ffmpeg.c
-+++ ffmpeg-6.0/fftools/ffmpeg.c
-@@ -2797,7 +2797,7 @@ static int init_input_stream(InputStream
- if (ist->decoding_needed) {
- const AVCodec *codec = ist->dec;
- if (!codec) {
-- snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
-+ snprintf(error, error_len, "This build of ffmpeg does not include a \"%s\" decoder needed for input stream #%d:%d.",
- avcodec_get_name(ist->dec_ctx->codec_id), ist->file_index, ist->st->index);
- return AVERROR(EINVAL);
- }
-Index: ffmpeg-6.0/fftools/ffmpeg_filter.c
-===================================================================
---- ffmpeg-6.0.orig/fftools/ffmpeg_filter.c
-+++ ffmpeg-6.0/fftools/ffmpeg_filter.c
-@@ -1064,7 +1064,7 @@ static int configure_input_filter(Filter
- {
- if (!ifilter->ist->dec) {
- av_log(NULL, AV_LOG_ERROR,
-- "No decoder for stream #%d:%d, filtering impossible\n",
-+ "This build of ffmpeg does not have a suitable decoder for stream #%d:%d enabled, filtering impossible\n",
- ifilter->ist->file_index, ifilter->ist->st->index);
- return AVERROR_DECODER_NOT_FOUND;
- }
diff --git a/ffmpeg.spec b/ffmpeg.spec
index 0ba795e..f2e147b 100644
--- a/ffmpeg.spec
+++ b/ffmpeg.spec
@@ -91,8 +91,8 @@
Name: ffmpeg
%global pkg_name %{name}%{?pkg_suffix}
-Version: 6.0.1
-Release: 2%{?dist}
+Version: 6.1
+Release: 1%{?dist}
Summary: A complete solution to record, convert and stream audio and video
License: GPL-3.0-or-later
URL: https://ffmpeg.org/
@@ -113,32 +113,15 @@ Source93: ffmpeg_find_free_source_headers.sh
# Fixes for reduced codec selection on free build
Patch1: ffmpeg-codec-choice.patch
-# Better error messages for free build
-Patch2: ffmpeg-new-coder-errors.patch
# Allow to build with fdk-aac-free
# See https://bugzilla.redhat.com/show_bug.cgi?id=1501522#c112
-Patch3: ffmpeg-allow-fdk-aac-free.patch
-# Backport upstream patches for libplacebo v5.264
-Patch4: 0001-avfilter-vf_libplacebo-wrap-deprecated-opts-in-FF_AP.patch
-Patch5: 0001-avfilter-vf_libplacebo-remove-deprecated-field.patch
-
-# Backport fix for segfault when passing non-existent filter option
-# See: https://bugzilla.rpmfusion.org/show_bug.cgi?id=6773
-Patch7: 0001-fftools-ffmpeg_filter-initialize-the-o-to-silence-th.patch
-
-# Backport patches for enhanced rtmp support
-# Cf. https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=8926
-## From: https://patchwork.ffmpeg.org/series/8926/mbox/
-Patch8: FFmpeg-devel-v10-Support-enhanced-flv-in-FFmpeg.patch
-
-# Backport AV1 VA-API encode support
-# Courtesy of GloriousEggroll
-## Adapted from: https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=9594
-Patch9: ffmpeg-ge-av1-vaapi-encode-support.patch
-
+Patch2: ffmpeg-allow-fdk-aac-free.patch
+# Backport fix for Vulkan Video with only AV1
+# From: https://ffmpeg.org/pipermail/ffmpeg-devel/2023-December/317728.html
+Patch3: 0001-lavc-Makefile-build-vulkan-decode-code-if-vulkan_av1.patch
# Drop openh264 runtime version checks
# https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=10211
-Patch10: 0001-lavc-libopenh264-Drop-openh264-runtime-version-check.patch
+Patch4: 0001-lavc-libopenh264-Drop-openh264-runtime-version-check.patch
# Set up dlopen for openh264
Patch1001: ffmpeg-dlopen-openh264.patch
@@ -256,7 +239,7 @@ BuildRequires: pkgconfig(vidstab)
BuildRequires: pkgconfig(vorbis)
BuildRequires: pkgconfig(vo-amrwbenc)
BuildRequires: pkgconfig(vpx)
-BuildRequires: pkgconfig(vulkan)
+BuildRequires: pkgconfig(vulkan) >= 1.3.255
BuildRequires: pkgconfig(wavpack)
BuildRequires: pkgconfig(xcb)
BuildRequires: pkgconfig(xcb-render)
@@ -880,6 +863,9 @@ rm -rf %{buildroot}%{_datadir}/%{name}/examples
%{_mandir}/man3/libswscale.3*
%changelog
+* Thu Jan 04 2024 Neal Gompa <ngompa@fedoraproject.org> - 6.1-1
+- Rebase to 6.1
+
* Wed Dec 06 2023 Kalev Lember <klember@redhat.com> - 6.0.1-2
- Prefer openh264 over noopenh264
- Backport upstream patch to drop openh264 runtime version checks
diff --git a/ffmpeg_free_sources b/ffmpeg_free_sources
index 0354de5..9830b45 100644
--- a/ffmpeg_free_sources
+++ b/ffmpeg_free_sources
@@ -29,8 +29,6 @@ doc/codecs.texi
doc/decoders.texi
doc/default.css
doc/demuxers.texi
-doc/dev_community/community.md
-doc/dev_community/resolution_process.md
doc/developer.texi
doc/devices.texi
doc/doxy-wrapper.sh
@@ -138,7 +136,9 @@ fftools/cmdutils.c
fftools/cmdutils.h
fftools/ffmpeg.c
fftools/ffmpeg.h
+fftools/ffmpeg_dec.c
fftools/ffmpeg_demux.c
+fftools/ffmpeg_enc.c
fftools/ffmpeg_filter.c
fftools/ffmpeg_hw.c
fftools/ffmpeg_mux.c
@@ -212,10 +212,7 @@ libavcodec/aandcttab.h
libavcodec/aarch64/Makefile
libavcodec/aarch64/aacpsdsp_init_aarch64.c
libavcodec/aarch64/aacpsdsp_neon.S
-libavcodec/aarch64/asm-offsets.h
libavcodec/aarch64/cabac.h
-libavcodec/aarch64/fft_init_aarch64.c
-libavcodec/aarch64/fft_neon.S
libavcodec/aarch64/fmtconvert_init.c
libavcodec/aarch64/fmtconvert_neon.S
libavcodec/aarch64/h264chroma_init_aarch64.c
@@ -232,7 +229,6 @@ libavcodec/aarch64/hpeldsp_neon.S
libavcodec/aarch64/idct.h
libavcodec/aarch64/idctdsp_init_aarch64.c
libavcodec/aarch64/idctdsp_neon.S
-libavcodec/aarch64/mdct_neon.S
libavcodec/aarch64/me_cmp_init_aarch64.c
libavcodec/aarch64/me_cmp_neon.S
libavcodec/aarch64/mpegaudiodsp_init.c
@@ -358,9 +354,6 @@ libavcodec/arm/blockdsp_init_neon.c
libavcodec/arm/blockdsp_neon.S
libavcodec/arm/cabac.h
libavcodec/arm/dca.h
-libavcodec/arm/fft_init_arm.c
-libavcodec/arm/fft_neon.S
-libavcodec/arm/fft_vfp.S
libavcodec/arm/flacdsp_arm.S
libavcodec/arm/flacdsp_init_arm.c
libavcodec/arm/fmtconvert_init_arm.c
@@ -398,8 +391,6 @@ libavcodec/arm/jrevdct_arm.S
libavcodec/arm/lossless_audiodsp_init_arm.c
libavcodec/arm/lossless_audiodsp_neon.S
libavcodec/arm/mathops.h
-libavcodec/arm/mdct_neon.S
-libavcodec/arm/mdct_vfp.S
libavcodec/arm/me_cmp_armv6.S
libavcodec/arm/me_cmp_init_arm.c
libavcodec/arm/mlpdsp_armv5te.S
@@ -419,8 +410,6 @@ libavcodec/arm/neontest.c
libavcodec/arm/pixblockdsp_armv6.S
libavcodec/arm/pixblockdsp_init_arm.c
libavcodec/arm/pixblockdsp_neon.S
-libavcodec/arm/rdft_init_arm.c
-libavcodec/arm/rdft_neon.S
libavcodec/arm/sbcdsp_armv6.S
libavcodec/arm/sbcdsp_init_arm.c
libavcodec/arm/sbcdsp_neon.S
@@ -468,6 +457,7 @@ libavcodec/arm/vp9lpf_16bpp_neon.S
libavcodec/arm/vp9lpf_neon.S
libavcodec/arm/vp9mc_16bpp_neon.S
libavcodec/arm/vp9mc_neon.S
+libavcodec/arm/vpx_arith.h
libavcodec/ass.c
libavcodec/ass.h
libavcodec/ass_split.c
@@ -499,6 +489,8 @@ libavcodec/aura.c
libavcodec/av1.h
libavcodec/av1_frame_merge_bsf.c
libavcodec/av1_frame_split_bsf.c
+libavcodec/av1_levels.c
+libavcodec/av1_levels.h
libavcodec/av1_metadata_bsf.c
libavcodec/av1_parse.c
libavcodec/av1_parse.h
@@ -507,6 +499,7 @@ libavcodec/av1dec.c
libavcodec/av1dec.h
libavcodec/avcodec.c
libavcodec/avcodec.h
+libavcodec/avcodec_internal.h
libavcodec/avdct.c
libavcodec/avdct.h
libavcodec/avfft.c
@@ -573,6 +566,8 @@ libavcodec/cbs_h2645.h
libavcodec/cbs_h264_syntax_template.c
libavcodec/cbs_h265.h
libavcodec/cbs_h265_syntax_template.c
+libavcodec/cbs_h266.h
+libavcodec/cbs_h266_syntax_template.c
libavcodec/cbs_internal.h
libavcodec/cbs_jpeg.c
libavcodec/cbs_jpeg.h
@@ -652,7 +647,6 @@ libavcodec/dcaenc.h
libavcodec/dcahuff.c
libavcodec/dcahuff.h
libavcodec/dcamath.h
-libavcodec/dct.c
libavcodec/dct.h
libavcodec/dct32.h
libavcodec/dct32_fixed.c
@@ -731,8 +725,6 @@ libavcodec/dvenc.c
libavcodec/dxa.c
libavcodec/dxtory.c
libavcodec/dxva2.h
-libavcodec/dynamic_hdr10_plus.c
-libavcodec/dynamic_hdr10_plus.h
libavcodec/dynamic_hdr_vivid.c
libavcodec/dynamic_hdr_vivid.h
libavcodec/eac3_core_bsf.c
@@ -754,6 +746,13 @@ libavcodec/error_resilience.c
libavcodec/error_resilience.h
libavcodec/escape124.c
libavcodec/escape130.c
+libavcodec/evc.h
+libavcodec/evc_frame_merge_bsf.c
+libavcodec/evc_parse.c
+libavcodec/evc_parse.h
+libavcodec/evc_parser.c
+libavcodec/evc_ps.c
+libavcodec/evc_ps.h
libavcodec/evrcdata.h
libavcodec/evrcdec.c
libavcodec/exif.c
@@ -773,13 +772,6 @@ libavcodec/fdctdsp.c
libavcodec/fdctdsp.h
libavcodec/fflcms2.c
libavcodec/fflcms2.h
-libavcodec/fft-internal.h
-libavcodec/fft.h
-libavcodec/fft_fixed_32.c
-libavcodec/fft_float.c
-libavcodec/fft_init_table.c
-libavcodec/fft_table.h
-libavcodec/fft_template.c
libavcodec/ffv1.c
libavcodec/ffv1.h
libavcodec/ffv1_template.c
@@ -916,6 +908,7 @@ libavcodec/h264qpel_template.c
libavcodec/h265_metadata_bsf.c
libavcodec/h265_profile_level.c
libavcodec/h265_profile_level.h
+libavcodec/h266_metadata_bsf.c
libavcodec/h274.h
libavcodec/half2float.c
libavcodec/hap.c
@@ -970,6 +963,7 @@ libavcodec/huffyuvdsp.h
libavcodec/huffyuvenc.c
libavcodec/huffyuvencdsp.c
libavcodec/huffyuvencdsp.h
+libavcodec/hwaccel_internal.h
libavcodec/hwaccels.h
libavcodec/hwconfig.h
libavcodec/idcinvideo.c
@@ -1021,10 +1015,13 @@ libavcodec/jpeg2000.c
libavcodec/jpeg2000.h
libavcodec/jpeg2000_parser.c
libavcodec/jpeg2000dec.c
+libavcodec/jpeg2000dec.h
libavcodec/jpeg2000dsp.c
libavcodec/jpeg2000dsp.h
libavcodec/jpeg2000dwt.c
libavcodec/jpeg2000dwt.h
+libavcodec/jpeg2000htdec.c
+libavcodec/jpeg2000htdec.h
libavcodec/jpegls.c
libavcodec/jpegls.h
libavcodec/jpeglsdec.c
@@ -1035,6 +1032,10 @@ libavcodec/jpegquanttables.h
libavcodec/jpegtables.c
libavcodec/jpegtables.h
libavcodec/jpegtabs.h
+libavcodec/jpegxl.h
+libavcodec/jpegxl_parse.c
+libavcodec/jpegxl_parse.h
+libavcodec/jpegxl_parser.c
libavcodec/jrevdct.c
libavcodec/jvdec.c
libavcodec/kbdwin.c
@@ -1070,7 +1071,6 @@ libavcodec/libopenh264.c
libavcodec/libopenh264.h
libavcodec/libopenh264dec.c
libavcodec/libopenh264enc.c
-libavcodec/libopenjpegdec.c
libavcodec/libopenjpegenc.c
libavcodec/libopus.c
libavcodec/libopus.h
@@ -1086,7 +1086,6 @@ libavcodec/libtwolame.c
libavcodec/libvo-amrwbenc.c
libavcodec/libvorbisdec.c
libavcodec/libvorbisenc.c
-libavcodec/libvpx.c
libavcodec/libvpx.h
libavcodec/libvpxdec.c
libavcodec/libvpxenc.c
@@ -1117,9 +1116,6 @@ libavcodec/m101.c
libavcodec/mace.c
libavcodec/mathops.h
libavcodec/mathtables.c
-libavcodec/mdct_fixed_32.c
-libavcodec/mdct_float.c
-libavcodec/mdct_template.c
libavcodec/mdec.c
libavcodec/me_cmp.c
libavcodec/me_cmp.h
@@ -1381,10 +1377,6 @@ libavcodec/ppc/audiodsp.c
libavcodec/ppc/blockdsp.c
libavcodec/ppc/fdct.h
libavcodec/ppc/fdctdsp.c
-libavcodec/ppc/fft_altivec.S
-libavcodec/ppc/fft_init.c
-libavcodec/ppc/fft_vsx.c
-libavcodec/ppc/fft_vsx.h
libavcodec/ppc/fmtconvert_altivec.c
libavcodec/ppc/h264chroma_init.c
libavcodec/ppc/h264chroma_template.c
@@ -1470,15 +1462,17 @@ libavcodec/raw.c
libavcodec/raw.h
libavcodec/rawdec.c
libavcodec/rawenc.c
-libavcodec/rdft.c
-libavcodec/rdft.h
libavcodec/realtextdec.c
libavcodec/rectangle.h
+libavcodec/refstruct.c
+libavcodec/refstruct.h
libavcodec/remove_extradata_bsf.c
libavcodec/reverse.c
libavcodec/riscv/Makefile
libavcodec/riscv/aacpsdsp_init.c
libavcodec/riscv/aacpsdsp_rvv.S
+libavcodec/riscv/ac3dsp_init.c
+libavcodec/riscv/ac3dsp_rvb.S
libavcodec/riscv/alacdsp_init.c
libavcodec/riscv/alacdsp_rvv.S
libavcodec/riscv/audiodsp_init.c
@@ -1487,8 +1481,14 @@ libavcodec/riscv/audiodsp_rvv.S
libavcodec/riscv/bswapdsp_init.c
libavcodec/riscv/bswapdsp_rvb.S
libavcodec/riscv/bswapdsp_rvv.S
+libavcodec/riscv/exrdsp_init.c
+libavcodec/riscv/exrdsp_rvv.S
libavcodec/riscv/fmtconvert_init.c
libavcodec/riscv/fmtconvert_rvv.S
+libavcodec/riscv/g722dsp_init.c
+libavcodec/riscv/g722dsp_rvv.S
+libavcodec/riscv/h264_chroma_init_riscv.c
+libavcodec/riscv/h264_mc_chroma.S
libavcodec/riscv/idctdsp_init.c
libavcodec/riscv/idctdsp_rvv.S
libavcodec/riscv/opusdsp_init.c
@@ -1696,6 +1696,7 @@ libavcodec/vaapi_decode.c
libavcodec/vaapi_decode.h
libavcodec/vaapi_encode.c
libavcodec/vaapi_encode.h
+libavcodec/vaapi_encode_av1.c
libavcodec/vaapi_encode_h264.c
libavcodec/vaapi_encode_h265.c
libavcodec/vaapi_encode_mjpeg.c
@@ -1778,6 +1779,7 @@ libavcodec/vp8.c
libavcodec/vp8.h
libavcodec/vp89_rac.h
libavcodec/vp8_parser.c
+libavcodec/vp8data.c
libavcodec/vp8data.h
libavcodec/vp8dsp.c
libavcodec/vp8dsp.h
@@ -1808,6 +1810,18 @@ libavcodec/vpx_rac.c
libavcodec/vpx_rac.h
libavcodec/vqavideo.c
libavcodec/vqcdec.c
+libavcodec/vulkan.c
+libavcodec/vulkan.h
+libavcodec/vulkan_av1.c
+libavcodec/vulkan_decode.c
+libavcodec/vulkan_decode.h
+libavcodec/vulkan_video.c
+libavcodec/vulkan_video.h
+libavcodec/vulkan_video_codec_av1std.h
+libavcodec/vulkan_video_codec_av1std_decode.h
+libavcodec/vvc.h
+libavcodec/vvc_mp4toannexb_bsf.c
+libavcodec/vvc_parser.c
libavcodec/wavarc.c
libavcodec/wavpack.c
libavcodec/wavpack.h
@@ -1875,7 +1889,6 @@ libavcodec/x86/constants.h
libavcodec/x86/dcadsp.asm
libavcodec/x86/dcadsp_init.c
libavcodec/x86/dct32.asm
-libavcodec/x86/dct_init.c
libavcodec/x86/dirac_dwt.asm
libavcodec/x86/dirac_dwt_init.c
libavcodec/x86/diracdsp.asm
@@ -1887,9 +1900,6 @@ libavcodec/x86/exrdsp_init.c
libavcodec/x86/fdct.c
libavcodec/x86/fdct.h
libavcodec/x86/fdctdsp_init.c
-libavcodec/x86/fft.asm
-libavcodec/x86/fft.h
-libavcodec/x86/fft_init.c
libavcodec/x86/flac_dsp_gpl.asm
libavcodec/x86/flacdsp.asm
libavcodec/x86/flacdsp_init.c
@@ -1923,8 +1933,6 @@ libavcodec/x86/hpeldsp.asm
libavcodec/x86/hpeldsp.h
libavcodec/x86/hpeldsp_init.c
libavcodec/x86/hpeldsp_rnd_template.c
-libavcodec/x86/hpeldsp_vp3.asm
-libavcodec/x86/hpeldsp_vp3_init.c
libavcodec/x86/huffyuvdsp.asm
libavcodec/x86/huffyuvdsp_init.c
libavcodec/x86/huffyuvdsp_template.asm
@@ -2025,6 +2033,7 @@ libavcodec/x86/vp9lpf_16bpp.asm
libavcodec/x86/vp9mc.asm
libavcodec/x86/vp9mc_16bpp.asm
libavcodec/x86/vpx_arith.h
+libavcodec/x86/w64xmmtest.c
libavcodec/x86/xvididct.asm
libavcodec/x86/xvididct.h
libavcodec/x86/xvididct_init.c
@@ -2115,8 +2124,11 @@ libavdevice/xcbgrab.c
libavdevice/xv.c
libavfilter/Makefile
libavfilter/aarch64/Makefile
+libavfilter/aarch64/vf_bwdif_init_aarch64.c
+libavfilter/aarch64/vf_bwdif_neon.S
libavfilter/aarch64/vf_nlmeans_init.c
libavfilter/aarch64/vf_nlmeans_neon.S
+libavfilter/adynamicequalizer_template.c
libavfilter/aeval.c
libavfilter/af_acontrast.c
libavfilter/af_acopy.c
@@ -2158,6 +2170,7 @@ libavfilter/af_aphaser.c
libavfilter/af_apsyclip.c
libavfilter/af_apulsator.c
libavfilter/af_aresample.c
+libavfilter/af_arls.c
libavfilter/af_arnndn.c
libavfilter/af_asdr.c
libavfilter/af_asetnsamples.c
@@ -2257,7 +2270,10 @@ libavfilter/buffersink.c
libavfilter/buffersink.h
libavfilter/buffersrc.c
libavfilter/buffersrc.h
-libavfilter/bwdif.h
+libavfilter/bwdifdsp.c
+libavfilter/bwdifdsp.h
+libavfilter/ccfifo.c
+libavfilter/ccfifo.h
libavfilter/colorchannelmixer_template.c
libavfilter/colorspace.c
libavfilter/colorspace.h
@@ -2270,28 +2286,6 @@ libavfilter/deshake.h
libavfilter/dnn/Makefile
libavfilter/dnn/dnn_backend_common.c
libavfilter/dnn/dnn_backend_common.h
-libavfilter/dnn/dnn_backend_native.c
-libavfilter/dnn/dnn_backend_native.h
-libavfilter/dnn/dnn_backend_native_layer_avgpool.c
-libavfilter/dnn/dnn_backend_native_layer_avgpool.h
-libavfilter/dnn/dnn_backend_native_layer_conv2d.c
-libavfilter/dnn/dnn_backend_native_layer_conv2d.h
-libavfilter/dnn/dnn_backend_native_layer_dense.c
-libavfilter/dnn/dnn_backend_native_layer_dense.h
-libavfilter/dnn/dnn_backend_native_layer_depth2space.c
-libavfilter/dnn/dnn_backend_native_layer_depth2space.h
-libavfilter/dnn/dnn_backend_native_layer_mathbinary.c
-libavfilter/dnn/dnn_backend_native_layer_mathbinary.h
-libavfilter/dnn/dnn_backend_native_layer_mathunary.c
-libavfilter/dnn/dnn_backend_native_layer_mathunary.h
-libavfilter/dnn/dnn_backend_native_layer_maximum.c
-libavfilter/dnn/dnn_backend_native_layer_maximum.h
-libavfilter/dnn/dnn_backend_native_layer_pad.c
-libavfilter/dnn/dnn_backend_native_layer_pad.h
-libavfilter/dnn/dnn_backend_native_layers.c
-libavfilter/dnn/dnn_backend_native_layers.h
-libavfilter/dnn/dnn_backend_openvino.h
-libavfilter/dnn/dnn_backend_tf.h
libavfilter/dnn/dnn_interface.c
libavfilter/dnn/dnn_io_proc.c
libavfilter/dnn/dnn_io_proc.h
@@ -2399,6 +2393,7 @@ libavfilter/setpts.c
libavfilter/settb.c
libavfilter/signature.h
libavfilter/signature_lookup.c
+libavfilter/silenceremove_template.c
libavfilter/split.c
libavfilter/src_avsynctest.c
libavfilter/src_movie.c
@@ -2443,7 +2438,9 @@ libavfilter/vf_blurdetect.c
libavfilter/vf_bm3d.c
libavfilter/vf_boxblur.c
libavfilter/vf_bwdif.c
+libavfilter/vf_bwdif_vulkan.c
libavfilter/vf_cas.c
+libavfilter/vf_ccrepack.c
libavfilter/vf_chromaber_vulkan.c
libavfilter/vf_chromakey.c
libavfilter/vf_chromanr.c
@@ -2569,6 +2566,7 @@ libavfilter/vf_maskedmerge.c
libavfilter/vf_maskedminmax.c
libavfilter/vf_maskedthreshold.c
libavfilter/vf_maskfun.c
+libavfilter/vf_mcdeint.c
libavfilter/vf_median.c
libavfilter/vf_mergeplanes.c
libavfilter/vf_mestimate.c
@@ -2587,6 +2585,7 @@ libavfilter/vf_nlmeans.c
libavfilter/vf_nlmeans.h
libavfilter/vf_nlmeans_init.h
libavfilter/vf_nlmeans_opencl.c
+libavfilter/vf_nlmeans_vulkan.c
libavfilter/vf_nnedi.c
libavfilter/vf_noise.c
libavfilter/vf_noise.h
@@ -2680,6 +2679,7 @@ libavfilter/vf_transpose_vulkan.c
libavfilter/vf_unsharp.c
libavfilter/vf_unsharp_opencl.c
libavfilter/vf_untile.c
+libavfilter/vf_uspp.c
libavfilter/vf_v360.c
libavfilter/vf_vaguedenoiser.c
libavfilter/vf_varblur.c
@@ -2699,6 +2699,7 @@ libavfilter/vf_weave.c
libavfilter/vf_xbr.c
libavfilter/vf_xfade.c
libavfilter/vf_xfade_opencl.c
+libavfilter/vf_xfade_vulkan.c
libavfilter/vf_xmedian.c
libavfilter/vf_yadif.c
libavfilter/vf_yaepblur.c
@@ -2717,10 +2718,13 @@ libavfilter/vsrc_mandelbrot.c
libavfilter/vsrc_mptestsrc.c
libavfilter/vsrc_sierpinski.c
libavfilter/vsrc_testsrc.c
+libavfilter/vsrc_testsrc_vulkan.c
libavfilter/vulkan.c
libavfilter/vulkan.h
libavfilter/vulkan_filter.c
libavfilter/vulkan_filter.h
+libavfilter/vulkan_shaderc.c
+libavfilter/vulkan_spirv.h
libavfilter/w3fdif.h
libavfilter/window_func.h
libavfilter/x86/Makefile
@@ -2811,6 +2815,8 @@ libavformat/aadec.c
libavformat/aaxdec.c
libavformat/ac3_channel_layout_tab.c
libavformat/ac3dec.c
+libavformat/ac4dec.c
+libavformat/ac4enc.c
libavformat/acedec.c
libavformat/acm.c
libavformat/act.c
@@ -2942,6 +2948,9 @@ libavformat/dxa.c
libavformat/eacdata.c
libavformat/electronicarts.c
libavformat/epafdec.c
+libavformat/evc.c
+libavformat/evc.h
+libavformat/evcdec.c
libavformat/ffmeta.h
libavformat/ffmetadec.c
libavformat/ffmetaenc.c
@@ -3050,8 +3059,8 @@ libavformat/ivfenc.c
libavformat/jacosubdec.c
libavformat/jacosubenc.c
libavformat/jpegtables.c
-libavformat/jpegxl_probe.c
-libavformat/jpegxl_probe.h
+libavformat/jpegxl_anim_dec.c
+libavformat/jpegxl_parse.c
libavformat/jvdec.c
libavformat/kvag.c
libavformat/lafdec.c
@@ -3178,11 +3187,13 @@ libavformat/options.c
libavformat/options_table.h
libavformat/os_support.c
libavformat/os_support.h
+libavformat/osq.c
libavformat/paf.c
libavformat/pcm.c
libavformat/pcm.h
libavformat/pcmdec.c
libavformat/pcmenc.c
+libavformat/pdvdec.c
libavformat/pjsdec.c
libavformat/pmpdec.c
libavformat/pp_bnk.c
@@ -3195,6 +3206,7 @@ libavformat/qcp.c
libavformat/qtpalette.c
libavformat/qtpalette.h
libavformat/r3d.c
+libavformat/rangecoder_dec.c
libavformat/rawdec.c
libavformat/rawdec.h
libavformat/rawenc.c
@@ -3380,6 +3392,7 @@ libavformat/url.c
libavformat/url.h
libavformat/urldecode.c
libavformat/urldecode.h
+libavformat/usmdec.c
libavformat/utils.c
libavformat/vag.c
libavformat/vapoursynth.c
@@ -3403,6 +3416,7 @@ libavformat/vpcc.h
libavformat/vpk.c
libavformat/vplayerdec.c
libavformat/vqf.c
+libavformat/vvcdec.c
libavformat/w64.c
libavformat/w64.h
libavformat/wady.c
@@ -3482,7 +3496,6 @@ libavutil/avstring.h
libavutil/avutil.h
libavutil/base64.c
libavutil/base64.h
-libavutil/bfin/timer.h
libavutil/blowfish.c
libavutil/blowfish.h
libavutil/bprint.c
@@ -3521,12 +3534,15 @@ libavutil/dovi_meta.h
libavutil/downmix_info.c
libavutil/downmix_info.h
libavutil/dynarray.h
+libavutil/emms.h
libavutil/encryption_info.c
libavutil/encryption_info.h
libavutil/error.c
libavutil/error.h
libavutil/eval.c
libavutil/eval.h
+libavutil/executor.c
+libavutil/executor.h
libavutil/ffmath.h
libavutil/fifo.c
libavutil/fifo.h
@@ -3709,12 +3725,12 @@ libavutil/version.h
libavutil/version_major.h
libavutil/video_enc_params.c
libavutil/video_enc_params.h
+libavutil/video_hint.c
+libavutil/video_hint.h
libavutil/vulkan.c
libavutil/vulkan.h
libavutil/vulkan_functions.h
-libavutil/vulkan_glslang.c
libavutil/vulkan_loader.h
-libavutil/vulkan_shaderc.c
libavutil/wchar_filename.h
libavutil/x86/Makefile
libavutil/x86/asm.h
@@ -3723,7 +3739,6 @@ libavutil/x86/cpu.c
libavutil/x86/cpu.h
libavutil/x86/cpuid.asm
libavutil/x86/emms.asm
-libavutil/x86/emms.h
libavutil/x86/fixed_dsp.asm
libavutil/x86/fixed_dsp_init.c
libavutil/x86/float_dsp.asm
@@ -3943,15 +3958,14 @@ tests/fate/cover-art.mak
tests/fate/dca.mak
tests/fate/demux.mak
tests/fate/dfa.mak
-tests/fate/dnn.mak
tests/fate/dnxhd.mak
tests/fate/dpcm.mak
tests/fate/dvvideo.mak
tests/fate/ea.mak
+tests/fate/enc_external.mak
tests/fate/exif.mak
tests/fate/ffmpeg.mak
tests/fate/ffprobe.mak
-tests/fate/fft.mak
tests/fate/fifo-muxer.mak
tests/fate/filter-audio.mak
tests/fate/filter-video.mak
@@ -3969,6 +3983,8 @@ tests/fate/id3v2.mak
tests/fate/image.mak
tests/fate/imf.mak
tests/fate/indeo.mak
+tests/fate/jpeg2000.mak
+tests/fate/jxl.mak
tests/fate/lavf-audio.mak
tests/fate/lavf-container.mak
tests/fate/lavf-image.mak
@@ -4026,11 +4042,11 @@ tests/fate/wma.mak
tests/fate/xvid.mak
tools/Makefile
tools/aviocat.c
-tools/cl2c
tools/crypto_bench.c
tools/cws2fws.c
tools/decode_simple.c
tools/decode_simple.h
+tools/enc_recon_frame_test.c
tools/enum_options.c
tools/ffescape.c
tools/ffeval.c
@@ -4045,6 +4061,7 @@ tools/scale_slice_test.c
tools/seek_print.c
tools/sidxindex.c
tools/sofa2wavs.c
+tools/source2c
tools/trasher.c
tools/uncoded_frame.c
tools/venc_data_dump.c
diff --git a/sources b/sources
index c3587ce..537a8b7 100644
--- a/sources
+++ b/sources
@@ -1,4 +1,4 @@
-SHA512 (ffmpeg-free-6.0.1.tar.xz) = da4aa6db92fbbfdda9fc64249a0c826ae5de33cacbed5ebbfbbe9a30d57ae6f79b61496fcf151dc504d646efd44ba63722220be0b718dd8ffdaa5b2510d92a97
-SHA512 (ffmpeg-6.0.1.tar.xz.asc) = 314f9ef996b85bc93c9fb823d582697c7415ac35f56bfc9cd906893491c8076df90bd852cf6e5e757b1fa94bd415ed108488c1220add49eb1f4854fc253c178c
+SHA512 (ffmpeg-free-6.1.tar.xz) = eb2c0906b659a81f061e508b5c5004efd3fdb8299f2a5e4e954e1dd0589770baccfda768fa9d3e39bde1e1d8644c42015e0f6f674ab96a94776c69aad515d72d
+SHA512 (ffmpeg-6.1.tar.xz.asc) = e4885270869cc6a1681bc3f76f344f77c4858c490a517e45a758d15214ce67c3c2113a1caa8ca65eb6447b68d822fa1dd730081345bcc0928faaf82bb76037ba
SHA512 (ffmpeg-dlopen-headers.tar.xz) = 97e6986fc2bb9dfa4516135a76b04d27ceb52ff96f0af21a6169919aeefefb4d2e2e24a771959689cdbec385f5d71614ba661223c67c0e94089a6dd823a30099
SHA512 (ffmpeg.keyring) = 9b36506835db36f776b7ddb53ad6fa9e915e6ca2f9c7cfebe8eb45513e1036a985283590a840ca313a111bf35dc3731f68885aaafb1fb7011ec433cc119e5165
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-07-20 17:31 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-20 17:31 [rpms/ffmpeg] epel9-next: Rebase to 6.1 Neal Gompa
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox