/* static */ bool MP4Decoder::IsVideoAccelerated(layers::LayersBackend aBackend) { VideoInfo config; nsRefPtr<MediaDataDecoder> decoder(CreateTestH264Decoder(aBackend, config)); if (!decoder) { return false; } bool result = decoder->IsHardwareAccelerated(); return result; }
/* static */ bool MP4Decoder::IsVideoAccelerated(layers::LayersBackend aBackend, nsACString& aFailureReason) { VideoInfo config; nsRefPtr<MediaDataDecoder> decoder(CreateTestH264Decoder(aBackend, config)); if (!decoder) { aFailureReason.AssignLiteral("Failed to create H264 decoder"); return false; } bool result = decoder->IsHardwareAccelerated(aFailureReason); return result; }
/* static */ already_AddRefed<dom::Promise> MP4Decoder::IsVideoAccelerated(layers::LayersBackend aBackend, nsIGlobalObject* aParent) { 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(aBackend, config, taskQueue)); if (!decoder) { taskQueue->BeginShutdown(); taskQueue->AwaitShutdownAndIdle(); promise->MaybeResolve(NS_LITERAL_STRING("No; Failed to create H264 decoder")); return promise.forget(); } 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] (MediaDataDecoder::DecoderFailureReason aResult) { decoder->Shutdown(); taskQueue->BeginShutdown(); taskQueue->AwaitShutdownAndIdle(); promise->MaybeResolve(NS_LITERAL_STRING("No; Failed to initialize H264 decoder")); }); return promise.forget(); }
/* static */ bool MP4Decoder::CanCreateH264Decoder() { #ifdef XP_WIN static bool haveCachedResult = false; static bool result = false; if (haveCachedResult) { return result; } VideoInfo config; nsRefPtr<MediaDataDecoder> decoder( CreateTestH264Decoder(layers::LayersBackend::LAYERS_BASIC, config)); if (decoder) { decoder->Shutdown(); result = true; } haveCachedResult = true; return result; #else return IsEnabled(); #endif }