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 -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 -Signed-off-by: James Almer ---- - 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 -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 -Signed-off-by: James Almer ---- - 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 -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 ---- - 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 +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 -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: -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 ; 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 -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: - - <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 -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Reply-To: FFmpeg development discussions and patches -Cc: Steven Liu -Errors-To: ffmpeg-devel-bounces@ffmpeg.org -Sender: "ffmpeg-devel" -X-TUID: WUhHC4/dXuk+ - -Signed-off-by: Steven Liu ---- - 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 -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: -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 ; 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 -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: - - <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 -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Reply-To: FFmpeg development discussions and patches -Cc: Steven Liu -Errors-To: ffmpeg-devel-bounces@ffmpeg.org -Sender: "ffmpeg-devel" -X-TUID: SFsjHMHu2ISl - -Signed-off-by: Steven Liu ---- - 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 -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: -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 ; 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 -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: - - <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 -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Reply-To: FFmpeg development discussions and patches -Cc: Steven Liu -Errors-To: ffmpeg-devel-bounces@ffmpeg.org -Sender: "ffmpeg-devel" -X-TUID: dRfPdsIvexzh - -Signed-off-by: Steven Liu ---- - 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 -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: -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 ; 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 -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: - - <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 -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Reply-To: FFmpeg development discussions and patches -Cc: Steven Liu -Errors-To: ffmpeg-devel-bounces@ffmpeg.org -Sender: "ffmpeg-devel" -X-TUID: MKqjViniwIy+ - -Signed-off-by: Steven Liu ---- - 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 -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: -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 ; 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 -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: - - <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 -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Reply-To: FFmpeg development discussions and patches -Cc: Steven Liu -Errors-To: ffmpeg-devel-bounces@ffmpeg.org -Sender: "ffmpeg-devel" -X-TUID: appcyLUJeeFW - -Signed-off-by: Steven Liu ---- - 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 -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: -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 ; 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 -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: - - <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 -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Reply-To: FFmpeg development discussions and patches -Cc: Steven Liu -Errors-To: ffmpeg-devel-bounces@ffmpeg.org -Sender: "ffmpeg-devel" -X-TUID: wOtvTzk+zhdw - -Signed-off-by: Steven Liu ---- - 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 -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 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 -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 -+#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 -+ -+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 -+#include -+ -+#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 -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 - 6.1-1 +- Rebase to 6.1 + * Wed Dec 06 2023 Kalev Lember - 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