Index | Thread | Search

From:
Kirill A. Korinsky <kirill@korins.ky>
Subject:
Re: ffmpeg-8.0 unable to play certain video formats
To:
David Goudou <david.goudou@gmail.com>, landry@openbsd.org
Cc:
stu@spacehopper.org, ports@openbsd.org
Date:
Tue, 04 Nov 2025 14:17:50 +0100

Download raw body.

Thread
On Tue, 04 Nov 2025 09:38:41 +0100,
David Goudou <david.goudou@gmail.com> 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