summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dom/base/nsDOMWindowUtils.cpp36
-rw-r--r--dom/interfaces/base/nsIDOMWindowUtils.idl9
-rw-r--r--dom/media/fmp4/MP4Decoder.cpp56
-rw-r--r--dom/media/fmp4/MP4Decoder.h3
-rw-r--r--modules/Troubleshoot.jsm23
5 files changed, 32 insertions, 95 deletions
diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp
index 7bac1c22a..e62344601 100644
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -106,7 +106,6 @@
#include "nsCSSPseudoElements.h" // for CSSPseudoElementType
#include "nsNetUtil.h"
#include "mozilla/layers/APZCTreeManager.h" // for layers::ZoomToRectBehavior
-#include "mozilla/dom/Promise.h"
#include "mozilla/StyleSheetInlines.h"
#include "mozilla/gfx/GPUProcessManager.h"
@@ -2333,34 +2332,31 @@ nsDOMWindowUtils::GetLayerManagerRemote(bool* retval)
}
NS_IMETHODIMP
-nsDOMWindowUtils::GetSupportsHardwareH264Decoding(JS::MutableHandle<JS::Value> aPromise)
+nsDOMWindowUtils::GetSupportsHardwareH264Decoding(nsAString& aRetval)
{
- nsCOMPtr<nsPIDOMWindowOuter> window = do_QueryReferent(mWindow);
- NS_ENSURE_STATE(window);
- nsCOMPtr<nsIGlobalObject> parentObject =
- do_QueryInterface(window->GetCurrentInnerWindow());
- NS_ENSURE_STATE(parentObject);
#ifdef MOZ_FMP4
nsCOMPtr<nsIWidget> widget = GetWidget();
- NS_ENSURE_STATE(widget);
+ if (!widget)
+ return NS_ERROR_FAILURE;
+
LayerManager *mgr = widget->GetLayerManager();
- NS_ENSURE_STATE(mgr);
- RefPtr<Promise> promise =
- MP4Decoder::IsVideoAccelerated(mgr->AsShadowForwarder(), parentObject);
- NS_ENSURE_STATE(promise);
- aPromise.setObject(*promise->PromiseObj());
-#else
- ErrorResult rv;
- RefPtr<Promise> promise = Promise::Create(parentObject, rv);
- if (rv.Failed()) {
- return rv.StealNSResult();
+ if (!mgr)
+ return NS_ERROR_FAILURE;
+
+ nsCString failureReason;
+ if (MP4Decoder::IsVideoAccelerated(mgr->AsShadowForwarder(), failureReason)) {
+ aRetval.AssignLiteral("Yes");
+ } else {
+ aRetval.AssignLiteral("No; ");
+ AppendUTF8toUTF16(failureReason, aRetval);
}
- promise->MaybeResolve(NS_LITERAL_STRING("No; Compiled without MP4 support."));
- aPromise.setObject(*promise->PromiseObj());
+#else
+ aRetval.AssignLiteral("No; Compiled without MP4 support.");
#endif
return NS_OK;
}
+
NS_IMETHODIMP
nsDOMWindowUtils::GetCurrentAudioBackend(nsAString& aBackend)
{
diff --git a/dom/interfaces/base/nsIDOMWindowUtils.idl b/dom/interfaces/base/nsIDOMWindowUtils.idl
index 8293c6c86..548214adc 100644
--- a/dom/interfaces/base/nsIDOMWindowUtils.idl
+++ b/dom/interfaces/base/nsIDOMWindowUtils.idl
@@ -50,7 +50,7 @@ interface nsIJSRAIIHelper;
interface nsIContentPermissionRequest;
interface nsIObserver;
-[scriptable, uuid(7fcc7958-77d9-45ff-8c81-277bde5f0dc8)]
+[scriptable, uuid(e23b3d3a-aa0c-4433-acab-07d4d25c1cc7)]
interface nsIDOMWindowUtils : nsISupports {
/**
@@ -1414,12 +1414,11 @@ interface nsIDOMWindowUtils : nsISupports {
readonly attribute boolean layerManagerRemote;
/**
- * Returns a Promise that will be resolved with a string once the capabilities
- * of the h264 decoder have been determined.
- * Success does not mean that all h264 video decoding will be done
+ * True if we can initialize a hardware-backed h264 decoder for a simple
+ * test video, does not mean that all h264 video decoding will be done
* in hardware.
*/
- readonly attribute jsval supportsHardwareH264Decoding;
+ readonly attribute AString supportsHardwareH264Decoding;
/**
* Returns the current audio backend as a free-form string.
diff --git a/dom/media/fmp4/MP4Decoder.cpp b/dom/media/fmp4/MP4Decoder.cpp
index 9b0886e74..c0c954198 100644
--- a/dom/media/fmp4/MP4Decoder.cpp
+++ b/dom/media/fmp4/MP4Decoder.cpp
@@ -248,58 +248,18 @@ CreateTestH264Decoder(layers::KnowsCompositor* aKnowsCompositor,
return decoder.forget();
}
-/* static */ already_AddRefed<dom::Promise>
-MP4Decoder::IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsIGlobalObject* aParent)
+/* static */ bool
+MP4Decoder::IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsACString& aFailureReason)
{
- MOZ_ASSERT(NS_IsMainThread());
-
- ErrorResult rv;
- RefPtr<dom::Promise> promise;
- promise = dom::Promise::Create(aParent, rv);
- if (rv.Failed()) {
- rv.SuppressException();
- return nullptr;
- }
-
- RefPtr<TaskQueue> taskQueue =
- new TaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER));
VideoInfo config;
- RefPtr<MediaDataDecoder> decoder(CreateTestH264Decoder(aKnowsCompositor, config, taskQueue));
+ RefPtr<MediaDataDecoder> decoder(CreateTestH264Decoder(aKnowsCompositor, config, nullptr));
if (!decoder) {
- taskQueue->BeginShutdown();
- taskQueue->AwaitShutdownAndIdle();
- promise->MaybeResolve(NS_LITERAL_STRING("No; Failed to create H264 decoder"));
- return promise.forget();
+ aFailureReason.AssignLiteral("Failed to create H264 decoder");
+ return false;
}
-
- decoder->Init()
- ->Then(AbstractThread::MainThread(), __func__,
- [promise, decoder, taskQueue] (TrackInfo::TrackType aTrack) {
- nsCString failureReason;
- bool ok = decoder->IsHardwareAccelerated(failureReason);
- nsAutoString result;
- if (ok) {
- result.AssignLiteral("Yes");
- } else {
- result.AssignLiteral("No");
- }
- if (failureReason.Length()) {
- result.AppendLiteral("; ");
- AppendUTF8toUTF16(failureReason, result);
- }
- decoder->Shutdown();
- taskQueue->BeginShutdown();
- taskQueue->AwaitShutdownAndIdle();
- promise->MaybeResolve(result);
- },
- [promise, decoder, taskQueue] (MediaResult aError) {
- decoder->Shutdown();
- taskQueue->BeginShutdown();
- taskQueue->AwaitShutdownAndIdle();
- promise->MaybeResolve(NS_LITERAL_STRING("No; Failed to initialize H264 decoder"));
- });
-
- return promise.forget();
+ bool result = decoder->IsHardwareAccelerated(aFailureReason);
+ decoder->Shutdown();
+ return result;
}
void
diff --git a/dom/media/fmp4/MP4Decoder.h b/dom/media/fmp4/MP4Decoder.h
index ad5fba7b5..def4b4f99 100644
--- a/dom/media/fmp4/MP4Decoder.h
+++ b/dom/media/fmp4/MP4Decoder.h
@@ -48,8 +48,7 @@ public:
// Returns true if the MP4 backend is preffed on.
static bool IsEnabled();
- static already_AddRefed<dom::Promise>
- IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsIGlobalObject* aParent);
+ static bool IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsACString& aFailureReason);
void GetMozDebugReaderData(nsAString& aString) override;
diff --git a/modules/Troubleshoot.jsm b/modules/Troubleshoot.jsm
index d8f485d2c..47e9b1d37 100644
--- a/modules/Troubleshoot.jsm
+++ b/modules/Troubleshoot.jsm
@@ -302,13 +302,6 @@ var dataProviders = {
}
catch (e) {}
- let promises = [];
- // done will be called upon all pending promises being resolved.
- // add your pending promise to promises when adding new ones.
- function completed() {
- Promise.all(promises).then(() => done(data));
- }
-
data.numTotalWindows = 0;
data.numAcceleratedWindows = 0;
let winEnumer = Services.ww.getWindowEnumerator();
@@ -324,6 +317,7 @@ var dataProviders = {
data.numTotalWindows++;
data.windowLayerManagerType = winUtils.layerManagerType;
data.windowLayerManagerRemote = winUtils.layerManagerRemote;
+ data.supportsHardwareH264 = winUtils.supportsHardwareH264Decoding;
}
catch (e) {
continue;
@@ -332,17 +326,6 @@ var dataProviders = {
data.numAcceleratedWindows++;
}
- data.supportsHardwareH264 = "Unknown";
- try {
- // After restart - data may not be available
- let promise = winUtils.supportsHardwareH264Decoding;
- promise.then(function(v) {
- data.supportsHardwareH264 = v;
- });
- promises.push(promise);
- } catch (e) {}
-
-
if (!data.numAcceleratedWindows && gfxInfo) {
#ifdef XP_WIN
let feature = gfxInfo.FEATURE_DIRECT3D_9_LAYERS;
@@ -353,7 +336,7 @@ var dataProviders = {
}
if (!gfxInfo) {
- completed();
+ done(data);
return;
}
@@ -485,7 +468,7 @@ var dataProviders = {
data.featureLog = gfxInfo.getFeatureLog();
data.crashGuards = gfxInfo.getActiveCrashGuards();
- completed();
+ done(data);
},
media: function media(done) {