import changes from `dev' branch of rmottola/Arctic-Fox:

- CLOSED TREE. Bug 1174077 - send silence instead of nothing to the decoded stream in CORS case. r=roc. (cf576aac9)
- Bug 1177466 - Clean up places calling MaybeStartPlayback() in MediaDecoderStateMachine. r=cpearce (a2ef0f47b)
- Remaining of Bug 1168008 - Replace 'Consumer' with 'Request' in MediaPromise (4e77e4f42)
- bug 1137076 remove declaration of undefined OmxDecoder::ProcessCachedData() r=edwin (90ef83ee9)
- bug 1137076 mark some methods as private r=edwin (e9f4dd0a1)
- Bug 1173001 - Fix up some task queue naming to make MediaDecoderReader consistent with MDSM. r=jww (879b186ea)
This commit is contained in:
2021-04-10 17:20:42 +08:00
parent 2f3df18559
commit aa4b6876ee
15 changed files with 91 additions and 90 deletions
+3 -3
View File
@@ -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();
+2 -2
View File
@@ -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;
}
+9 -8
View File
@@ -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.
+1 -1
View File
@@ -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.
+14 -14
View File
@@ -241,7 +241,7 @@ MediaFormatReader::AsyncReadMetadata()
nsRefPtr<MetadataPromise> 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<nsIRunnable> task(
NS_NewRunnableMethodWithArg<TrackType>(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<MediaFormatReader> 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<nsIRunnable> task =
NS_NewRunnableMethodWithArgs<TrackType, MediaData*>(
this, &MediaFormatReader::NotifyNewOutput, aTrack, aSample);
GetTaskQueue()->Dispatch(task.forget());
TaskQueue()->Dispatch(task.forget());
}
void
@@ -1145,7 +1145,7 @@ MediaFormatReader::DrainComplete(TrackType aTrack)
RefPtr<nsIRunnable> task =
NS_NewRunnableMethodWithArg<TrackType>(
this, &MediaFormatReader::NotifyDrainComplete, aTrack);
GetTaskQueue()->Dispatch(task.forget());
TaskQueue()->Dispatch(task.forget());
}
void
@@ -1154,7 +1154,7 @@ MediaFormatReader::InputExhausted(TrackType aTrack)
RefPtr<nsIRunnable> task =
NS_NewRunnableMethodWithArg<TrackType>(
this, &MediaFormatReader::NotifyInputExhausted, aTrack);
GetTaskQueue()->Dispatch(task.forget());
TaskQueue()->Dispatch(task.forget());
}
void
@@ -1163,7 +1163,7 @@ MediaFormatReader::Error(TrackType aTrack)
RefPtr<nsIRunnable> task =
NS_NewRunnableMethodWithArg<TrackType>(
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<int32_t, uint64_t>(
this, &MediaFormatReader::NotifyDemuxer,
aLength, aOffset);
GetTaskQueue()->Dispatch(task.forget());
TaskQueue()->Dispatch(task.forget());
}
void
@@ -1550,7 +1550,7 @@ MediaFormatReader::NotifyDataRemoved()
NS_NewRunnableMethodWithArgs<int32_t, uint64_t>(
this, &MediaFormatReader::NotifyDemuxer,
0, 0);
GetTaskQueue()->Dispatch(task.forget());
TaskQueue()->Dispatch(task.forget());
}
bool
+9 -9
View File
@@ -168,7 +168,7 @@ MP4Reader::~MP4Reader()
nsRefPtr<ShutdownPromise>
MP4Reader::Shutdown()
{
MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn());
MOZ_ASSERT(OnTaskQueue());
if (mAudio.mDecoder) {
Flush(TrackInfo::kAudioTrack);
@@ -543,7 +543,7 @@ nsRefPtr<MediaDecoderReader::VideoDataPromise>
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<MediaDecoderReader::AudioDataPromise>
MP4Reader::RequestAudioData()
{
MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn());
MOZ_ASSERT(OnTaskQueue());
VLOG("");
if (!EnsureDecodersSetup()) {
@@ -615,7 +615,7 @@ MP4Reader::ScheduleUpdate(TrackType aTrack)
decoder.mUpdateScheduled = true;
RefPtr<nsIRunnable> task(
NS_NewRunnableMethodWithArg<TrackType>(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<MediaDecoderReader::SeekPromise>
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)");
+1 -1
View File
@@ -56,7 +56,7 @@ private:
virtual ~TestBinding()
{
{
nsRefPtr<MediaTaskQueue> queue = reader->GetTaskQueue();
nsRefPtr<MediaTaskQueue> queue = reader->TaskQueue();
nsCOMPtr<nsIRunnable> task = NS_NewRunnableMethod(reader, &MP4Reader::Shutdown);
// Hackily bypass the tail dispatcher so that we can AwaitShutdownAndIdle.
// In production code we'd use BeginShutdown + promises.
+13 -13
View File
@@ -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<SourceBufferDecoder> decoder =
new SourceBufferDecoder(new SourceBufferResource(aType), mDecoder, aTimestampOffset);
nsRefPtr<MediaDecoderReader> reader(CreateReaderForType(aType, decoder, GetTaskQueue()));
nsRefPtr<MediaDecoderReader> 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<nsIRunnable> 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<nsIRunnable> task(NS_NewRunnableMethod(
this, &MediaSourceReader::NotifyTimeRangesChanged));
GetTaskQueue()->Dispatch(task.forget());
TaskQueue()->Dispatch(task.forget());
}
}
+10 -10
View File
@@ -112,7 +112,7 @@ TrackBuffer::Shutdown()
RefPtr<MediaTaskQueue> 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<nsIRunnable> 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<TrackBuffer::RangeRemovalPromise>
+3 -3
View File
@@ -340,7 +340,7 @@ MediaCodecReader::DispatchVideoTask(int64_t aTimeThreshold)
nsRefPtr<MediaDecoderReader::AudioDataPromise>
MediaCodecReader::RequestAudioData()
{
MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn());
MOZ_ASSERT(OnTaskQueue());
MOZ_ASSERT(HasAudio());
MonitorAutoLock al(mAudioTrack.mTrackMonitor);
@@ -355,7 +355,7 @@ nsRefPtr<MediaDecoderReader::VideoDataPromise>
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<MediaCodecReader> self = this;
mMediaResourceRequest.Begin(CreateMediaCodecs()
->RefableThen(GetTaskQueue(), __func__,
->Then(TaskQueue(), __func__,
[self] (bool) -> void {
self->mMediaResourceRequest.Complete();
self->HandleResourceAllocated();
+1 -1
View File
@@ -182,7 +182,7 @@ protected:
MediaPromiseHolder<MediaDecoderReader::MetadataPromise> mMetadataPromise;
// XXX Remove after bug 1168008 land.
MediaPromiseConsumerHolder<MediaResourcePromise> mMediaResourceRequest;
MediaPromiseRequestHolder<MediaResourcePromise> mMediaResourceRequest;
MediaPromiseHolder<MediaResourcePromise> mMediaResourcePromise;
private:
+9 -12
View File
@@ -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<MediaOmxReader> 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<OmxReaderNotifyDataArrivedRunnable> runnable(
new OmxReaderNotifyDataArrivedRunnable(this,
buffer.forget(),
bufferLength,
aOffset,
resourceLength));
nsRefPtr<NotifyDataArrivedRunnable> runnable(
new NotifyDataArrivedRunnable(this, buffer.forget(), bufferLength,
aOffset, resourceLength));
if (aWaitForCompletion) {
rv = NS_DispatchToMainThread(runnable.get(), NS_DISPATCH_SYNC);
} else {
+11 -6
View File
@@ -45,7 +45,7 @@ class MediaOmxReader : public MediaOmxCommonReader
// AbstractMediaDecoder::mDecoder will be non-null.
bool mIsShutdown;
MediaPromiseHolder<MediaDecoderReader::MetadataPromise> mMetadataPromise;
MediaPromiseConsumerHolder<MediaResourcePromise> mMediaResourceRequest;
MediaPromiseRequestHolder<MediaResourcePromise> mMediaResourceRequest;
protected:
android::sp<android::OmxDecoder> mOmxDecoder;
android::sp<android::MediaExtractor> mExtractor;
@@ -99,18 +99,23 @@ public:
virtual nsRefPtr<ShutdownPromise> Shutdown() override;
android::sp<android::MediaSource> 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<android::MediaSource> GetAudioOffloadTrack();
private:
already_AddRefed<AbstractMediaDecoder> SafeGetDecoder();
};
-2
View File
@@ -215,8 +215,6 @@ public:
// Called on ALooper thread.
void onMessageReceived(const sp<AMessage> &msg);
int64_t ProcessCachedData(int64_t aOffset, bool aWaitForCompletion);
sp<MediaSource> GetAudioOffloadTrack() { return mAudioOffloadTrack; }
void RecycleCallbackImp(TextureClient* aClient);
+5 -5
View File
@@ -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());
}
}