On Tue, 04 Nov 2025 09:38:41 +0100, David Goudou <[email protected]> wrote: > > On 03 Nov 25 - 18:24, Stuart Henderson wrote: > > > > "So, installing ffmpeg4.4 solves my problem." > > > > -> > > > > Status: RESOLVED > > Closed: 25 days ago > > WORKSFORME > > > > *me cries* > > > > > > Not sure where to go from here. ffmpeg upstream or back to firefox bugzilla? > > Probably not viable for me to keep ffmpeg at 6 just for ff playback as the > snapshots been built with 8Resolution: --- UNCONFIRMED >
Here a diff which allows me to build firefox which plays a video by openning https://justdavid.org/x3kja9d680zf1.mp4 It is a bit hacky but works. Landry, are you ok with this way? If yes I'll backport it to firefox-esr. Index: Makefile =================================================================== RCS file: /home/cvs/ports/www/mozilla-firefox/Makefile,v diff -u -p -r1.656 Makefile --- Makefile 28 Oct 2025 14:22:02 -0000 1.656 +++ Makefile 4 Nov 2025 12:08:38 -0000 @@ -3,6 +3,7 @@ ONLY_FOR_ARCHS = amd64 aarch64 riscv64 # Don't forget to bump www/firefox-i18n after updates. +REVISION = 0 MOZILLA_VERSION = 144.0.2 MOZILLA_BRANCH = release MOZILLA_PROJECT = firefox @@ -72,6 +73,17 @@ CONFIGURE_ARGS += --enable-lto=thin # riscv64 JIT code not ready for prime time #1994624 CONFIGURE_ARGS += --disable-jit .endif + +LIB_DEPENDS += graphics/ffmpeg + +pre-patch: + @mkdir -p ${WRKSRC}/dom/media/platforms/ffmpeg/ffmpeg62/include +.for _d in libavcodec libavutil + @ln -s ${LOCALBASE}/include/${_d} \ + ${WRKSRC}/dom/media/platforms/ffmpeg/ffmpeg62/include/${_d} +.endfor + @ln -s ${WRKSRC}/dom/media/platforms/ffmpeg/ffmpeg61/moz.build \ + ${WRKSRC}/dom/media/platforms/ffmpeg/ffmpeg62/moz.build # XXX badly formed debug ? DWZ = : Index: patches/patch-dom_media_platforms_ffmpeg_FFmpegLibWrapper_cpp =================================================================== RCS file: patches/patch-dom_media_platforms_ffmpeg_FFmpegLibWrapper_cpp diff -N patches/patch-dom_media_platforms_ffmpeg_FFmpegLibWrapper_cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-dom_media_platforms_ffmpeg_FFmpegLibWrapper_cpp 4 Nov 2025 10:35:40 -0000 @@ -0,0 +1,247 @@ +Support of ffmpeg 8 +See: https://bugzilla.mozilla.org/show_bug.cgi?id=1962139 + +Index: dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp +--- dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp.orig ++++ dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp +@@ -81,6 +81,7 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() + AV_FUNC_59 = 1 << 6, + AV_FUNC_60 = 1 << 7, + AV_FUNC_61 = 1 << 8, ++ AV_FUNC_62 = 1 << 9, + AV_FUNC_AVUTIL_53 = AV_FUNC_53 | AV_FUNC_AVUTIL_MASK, + AV_FUNC_AVUTIL_54 = AV_FUNC_54 | AV_FUNC_AVUTIL_MASK, + AV_FUNC_AVUTIL_55 = AV_FUNC_55 | AV_FUNC_AVUTIL_MASK, +@@ -90,9 +91,10 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() + AV_FUNC_AVUTIL_59 = AV_FUNC_59 | AV_FUNC_AVUTIL_MASK, + AV_FUNC_AVUTIL_60 = AV_FUNC_60 | AV_FUNC_AVUTIL_MASK, + AV_FUNC_AVUTIL_61 = AV_FUNC_61 | AV_FUNC_AVUTIL_MASK, ++ AV_FUNC_AVUTIL_62 = AV_FUNC_62 | AV_FUNC_AVUTIL_MASK, + AV_FUNC_AVCODEC_ALL = AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | AV_FUNC_56 | + AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | +- AV_FUNC_61, ++ AV_FUNC_61 | AV_FUNC_62, + AV_FUNC_AVUTIL_ALL = AV_FUNC_AVCODEC_ALL | AV_FUNC_AVUTIL_MASK + }; + +@@ -124,6 +126,9 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() + case 61: + version = AV_FUNC_61; + break; ++ case 62: ++ version = AV_FUNC_62; ++ break; + default: + FFMPEGV_LOG("Unknown avcodec version: %d", macro); + Unlink(); +@@ -164,17 +169,20 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() + AV_FUNC(av_lockmgr_register, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | + AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58) + AV_FUNC(avcodec_alloc_context3, AV_FUNC_AVCODEC_ALL) +- AV_FUNC(avcodec_close, AV_FUNC_AVCODEC_ALL) ++ AV_FUNC(avcodec_close, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | ++ AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58 | ++ AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ + AV_FUNC(avcodec_decode_audio4, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | + AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58) + AV_FUNC(avcodec_decode_video2, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | + AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58) + AV_FUNC(avcodec_find_decoder, AV_FUNC_AVCODEC_ALL) + AV_FUNC(avcodec_find_decoder_by_name, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | AV_FUNC_62) + AV_FUNC(avcodec_find_encoder, AV_FUNC_AVCODEC_ALL) + AV_FUNC(avcodec_find_encoder_by_name, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | AV_FUNC_62) + AV_FUNC(avcodec_flush_buffers, AV_FUNC_AVCODEC_ALL) + AV_FUNC(avcodec_open2, AV_FUNC_AVCODEC_ALL) + AV_FUNC(avcodec_register_all, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | +@@ -189,21 +197,25 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() + AV_FUNC(avcodec_get_frame_defaults, (AV_FUNC_53 | AV_FUNC_54)) + AV_FUNC(avcodec_free_frame, AV_FUNC_54) + AV_FUNC(avcodec_send_packet, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | AV_FUNC_62) + AV_FUNC(avcodec_receive_packet, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) +- AV_FUNC(avcodec_send_frame, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | AV_FUNC_62) ++ AV_FUNC(avcodec_send_frame, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | ++ AV_FUNC_61 | AV_FUNC_62) + AV_FUNC(avcodec_receive_frame, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | AV_FUNC_62) + AV_FUNC(avcodec_default_get_buffer2, + (AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | +- AV_FUNC_60 | AV_FUNC_61)) ++ AV_FUNC_60 | AV_FUNC_61 | AV_FUNC_62)) + AV_FUNC(av_packet_alloc, +- (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)) ++ (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62)) + AV_FUNC(av_packet_unref, +- (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)) ++ (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62)) + AV_FUNC(av_packet_free, +- (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)) ++ (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62)) + AV_FUNC(avcodec_descriptor_get, AV_FUNC_AVCODEC_ALL) + AV_FUNC(av_log_set_callback, AV_FUNC_AVUTIL_ALL) + AV_FUNC(av_log_set_level, AV_FUNC_AVUTIL_ALL) +@@ -212,41 +224,44 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() + AV_FUNC(av_frame_alloc, + (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | +- AV_FUNC_AVUTIL_61)) ++ AV_FUNC_AVUTIL_61 | AV_FUNC_AVUTIL_62)) + AV_FUNC(av_frame_clone, + (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | +- AV_FUNC_AVUTIL_61)) ++ AV_FUNC_AVUTIL_61 | AV_FUNC_AVUTIL_62)) + AV_FUNC(av_frame_free, + (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | +- AV_FUNC_AVUTIL_61)) ++ AV_FUNC_AVUTIL_61 | AV_FUNC_AVUTIL_62)) + AV_FUNC(av_frame_unref, + (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | +- AV_FUNC_AVUTIL_61)) ++ AV_FUNC_AVUTIL_61 | AV_FUNC_AVUTIL_62)) + AV_FUNC(av_frame_get_buffer, + (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | +- AV_FUNC_AVUTIL_61)) ++ AV_FUNC_AVUTIL_61 | AV_FUNC_AVUTIL_62)) + AV_FUNC(av_frame_make_writable, + (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | +- AV_FUNC_AVUTIL_61)) ++ AV_FUNC_AVUTIL_61 | AV_FUNC_AVUTIL_62)) + AV_FUNC(av_image_check_size, AV_FUNC_AVUTIL_ALL) + AV_FUNC(av_image_get_buffer_size, AV_FUNC_AVUTIL_ALL) + AV_FUNC_OPTION(av_channel_layout_default, +- AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61) ++ AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61 | AV_FUNC_AVUTIL_62) + AV_FUNC_OPTION(av_channel_layout_from_mask, +- AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61) +- AV_FUNC_OPTION(av_channel_layout_copy, AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61) ++ AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61 | AV_FUNC_AVUTIL_62) ++ AV_FUNC_OPTION(av_channel_layout_copy, AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61 | ++ AV_FUNC_AVUTIL_62) + AV_FUNC_OPTION(av_buffer_get_opaque, + (AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58 | +- AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61)) ++ AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61 | ++ AV_FUNC_AVUTIL_62)) + AV_FUNC( + av_buffer_create, + (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | +- AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | AV_FUNC_61)) ++ AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | AV_FUNC_61 | ++ AV_FUNC_62)) + AV_FUNC_OPTION(av_frame_get_colorspace, + AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | + AV_FUNC_AVUTIL_58) +@@ -254,7 +269,8 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() + AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | + AV_FUNC_AVUTIL_58) + AV_FUNC(av_strerror, AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | +- AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61) ++ AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61 | ++ AV_FUNC_AVUTIL_62) + AV_FUNC(av_get_sample_fmt_name, AV_FUNC_AVUTIL_ALL) + AV_FUNC(av_dict_set, AV_FUNC_AVUTIL_ALL) + AV_FUNC(av_dict_free, AV_FUNC_AVUTIL_ALL) +@@ -262,50 +278,68 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() + AV_FUNC(av_opt_set_double, AV_FUNC_AVUTIL_ALL) + AV_FUNC(av_opt_set_int, AV_FUNC_AVUTIL_ALL) + AV_FUNC(avcodec_free_context, +- AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(avcodec_get_hw_config, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(av_codec_is_decoder, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(av_codec_is_encoder, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(av_codec_iterate, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_init, + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | +- AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61) ++ AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61 | ++ AV_FUNC_AVUTIL_62) + AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_alloc, + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | +- AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61) ++ AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61 | ++ AV_FUNC_AVUTIL_62) + AV_FUNC_OPTION_SILENT(av_buffer_ref, AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | + AV_FUNC_AVUTIL_60 | +- AV_FUNC_AVUTIL_61) ++ AV_FUNC_AVUTIL_61 | ++ AV_FUNC_AVUTIL_62) + AV_FUNC_OPTION_SILENT(av_buffer_unref, AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | + AV_FUNC_AVUTIL_60 | +- AV_FUNC_AVUTIL_61) ++ AV_FUNC_AVUTIL_61 | ++ AV_FUNC_AVUTIL_62) + AV_FUNC_OPTION_SILENT(av_hwframe_ctx_alloc, + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | +- AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61) ++ AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61 | ++ AV_FUNC_AVUTIL_62) + AV_FUNC_OPTION_SILENT(av_hwframe_ctx_init, + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | +- AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61) ++ AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61 | ++ AV_FUNC_AVUTIL_62) + + #ifdef MOZ_WIDGET_GTK + AV_FUNC_OPTION_SILENT(av_hwdevice_hwconfig_alloc, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(av_hwdevice_get_hwframe_constraints, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(av_hwframe_constraints_free, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(av_hwframe_transfer_get_formats, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_create_derived, +- AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(avcodec_get_name, AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | +- AV_FUNC_60 | AV_FUNC_61) ++ AV_FUNC_60 | AV_FUNC_61 | ++ AV_FUNC_62) + AV_FUNC_OPTION_SILENT(av_get_pix_fmt_string, + AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | +- AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61) ++ AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61 | ++ AV_FUNC_AVUTIL_62) + #endif + + AV_FUNC_OPTION(av_tx_init, AV_FUNC_AVUTIL_ALL) Index: patches/patch-dom_media_platforms_ffmpeg_FFmpegRuntimeLinker_cpp =================================================================== RCS file: patches/patch-dom_media_platforms_ffmpeg_FFmpegRuntimeLinker_cpp diff -N patches/patch-dom_media_platforms_ffmpeg_FFmpegRuntimeLinker_cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-dom_media_platforms_ffmpeg_FFmpegRuntimeLinker_cpp 4 Nov 2025 10:58:00 -0000 @@ -0,0 +1,52 @@ +Support of ffmpeg 8 +See: https://bugzilla.mozilla.org/show_bug.cgi?id=1962139 + +Index: dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp +--- dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp.orig ++++ dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp +@@ -35,6 +35,7 @@ static FFmpegLibWrapper sLibAV; + static const char* sLibs[] = { + // clang-format off + #if defined(XP_DARWIN) ++ "libavcodec.62.dylib", + "libavcodec.61.dylib", + "libavcodec.60.dylib", + "libavcodec.59.dylib", +@@ -48,6 +49,7 @@ static const char* sLibs[] = { + "libavcodec.so", // OpenBSD hardly controls the major/minor library version + // of ffmpeg and update it regulary on ABI/API changes + #else ++ "libavcodec.so.62", + "libavcodec.so.61", + "libavcodec.so.60", + "libavcodec.so.59", +@@ -120,6 +122,9 @@ bool FFmpegRuntimeLinker::Init() { + case 61: + FFmpegDecoderModule<61>::Init(&sLibAV); + break; ++ case 62: ++ FFmpegDecoderModule<62>::Init(&sLibAV); ++ break; + } + return true; + case FFmpegLibWrapper::LinkResult::NoProvidedLib: +@@ -210,6 +215,9 @@ already_AddRefed<PlatformDecoderModule> FFmpegRuntimeL + case 61: + module = FFmpegDecoderModule<61>::Create(&sLibAV); + break; ++ case 62: ++ module = FFmpegDecoderModule<62>::Create(&sLibAV); ++ break; + default: + module = nullptr; + } +@@ -247,6 +255,9 @@ already_AddRefed<PlatformEncoderModule> FFmpegRuntimeL + break; + case 61: + module = FFmpegEncoderModule<61>::Create(&sLibAV); ++ break; ++ case 62: ++ module = FFmpegEncoderModule<62>::Create(&sLibAV); + break; + default: + module = nullptr; Index: patches/patch-dom_media_platforms_ffmpeg_FFmpegVideoDecoder_cpp =================================================================== RCS file: patches/patch-dom_media_platforms_ffmpeg_FFmpegVideoDecoder_cpp diff -N patches/patch-dom_media_platforms_ffmpeg_FFmpegVideoDecoder_cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-dom_media_platforms_ffmpeg_FFmpegVideoDecoder_cpp 4 Nov 2025 10:35:47 -0000 @@ -0,0 +1,183 @@ +Support of ffmpeg 8 +See: https://bugzilla.mozilla.org/show_bug.cgi?id=1962139 + +Index: dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp +--- dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp.orig ++++ dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp +@@ -1306,11 +1306,21 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER>::DoDecode( + RESULT_DETAIL("HW decoding is slow, switching back to SW decode")); + } + if (mUsingV4L2) { ++# if LIBAVCODEC_VERSION_MAJOR < 62 + rv = CreateImageV4L2(mFrame->pkt_pos, GetFramePts(mFrame), + Duration(mFrame), aResults); ++# else ++ rv = CreateImageV4L2(packet->pos, GetFramePts(mFrame), ++ Duration(mFrame), aResults); ++# endif + } else { ++# if LIBAVCODEC_VERSION_MAJOR < 62 + rv = CreateImageVAAPI(mFrame->pkt_pos, GetFramePts(mFrame), + Duration(mFrame), aResults); ++# else ++ rv = CreateImageVAAPI(packet->pos, GetFramePts(mFrame), ++ Duration(mFrame), aResults); ++# endif + } + + // If VA-API/V4L2 playback failed, just quit. Decoder is going to be +@@ -1323,15 +1333,25 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER>::DoDecode( + } + # elif defined(MOZ_ENABLE_D3D11VA) + mDecodeStats.UpdateDecodeTimes(Duration(mFrame)); ++# if LIBAVCODEC_VERSION_MAJOR < 62 + rv = CreateImageD3D11(mFrame->pkt_pos, GetFramePts(mFrame), + Duration(mFrame), aResults); ++# else ++ rv = CreateImageD3D11(packet->pos, GetFramePts(mFrame), ++ Duration(mFrame), aResults); ++# endif + # elif defined(MOZ_WIDGET_ANDROID) + InputInfo info(aSample); + info.mTimecode = -1; + TakeInputInfo(mFrame, info); + mDecodeStats.UpdateDecodeTimes(info.mDuration); ++# if LIBAVCODEC_VERSION_MAJOR < 62 + rv = CreateImageMediaCodec(mFrame->pkt_pos, GetFramePts(mFrame), + info.mTimecode, info.mDuration, aResults); ++# else ++ rv = CreateImageMediaCodec(packet->pos, GetFramePts(mFrame), ++ info.mTimecode, info.mDuration, aResults); ++# endif + # else + mDecodeStats.UpdateDecodeTimes(Duration(mFrame)); + return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, +@@ -1341,8 +1361,13 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER>::DoDecode( + # endif + { + mDecodeStats.UpdateDecodeTimes(Duration(mFrame)); ++# if LIBAVCODEC_VERSION_MAJOR < 62 + rv = CreateImage(mFrame->pkt_pos, GetFramePts(mFrame), Duration(mFrame), + aResults); ++# else ++ rv = CreateImage(packet->pos, GetFramePts(mFrame), Duration(mFrame), ++ aResults); ++# endif + } + if (NS_FAILED(rv)) { + return rv; +@@ -1670,10 +1695,17 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER>::CreateImage + mLib->av_buffer_get_opaque(mFrame->buf[0])); + MOZ_ASSERT(wrapper); + FFMPEG_LOGV("Create a video data from a shmem image=%p", wrapper.get()); ++# if LIBAVCODEC_VERSION_MAJOR < 62 + v = VideoData::CreateFromImage( + mInfo.mDisplay, aOffset, TimeUnit::FromMicroseconds(aPts), + TimeUnit::FromMicroseconds(aDuration), wrapper->AsImage(), + !!mFrame->key_frame, TimeUnit::FromMicroseconds(-1)); ++# else ++ v = VideoData::CreateFromImage( ++ mInfo.mDisplay, aOffset, TimeUnit::FromMicroseconds(aPts), ++ TimeUnit::FromMicroseconds(aDuration), wrapper->AsImage(), ++ !!(mFrame->flags & AV_FRAME_FLAG_KEY), TimeUnit::FromMicroseconds(-1)); ++# endif + } + #endif + #if defined(MOZ_WIDGET_GTK) && defined(MOZ_USE_HWDECODE) +@@ -1706,10 +1738,17 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER>::CreateImage + mInfo.mTransferFunction + ? TransferFunctionToString(mInfo.mTransferFunction.value()) + : "unknown"); ++# if LIBAVCODEC_VERSION_MAJOR < 62 + v = VideoData::CreateFromImage( + mInfo.mDisplay, aOffset, TimeUnit::FromMicroseconds(aPts), + TimeUnit::FromMicroseconds(aDuration), surface->GetAsImage(), + !!mFrame->key_frame, TimeUnit::FromMicroseconds(-1)); ++# else ++ v = VideoData::CreateFromImage( ++ mInfo.mDisplay, aOffset, TimeUnit::FromMicroseconds(aPts), ++ TimeUnit::FromMicroseconds(aDuration), surface->GetAsImage(), ++ !!(mFrame->flags & AV_FRAME_FLAG_KEY), TimeUnit::FromMicroseconds(-1)); ++# endif + } else { + FFMPEG_LOG("Failed to uploaded video data to DMABuf"); + } +@@ -1726,6 +1765,7 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER>::CreateImage + return ret; + } + } ++#if LIBAVCODEC_VERSION_MAJOR < 62 + Result<already_AddRefed<VideoData>, MediaResult> r = + VideoData::CreateAndCopyData( + mInfo, mImageContainer, aOffset, TimeUnit::FromMicroseconds(aPts), +@@ -1733,6 +1773,15 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER>::CreateImage + TimeUnit::FromMicroseconds(mFrame->pkt_dts), + mInfo.ScaledImageRect(mFrame->width, mFrame->height), + mImageAllocator); ++#else ++ Result<already_AddRefed<VideoData>, MediaResult> r = ++ VideoData::CreateAndCopyData( ++ mInfo, mImageContainer, aOffset, TimeUnit::FromMicroseconds(aPts), ++ TimeUnit::FromMicroseconds(aDuration), b, !!(mFrame->flags & AV_FRAME_FLAG_KEY), ++ TimeUnit::FromMicroseconds(mFrame->pkt_dts), ++ mInfo.ScaledImageRect(mFrame->width, mFrame->height), ++ mImageAllocator); ++#endif + if (r.isErr()) { + return r.unwrapErr(); + } +@@ -1807,11 +1856,17 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER>::CreateImage + mInfo.mTransferFunction + ? TransferFunctionToString(mInfo.mTransferFunction.value()) + : "unknown"); +- ++# if LIBAVCODEC_VERSION_MAJOR < 62 + RefPtr<VideoData> vp = VideoData::CreateFromImage( + mInfo.mDisplay, aOffset, TimeUnit::FromMicroseconds(aPts), + TimeUnit::FromMicroseconds(aDuration), surface->GetAsImage(), + !!mFrame->key_frame, TimeUnit::FromMicroseconds(mFrame->pkt_dts)); ++# else ++ RefPtr<VideoData> vp = VideoData::CreateFromImage( ++ mInfo.mDisplay, aOffset, TimeUnit::FromMicroseconds(aPts), ++ TimeUnit::FromMicroseconds(aDuration), surface->GetAsImage(), ++ !!(mFrame->flags & AV_FRAME_FLAG_KEY), TimeUnit::FromMicroseconds(mFrame->pkt_dts)); ++# endif + + if (!vp) { + return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, +@@ -1857,10 +1912,17 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER>::CreateImage + surface->SetYUVColorSpace(GetFrameColorSpace()); + surface->SetColorRange(GetFrameColorRange()); + ++# if LIBAVCODEC_VERSION_MAJOR < 62 + RefPtr<VideoData> vp = VideoData::CreateFromImage( + mInfo.mDisplay, aOffset, TimeUnit::FromMicroseconds(aPts), + TimeUnit::FromMicroseconds(aDuration), surface->GetAsImage(), + !!mFrame->key_frame, TimeUnit::FromMicroseconds(mFrame->pkt_dts)); ++# else ++ RefPtr<VideoData> vp = VideoData::CreateFromImage( ++ mInfo.mDisplay, aOffset, TimeUnit::FromMicroseconds(aPts), ++ TimeUnit::FromMicroseconds(aDuration), surface->GetAsImage(), ++ !!(mFrame->flags & AV_FRAME_FLAG_KEY), TimeUnit::FromMicroseconds(mFrame->pkt_dts)); ++# endif + + if (!vp) { + return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, +@@ -2298,10 +2360,17 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER>::CreateImage + } + MOZ_ASSERT(image); + ++# if LIBAVCODEC_VERSION_MAJOR < 62 + RefPtr<VideoData> v = VideoData::CreateFromImage( + mInfo.mDisplay, aOffset, TimeUnit::FromMicroseconds(aPts), + TimeUnit::FromMicroseconds(aDuration), image, !!mFrame->key_frame, + TimeUnit::FromMicroseconds(mFrame->pkt_dts)); ++# else ++ RefPtr<VideoData> v = VideoData::CreateFromImage( ++ mInfo.mDisplay, aOffset, TimeUnit::FromMicroseconds(aPts), ++ TimeUnit::FromMicroseconds(aDuration), image, !!(mFrame->flags & AV_FRAME_FLAG_KEY), ++ TimeUnit::FromMicroseconds(mFrame->pkt_dts)); ++# endif + if (!v) { + nsPrintfCString msg("D3D image allocation error"); + FFMPEG_LOG("%s", msg.get()); Index: patches/patch-dom_media_platforms_ffmpeg_FFmpegVideoEncoder_cpp =================================================================== RCS file: patches/patch-dom_media_platforms_ffmpeg_FFmpegVideoEncoder_cpp diff -N patches/patch-dom_media_platforms_ffmpeg_FFmpegVideoEncoder_cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-dom_media_platforms_ffmpeg_FFmpegVideoEncoder_cpp 4 Nov 2025 10:35:53 -0000 @@ -0,0 +1,26 @@ +Support of ffmpeg 8 +See: https://bugzilla.mozilla.org/show_bug.cgi?id=1962139 + +Index: dom/media/platforms/ffmpeg/FFmpegVideoEncoder.cpp +--- dom/media/platforms/ffmpeg/FFmpegVideoEncoder.cpp.orig ++++ dom/media/platforms/ffmpeg/FFmpegVideoEncoder.cpp +@@ -118,11 +118,19 @@ struct H264LiteralSetting { + H264Setting get() const { return {mValue, mString.AsString()}; } + }; + ++#if LIBAVCODEC_VERSION_MAJOR < 62 + static constexpr H264LiteralSetting H264Profiles[]{ + {FF_PROFILE_H264_BASELINE, "baseline"_ns}, + {FF_PROFILE_H264_MAIN, "main"_ns}, + {FF_PROFILE_H264_EXTENDED, ""_ns}, + {FF_PROFILE_H264_HIGH, "high"_ns}}; ++#else ++static constexpr H264LiteralSetting H264Profiles[]{ ++ {AV_PROFILE_H264_BASELINE, "baseline"_ns}, ++ {AV_PROFILE_H264_MAIN, "main"_ns}, ++ {AV_PROFILE_H264_EXTENDED, ""_ns}, ++ {AV_PROFILE_H264_HIGH, "high"_ns}}; ++#endif + + static Maybe<H264Setting> GetH264Profile(const H264_PROFILE& aProfile) { + switch (aProfile) { Index: patches/patch-dom_media_platforms_ffmpeg_moz_build =================================================================== RCS file: patches/patch-dom_media_platforms_ffmpeg_moz_build diff -N patches/patch-dom_media_platforms_ffmpeg_moz_build --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-dom_media_platforms_ffmpeg_moz_build 4 Nov 2025 11:27:04 -0000 @@ -0,0 +1,14 @@ +Support of ffmpeg 8 +See: https://bugzilla.mozilla.org/show_bug.cgi?id=1962139 + +Index: dom/media/platforms/ffmpeg/moz.build +--- dom/media/platforms/ffmpeg/moz.build.orig ++++ dom/media/platforms/ffmpeg/moz.build +@@ -17,6 +17,7 @@ DIRS += [ + "ffmpeg59", + "ffmpeg60", + "ffmpeg61", ++ "ffmpeg62", + ] + + UNIFIED_SOURCES += ["FFmpegRuntimeLinker.cpp"] -- wbr, Kirill
