Added va-api patches
This commit is contained in:
parent
f97694215f
commit
cb1655cd55
13
firefox.spec
13
firefox.spec
@ -187,6 +187,13 @@ Patch422: mozilla-1580174-webrtc-popup.patch
|
||||
# Wayland specific upstream patches
|
||||
Patch574: firefox-pipewire.patch
|
||||
|
||||
#VA-API patches
|
||||
Patch579: mozilla-1625431.patch
|
||||
Patch580: mozilla-1628690.patch
|
||||
Patch581: mozilla-1630754.patch
|
||||
Patch582: mozilla-1619543.patch
|
||||
Patch583: mozilla-1632059.patch
|
||||
|
||||
# PGO/LTO patches
|
||||
Patch600: pgo.patch
|
||||
Patch601: mozilla-1516081.patch
|
||||
@ -392,6 +399,12 @@ This package contains results of tests executed during build.
|
||||
# Wayland specific upstream patches
|
||||
%patch574 -p1 -b .firefox-pipewire
|
||||
|
||||
%patch580 -p1 -b .mozilla-1628690
|
||||
%patch582 -p1 -b .mozilla-1619543
|
||||
%patch579 -p1 -b .mozilla-1625431
|
||||
%patch581 -p1 -b .mozilla-1630754
|
||||
%patch583 -p1 -b .mozilla-1632059
|
||||
|
||||
# PGO patches
|
||||
%patch600 -p1 -b .pgo
|
||||
#fix
|
||||
|
97
mozilla-1619543.patch
Normal file
97
mozilla-1619543.patch
Normal file
@ -0,0 +1,97 @@
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
|
||||
@@ -101,17 +101,22 @@
|
||||
: LinkResult::UnknownFutureLibAVVersion;
|
||||
}
|
||||
|
||||
-#define AV_FUNC_OPTION(func, ver) \
|
||||
+#define AV_FUNC_OPTION_SILENT(func, ver) \
|
||||
if ((ver)&version) { \
|
||||
if (!(func = (decltype(func))PR_FindSymbol( \
|
||||
((ver)&AV_FUNC_AVUTIL_MASK) ? mAVUtilLib : mAVCodecLib, \
|
||||
#func))) { \
|
||||
- FFMPEG_LOG("Couldn't load function " #func); \
|
||||
} \
|
||||
} else { \
|
||||
func = (decltype(func)) nullptr; \
|
||||
}
|
||||
|
||||
+#define AV_FUNC_OPTION(func, ver) \
|
||||
+ AV_FUNC_OPTION_SILENT(func, ver) \
|
||||
+ if ((ver)&version && (func) == (decltype(func)) nullptr) { \
|
||||
+ FFMPEG_LOG("Couldn't load function " #func); \
|
||||
+ }
|
||||
+
|
||||
#define AV_FUNC(func, ver) \
|
||||
AV_FUNC_OPTION(func, ver) \
|
||||
if ((ver)&version && !func) { \
|
||||
@@ -153,30 +158,29 @@
|
||||
AV_FUNC_OPTION(av_frame_get_colorspace, AV_FUNC_AVUTIL_ALL)
|
||||
AV_FUNC_OPTION(av_frame_get_color_range, AV_FUNC_AVUTIL_ALL)
|
||||
#ifdef MOZ_WAYLAND
|
||||
- AV_FUNC_OPTION(avcodec_get_hw_config, AV_FUNC_58)
|
||||
- AV_FUNC_OPTION(av_hwdevice_ctx_create, AV_FUNC_58)
|
||||
- AV_FUNC_OPTION(av_buffer_ref, AV_FUNC_AVUTIL_58)
|
||||
- AV_FUNC_OPTION(av_buffer_unref, AV_FUNC_AVUTIL_58)
|
||||
- AV_FUNC_OPTION(av_hwframe_transfer_get_formats, AV_FUNC_58)
|
||||
- AV_FUNC_OPTION(av_hwdevice_ctx_create_derived, AV_FUNC_58)
|
||||
- AV_FUNC_OPTION(av_hwframe_ctx_alloc, AV_FUNC_58)
|
||||
- AV_FUNC_OPTION(av_dict_set, AV_FUNC_58)
|
||||
- AV_FUNC_OPTION(av_dict_free, AV_FUNC_58)
|
||||
+ AV_FUNC_OPTION_SILENT(avcodec_get_hw_config, AV_FUNC_58)
|
||||
+ AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_create, AV_FUNC_58)
|
||||
+ AV_FUNC_OPTION_SILENT(av_buffer_ref, AV_FUNC_AVUTIL_58)
|
||||
+ AV_FUNC_OPTION_SILENT(av_buffer_unref, AV_FUNC_AVUTIL_58)
|
||||
+ AV_FUNC_OPTION_SILENT(av_hwframe_transfer_get_formats, AV_FUNC_58)
|
||||
+ AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_create_derived, AV_FUNC_58)
|
||||
+ AV_FUNC_OPTION_SILENT(av_hwframe_ctx_alloc, AV_FUNC_58)
|
||||
+ AV_FUNC_OPTION_SILENT(av_dict_set, AV_FUNC_58)
|
||||
+ AV_FUNC_OPTION_SILENT(av_dict_free, AV_FUNC_58)
|
||||
#endif
|
||||
#undef AV_FUNC
|
||||
#undef AV_FUNC_OPTION
|
||||
|
||||
#ifdef MOZ_WAYLAND
|
||||
-# define VA_FUNC_OPTION(func) \
|
||||
+# define VA_FUNC_OPTION_SILENT(func) \
|
||||
if (!(func = (decltype(func))PR_FindSymbol(mVALib, #func))) { \
|
||||
- FFMPEG_LOG("Couldn't load function " #func); \
|
||||
func = (decltype(func)) nullptr; \
|
||||
}
|
||||
|
||||
// mVALib is optional and may not be present.
|
||||
if (mVALib) {
|
||||
- VA_FUNC_OPTION(vaExportSurfaceHandle)
|
||||
- VA_FUNC_OPTION(vaSyncSurface)
|
||||
+ VA_FUNC_OPTION_SILENT(vaExportSurfaceHandle)
|
||||
+ VA_FUNC_OPTION_SILENT(vaSyncSurface)
|
||||
}
|
||||
# undef VA_FUNC_OPTION
|
||||
#endif
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
|
||||
@@ -66,6 +66,9 @@
|
||||
PR_UnloadLibrary(sLibAV.mVALib);
|
||||
sLibAV.mVALib = nullptr;
|
||||
}
|
||||
+ if (!sLibAV.mVALib) {
|
||||
+ FFMPEG_LOG("VA-API support: Missing or old %s library.\n", lib);
|
||||
+ }
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
@@ -173,7 +173,7 @@
|
||||
FFMPEG_LOG("Initialising VA-API FFmpeg decoder");
|
||||
|
||||
if (!mLib->IsVAAPIAvailable()) {
|
||||
- FFMPEG_LOG("libva library is missing");
|
||||
+ FFMPEG_LOG("libva library or symbols are missing.");
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
|
20
mozilla-1625431.patch
Normal file
20
mozilla-1625431.patch
Normal file
@ -0,0 +1,20 @@
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
@@ -172,6 +172,15 @@
|
||||
MediaResult FFmpegVideoDecoder<LIBAV_VER>::InitVAAPIDecoder() {
|
||||
FFMPEG_LOG("Initialising VA-API FFmpeg decoder");
|
||||
|
||||
+ auto layersBackend = mImageAllocator
|
||||
+ ? mImageAllocator->GetCompositorBackendType()
|
||||
+ : layers::LayersBackend::LAYERS_BASIC;
|
||||
+ if (layersBackend != layers::LayersBackend::LAYERS_OPENGL &&
|
||||
+ layersBackend != layers::LayersBackend::LAYERS_WR) {
|
||||
+ FFMPEG_LOG("VA-API works with HW accelerated backend only!");
|
||||
+ return NS_ERROR_NOT_AVAILABLE;
|
||||
+ }
|
||||
+
|
||||
if (!mLib->IsVAAPIAvailable()) {
|
||||
FFMPEG_LOG("libva library or symbols are missing.");
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
|
67
mozilla-1628690.patch
Normal file
67
mozilla-1628690.patch
Normal file
@ -0,0 +1,67 @@
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h
|
||||
@@ -49,7 +49,9 @@
|
||||
RefPtr<MediaDataDecoder> decoder = new FFmpegVideoDecoder<V>(
|
||||
mLib, aParams.mTaskQueue, aParams.VideoConfig(),
|
||||
aParams.mKnowsCompositor, aParams.mImageContainer,
|
||||
- aParams.mOptions.contains(CreateDecoderParams::Option::LowLatency));
|
||||
+ aParams.mOptions.contains(CreateDecoderParams::Option::LowLatency),
|
||||
+ aParams.mOptions.contains(
|
||||
+ CreateDecoderParams::Option::HardwareDecoderNotAllowed));
|
||||
return decoder.forget();
|
||||
}
|
||||
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
||||
@@ -48,7 +48,8 @@
|
||||
public:
|
||||
FFmpegVideoDecoder(FFmpegLibWrapper* aLib, TaskQueue* aTaskQueue,
|
||||
const VideoInfo& aConfig, KnowsCompositor* aAllocator,
|
||||
- ImageContainer* aImageContainer, bool aLowLatency);
|
||||
+ ImageContainer* aImageContainer, bool aLowLatency,
|
||||
+ bool aDisableHardwareDecoding);
|
||||
|
||||
RefPtr<InitPromise> Init() override;
|
||||
void InitCodecContext() override;
|
||||
@@ -109,6 +110,7 @@
|
||||
|
||||
#ifdef MOZ_WAYLAND_USE_VAAPI
|
||||
AVBufferRef* mVAAPIDeviceContext;
|
||||
+ const bool mDisableHardwareDecoding;
|
||||
#endif
|
||||
RefPtr<KnowsCompositor> mImageAllocator;
|
||||
RefPtr<ImageContainer> mImageContainer;
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
@@ -270,10 +270,11 @@
|
||||
FFmpegVideoDecoder<LIBAV_VER>::FFmpegVideoDecoder(
|
||||
FFmpegLibWrapper* aLib, TaskQueue* aTaskQueue, const VideoInfo& aConfig,
|
||||
KnowsCompositor* aAllocator, ImageContainer* aImageContainer,
|
||||
- bool aLowLatency)
|
||||
+ bool aLowLatency, bool aDisableHardwareDecoding)
|
||||
: FFmpegDataDecoder(aLib, aTaskQueue, GetCodecId(aConfig.mMimeType)),
|
||||
#ifdef MOZ_WAYLAND_USE_VAAPI
|
||||
mVAAPIDeviceContext(nullptr),
|
||||
+ mDisableHardwareDecoding(aDisableHardwareDecoding),
|
||||
#endif
|
||||
mImageAllocator(aAllocator),
|
||||
mImageContainer(aImageContainer),
|
||||
@@ -289,9 +290,11 @@
|
||||
MediaResult rv;
|
||||
|
||||
#ifdef MOZ_WAYLAND_USE_VAAPI
|
||||
- rv = InitVAAPIDecoder();
|
||||
- if (NS_SUCCEEDED(rv)) {
|
||||
- return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
|
||||
+ if (!mDisableHardwareDecoding) {
|
||||
+ rv = InitVAAPIDecoder();
|
||||
+ if (NS_SUCCEEDED(rv)) {
|
||||
+ return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
|
||||
+ }
|
||||
}
|
||||
#endif
|
||||
|
||||
|
298
mozilla-1630754.patch
Normal file
298
mozilla-1630754.patch
Normal file
@ -0,0 +1,298 @@
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
|
||||
@@ -116,9 +116,9 @@
|
||||
#ifdef MOZ_WAYLAND
|
||||
const AVCodecHWConfig* (*avcodec_get_hw_config)(const AVCodec* codec,
|
||||
int index);
|
||||
- int (*av_hwdevice_ctx_create)(AVBufferRef** device_ctx, int type,
|
||||
- const char* device, AVDictionary* opts,
|
||||
- int flags);
|
||||
+ AVBufferRef* (*av_hwdevice_ctx_alloc)(int);
|
||||
+ int (*av_hwdevice_ctx_init)(AVBufferRef* ref);
|
||||
+
|
||||
AVBufferRef* (*av_buffer_ref)(AVBufferRef* buf);
|
||||
void (*av_buffer_unref)(AVBufferRef** buf);
|
||||
int (*av_hwframe_transfer_get_formats)(AVBufferRef* hwframe_ctx, int dir,
|
||||
@@ -132,12 +132,16 @@
|
||||
|
||||
int (*vaExportSurfaceHandle)(void*, unsigned int, uint32_t, uint32_t, void*);
|
||||
int (*vaSyncSurface)(void*, unsigned int);
|
||||
+ int (*vaInitialize)(void* dpy, int* major_version, int* minor_version);
|
||||
+ int (*vaTerminate)(void* dpy);
|
||||
+ void* (*vaGetDisplayWl)(struct wl_display* display);
|
||||
#endif
|
||||
|
||||
PRLibrary* mAVCodecLib;
|
||||
PRLibrary* mAVUtilLib;
|
||||
#ifdef MOZ_WAYLAND
|
||||
PRLibrary* mVALib;
|
||||
+ PRLibrary* mVALibWayland;
|
||||
#endif
|
||||
|
||||
private:
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
|
||||
@@ -159,7 +159,8 @@
|
||||
AV_FUNC_OPTION(av_frame_get_color_range, AV_FUNC_AVUTIL_ALL)
|
||||
#ifdef MOZ_WAYLAND
|
||||
AV_FUNC_OPTION_SILENT(avcodec_get_hw_config, AV_FUNC_58)
|
||||
- AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_create, AV_FUNC_58)
|
||||
+ AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_init, AV_FUNC_58)
|
||||
+ AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_alloc, AV_FUNC_58)
|
||||
AV_FUNC_OPTION_SILENT(av_buffer_ref, AV_FUNC_AVUTIL_58)
|
||||
AV_FUNC_OPTION_SILENT(av_buffer_unref, AV_FUNC_AVUTIL_58)
|
||||
AV_FUNC_OPTION_SILENT(av_hwframe_transfer_get_formats, AV_FUNC_58)
|
||||
@@ -181,8 +182,21 @@
|
||||
if (mVALib) {
|
||||
VA_FUNC_OPTION_SILENT(vaExportSurfaceHandle)
|
||||
VA_FUNC_OPTION_SILENT(vaSyncSurface)
|
||||
+ VA_FUNC_OPTION_SILENT(vaInitialize)
|
||||
+ VA_FUNC_OPTION_SILENT(vaTerminate)
|
||||
}
|
||||
-# undef VA_FUNC_OPTION
|
||||
+# undef VA_FUNC_OPTION_SILENT
|
||||
+
|
||||
+# define VAW_FUNC_OPTION_SILENT(func) \
|
||||
+ if (!(func = (decltype(func))PR_FindSymbol(mVALibWayland, #func))) { \
|
||||
+ FFMPEG_LOG("Couldn't load function " #func); \
|
||||
+ }
|
||||
+
|
||||
+ // mVALibWayland is optional and may not be present.
|
||||
+ if (mVALibWayland) {
|
||||
+ VAW_FUNC_OPTION_SILENT(vaGetDisplayWl)
|
||||
+ }
|
||||
+# undef VAW_FUNC_OPTION_SILENT
|
||||
#endif
|
||||
|
||||
avcodec_register_all();
|
||||
@@ -218,6 +232,9 @@
|
||||
if (mVALib) {
|
||||
PR_UnloadLibrary(mVALib);
|
||||
}
|
||||
+ if (mVALibWayland) {
|
||||
+ PR_UnloadLibrary(mVALibWayland);
|
||||
+ }
|
||||
#endif
|
||||
PodZero(this);
|
||||
}
|
||||
@@ -226,13 +243,16 @@
|
||||
bool FFmpegLibWrapper::IsVAAPIAvailable() {
|
||||
# define VA_FUNC_LOADED(func) (func != nullptr)
|
||||
return VA_FUNC_LOADED(avcodec_get_hw_config) &&
|
||||
- VA_FUNC_LOADED(av_hwdevice_ctx_create) &&
|
||||
+ VA_FUNC_LOADED(av_hwdevice_ctx_alloc) &&
|
||||
+ VA_FUNC_LOADED(av_hwdevice_ctx_init) &&
|
||||
VA_FUNC_LOADED(av_buffer_ref) && VA_FUNC_LOADED(av_buffer_unref) &&
|
||||
VA_FUNC_LOADED(av_hwframe_transfer_get_formats) &&
|
||||
VA_FUNC_LOADED(av_hwdevice_ctx_create_derived) &&
|
||||
VA_FUNC_LOADED(av_hwframe_ctx_alloc) && VA_FUNC_LOADED(av_dict_set) &&
|
||||
VA_FUNC_LOADED(av_dict_free) &&
|
||||
- VA_FUNC_LOADED(vaExportSurfaceHandle) && VA_FUNC_LOADED(vaSyncSurface);
|
||||
+ VA_FUNC_LOADED(vaExportSurfaceHandle) &&
|
||||
+ VA_FUNC_LOADED(vaSyncSurface) && VA_FUNC_LOADED(vaInitialize) &&
|
||||
+ VA_FUNC_LOADED(vaTerminate) && VA_FUNC_LOADED(vaGetDisplayWl);
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
|
||||
@@ -9,6 +9,9 @@
|
||||
#include "mozilla/ArrayUtils.h"
|
||||
#include "FFmpegLog.h"
|
||||
#include "prlink.h"
|
||||
+#ifdef MOZ_WAYLAND
|
||||
+# include "gfxPlatformGtk.h"
|
||||
+#endif
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
@@ -54,21 +57,33 @@
|
||||
}
|
||||
|
||||
#ifdef MOZ_WAYLAND
|
||||
- {
|
||||
- const char* lib = "libva.so.2";
|
||||
+ if (gfxPlatformGtk::GetPlatform()->UseWaylandHardwareVideoDecoding()) {
|
||||
+ const char* libWayland = "libva-wayland.so.2";
|
||||
PRLibSpec lspec;
|
||||
lspec.type = PR_LibSpec_Pathname;
|
||||
- lspec.value.pathname = lib;
|
||||
- sLibAV.mVALib = PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
|
||||
- // Don't use libva when it's missing vaExportSurfaceHandle.
|
||||
- if (sLibAV.mVALib &&
|
||||
- !PR_FindSymbol(sLibAV.mVALib, "vaExportSurfaceHandle")) {
|
||||
- PR_UnloadLibrary(sLibAV.mVALib);
|
||||
- sLibAV.mVALib = nullptr;
|
||||
+ lspec.value.pathname = libWayland;
|
||||
+ sLibAV.mVALibWayland =
|
||||
+ PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
|
||||
+ if (!sLibAV.mVALibWayland) {
|
||||
+ FFMPEG_LOG("VA-API support: Missing or old %s library.\n", libWayland);
|
||||
}
|
||||
- if (!sLibAV.mVALib) {
|
||||
- FFMPEG_LOG("VA-API support: Missing or old %s library.\n", lib);
|
||||
+
|
||||
+ if (sLibAV.mVALibWayland) {
|
||||
+ const char* lib = "libva.so.2";
|
||||
+ lspec.value.pathname = lib;
|
||||
+ sLibAV.mVALib = PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
|
||||
+ // Don't use libva when it's missing vaExportSurfaceHandle.
|
||||
+ if (sLibAV.mVALib &&
|
||||
+ !PR_FindSymbol(sLibAV.mVALib, "vaExportSurfaceHandle")) {
|
||||
+ PR_UnloadLibrary(sLibAV.mVALib);
|
||||
+ sLibAV.mVALib = nullptr;
|
||||
+ }
|
||||
+ if (!sLibAV.mVALib) {
|
||||
+ FFMPEG_LOG("VA-API support: Missing or old %s library.\n", lib);
|
||||
+ }
|
||||
}
|
||||
+ } else {
|
||||
+ FFMPEG_LOG("VA-API FFmpeg is disabled by platform");
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
||||
@@ -111,6 +111,7 @@
|
||||
#ifdef MOZ_WAYLAND_USE_VAAPI
|
||||
AVBufferRef* mVAAPIDeviceContext;
|
||||
const bool mDisableHardwareDecoding;
|
||||
+ VADisplay mDisplay;
|
||||
#endif
|
||||
RefPtr<KnowsCompositor> mImageAllocator;
|
||||
RefPtr<ImageContainer> mImageContainer;
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
@@ -154,14 +154,44 @@
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
+class VAAPIDisplayHolder {
|
||||
+ public:
|
||||
+ VAAPIDisplayHolder(FFmpegLibWrapper* aLib, VADisplay aDisplay)
|
||||
+ : mLib(aLib), mDisplay(aDisplay){};
|
||||
+ ~VAAPIDisplayHolder() { mLib->vaTerminate(mDisplay); }
|
||||
+
|
||||
+ private:
|
||||
+ FFmpegLibWrapper* mLib;
|
||||
+ VADisplay mDisplay;
|
||||
+};
|
||||
+
|
||||
+static void VAAPIDisplayReleaseCallback(struct AVHWDeviceContext* hwctx) {
|
||||
+ auto displayHolder = static_cast<VAAPIDisplayHolder*>(hwctx->user_opaque);
|
||||
+ delete displayHolder;
|
||||
+}
|
||||
+
|
||||
bool FFmpegVideoDecoder<LIBAV_VER>::CreateVAAPIDeviceContext() {
|
||||
- AVDictionary* opts = nullptr;
|
||||
- mLib->av_dict_set(&opts, "connection_type", "drm", 0);
|
||||
- bool ret =
|
||||
- (mLib->av_hwdevice_ctx_create(
|
||||
- &mVAAPIDeviceContext, AV_HWDEVICE_TYPE_VAAPI, NULL, NULL, 0) == 0);
|
||||
- mLib->av_dict_free(&opts);
|
||||
- if (!ret) {
|
||||
+ mVAAPIDeviceContext = mLib->av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_VAAPI);
|
||||
+ if (!mVAAPIDeviceContext) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ AVHWDeviceContext* hwctx = (AVHWDeviceContext*)mVAAPIDeviceContext->data;
|
||||
+ AVVAAPIDeviceContext* vactx = (AVVAAPIDeviceContext*)hwctx->hwctx;
|
||||
+
|
||||
+ mDisplay = mLib->vaGetDisplayWl(widget::WaylandDisplayGet()->GetDisplay());
|
||||
+
|
||||
+ hwctx->user_opaque = new VAAPIDisplayHolder(mLib, mDisplay);
|
||||
+ hwctx->free = VAAPIDisplayReleaseCallback;
|
||||
+
|
||||
+ int major, minor;
|
||||
+ int status = mLib->vaInitialize(mDisplay, &major, &minor);
|
||||
+ if (status != VA_STATUS_SUCCESS) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ vactx->display = mDisplay;
|
||||
+
|
||||
+ if (mLib->av_hwdevice_ctx_init(mVAAPIDeviceContext) < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -172,6 +202,11 @@
|
||||
MediaResult FFmpegVideoDecoder<LIBAV_VER>::InitVAAPIDecoder() {
|
||||
FFMPEG_LOG("Initialising VA-API FFmpeg decoder");
|
||||
|
||||
+ if (!mLib->IsVAAPIAvailable()) {
|
||||
+ FFMPEG_LOG("libva library or symbols are missing.");
|
||||
+ return NS_ERROR_NOT_AVAILABLE;
|
||||
+ }
|
||||
+
|
||||
auto layersBackend = mImageAllocator
|
||||
? mImageAllocator->GetCompositorBackendType()
|
||||
: layers::LayersBackend::LAYERS_BASIC;
|
||||
@@ -181,16 +216,6 @@
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
- if (!mLib->IsVAAPIAvailable()) {
|
||||
- FFMPEG_LOG("libva library or symbols are missing.");
|
||||
- return NS_ERROR_NOT_AVAILABLE;
|
||||
- }
|
||||
-
|
||||
- if (!gfxPlatformGtk::GetPlatform()->UseWaylandHardwareVideoDecoding()) {
|
||||
- FFMPEG_LOG("VA-API FFmpeg is disabled by platform");
|
||||
- return NS_ERROR_NOT_AVAILABLE;
|
||||
- }
|
||||
-
|
||||
AVCodec* codec = FindVAAPICodec();
|
||||
if (!codec) {
|
||||
FFMPEG_LOG("Couldn't find ffmpeg VA-API decoder");
|
||||
@@ -275,6 +300,7 @@
|
||||
#ifdef MOZ_WAYLAND_USE_VAAPI
|
||||
mVAAPIDeviceContext(nullptr),
|
||||
mDisableHardwareDecoding(aDisableHardwareDecoding),
|
||||
+ mDisplay(nullptr),
|
||||
#endif
|
||||
mImageAllocator(aAllocator),
|
||||
mImageContainer(aImageContainer),
|
||||
@@ -606,16 +632,10 @@
|
||||
" duration=%" PRId64 " opaque=%" PRId64,
|
||||
aPts, mFrame->pkt_dts, aDuration, mCodecContext->reordered_opaque);
|
||||
|
||||
- AVHWDeviceContext* device_ctx = (AVHWDeviceContext*)mVAAPIDeviceContext->data;
|
||||
- AVVAAPIDeviceContext* VAAPIDeviceContext =
|
||||
- (AVVAAPIDeviceContext*)device_ctx->hwctx;
|
||||
VADRMPRIMESurfaceDescriptor va_desc;
|
||||
-
|
||||
VASurfaceID surface_id = (VASurfaceID)(uintptr_t)mFrame->data[3];
|
||||
-
|
||||
VAStatus vas = mLib->vaExportSurfaceHandle(
|
||||
- VAAPIDeviceContext->display, surface_id,
|
||||
- VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
|
||||
+ mDisplay, surface_id, VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
|
||||
VA_EXPORT_SURFACE_READ_ONLY | VA_EXPORT_SURFACE_SEPARATE_LAYERS,
|
||||
&va_desc);
|
||||
if (vas != VA_STATUS_SUCCESS) {
|
||||
@@ -623,7 +643,7 @@
|
||||
NS_ERROR_OUT_OF_MEMORY,
|
||||
RESULT_DETAIL("Unable to get frame by vaExportSurfaceHandle()"));
|
||||
}
|
||||
- vas = mLib->vaSyncSurface(VAAPIDeviceContext->display, surface_id);
|
||||
+ vas = mLib->vaSyncSurface(mDisplay, surface_id);
|
||||
if (vas != VA_STATUS_SUCCESS) {
|
||||
NS_WARNING("vaSyncSurface() failed.");
|
||||
}
|
||||
diff --git a/dom/media/platforms/ffmpeg/moz.build b/dom/media/platforms/ffmpeg/moz.build
|
||||
--- a/dom/media/platforms/ffmpeg/moz.build
|
||||
+++ b/dom/media/platforms/ffmpeg/moz.build
|
||||
@@ -20,4 +20,7 @@
|
||||
'FFmpegRuntimeLinker.cpp',
|
||||
]
|
||||
|
||||
+if CONFIG['MOZ_WAYLAND']:
|
||||
+ include('/ipc/chromium/chromium-config.mozbuild')
|
||||
+
|
||||
FINAL_LIBRARY = 'xul'
|
||||
|
41
mozilla-1632059.patch
Normal file
41
mozilla-1632059.patch
Normal file
@ -0,0 +1,41 @@
|
||||
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
||||
@@ -178,7 +178,12 @@
|
||||
AVHWDeviceContext* hwctx = (AVHWDeviceContext*)mVAAPIDeviceContext->data;
|
||||
AVVAAPIDeviceContext* vactx = (AVVAAPIDeviceContext*)hwctx->hwctx;
|
||||
|
||||
- mDisplay = mLib->vaGetDisplayWl(widget::WaylandDisplayGet()->GetDisplay());
|
||||
+ wl_display* display = widget::WaylandDisplayGetWLDisplay();
|
||||
+ if (!display) {
|
||||
+ FFMPEG_LOG("Can't get default wayland display.");
|
||||
+ return false;
|
||||
+ }
|
||||
+ mDisplay = mLib->vaGetDisplayWl(display);
|
||||
|
||||
hwctx->user_opaque = new VAAPIDisplayHolder(mLib, mDisplay);
|
||||
hwctx->free = VAAPIDisplayReleaseCallback;
|
||||
diff --git a/widget/gtk/nsWaylandDisplay.cpp b/widget/gtk/nsWaylandDisplay.cpp
|
||||
--- a/widget/gtk/nsWaylandDisplay.cpp
|
||||
+++ b/widget/gtk/nsWaylandDisplay.cpp
|
||||
@@ -35,6 +35,9 @@
|
||||
wl_display* WaylandDisplayGetWLDisplay(GdkDisplay* aGdkDisplay) {
|
||||
if (!aGdkDisplay) {
|
||||
aGdkDisplay = gdk_display_get_default();
|
||||
+ if (!aGdkDisplay || GDK_IS_X11_DISPLAY(aGdkDisplay)) {
|
||||
+ return nullptr;
|
||||
+ }
|
||||
}
|
||||
|
||||
// Available as of GTK 3.8+
|
||||
@@ -537,8 +540,7 @@
|
||||
StaticPrefs::widget_wayland_dmabuf_webgl_enabled();
|
||||
}
|
||||
bool nsWaylandDisplay::IsDMABufVAAPIEnabled() {
|
||||
- return IsDMABufEnabled() &&
|
||||
- StaticPrefs::widget_wayland_dmabuf_vaapi_enabled();
|
||||
+ return StaticPrefs::widget_wayland_dmabuf_vaapi_enabled();
|
||||
}
|
||||
|
||||
void* nsGbmLib::sGbmLibHandle = nullptr;
|
||||
|
Loading…
Reference in New Issue
Block a user