diff --git a/0001-lavc-libopenh264-Drop-openh264-runtime-version-check.patch b/0001-lavc-libopenh264-Drop-openh264-runtime-version-check.patch new file mode 100644 index 0000000..7066f16 --- /dev/null +++ b/0001-lavc-libopenh264-Drop-openh264-runtime-version-check.patch @@ -0,0 +1,109 @@ +From a641e629591d68bd3edd99bddec623dc31295f6b Mon Sep 17 00:00:00 2001 +From: Kalev Lember +Date: Wed, 6 Dec 2023 14:37:34 +0100 +Subject: [PATCH] lavc/libopenh264: Drop openh264 runtime version checks + +Years ago, openh264 releases often changed their ABI without changing +the library soname. To avoid running into ABI issues, a version check +was added to lavc libopenh264 code to error out at runtime in case the +build time and runtime openh264 versions don't match. + +This should no longer be an issue with newer openh264 releases and we +can drop the runtime version check and rely on upstream doing the right +thing and bump the library soname if the ABI changes, similar to how +other libraries are consumed in ffmpeg. + +Almost all major distributions now include openh264 and this means there +are more eyes on ABI changes and issues are discovered and reported +quickly. See e.g. https://github.com/cisco/openh264/issues/3564 where an +ABI issue was quickly discovered and fixed. + +Relaxing the check allows downstream distributions to build ffmpeg +against e.g. openh264 2.3.1 and ship an update to ABI-compatible +openh264 2.4.0, without needing to coordinate a lock step update between +ffmpeg and openh264 (which can be difficult if openh264 is distributed +by Cisco and ffmpeg comes from the distro, such as is the case for +Fedora). + +Signed-off-by: Kalev Lember +--- + libavcodec/libopenh264.c | 15 --------------- + libavcodec/libopenh264.h | 2 -- + libavcodec/libopenh264dec.c | 4 ---- + libavcodec/libopenh264enc.c | 4 ---- + 4 files changed, 25 deletions(-) + +diff --git a/libavcodec/libopenh264.c b/libavcodec/libopenh264.c +index 0f6d28ed88..c80c85ea8b 100644 +--- a/libavcodec/libopenh264.c ++++ b/libavcodec/libopenh264.c +@@ -46,18 +46,3 @@ void ff_libopenh264_trace_callback(void *ctx, int level, const char *msg) + int equiv_ffmpeg_log_level = libopenh264_to_ffmpeg_log_level(level); + av_log(ctx, equiv_ffmpeg_log_level, "%s\n", msg); + } +- +-int ff_libopenh264_check_version(void *logctx) +-{ +- // Mingw GCC < 4.7 on x86_32 uses an incorrect/buggy ABI for the WelsGetCodecVersion +- // function (for functions returning larger structs), thus skip the check in those +- // configurations. +-#if !defined(_WIN32) || !defined(__GNUC__) || !ARCH_X86_32 || AV_GCC_VERSION_AT_LEAST(4, 7) +- OpenH264Version libver = WelsGetCodecVersion(); +- if (memcmp(&libver, &g_stCodecVersion, sizeof(libver))) { +- av_log(logctx, AV_LOG_ERROR, "Incorrect library version loaded\n"); +- return AVERROR(EINVAL); +- } +-#endif +- return 0; +-} +diff --git a/libavcodec/libopenh264.h b/libavcodec/libopenh264.h +index dbb9c5d429..0b462d6fdc 100644 +--- a/libavcodec/libopenh264.h ++++ b/libavcodec/libopenh264.h +@@ -34,6 +34,4 @@ + + void ff_libopenh264_trace_callback(void *ctx, int level, const char *msg); + +-int ff_libopenh264_check_version(void *logctx); +- + #endif /* AVCODEC_LIBOPENH264_H */ +diff --git a/libavcodec/libopenh264dec.c b/libavcodec/libopenh264dec.c +index 7d650ae03e..b6a9bba2dc 100644 +--- a/libavcodec/libopenh264dec.c ++++ b/libavcodec/libopenh264dec.c +@@ -52,13 +52,9 @@ static av_cold int svc_decode_init(AVCodecContext *avctx) + { + SVCContext *s = avctx->priv_data; + SDecodingParam param = { 0 }; +- int err; + int log_level; + WelsTraceCallback callback_function; + +- if ((err = ff_libopenh264_check_version(avctx)) < 0) +- return AVERROR_DECODER_NOT_FOUND; +- + if (WelsCreateDecoder(&s->decoder)) { + 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 f518d0894e..6f231d22b2 100644 +--- a/libavcodec/libopenh264enc.c ++++ b/libavcodec/libopenh264enc.c +@@ -110,14 +110,10 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) + { + SVCContext *s = avctx->priv_data; + SEncParamExt param = { 0 }; +- int err; + int log_level; + WelsTraceCallback callback_function; + AVCPBProperties *props; + +- if ((err = ff_libopenh264_check_version(avctx)) < 0) +- return AVERROR_ENCODER_NOT_FOUND; +- + if (WelsCreateSVCEncoder(&s->encoder)) { + av_log(avctx, AV_LOG_ERROR, "Unable to create encoder\n"); + return AVERROR_UNKNOWN; +-- +2.43.0 + diff --git a/ffmpeg-allow-fdk-aac-free.patch b/ffmpeg-allow-fdk-aac-free.patch index 0cc91f1..3b87cce 100644 --- a/ffmpeg-allow-fdk-aac-free.patch +++ b/ffmpeg-allow-fdk-aac-free.patch @@ -1,3 +1,5 @@ +From: Andreas Schneider + fdk-aac-free-devel is GPL compatible See https://bugzilla.redhat.com/show_bug.cgi?id=1501522#c112 diff --git a/ffmpeg-chromium.patch b/ffmpeg-chromium.patch new file mode 100644 index 0000000..6625e2d --- /dev/null +++ b/ffmpeg-chromium.patch @@ -0,0 +1,46 @@ +From 4464ecf750bb9440e2571a8d810627cdec85ae02 Mon Sep 17 00:00:00 2001 +From: Frank Liberato +Date: Wed, 7 Jul 2021 19:01:22 -0700 +Subject: [PATCH] Add av_stream_get_first_dts for Chromium + +--- + libavformat/avformat.h | 4 ++++ + libavformat/utils.c | 7 +++++++ + 2 files changed, 11 insertions(+) + +diff --git a/libavformat/avformat.h b/libavformat/avformat.h +index f12fa7d904..0b9fd1f061 100644 +--- a/libavformat/avformat.h ++++ b/libavformat/avformat.h +@@ -1128,6 +1128,10 @@ struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); + */ + int64_t av_stream_get_end_pts(const AVStream *st); + ++// Chromium: We use the internal field first_dts vvv ++int64_t av_stream_get_first_dts(const AVStream *st); ++// Chromium: We use the internal field first_dts ^^^ ++ + #define AV_PROGRAM_RUNNING 1 + + /** +diff --git a/libavformat/utils.c b/libavformat/utils.c +index cf4d68bff9..7d750abf88 100644 +--- a/libavformat/utils.c ++++ b/libavformat/utils.c +@@ -55,6 +55,13 @@ int ff_unlock_avformat(void) + return ff_mutex_unlock(&avformat_mutex) ? -1 : 0; + } + ++// Chromium: We use the internal field first_dts vvv ++int64_t av_stream_get_first_dts(const AVStream *st) ++{ ++ return cffstream(st)->first_dts; ++} ++// Chromium: We use the internal field first_dts ^^^ ++ + /* an arbitrarily chosen "sane" max packet size -- 50M */ + #define SANE_CHUNK_SIZE (50000000) + +-- +2.41.0 + diff --git a/ffmpeg-dlopen-openh264.patch b/ffmpeg-dlopen-openh264.patch index 334e07f..a283f85 100644 --- a/ffmpeg-dlopen-openh264.patch +++ b/ffmpeg-dlopen-openh264.patch @@ -1,4 +1,4 @@ -From 4739b0c97b3378bdaf737171777fe9a71a53eff1 Mon Sep 17 00:00:00 2001 +From 1f48740db0dda8d6ec1b97a7f4a794e381a65636 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 @@ -14,12 +14,12 @@ Signed-off-by: Neal Gompa --- configure | 3 + libavcodec/Makefile | 1 + - libavcodec/libopenh264.c | 18 +++- + libavcodec/libopenh264.c | 5 ++ libavcodec/libopenh264_dlopen.c | 147 ++++++++++++++++++++++++++++++++ libavcodec/libopenh264_dlopen.h | 58 +++++++++++++ libavcodec/libopenh264dec.c | 10 +++ libavcodec/libopenh264enc.c | 10 +++ - 7 files changed, 245 insertions(+), 2 deletions(-) + 7 files changed, 234 insertions(+) create mode 100644 libavcodec/libopenh264_dlopen.c create mode 100644 libavcodec/libopenh264_dlopen.h @@ -64,7 +64,7 @@ index 457ec58377..08a26fba5f 100644 OBJS-$(CONFIG_LIBOPENH264_ENCODER) += libopenh264enc.o libopenh264.o OBJS-$(CONFIG_LIBOPENJPEG_DECODER) += libopenjpegdec.o diff --git a/libavcodec/libopenh264.c b/libavcodec/libopenh264.c -index 0f6d28ed88..a124c3fa1e 100644 +index c80c85ea8b..128c3d9846 100644 --- a/libavcodec/libopenh264.c +++ b/libavcodec/libopenh264.c @@ -20,8 +20,13 @@ @@ -81,26 +81,6 @@ index 0f6d28ed88..a124c3fa1e 100644 #include "libavutil/error.h" #include "libavutil/log.h" -@@ -52,8 +57,17 @@ int ff_libopenh264_check_version(void *logctx) - // Mingw GCC < 4.7 on x86_32 uses an incorrect/buggy ABI for the WelsGetCodecVersion - // function (for functions returning larger structs), thus skip the check in those - // configurations. --#if !defined(_WIN32) || !defined(__GNUC__) || !ARCH_X86_32 || AV_GCC_VERSION_AT_LEAST(4, 7) -- OpenH264Version libver = WelsGetCodecVersion(); -+ // Also, for dlopened OpenH264, we should not do the version check. It's too punitive. -+#if !defined(_WIN32) || !defined(__GNUC__) || !ARCH_X86_32 || AV_GCC_VERSION_AT_LEAST(4, 7) || !defined(CONFIG_LIBOPENH264_DLOPEN) -+ OpenH264Version libver; -+ -+#ifdef CONFIG_LIBOPENH264_DLOPEN -+ if (loadLibOpenH264(logctx)) { -+ return AVERROR_EXTERNAL; -+ } -+#endif -+ -+ libver = WelsGetCodecVersion(); - if (memcmp(&libver, &g_stCodecVersion, sizeof(libver))) { - av_log(logctx, AV_LOG_ERROR, "Incorrect library version loaded\n"); - return AVERROR(EINVAL); diff --git a/libavcodec/libopenh264_dlopen.c b/libavcodec/libopenh264_dlopen.c new file mode 100644 index 0000000000..49ea8ff44f @@ -319,7 +299,7 @@ index 0000000000..d7d8bb7cad + +#endif /* HAVE_LIBOPENH264_DLOPEN_H */ diff --git a/libavcodec/libopenh264dec.c b/libavcodec/libopenh264dec.c -index 007f86b619..57aa3bc1d1 100644 +index 7e14d4dd7d..a805598446 100644 --- a/libavcodec/libopenh264dec.c +++ b/libavcodec/libopenh264dec.c @@ -19,8 +19,12 @@ @@ -335,7 +315,7 @@ index 007f86b619..57aa3bc1d1 100644 #include "libavutil/common.h" #include "libavutil/fifo.h" -@@ -56,6 +60,12 @@ static av_cold int svc_decode_init(AVCodecContext *avctx) +@@ -55,6 +59,12 @@ static av_cold int svc_decode_init(AVCodecContext *avctx) int log_level; WelsTraceCallback callback_function; @@ -345,11 +325,11 @@ index 007f86b619..57aa3bc1d1 100644 + } +#endif + - if ((err = ff_libopenh264_check_version(avctx)) < 0) - return AVERROR_DECODER_NOT_FOUND; - + if (WelsCreateDecoder(&s->decoder)) { + 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 db252aace1..75289678da 100644 +index 5257906567..80481f3d0a 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -19,8 +19,12 @@ @@ -365,7 +345,7 @@ index db252aace1..75289678da 100644 #include "libavutil/attributes.h" #include "libavutil/common.h" -@@ -137,6 +141,12 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) +@@ -114,6 +118,12 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) WelsTraceCallback callback_function; AVCPBProperties *props; @@ -375,9 +355,9 @@ index db252aace1..75289678da 100644 + } +#endif + - if ((err = ff_libopenh264_check_version(avctx)) < 0) - return AVERROR_ENCODER_NOT_FOUND; - + if (WelsCreateSVCEncoder(&s->encoder)) { + av_log(avctx, AV_LOG_ERROR, "Unable to create encoder\n"); + return AVERROR_UNKNOWN; -- 2.36.1 diff --git a/ffmpeg-vulkan-headers.patch b/ffmpeg-vulkan-headers.patch deleted file mode 100644 index ccf79e6..0000000 --- a/ffmpeg-vulkan-headers.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Lynne -Date: Sun, 25 Dec 2022 00:03:30 +0000 (+0100) -Subject: hwcontext_vulkan: remove optional encode/decode extensions from the list -X-Git-Url: http://git.ffmpeg.org/gitweb/ffmpeg.git/commitdiff_plain/eb0455d64690eed0068e5cb202f72ecdf899837c - -hwcontext_vulkan: remove optional encode/decode extensions from the list - -They're not currently used, so they don't need to be there. -Vulkan stabilized the decode extensions less than a week ago, and their -name prefixes were changed from EXT to KHR. It's a bit too soon to be -depending on it, so rather than bumping, just remove these for now. ---- - -diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c -index f1db1c7291..2a9b5f4aac 100644 ---- a/libavutil/hwcontext_vulkan.c -+++ b/libavutil/hwcontext_vulkan.c -@@ -358,14 +358,6 @@ static const VulkanOptExtension optional_device_exts[] = { - { VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_WIN32_MEMORY }, - { VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_WIN32_SEM }, - #endif -- -- /* Video encoding/decoding */ -- { VK_KHR_VIDEO_QUEUE_EXTENSION_NAME, FF_VK_EXT_NO_FLAG }, -- { VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME, FF_VK_EXT_NO_FLAG }, -- { VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME, FF_VK_EXT_NO_FLAG }, -- { VK_EXT_VIDEO_ENCODE_H264_EXTENSION_NAME, FF_VK_EXT_NO_FLAG }, -- { VK_EXT_VIDEO_DECODE_H264_EXTENSION_NAME, FF_VK_EXT_NO_FLAG }, -- { VK_EXT_VIDEO_DECODE_H265_EXTENSION_NAME, FF_VK_EXT_NO_FLAG }, - }; - - /* Converts return values to strings */ diff --git a/ffmpeg.spec b/ffmpeg.spec index f2024e1..13d0602 100644 --- a/ffmpeg.spec +++ b/ffmpeg.spec @@ -101,8 +101,8 @@ Name: ffmpeg %global pkg_name %{name}%{?pkg_suffix} -Version: 5.1.2 -Release: 12%{?dist} +Version: 5.1.4 +Release: 3%{?dist} Summary: A complete solution to record, convert and stream audio and video License: GPLv3+ URL: https://ffmpeg.org/ @@ -128,12 +128,19 @@ 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 -# Upstream fix for vulkan-headers 1.3.236.0+ -Patch4: ffmpeg-vulkan-headers.patch +# Drop openh264 runtime version checks +# https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=10211 +Patch4: 0001-lavc-libopenh264-Drop-openh264-runtime-version-check.patch # Set up dlopen for openh264 Patch1001: ffmpeg-dlopen-openh264.patch +# Add first_dts getter to libavformat for Chromium +# See: https://bugzilla.redhat.com/show_bug.cgi?id=2240127 +# Reference: https://crbug.com/1306560 +Patch1002: ffmpeg-chromium.patch + + Requires: libavcodec%{?pkg_suffix}%{_isa} = %{version}-%{release} Requires: libavdevice%{?pkg_suffix}%{_isa} = %{version}-%{release} Requires: libavfilter%{?pkg_suffix}%{_isa} = %{version}-%{release} @@ -150,6 +157,7 @@ BuildRequires: flite-devel >= 2.2 %endif BuildRequires: game-music-emu-devel BuildRequires: gcc +BuildRequires: git-core BuildRequires: gnupg2 BuildRequires: gsm-devel BuildRequires: ladspa-devel @@ -345,6 +353,7 @@ Requires: libswresample%{?pkg_suffix}%{_isa} = %{version}-%{release} ## Note, we can do this because openh264 is provided in a default-enabled ## third party repository provided by Cisco. Recommends: libopenh264.so.%{openh264_soversion}%{?lib64_suffix} +Suggests: openh264%{_isa} %description -n libavcodec%{?pkg_suffix} The libavcodec library provides a generic encoding/decoding framework @@ -554,7 +563,7 @@ This subpackage contains the headers for FFmpeg libswscale. gpgv2 --quiet --keyring %{SOURCE3} %{SOURCE2} %{SOURCE0} %endif -%autosetup -a1 -p1 +%autosetup -a1 -S git_am install -m 0644 %{SOURCE20} enable_decoders install -m 0644 %{SOURCE21} enable_encoders # fix -O3 -g in host_cflags @@ -870,6 +879,21 @@ rm -rf %{buildroot}%{_datadir}/%{name}/examples %{_mandir}/man3/libswscale.3* %changelog +* Wed Nov 06 2024 Fabio Valentini - 5.1.4-3 +- Rebuild for dav1d 1.5.0 + +* Wed Dec 06 2023 Kalev Lember - 5.1.4-2 +- Prefer openh264 over noopenh264 +- Backport upstream patch to drop openh264 runtime version checks + +* Tue Nov 14 2023 Neal Gompa - 5.1.4-1 +- Update to 5.1.4 +- Add ffmpeg chromium support patch (#2240127) +- Use git to apply patches + +* Tue Mar 28 2023 Yaakov Selkowitz - 5.1.3-1 +- Update to 5.1.3 + * Wed Feb 15 2023 Neal Gompa - 5.1.2-12 - Enable support for the RIST protocol through librist diff --git a/sources b/sources index bea1472..fb4b748 100644 --- a/sources +++ b/sources @@ -1,4 +1,4 @@ -SHA512 (ffmpeg-free-5.1.2.tar.xz) = 8dfb1b8a7d60357abbb21b38526ece67efec38cb52c01ed03b540d350ac82576ce68de3294a4cc6f166c36defa3933e2f9d4652b290e167bf8b6f220921e1e50 -SHA512 (ffmpeg-5.1.2.tar.xz.asc) = 6afc898e3898a7d34e21f0f0bd0553765a46257332c6ece6226e3e043b842275a8d885b9ccca34bc90a2f008ae5fa14515276d23f921a518a63a47f6504af115 +SHA512 (ffmpeg-free-5.1.4.tar.xz) = 73365770b6049528d08fb199de30d61c31327f050d66d87876d26388cc85feaae5c2f1cad6b06f34c7fbb28a1dff0df55d15653f7f5e216e9662cfe902bd8d5a +SHA512 (ffmpeg-5.1.4.tar.xz.asc) = f161815d47c988f8b6281a95f22301d07a22ddc41a2a84bfc126b4d7de0e9175da499c2cc15b3bdaa415af0e8ed1d2b4d52096a81b4a3d804effb00ff9e8ec5b SHA512 (ffmpeg-dlopen-headers.tar.xz) = 97e6986fc2bb9dfa4516135a76b04d27ceb52ff96f0af21a6169919aeefefb4d2e2e24a771959689cdbec385f5d71614ba661223c67c0e94089a6dd823a30099 SHA512 (ffmpeg.keyring) = 9b36506835db36f776b7ddb53ad6fa9e915e6ca2f9c7cfebe8eb45513e1036a985283590a840ca313a111bf35dc3731f68885aaafb1fb7011ec433cc119e5165