summaryrefslogtreecommitdiffstats
path: root/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp')
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp169
1 files changed, 169 insertions, 0 deletions
diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
new file mode 100644
index 000000000..fdbe77ef7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
@@ -0,0 +1,169 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "FFmpegRuntimeLinker.h"
+#include "FFmpegLibWrapper.h"
+#include "mozilla/ArrayUtils.h"
+#include "FFmpegLog.h"
+#include "prlink.h"
+
+namespace mozilla
+{
+
+FFmpegRuntimeLinker::LinkStatus FFmpegRuntimeLinker::sLinkStatus =
+ LinkStatus_INIT;
+const char* FFmpegRuntimeLinker::sLinkStatusLibraryName = "";
+
+template <int V> class FFmpegDecoderModule
+{
+public:
+ static already_AddRefed<PlatformDecoderModule> Create(FFmpegLibWrapper*);
+};
+
+static FFmpegLibWrapper sLibAV;
+
+static const char* sLibs[] = {
+#if defined(XP_DARWIN)
+ "libavcodec.57.dylib",
+ "libavcodec.56.dylib",
+ "libavcodec.55.dylib",
+ "libavcodec.54.dylib",
+ "libavcodec.53.dylib",
+#else
+ "libavcodec-ffmpeg.so.57",
+ "libavcodec-ffmpeg.so.56",
+ "libavcodec.so.57",
+ "libavcodec.so.56",
+ "libavcodec.so.55",
+ "libavcodec.so.54",
+ "libavcodec.so.53",
+#endif
+};
+
+/* static */ bool
+FFmpegRuntimeLinker::Init()
+{
+ if (sLinkStatus != LinkStatus_INIT) {
+ return sLinkStatus == LinkStatus_SUCCEEDED;
+ }
+
+ // While going through all possible libs, this status will be updated with a
+ // more precise error if possible.
+ sLinkStatus = LinkStatus_NOT_FOUND;
+
+ for (size_t i = 0; i < ArrayLength(sLibs); i++) {
+ const char* lib = sLibs[i];
+ PRLibSpec lspec;
+ lspec.type = PR_LibSpec_Pathname;
+ lspec.value.pathname = lib;
+ sLibAV.mAVCodecLib = PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
+ if (sLibAV.mAVCodecLib) {
+ sLibAV.mAVUtilLib = sLibAV.mAVCodecLib;
+ switch (sLibAV.Link()) {
+ case FFmpegLibWrapper::LinkResult::Success:
+ sLinkStatus = LinkStatus_SUCCEEDED;
+ sLinkStatusLibraryName = lib;
+ return true;
+ case FFmpegLibWrapper::LinkResult::NoProvidedLib:
+ MOZ_ASSERT_UNREACHABLE("Incorrectly-setup sLibAV");
+ break;
+ case FFmpegLibWrapper::LinkResult::NoAVCodecVersion:
+ if (sLinkStatus > LinkStatus_INVALID_CANDIDATE) {
+ sLinkStatus = LinkStatus_INVALID_CANDIDATE;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ case FFmpegLibWrapper::LinkResult::CannotUseLibAV57:
+ if (sLinkStatus > LinkStatus_UNUSABLE_LIBAV57) {
+ sLinkStatus = LinkStatus_UNUSABLE_LIBAV57;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ case FFmpegLibWrapper::LinkResult::BlockedOldLibAVVersion:
+ if (sLinkStatus > LinkStatus_OBSOLETE_LIBAV) {
+ sLinkStatus = LinkStatus_OBSOLETE_LIBAV;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ case FFmpegLibWrapper::LinkResult::UnknownFutureLibAVVersion:
+ case FFmpegLibWrapper::LinkResult::MissingLibAVFunction:
+ if (sLinkStatus > LinkStatus_INVALID_LIBAV_CANDIDATE) {
+ sLinkStatus = LinkStatus_INVALID_LIBAV_CANDIDATE;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ case FFmpegLibWrapper::LinkResult::UnknownFutureFFMpegVersion:
+ case FFmpegLibWrapper::LinkResult::MissingFFMpegFunction:
+ if (sLinkStatus > LinkStatus_INVALID_FFMPEG_CANDIDATE) {
+ sLinkStatus = LinkStatus_INVALID_FFMPEG_CANDIDATE;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ case FFmpegLibWrapper::LinkResult::UnknownOlderFFMpegVersion:
+ if (sLinkStatus > LinkStatus_OBSOLETE_FFMPEG) {
+ sLinkStatus = LinkStatus_OBSOLETE_FFMPEG;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ }
+ }
+ }
+
+ FFMPEG_LOG("H264/AAC codecs unsupported without [");
+ for (size_t i = 0; i < ArrayLength(sLibs); i++) {
+ FFMPEG_LOG("%s %s", i ? "," : " ", sLibs[i]);
+ }
+ FFMPEG_LOG(" ]\n");
+
+ return false;
+}
+
+/* static */ already_AddRefed<PlatformDecoderModule>
+FFmpegRuntimeLinker::CreateDecoderModule()
+{
+ if (!Init()) {
+ return nullptr;
+ }
+ RefPtr<PlatformDecoderModule> module;
+ switch (sLibAV.mVersion) {
+ case 53: module = FFmpegDecoderModule<53>::Create(&sLibAV); break;
+ case 54: module = FFmpegDecoderModule<54>::Create(&sLibAV); break;
+ case 55:
+ case 56: module = FFmpegDecoderModule<55>::Create(&sLibAV); break;
+ case 57: module = FFmpegDecoderModule<57>::Create(&sLibAV); break;
+ default: module = nullptr;
+ }
+ return module.forget();
+}
+
+/* static */ const char*
+FFmpegRuntimeLinker::LinkStatusString()
+{
+ switch (sLinkStatus) {
+ case LinkStatus_INIT:
+ return "Libavcodec not initialized yet";
+ case LinkStatus_SUCCEEDED:
+ return "Libavcodec linking succeeded";
+ case LinkStatus_INVALID_FFMPEG_CANDIDATE:
+ return "Invalid FFMpeg libavcodec candidate";
+ case LinkStatus_UNUSABLE_LIBAV57:
+ return "Unusable LibAV's libavcodec 57";
+ case LinkStatus_INVALID_LIBAV_CANDIDATE:
+ return "Invalid LibAV libavcodec candidate";
+ case LinkStatus_OBSOLETE_FFMPEG:
+ return "Obsolete FFMpeg libavcodec candidate";
+ case LinkStatus_OBSOLETE_LIBAV:
+ return "Obsolete LibAV libavcodec candidate";
+ case LinkStatus_INVALID_CANDIDATE:
+ return "Invalid libavcodec candidate";
+ case LinkStatus_NOT_FOUND:
+ return "Libavcodec not found";
+ }
+ MOZ_ASSERT_UNREACHABLE("Unknown sLinkStatus value");
+ return "?";
+}
+
+} // namespace mozilla