cb1655c
diff --git a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h
cb1655c
--- a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h
cb1655c
+++ b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h
cb1655c
@@ -49,7 +49,9 @@
cb1655c
     RefPtr<MediaDataDecoder> decoder = new FFmpegVideoDecoder<V>(
cb1655c
         mLib, aParams.mTaskQueue, aParams.VideoConfig(),
cb1655c
         aParams.mKnowsCompositor, aParams.mImageContainer,
cb1655c
-        aParams.mOptions.contains(CreateDecoderParams::Option::LowLatency));
cb1655c
+        aParams.mOptions.contains(CreateDecoderParams::Option::LowLatency),
cb1655c
+        aParams.mOptions.contains(
cb1655c
+            CreateDecoderParams::Option::HardwareDecoderNotAllowed));
cb1655c
     return decoder.forget();
cb1655c
   }
cb1655c
 
cb1655c
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
cb1655c
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
cb1655c
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
cb1655c
@@ -48,7 +48,8 @@
cb1655c
  public:
cb1655c
   FFmpegVideoDecoder(FFmpegLibWrapper* aLib, TaskQueue* aTaskQueue,
cb1655c
                      const VideoInfo& aConfig, KnowsCompositor* aAllocator,
cb1655c
-                     ImageContainer* aImageContainer, bool aLowLatency);
cb1655c
+                     ImageContainer* aImageContainer, bool aLowLatency,
cb1655c
+                     bool aDisableHardwareDecoding);
cb1655c
 
cb1655c
   RefPtr<InitPromise> Init() override;
cb1655c
   void InitCodecContext() override;
cb1655c
@@ -109,6 +110,7 @@
cb1655c
 
cb1655c
 #ifdef MOZ_WAYLAND_USE_VAAPI
cb1655c
   AVBufferRef* mVAAPIDeviceContext;
cb1655c
+  const bool mDisableHardwareDecoding;
cb1655c
 #endif
cb1655c
   RefPtr<KnowsCompositor> mImageAllocator;
cb1655c
   RefPtr<ImageContainer> mImageContainer;
cb1655c
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
cb1655c
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
cb1655c
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
cb1655c
@@ -270,10 +270,11 @@
cb1655c
 FFmpegVideoDecoder<LIBAV_VER>::FFmpegVideoDecoder(
cb1655c
     FFmpegLibWrapper* aLib, TaskQueue* aTaskQueue, const VideoInfo& aConfig,
cb1655c
     KnowsCompositor* aAllocator, ImageContainer* aImageContainer,
cb1655c
-    bool aLowLatency)
cb1655c
+    bool aLowLatency, bool aDisableHardwareDecoding)
cb1655c
     : FFmpegDataDecoder(aLib, aTaskQueue, GetCodecId(aConfig.mMimeType)),
cb1655c
 #ifdef MOZ_WAYLAND_USE_VAAPI
cb1655c
       mVAAPIDeviceContext(nullptr),
cb1655c
+      mDisableHardwareDecoding(aDisableHardwareDecoding),
cb1655c
 #endif
cb1655c
       mImageAllocator(aAllocator),
cb1655c
       mImageContainer(aImageContainer),
cb1655c
@@ -289,9 +290,11 @@
cb1655c
   MediaResult rv;
cb1655c
 
cb1655c
 #ifdef MOZ_WAYLAND_USE_VAAPI
cb1655c
-  rv = InitVAAPIDecoder();
cb1655c
-  if (NS_SUCCEEDED(rv)) {
cb1655c
-    return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
cb1655c
+  if (!mDisableHardwareDecoding) {
cb1655c
+    rv = InitVAAPIDecoder();
cb1655c
+    if (NS_SUCCEEDED(rv)) {
cb1655c
+      return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
cb1655c
+    }
cb1655c
   }
cb1655c
 #endif
cb1655c
 
cb1655c