diff --git a/dom/media/MediaDecoderReader.cpp b/dom/media/MediaDecoderReader.cpp index b03eadf34c..5d5d46e096 100644 --- a/dom/media/MediaDecoderReader.cpp +++ b/dom/media/MediaDecoderReader.cpp @@ -226,7 +226,7 @@ public: NS_METHOD Run() { - MOZ_ASSERT(mReader->GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(mReader->OnTaskQueue()); // Make sure ResetDecode hasn't been called in the mean time. if (!mReader->mBaseVideoPromise.IsEmpty()) { @@ -251,7 +251,7 @@ public: NS_METHOD Run() { - MOZ_ASSERT(mReader->GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(mReader->OnTaskQueue()); // Make sure ResetDecode hasn't been called in the mean time. if (!mReader->mBaseAudioPromise.IsEmpty()) { @@ -358,7 +358,7 @@ MediaDecoderReader::Shutdown() // Spin down the task queue if necessary. We wait until BreakCycles to null // out mTaskQueue, since otherwise any remaining tasks could crash when they - // invoke GetTaskQueue()->IsCurrentThreadIn(). + // invoke OnTaskQueue(). if (mTaskQueue && !mTaskQueueIsBorrowed) { // If we own our task queue, shutdown ends when the task queue is done. p = mTaskQueue->BeginShutdown(); diff --git a/dom/media/MediaDecoderReader.h b/dom/media/MediaDecoderReader.h index e932506eae..96befc0e87 100644 --- a/dom/media/MediaDecoderReader.h +++ b/dom/media/MediaDecoderReader.h @@ -115,7 +115,7 @@ public: virtual bool OnTaskQueue() { - return GetTaskQueue()->IsCurrentThreadIn(); + return TaskQueue()->IsCurrentThreadIn(); } // Resets all state related to decoding, emptying all buffers etc. @@ -264,7 +264,7 @@ public: virtual bool IsMediaSeekable() = 0; void SetStartTime(int64_t aStartTime); - MediaTaskQueue* GetTaskQueue() { + MediaTaskQueue* TaskQueue() { return mTaskQueue; } diff --git a/dom/media/MediaDecoderStateMachine.cpp b/dom/media/MediaDecoderStateMachine.cpp index cc3ec0a8a0..aff799ba24 100644 --- a/dom/media/MediaDecoderStateMachine.cpp +++ b/dom/media/MediaDecoderStateMachine.cpp @@ -447,9 +447,11 @@ void MediaDecoderStateMachine::SendStreamData() bool finished = (!mInfo.HasAudio() || AudioQueue().IsFinished()) && (!mInfo.HasVideo() || VideoQueue().IsFinished()); - if (mDecoder->IsSameOriginMedia()) { + + { SourceMediaStream* mediaStream = stream->mStream; StreamTime endPosition = 0; + const bool isSameOrigin = mDecoder->IsSameOriginMedia(); if (!stream->mStreamInitialized) { if (mInfo.HasAudio()) { @@ -487,6 +489,9 @@ void MediaDecoderStateMachine::SendStreamData() for (uint32_t i = 0; i < audio.Length(); ++i) { SendStreamAudio(audio[i], stream, &output); } + if (!isSameOrigin) { + output.ReplaceWithDisabled(); + } // |mNextAudioTime| is updated as we process each audio sample in // SendStreamAudio(). This is consistent with how |mNextVideoTime| // is updated for video samples. @@ -549,6 +554,9 @@ void MediaDecoderStateMachine::SendStreamData() v->mTime, v->GetEndTime()); } } + if (!isSameOrigin) { + output.ReplaceWithDisabled(); + } if (output.GetDuration() > 0) { mediaStream->AppendToTrack(videoTrackId, &output); } @@ -2347,7 +2355,6 @@ MediaDecoderStateMachine::FinishDecodeFirstFrame() // So we need to check if this has occurred, else our decode pipeline won't // run (since it doesn't need to) and we won't detect end of stream. CheckIfDecodeComplete(); - MaybeStartPlayback(); if (mQueuedSeek.Exists()) { mPendingSeek.Steal(mQueuedSeek); @@ -2901,12 +2908,6 @@ void MediaDecoderStateMachine::UpdateRenderedVideoFrames() } } - // We've got enough data to keep playing until at least the next frame. - // Start playing now if need be. - if ((mFragmentEndTime >= 0 && clock_time < mFragmentEndTime) || mFragmentEndTime < 0) { - MaybeStartPlayback(); - } - // Cap the current time to the larger of the audio and video end time. // This ensures that if we're running off the system clock, we don't // advance the clock to after the media end time. diff --git a/dom/media/MediaDecoderStateMachine.h b/dom/media/MediaDecoderStateMachine.h index 16a46f6f13..8114d25140 100644 --- a/dom/media/MediaDecoderStateMachine.h +++ b/dom/media/MediaDecoderStateMachine.h @@ -916,7 +916,7 @@ private: // The task queue in which we run decode tasks. This is referred to as // the "decode thread", though in practise tasks can run on a different // thread every time they're called. - MediaTaskQueue* DecodeTaskQueue() const { return mReader->GetTaskQueue(); } + MediaTaskQueue* DecodeTaskQueue() const { return mReader->TaskQueue(); } // The time that playback started from the system clock. This is used for // timing the presentation of video frames when there's no audio. diff --git a/dom/media/MediaFormatReader.cpp b/dom/media/MediaFormatReader.cpp index caf71d040a..384318d4b7 100644 --- a/dom/media/MediaFormatReader.cpp +++ b/dom/media/MediaFormatReader.cpp @@ -241,7 +241,7 @@ MediaFormatReader::AsyncReadMetadata() nsRefPtr p = mMetadataPromise.Ensure(__func__); mDemuxerInitRequest.Begin(mDemuxer->Init() - ->Then(GetTaskQueue(), __func__, + ->Then(TaskQueue(), __func__, this, &MediaFormatReader::OnDemuxerInitDone, &MediaFormatReader::OnDemuxerInitFailed)); @@ -550,7 +550,7 @@ MediaFormatReader::DoDemuxVideo() { // TODO Use DecodeAhead value rather than 1. mVideo.mDemuxRequest.Begin(mVideo.mTrackDemuxer->GetSamples(1) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaFormatReader::OnVideoDemuxCompleted, &MediaFormatReader::OnVideoDemuxFailed)); } @@ -607,7 +607,7 @@ MediaFormatReader::DoDemuxAudio() { // TODO Use DecodeAhead value rather than 1. mAudio.mDemuxRequest.Begin(mAudio.mTrackDemuxer->GetSamples(1) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaFormatReader::OnAudioDemuxCompleted, &MediaFormatReader::OnAudioDemuxFailed)); } @@ -725,7 +725,7 @@ MediaFormatReader::ScheduleUpdate(TrackType aTrack) decoder.mUpdateScheduled = true; RefPtr task( NS_NewRunnableMethodWithArg(this, &MediaFormatReader::Update, aTrack)); - GetTaskQueue()->Dispatch(task.forget()); + TaskQueue()->Dispatch(task.forget()); } bool @@ -857,7 +857,7 @@ MediaFormatReader::DecodeDemuxedSamples(TrackType aTrack, decoder.mTimeThreshold = Some(TimeUnit::FromMicroseconds(sample->mTime)); nsRefPtr self = this; decoder.mSeekRequest.Begin(decoder.mTrackDemuxer->Seek(decoder.mTimeThreshold.ref()) - ->Then(GetTaskQueue(), __func__, + ->Then(TaskQueue(), __func__, [self, aTrack] (media::TimeUnit aTime) { auto& decoder = self->GetDecoderData(aTrack); decoder.mSeekRequest.Complete(); @@ -1136,7 +1136,7 @@ MediaFormatReader::Output(TrackType aTrack, MediaData* aSample) RefPtr task = NS_NewRunnableMethodWithArgs( this, &MediaFormatReader::NotifyNewOutput, aTrack, aSample); - GetTaskQueue()->Dispatch(task.forget()); + TaskQueue()->Dispatch(task.forget()); } void @@ -1145,7 +1145,7 @@ MediaFormatReader::DrainComplete(TrackType aTrack) RefPtr task = NS_NewRunnableMethodWithArg( this, &MediaFormatReader::NotifyDrainComplete, aTrack); - GetTaskQueue()->Dispatch(task.forget()); + TaskQueue()->Dispatch(task.forget()); } void @@ -1154,7 +1154,7 @@ MediaFormatReader::InputExhausted(TrackType aTrack) RefPtr task = NS_NewRunnableMethodWithArg( this, &MediaFormatReader::NotifyInputExhausted, aTrack); - GetTaskQueue()->Dispatch(task.forget()); + TaskQueue()->Dispatch(task.forget()); } void @@ -1163,7 +1163,7 @@ MediaFormatReader::Error(TrackType aTrack) RefPtr task = NS_NewRunnableMethodWithArg( this, &MediaFormatReader::NotifyError, aTrack); - GetTaskQueue()->Dispatch(task.forget()); + TaskQueue()->Dispatch(task.forget()); } void @@ -1200,7 +1200,7 @@ MediaFormatReader::SkipVideoDemuxToNextKeyFrame(media::TimeUnit aTimeThreshold) } mSkipRequest.Begin(mVideo.mTrackDemuxer->SkipToNextRandomAccessPoint(aTimeThreshold) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaFormatReader::OnVideoSkipCompleted, &MediaFormatReader::OnVideoSkipFailed)); return; @@ -1314,7 +1314,7 @@ MediaFormatReader::DoVideoSeek() MOZ_ASSERT(mPendingSeekTime.isSome()); media::TimeUnit seekTime = mPendingSeekTime.ref(); mVideo.mSeekRequest.Begin(mVideo.mTrackDemuxer->Seek(seekTime) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaFormatReader::OnVideoSeekCompleted, &MediaFormatReader::OnVideoSeekFailed)); } @@ -1340,7 +1340,7 @@ MediaFormatReader::DoAudioSeek() MOZ_ASSERT(mPendingSeekTime.isSome()); media::TimeUnit seekTime = mPendingSeekTime.ref(); mAudio.mSeekRequest.Begin(mAudio.mTrackDemuxer->Seek(seekTime) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaFormatReader::OnAudioSeekCompleted, &MediaFormatReader::OnAudioSeekFailed)); } @@ -1527,7 +1527,7 @@ MediaFormatReader::NotifyDataArrived(const char* aBuffer, uint32_t aLength, int6 NS_NewRunnableMethodWithArgs( this, &MediaFormatReader::NotifyDemuxer, aLength, aOffset); - GetTaskQueue()->Dispatch(task.forget()); + TaskQueue()->Dispatch(task.forget()); } void @@ -1550,7 +1550,7 @@ MediaFormatReader::NotifyDataRemoved() NS_NewRunnableMethodWithArgs( this, &MediaFormatReader::NotifyDemuxer, 0, 0); - GetTaskQueue()->Dispatch(task.forget()); + TaskQueue()->Dispatch(task.forget()); } bool diff --git a/dom/media/fmp4/MP4Reader.cpp b/dom/media/fmp4/MP4Reader.cpp index 7b7a27e448..a4f1873b77 100644 --- a/dom/media/fmp4/MP4Reader.cpp +++ b/dom/media/fmp4/MP4Reader.cpp @@ -168,7 +168,7 @@ MP4Reader::~MP4Reader() nsRefPtr MP4Reader::Shutdown() { - MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(OnTaskQueue()); if (mAudio.mDecoder) { Flush(TrackInfo::kAudioTrack); @@ -543,7 +543,7 @@ nsRefPtr MP4Reader::RequestVideoData(bool aSkipToNextKeyframe, int64_t aTimeThreshold) { - MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(OnTaskQueue()); VLOG("skip=%d time=%lld", aSkipToNextKeyframe, aTimeThreshold); if (!EnsureDecodersSetup()) { @@ -584,7 +584,7 @@ MP4Reader::RequestVideoData(bool aSkipToNextKeyframe, nsRefPtr MP4Reader::RequestAudioData() { - MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(OnTaskQueue()); VLOG(""); if (!EnsureDecodersSetup()) { @@ -615,7 +615,7 @@ MP4Reader::ScheduleUpdate(TrackType aTrack) decoder.mUpdateScheduled = true; RefPtr task( NS_NewRunnableMethodWithArg(this, &MP4Reader::Update, aTrack)); - GetTaskQueue()->Dispatch(task.forget()); + TaskQueue()->Dispatch(task.forget()); } bool @@ -639,7 +639,7 @@ MP4Reader::NeedInput(DecoderData& aDecoder) void MP4Reader::Update(TrackType aTrack) { - MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(OnTaskQueue()); if (mShutdown) { return; @@ -799,7 +799,7 @@ MP4Reader::SizeOfQueue(TrackType aTrack) nsresult MP4Reader::ResetDecode() { - MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(OnTaskQueue()); Flush(TrackInfo::kVideoTrack); { MonitorAutoLock mon(mDemuxerMonitor); @@ -881,7 +881,7 @@ MP4Reader::Error(TrackType aTrack) void MP4Reader::Flush(TrackType aTrack) { - MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(OnTaskQueue()); VLOG("Flush(%s) BEGIN", TrackTypeToStr(aTrack)); DecoderData& data = GetDecoderData(aTrack); if (!data.mDecoder) { @@ -919,7 +919,7 @@ MP4Reader::Flush(TrackType aTrack) bool MP4Reader::SkipVideoDemuxToNextKeyFrame(int64_t aTimeThreshold, uint32_t& parsed) { - MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(OnTaskQueue()); MOZ_ASSERT(mVideo.mDecoder); @@ -950,7 +950,7 @@ nsRefPtr MP4Reader::Seek(int64_t aTime, int64_t aEndTime) { LOG("aTime=(%lld)", aTime); - MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(OnTaskQueue()); MonitorAutoLock mon(mDemuxerMonitor); if (!mDemuxer->CanSeek()) { VLOG("Seek() END (Unseekable)"); diff --git a/dom/media/gtest/TestMP4Reader.cpp b/dom/media/gtest/TestMP4Reader.cpp index 617aa00f78..4c7c919111 100644 --- a/dom/media/gtest/TestMP4Reader.cpp +++ b/dom/media/gtest/TestMP4Reader.cpp @@ -56,7 +56,7 @@ private: virtual ~TestBinding() { { - nsRefPtr queue = reader->GetTaskQueue(); + nsRefPtr queue = reader->TaskQueue(); nsCOMPtr task = NS_NewRunnableMethod(reader, &MP4Reader::Shutdown); // Hackily bypass the tail dispatcher so that we can AwaitShutdownAndIdle. // In production code we'd use BeginShutdown + promises. diff --git a/dom/media/mediasource/MediaSourceReader.cpp b/dom/media/mediasource/MediaSourceReader.cpp index affae3b722..bc82a3e808 100644 --- a/dom/media/mediasource/MediaSourceReader.cpp +++ b/dom/media/mediasource/MediaSourceReader.cpp @@ -141,7 +141,7 @@ MediaSourceReader::RequestAudioData() case SOURCE_NEW: GetAudioReader()->ResetDecode(); mAudioSeekRequest.Begin(GetAudioReader()->Seek(GetReaderAudioTime(mLastAudioTime), 0) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaSourceReader::CompleteAudioSeekAndDoRequest, &MediaSourceReader::CompleteAudioSeekAndRejectPromise)); break; @@ -166,7 +166,7 @@ MediaSourceReader::RequestAudioData() void MediaSourceReader::DoAudioRequest() { mAudioRequest.Begin(GetAudioReader()->RequestAudioData() - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaSourceReader::OnAudioDecoded, &MediaSourceReader::OnAudioNotDecoded)); } @@ -189,7 +189,7 @@ MediaSourceReader::OnAudioDecoded(AudioData* aSample) MSE_DEBUG("mTime=%lld < mTimeThreshold=%lld", ourTime, mTimeThreshold); mAudioRequest.Begin(GetAudioReader()->RequestAudioData() - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaSourceReader::OnAudioDecoded, &MediaSourceReader::OnAudioNotDecoded)); return; @@ -259,7 +259,7 @@ MediaSourceReader::OnAudioNotDecoded(NotDecodedReason aReason) if (result == SOURCE_NEW) { GetAudioReader()->ResetDecode(); mAudioSeekRequest.Begin(GetAudioReader()->Seek(GetReaderAudioTime(mLastAudioTime), 0) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaSourceReader::CompleteAudioSeekAndDoRequest, &MediaSourceReader::CompleteAudioSeekAndRejectPromise)); return; @@ -314,7 +314,7 @@ MediaSourceReader::RequestVideoData(bool aSkipToNextKeyframe, int64_t aTimeThres case SOURCE_NEW: GetVideoReader()->ResetDecode(); mVideoSeekRequest.Begin(GetVideoReader()->Seek(GetReaderVideoTime(mLastVideoTime), 0) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaSourceReader::CompleteVideoSeekAndDoRequest, &MediaSourceReader::CompleteVideoSeekAndRejectPromise)); break; @@ -341,7 +341,7 @@ void MediaSourceReader::DoVideoRequest() { mVideoRequest.Begin(GetVideoReader()->RequestVideoData(mDropVideoBeforeThreshold, GetReaderVideoTime(mTimeThreshold)) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaSourceReader::OnVideoDecoded, &MediaSourceReader::OnVideoNotDecoded)); } @@ -411,7 +411,7 @@ MediaSourceReader::OnVideoNotDecoded(NotDecodedReason aReason) if (result == SOURCE_NEW) { GetVideoReader()->ResetDecode(); mVideoSeekRequest.Begin(GetVideoReader()->Seek(GetReaderVideoTime(mLastVideoTime), 0) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaSourceReader::CompleteVideoSeekAndDoRequest, &MediaSourceReader::CompleteVideoSeekAndRejectPromise)); return; @@ -482,7 +482,7 @@ MediaSourceReader::ContinueShutdown() { ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); if (mTrackBuffers.Length()) { - mTrackBuffers[0]->Shutdown()->Then(GetTaskQueue(), __func__, this, + mTrackBuffers[0]->Shutdown()->Then(TaskQueue(), __func__, this, &MediaSourceReader::ContinueShutdown, &MediaSourceReader::ContinueShutdown); mShutdownTrackBuffers.AppendElement(mTrackBuffers[0]); @@ -703,7 +703,7 @@ MediaSourceReader::CreateSubDecoder(const nsACString& aType, int64_t aTimestampO // borrowing. nsRefPtr decoder = new SourceBufferDecoder(new SourceBufferResource(aType), mDecoder, aTimestampOffset); - nsRefPtr reader(CreateReaderForType(aType, decoder, GetTaskQueue())); + nsRefPtr reader(CreateReaderForType(aType, decoder, TaskQueue())); if (!reader) { return nullptr; } @@ -789,7 +789,7 @@ MediaSourceReader::NotifyTimeRangesChanged() //post a task to the decode queue to try to complete the pending seek. RefPtr task(NS_NewRunnableMethod( this, &MediaSourceReader::AttemptSeek)); - GetTaskQueue()->Dispatch(task.forget()); + TaskQueue()->Dispatch(task.forget()); } else { MaybeNotifyHaveData(); } @@ -906,7 +906,7 @@ MediaSourceReader::DoAudioSeek() } GetAudioReader()->ResetDecode(); mAudioSeekRequest.Begin(GetAudioReader()->Seek(GetReaderAudioTime(seekTime), 0) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaSourceReader::OnAudioSeekCompleted, &MediaSourceReader::OnAudioSeekFailed)); MSE_DEBUG("reader=%p", GetAudioReader()); @@ -978,7 +978,7 @@ MediaSourceReader::DoVideoSeek() } GetVideoReader()->ResetDecode(); mVideoSeekRequest.Begin(GetVideoReader()->Seek(GetReaderVideoTime(seekTime), 0) - ->Then(GetTaskQueue(), __func__, this, + ->Then(TaskQueue(), __func__, this, &MediaSourceReader::OnVideoSeekCompleted, &MediaSourceReader::OnVideoSeekFailed)); MSE_DEBUG("reader=%p", GetVideoReader()); @@ -1174,7 +1174,7 @@ MediaSourceReader::Ended(bool aEnded) // seek or wait RefPtr task(NS_NewRunnableMethod( this, &MediaSourceReader::NotifyTimeRangesChanged)); - GetTaskQueue()->Dispatch(task.forget()); + TaskQueue()->Dispatch(task.forget()); } } diff --git a/dom/media/mediasource/TrackBuffer.cpp b/dom/media/mediasource/TrackBuffer.cpp index 8deaed143c..b589d9a997 100644 --- a/dom/media/mediasource/TrackBuffer.cpp +++ b/dom/media/mediasource/TrackBuffer.cpp @@ -112,7 +112,7 @@ TrackBuffer::Shutdown() RefPtr queue = mTaskQueue; mTaskQueue = nullptr; queue->BeginShutdown() - ->Then(mParentDecoder->GetReader()->GetTaskQueue(), __func__, this, + ->Then(mParentDecoder->GetReader()->TaskQueue(), __func__, this, &TrackBuffer::ContinueShutdown, &TrackBuffer::ContinueShutdown); return p; @@ -124,7 +124,7 @@ TrackBuffer::ContinueShutdown() ReentrantMonitorAutoEnter mon(mParentDecoder->GetReentrantMonitor()); if (mDecoders.Length()) { mDecoders[0]->GetReader()->Shutdown() - ->Then(mParentDecoder->GetReader()->GetTaskQueue(), __func__, this, + ->Then(mParentDecoder->GetReader()->TaskQueue(), __func__, this, &TrackBuffer::ContinueShutdown, &TrackBuffer::ContinueShutdown); mShutdownDecoders.AppendElement(mDecoders[0]); mDecoders.RemoveElementAt(0); @@ -288,7 +288,7 @@ TrackBuffer::NotifyTimeRangesChanged() RefPtr task = NS_NewRunnableMethod(mParentDecoder->GetReader(), &MediaSourceReader::NotifyTimeRangesChanged); - mParentDecoder->GetReader()->GetTaskQueue()->Dispatch(task.forget()); + mParentDecoder->GetReader()->TaskQueue()->Dispatch(task.forget()); } class DecoderSorter @@ -580,7 +580,7 @@ TrackBuffer::NewDecoder(TimeUnit aTimestampOffset) mLastEndTimestamp.reset(); mLastTimestampOffset = aTimestampOffset; - decoder->SetTaskQueue(decoder->GetReader()->GetTaskQueue()); + decoder->SetTaskQueue(decoder->GetReader()->TaskQueue()); return decoder.forget(); } @@ -596,7 +596,7 @@ TrackBuffer::QueueInitializeDecoder(SourceBufferDecoder* aDecoder) &TrackBuffer::InitializeDecoder, aDecoder); // We need to initialize the reader on its own task queue - aDecoder->GetReader()->GetTaskQueue()->Dispatch(task.forget()); + aDecoder->GetReader()->TaskQueue()->Dispatch(task.forget()); return true; } @@ -661,7 +661,7 @@ TrackBuffer::InitializeDecoder(SourceBufferDecoder* aDecoder) return; } - MOZ_ASSERT(aDecoder->GetReader()->GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(aDecoder->GetReader()->OnTaskQueue()); MediaDecoderReader* reader = aDecoder->GetReader(); @@ -697,7 +697,7 @@ TrackBuffer::InitializeDecoder(SourceBufferDecoder* aDecoder) } mMetadataRequest.Begin(promise - ->Then(reader->GetTaskQueue(), __func__, + ->Then(reader->TaskQueue(), __func__, recipient.get(), &MetadataRecipient::OnMetadataRead, &MetadataRecipient::OnMetadataNotRead)); @@ -708,7 +708,7 @@ TrackBuffer::OnMetadataRead(MetadataHolder* aMetadata, SourceBufferDecoder* aDecoder, bool aWasEnded) { - MOZ_ASSERT(aDecoder->GetReader()->GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(aDecoder->GetReader()->OnTaskQueue()); mParentDecoder->GetReentrantMonitor().AssertNotCurrentThreadIn(); ReentrantMonitorAutoEnter mon(mParentDecoder->GetReentrantMonitor()); @@ -768,7 +768,7 @@ void TrackBuffer::OnMetadataNotRead(ReadMetadataFailureReason aReason, SourceBufferDecoder* aDecoder) { - MOZ_ASSERT(aDecoder->GetReader()->GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(aDecoder->GetReader()->TaskQueue()->IsCurrentThreadIn()); mParentDecoder->GetReentrantMonitor().AssertNotCurrentThreadIn(); ReentrantMonitorAutoEnter mon(mParentDecoder->GetReentrantMonitor()); @@ -1074,7 +1074,7 @@ TrackBuffer::RemoveDecoder(SourceBufferDecoder* aDecoder) mInitializedDecoders.RemoveElement(aDecoder); mDecoders.RemoveElement(aDecoder); } - aDecoder->GetReader()->GetTaskQueue()->Dispatch(task.forget()); + aDecoder->GetReader()->TaskQueue()->Dispatch(task.forget()); } nsRefPtr diff --git a/dom/media/omx/MediaCodecReader.cpp b/dom/media/omx/MediaCodecReader.cpp index 376ec243d0..3a3bea6994 100644 --- a/dom/media/omx/MediaCodecReader.cpp +++ b/dom/media/omx/MediaCodecReader.cpp @@ -340,7 +340,7 @@ MediaCodecReader::DispatchVideoTask(int64_t aTimeThreshold) nsRefPtr MediaCodecReader::RequestAudioData() { - MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(OnTaskQueue()); MOZ_ASSERT(HasAudio()); MonitorAutoLock al(mAudioTrack.mTrackMonitor); @@ -355,7 +355,7 @@ nsRefPtr MediaCodecReader::RequestVideoData(bool aSkipToNextKeyframe, int64_t aTimeThreshold) { - MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn()); + MOZ_ASSERT(OnTaskQueue()); MOZ_ASSERT(HasVideo()); int64_t threshold = sInvalidTimestampUs; @@ -655,7 +655,7 @@ MediaCodecReader::AsyncReadMetadata() nsRefPtr self = this; mMediaResourceRequest.Begin(CreateMediaCodecs() - ->RefableThen(GetTaskQueue(), __func__, + ->Then(TaskQueue(), __func__, [self] (bool) -> void { self->mMediaResourceRequest.Complete(); self->HandleResourceAllocated(); diff --git a/dom/media/omx/MediaCodecReader.h b/dom/media/omx/MediaCodecReader.h index 1e543e969c..9e168419b2 100644 --- a/dom/media/omx/MediaCodecReader.h +++ b/dom/media/omx/MediaCodecReader.h @@ -182,7 +182,7 @@ protected: MediaPromiseHolder mMetadataPromise; // XXX Remove after bug 1168008 land. - MediaPromiseConsumerHolder mMediaResourceRequest; + MediaPromiseRequestHolder mMediaResourceRequest; MediaPromiseHolder mMediaResourcePromise; private: diff --git a/dom/media/omx/MediaOmxReader.cpp b/dom/media/omx/MediaOmxReader.cpp index 72f28a50fc..a60fe3f126 100644 --- a/dom/media/omx/MediaOmxReader.cpp +++ b/dom/media/omx/MediaOmxReader.cpp @@ -31,10 +31,10 @@ namespace mozilla { extern PRLogModuleInfo* gMediaDecoderLog; #define DECODER_LOG(type, msg) MOZ_LOG(gMediaDecoderLog, type, msg) -class OmxReaderProcessCachedDataTask : public Task +class MediaOmxReader::ProcessCachedDataTask : public Task { public: - OmxReaderProcessCachedDataTask(MediaOmxReader* aOmxReader, int64_t aOffset) + ProcessCachedDataTask(MediaOmxReader* aOmxReader, int64_t aOffset) : mOmxReader(aOmxReader), mOffset(aOffset) { } @@ -66,10 +66,10 @@ private: // the IO task dispatches a runnable to the main thread for parsing the // data. This goes on until all of the MP3 file has been parsed. -class OmxReaderNotifyDataArrivedRunnable : public nsRunnable +class MediaOmxReader::NotifyDataArrivedRunnable : public nsRunnable { public: - OmxReaderNotifyDataArrivedRunnable(MediaOmxReader* aOmxReader, + NotifyDataArrivedRunnable(MediaOmxReader* aOmxReader, const char* aBuffer, uint64_t aLength, int64_t aOffset, uint64_t aFullLength) : mOmxReader(aOmxReader), @@ -113,7 +113,7 @@ private: // might block for too long. Instead we post an IO task // to the IO thread if there is more data available. XRE_GetIOMessageLoop()->PostTask(FROM_HERE, - new OmxReaderProcessCachedDataTask(mOmxReader.get(), mOffset)); + new ProcessCachedDataTask(mOmxReader.get(), mOffset)); } } @@ -252,7 +252,7 @@ MediaOmxReader::AsyncReadMetadata() nsRefPtr self = this; mMediaResourceRequest.Begin(mOmxDecoder->AllocateMediaResources() - ->RefableThen(GetTaskQueue(), __func__, + ->Then(TaskQueue(), __func__, [self] (bool) -> void { self->mMediaResourceRequest.Complete(); self->HandleResourceAllocated(); @@ -606,12 +606,9 @@ int64_t MediaOmxReader::ProcessCachedData(int64_t aOffset, bool aWaitForCompleti aOffset, bufferLength); NS_ENSURE_SUCCESS(rv, -1); - nsRefPtr runnable( - new OmxReaderNotifyDataArrivedRunnable(this, - buffer.forget(), - bufferLength, - aOffset, - resourceLength)); + nsRefPtr runnable( + new NotifyDataArrivedRunnable(this, buffer.forget(), bufferLength, + aOffset, resourceLength)); if (aWaitForCompletion) { rv = NS_DispatchToMainThread(runnable.get(), NS_DISPATCH_SYNC); } else { diff --git a/dom/media/omx/MediaOmxReader.h b/dom/media/omx/MediaOmxReader.h index d9cbd906e2..f0183897b7 100644 --- a/dom/media/omx/MediaOmxReader.h +++ b/dom/media/omx/MediaOmxReader.h @@ -45,7 +45,7 @@ class MediaOmxReader : public MediaOmxCommonReader // AbstractMediaDecoder::mDecoder will be non-null. bool mIsShutdown; MediaPromiseHolder mMetadataPromise; - MediaPromiseConsumerHolder mMediaResourceRequest; + MediaPromiseRequestHolder mMediaResourceRequest; protected: android::sp mOmxDecoder; android::sp mExtractor; @@ -99,18 +99,23 @@ public: virtual nsRefPtr Shutdown() override; + android::sp GetAudioOffloadTrack(); + + // This method is intended only for private use but public only for + // MediaPromise::InvokeCallbackMethod(). + void ReleaseDecoder(); + +private: + class ProcessCachedDataTask; + class NotifyDataArrivedRunnable; + bool IsShutdown() { MutexAutoLock lock(mShutdownMutex); return mIsShutdown; } - void ReleaseDecoder(); - int64_t ProcessCachedData(int64_t aOffset, bool aWaitForCompletion); - android::sp GetAudioOffloadTrack(); - -private: already_AddRefed SafeGetDecoder(); }; diff --git a/dom/media/omx/OmxDecoder.h b/dom/media/omx/OmxDecoder.h index 83cac84d31..7dfbab5caf 100644 --- a/dom/media/omx/OmxDecoder.h +++ b/dom/media/omx/OmxDecoder.h @@ -215,8 +215,6 @@ public: // Called on ALooper thread. void onMessageReceived(const sp &msg); - int64_t ProcessCachedData(int64_t aOffset, bool aWaitForCompletion); - sp GetAudioOffloadTrack() { return mAudioOffloadTrack; } void RecycleCallbackImp(TextureClient* aClient); diff --git a/dom/media/webaudio/MediaBufferDecoder.cpp b/dom/media/webaudio/MediaBufferDecoder.cpp index 769a22f61b..6d3de84498 100644 --- a/dom/media/webaudio/MediaBufferDecoder.cpp +++ b/dom/media/webaudio/MediaBufferDecoder.cpp @@ -245,14 +245,14 @@ MediaDecodeTask::Decode() { MOZ_ASSERT(!NS_IsMainThread()); - mBufferDecoder->BeginDecoding(mDecoderReader->GetTaskQueue()); + mBufferDecoder->BeginDecoding(mDecoderReader->TaskQueue()); // Tell the decoder reader that we are not going to play the data directly, // and that we should not reject files with more channels than the audio // backend support. mDecoderReader->SetIgnoreAudioOutputFormat(); - mDecoderReader->AsyncReadMetadata()->Then(mDecoderReader->GetTaskQueue(), __func__, this, + mDecoderReader->AsyncReadMetadata()->Then(mDecoderReader->TaskQueue(), __func__, this, &MediaDecodeTask::OnMetadataRead, &MediaDecodeTask::OnMetadataNotRead); } @@ -281,7 +281,7 @@ MediaDecodeTask::OnMetadataNotRead(ReadMetadataFailureReason aReason) void MediaDecodeTask::RequestSample() { - mDecoderReader->RequestAudioData()->Then(mDecoderReader->GetTaskQueue(), __func__, this, + mDecoderReader->RequestAudioData()->Then(mDecoderReader->TaskQueue(), __func__, this, &MediaDecodeTask::SampleDecoded, &MediaDecodeTask::SampleNotDecoded); } @@ -504,10 +504,10 @@ AsyncDecodeWebAudio(const char* aContentType, uint8_t* aBuffer, NS_DispatchToMainThread(event); } else { // If we did this without a temporary: - // task->Reader()->GetTaskQueue()->Dispatch(task.forget()) + // task->Reader()->TaskQueue()->Dispatch(task.forget()) // we might evaluate the task.forget() before calling Reader(). Enforce // a non-crashy order-of-operations. - MediaTaskQueue* taskQueue = task->Reader()->GetTaskQueue(); + MediaTaskQueue* taskQueue = task->Reader()->TaskQueue(); taskQueue->Dispatch(task.forget()); } }