BenchmarkPlayback::BenchmarkPlayback(Benchmark* aGlobalState, MediaDataDemuxer* aDemuxer) : QueueObject(new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK), "BenchmarkPlayback::QueueObject")), mGlobalState(aGlobalState), mDecoderTaskQueue( new TaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER), "BenchmarkPlayback::mDecoderTaskQueue")), mDemuxer(aDemuxer), mSampleIndex(0), mFrameCount(0), mFinished(false), mDrained(false) {}
BenchmarkPlayback::BenchmarkPlayback(Benchmark* aMainThreadState, MediaDataDemuxer* aDemuxer) : QueueObject(new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK))) , mMainThreadState(aMainThreadState) , mDecoderTaskQueue(new FlushableTaskQueue(GetMediaThreadPool( MediaThreadType::PLATFORM_DECODER))) , mDemuxer(aDemuxer) , mSampleIndex(0) , mFrameCount(0) , mFinished(false) { MOZ_ASSERT(static_cast<Benchmark*>(mMainThreadState)->OnThread()); }
already_AddRefed<TaskQueue> CreateMediaDecodeTaskQueue(const char* aName) { RefPtr<TaskQueue> queue = new TaskQueue( GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER), aName); return queue.forget(); }
MediaDecoderReader::MediaDecoderReader(AbstractMediaDecoder* aDecoder) : mAudioCompactor(mAudioQueue) , mDecoder(aDecoder) , mTaskQueue(new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK), /* aSupportsTailDispatch = */ true)) , mWatchManager(this, mTaskQueue) , mBuffered(mTaskQueue, TimeIntervals(), "MediaDecoderReader::mBuffered (Canonical)") , mDuration(mTaskQueue, NullableTimeUnit(), "MediaDecoderReader::mDuration (Mirror)") , mIgnoreAudioOutputFormat(false) , mHitAudioDecodeError(false) , mShutdown(false) , mIsSuspended(mTaskQueue, true, "MediaDecoderReader::mIsSuspended (Canonical)") { MOZ_COUNT_CTOR(MediaDecoderReader); MOZ_ASSERT(NS_IsMainThread()); if (mDecoder && mDecoder->DataArrivedEvent()) { mDataArrivedListener = mDecoder->DataArrivedEvent()->Connect( mTaskQueue, this, &MediaDecoderReader::NotifyDataArrived); } ReaderQueue::Instance().Add(this); // Dispatch initialization that needs to happen on that task queue. mTaskQueue->Dispatch(NewRunnableMethod(this, &MediaDecoderReader::InitializationTask)); }
MediaDecoderReader::MediaDecoderReader(AbstractMediaDecoder* aDecoder, TaskQueue* aBorrowedTaskQueue) : mAudioCompactor(mAudioQueue) , mDecoder(aDecoder) , mTaskQueue(aBorrowedTaskQueue ? aBorrowedTaskQueue : new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK), /* aSupportsTailDispatch = */ true)) , mWatchManager(this, mTaskQueue) , mTimer(new MediaTimer()) , mBuffered(mTaskQueue, TimeIntervals(), "MediaDecoderReader::mBuffered (Canonical)") , mDuration(mTaskQueue, NullableTimeUnit(), "MediaDecoderReader::mDuration (Mirror)") , mThrottleDuration(TimeDuration::FromMilliseconds(500)) , mLastThrottledNotify(TimeStamp::Now() - mThrottleDuration) , mIgnoreAudioOutputFormat(false) , mHitAudioDecodeError(false) , mShutdown(false) , mTaskQueueIsBorrowed(!!aBorrowedTaskQueue) , mAudioDiscontinuity(false) , mVideoDiscontinuity(false) { MOZ_COUNT_CTOR(MediaDecoderReader); MOZ_ASSERT(NS_IsMainThread()); // Dispatch initialization that needs to happen on that task queue. nsCOMPtr<nsIRunnable> r = NS_NewRunnableMethod(this, &MediaDecoderReader::InitializationTask); mTaskQueue->Dispatch(r.forget()); }
already_AddRefed<FlushableTaskQueue> CreateFlushableMediaDecodeTaskQueue() { nsRefPtr<FlushableTaskQueue> queue = new FlushableTaskQueue( GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER)); return queue.forget(); }
Benchmark::Benchmark(MediaDataDemuxer* aDemuxer, const Parameters& aParameters) : QueueObject(new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK), "Benchmark::QueueObject")), mParameters(aParameters), mKeepAliveUntilComplete(this), mPlaybackState(this, aDemuxer) { MOZ_COUNT_CTOR(Benchmark); }
SharedDecoderManager::SharedDecoderManager() : mTaskQueue(new FlushableMediaTaskQueue(GetMediaThreadPool())) , mActiveProxy(nullptr) , mActiveCallback(nullptr) , mWaitForInternalDrain(false) , mMonitor("SharedDecoderProxy") , mDecoderReleasedResources(false) { MOZ_ASSERT(NS_IsMainThread()); // taskqueue must be created on main thread. mCallback = new SharedDecoderCallback(this); }
/* 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(); }
MediaTaskQueue* MediaDecoderReader::EnsureTaskQueue() { if (!mTaskQueue) { MOZ_ASSERT(!mTaskQueueIsBorrowed); RefPtr<SharedThreadPool> pool(GetMediaThreadPool(MediaThreadType::PLAYBACK)); MOZ_DIAGNOSTIC_ASSERT(pool); mTaskQueue = new MediaTaskQueue(pool.forget()); } return mTaskQueue; }
nsresult MP4Reader::Init(MediaDecoderReader* aCloneDonor) { MOZ_ASSERT(NS_IsMainThread(), "Must be on main thread."); PlatformDecoderModule::Init(); mStream = new MP4Stream(mDecoder->GetResource()); InitLayersBackendType(); mAudio.mTaskQueue = new FlushableMediaTaskQueue(GetMediaThreadPool()); NS_ENSURE_TRUE(mAudio.mTaskQueue, NS_ERROR_FAILURE); mVideo.mTaskQueue = new FlushableMediaTaskQueue(GetMediaThreadPool()); NS_ENSURE_TRUE(mVideo.mTaskQueue, NS_ERROR_FAILURE); static bool sSetupPrefCache = false; if (!sSetupPrefCache) { sSetupPrefCache = true; Preferences::AddBoolVarCache(&sIsEMEEnabled, "media.eme.enabled", false); Preferences::AddBoolVarCache(&sDemuxSkipToNextKeyframe, "media.fmp4.demux-skip", true); } return NS_OK; }
MediaDecoderReader::MediaDecoderReader(AbstractMediaDecoder* aDecoder) : mAudioCompactor(mAudioQueue) , mDecoder(aDecoder) , mTaskQueue(new TaskQueue( GetMediaThreadPool(MediaThreadType::PLAYBACK), "MediaDecoderReader::mTaskQueue", /* aSupportsTailDispatch = */ true)) , mWatchManager(this, mTaskQueue) , mBuffered(mTaskQueue, TimeIntervals(), "MediaDecoderReader::mBuffered (Canonical)") , mDuration(mTaskQueue, NullableTimeUnit(), "MediaDecoderReader::mDuration (Mirror)") , mIgnoreAudioOutputFormat(false) , mHitAudioDecodeError(false) , mShutdown(false) { MOZ_COUNT_CTOR(MediaDecoderReader); MOZ_ASSERT(NS_IsMainThread()); }
MediaDecoderReader::MediaDecoderReader(AbstractMediaDecoder* aDecoder, MediaTaskQueue* aBorrowedTaskQueue) : mAudioCompactor(mAudioQueue) , mDecoder(aDecoder) , mTaskQueue(aBorrowedTaskQueue ? aBorrowedTaskQueue : new MediaTaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK), /* aSupportsTailDispatch = */ true)) , mDuration(mTaskQueue, NullableTimeUnit(), "MediaDecoderReader::mDuration (Mirror)") , mIgnoreAudioOutputFormat(false) , mStartTime(-1) , mHitAudioDecodeError(false) , mShutdown(false) , mTaskQueueIsBorrowed(!!aBorrowedTaskQueue) , mAudioDiscontinuity(false) , mVideoDiscontinuity(false) { MOZ_COUNT_CTOR(MediaDecoderReader); MOZ_ASSERT(NS_IsMainThread()); // Dispatch initialization that needs to happen on that task queue. nsCOMPtr<nsIRunnable> r = NS_NewRunnableMethod(this, &MediaDecoderReader::InitializationTask); mTaskQueue->Dispatch(r.forget()); }
NS_IMETHOD Run() { MOZ_ASSERT(NS_IsMainThread()); mTaskQueue = new FlushableTaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER)); return NS_OK; }
NS_IMETHOD Run() { MOZ_ASSERT(NS_IsMainThread()); mTaskQueue = new FlushableMediaTaskQueue(GetMediaThreadPool()); return NS_OK; }