mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-17 22:32:51 +00:00
Bug 1328130. Part 2 - remove MozPromiseRequestHolder::Begin(). r=gerald
MozReview-Commit-ID: JL27n0Era6E --HG-- extra : rebase_source : e6de76db3fb35b110370497f4060ea1c3f527f23 extra : intermediate-source : 5bc39a45ef042b895a5abda59cc0796e8cfb4be3 extra : source : a7f7faded7b112e8a971ca96b091a9a22214a2bb
This commit is contained in:
parent
bc040ae51e
commit
4f5754ca55
@ -752,10 +752,10 @@ MediaDecoder::CallSeek(const SeekTarget& aTarget, dom::Promise* aPromise)
|
||||
DiscardOngoingSeekIfExists();
|
||||
|
||||
mSeekDOMPromise = aPromise;
|
||||
mSeekRequest.Begin(
|
||||
mDecoderStateMachine->InvokeSeek(aTarget)
|
||||
->Then(AbstractThread::MainThread(), __func__, this,
|
||||
&MediaDecoder::OnSeekResolved, &MediaDecoder::OnSeekRejected));
|
||||
mDecoderStateMachine->InvokeSeek(aTarget)
|
||||
->Then(AbstractThread::MainThread(), __func__, this,
|
||||
&MediaDecoder::OnSeekResolved, &MediaDecoder::OnSeekRejected)
|
||||
->Track(mSeekRequest);
|
||||
}
|
||||
|
||||
double
|
||||
|
@ -340,14 +340,15 @@ public:
|
||||
|
||||
// We disconnect mMetadataRequest in Exit() so it is fine to capture
|
||||
// a raw pointer here.
|
||||
mMetadataRequest.Begin(Reader()->ReadMetadata()
|
||||
Reader()->ReadMetadata()
|
||||
->Then(OwnerThread(), __func__,
|
||||
[this] (MetadataHolder* aMetadata) {
|
||||
OnMetadataRead(aMetadata);
|
||||
},
|
||||
[this] (const MediaResult& aError) {
|
||||
OnMetadataNotRead(aError);
|
||||
}));
|
||||
})
|
||||
->Track(mMetadataRequest);
|
||||
}
|
||||
|
||||
void Exit() override
|
||||
@ -1108,14 +1109,15 @@ private:
|
||||
void DemuxerSeek()
|
||||
{
|
||||
// Request the demuxer to perform seek.
|
||||
mSeekRequest.Begin(Reader()->Seek(mSeekJob.mTarget.ref())
|
||||
Reader()->Seek(mSeekJob.mTarget.ref())
|
||||
->Then(OwnerThread(), __func__,
|
||||
[this] (const media::TimeUnit& aUnit) {
|
||||
OnSeekResolved(aUnit);
|
||||
},
|
||||
[this] (const SeekRejectValue& aReject) {
|
||||
OnSeekRejected(aReject);
|
||||
}));
|
||||
})
|
||||
->Track(mSeekRequest);
|
||||
}
|
||||
|
||||
void DoSeek() override
|
||||
@ -1191,20 +1193,18 @@ private:
|
||||
MOZ_ASSERT(!mMaster->IsWaitingVideoData());
|
||||
// Fire 'waiting' to notify the player that we are waiting for data.
|
||||
mMaster->UpdateNextFrameStatus(MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_SEEKING);
|
||||
mWaitRequest.Begin(
|
||||
Reader()->WaitForData(aReject.mType)->Then(
|
||||
OwnerThread(), __func__,
|
||||
[this] (MediaData::Type aType) {
|
||||
SLOG("OnSeekRejected wait promise resolved");
|
||||
mWaitRequest.Complete();
|
||||
DemuxerSeek();
|
||||
},
|
||||
[this] (const WaitForDataRejectValue& aRejection) {
|
||||
SLOG("OnSeekRejected wait promise rejected");
|
||||
mWaitRequest.Complete();
|
||||
mMaster->DecodeError(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
|
||||
})
|
||||
);
|
||||
Reader()->WaitForData(aReject.mType)->Then(
|
||||
OwnerThread(), __func__,
|
||||
[this] (MediaData::Type aType) {
|
||||
SLOG("OnSeekRejected wait promise resolved");
|
||||
mWaitRequest.Complete();
|
||||
DemuxerSeek();
|
||||
},
|
||||
[this] (const WaitForDataRejectValue& aRejection) {
|
||||
SLOG("OnSeekRejected wait promise rejected");
|
||||
mWaitRequest.Complete();
|
||||
mMaster->DecodeError(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
|
||||
})->Track(mWaitRequest);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2728,10 +2728,11 @@ nsresult MediaDecoderStateMachine::Init(MediaDecoder* aDecoder)
|
||||
|
||||
mMediaSink = CreateMediaSink(mAudioCaptured);
|
||||
|
||||
mCDMProxyPromise.Begin(aDecoder->RequestCDMProxy()->Then(
|
||||
aDecoder->RequestCDMProxy()->Then(
|
||||
OwnerThread(), __func__, this,
|
||||
&MediaDecoderStateMachine::OnCDMProxyReady,
|
||||
&MediaDecoderStateMachine::OnCDMProxyNotReady));
|
||||
&MediaDecoderStateMachine::OnCDMProxyNotReady)
|
||||
->Track(mCDMProxyPromise);
|
||||
|
||||
nsresult rv = mReader->Init();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
@ -3008,35 +3009,33 @@ MediaDecoderStateMachine::RequestAudioData()
|
||||
SAMPLE_LOG("Queueing audio task - queued=%i, decoder-queued=%o",
|
||||
AudioQueue().GetSize(), mReader->SizeOfAudioQueueInFrames());
|
||||
|
||||
mAudioDataRequest.Begin(
|
||||
mReader->RequestAudioData()->Then(
|
||||
OwnerThread(), __func__,
|
||||
[this] (MediaData* aAudio) {
|
||||
MOZ_ASSERT(aAudio);
|
||||
mAudioDataRequest.Complete();
|
||||
// audio->GetEndTime() is not always mono-increasing in chained ogg.
|
||||
mDecodedAudioEndTime = std::max(aAudio->GetEndTime(), mDecodedAudioEndTime);
|
||||
SAMPLE_LOG("OnAudioDecoded [%lld,%lld]", aAudio->mTime, aAudio->GetEndTime());
|
||||
mStateObj->HandleAudioDecoded(aAudio);
|
||||
},
|
||||
[this] (const MediaResult& aError) {
|
||||
SAMPLE_LOG("OnAudioNotDecoded aError=%u", aError.Code());
|
||||
mAudioDataRequest.Complete();
|
||||
switch (aError.Code()) {
|
||||
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
|
||||
mStateObj->HandleWaitingForAudio();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_CANCELED:
|
||||
mStateObj->HandleAudioCanceled();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
|
||||
mStateObj->HandleEndOfAudio();
|
||||
break;
|
||||
default:
|
||||
DecodeError(aError);
|
||||
}
|
||||
})
|
||||
);
|
||||
mReader->RequestAudioData()->Then(
|
||||
OwnerThread(), __func__,
|
||||
[this] (MediaData* aAudio) {
|
||||
MOZ_ASSERT(aAudio);
|
||||
mAudioDataRequest.Complete();
|
||||
// audio->GetEndTime() is not always mono-increasing in chained ogg.
|
||||
mDecodedAudioEndTime = std::max(aAudio->GetEndTime(), mDecodedAudioEndTime);
|
||||
SAMPLE_LOG("OnAudioDecoded [%lld,%lld]", aAudio->mTime, aAudio->GetEndTime());
|
||||
mStateObj->HandleAudioDecoded(aAudio);
|
||||
},
|
||||
[this] (const MediaResult& aError) {
|
||||
SAMPLE_LOG("OnAudioNotDecoded aError=%u", aError.Code());
|
||||
mAudioDataRequest.Complete();
|
||||
switch (aError.Code()) {
|
||||
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
|
||||
mStateObj->HandleWaitingForAudio();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_CANCELED:
|
||||
mStateObj->HandleAudioCanceled();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
|
||||
mStateObj->HandleEndOfAudio();
|
||||
break;
|
||||
default:
|
||||
DecodeError(aError);
|
||||
}
|
||||
})->Track(mAudioDataRequest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -3052,35 +3051,33 @@ MediaDecoderStateMachine::RequestVideoData(bool aSkipToNextKeyframe,
|
||||
aCurrentTime.ToMicroseconds());
|
||||
|
||||
TimeStamp videoDecodeStartTime = TimeStamp::Now();
|
||||
mVideoDataRequest.Begin(
|
||||
mReader->RequestVideoData(aSkipToNextKeyframe, aCurrentTime)->Then(
|
||||
OwnerThread(), __func__,
|
||||
[this, videoDecodeStartTime] (MediaData* aVideo) {
|
||||
MOZ_ASSERT(aVideo);
|
||||
mVideoDataRequest.Complete();
|
||||
// Handle abnormal or negative timestamps.
|
||||
mDecodedVideoEndTime = std::max(mDecodedVideoEndTime, aVideo->GetEndTime());
|
||||
SAMPLE_LOG("OnVideoDecoded [%lld,%lld]", aVideo->mTime, aVideo->GetEndTime());
|
||||
mStateObj->HandleVideoDecoded(aVideo, videoDecodeStartTime);
|
||||
},
|
||||
[this] (const MediaResult& aError) {
|
||||
SAMPLE_LOG("OnVideoNotDecoded aError=%u", aError.Code());
|
||||
mVideoDataRequest.Complete();
|
||||
switch (aError.Code()) {
|
||||
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
|
||||
mStateObj->HandleWaitingForVideo();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_CANCELED:
|
||||
mStateObj->HandleVideoCanceled();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
|
||||
mStateObj->HandleEndOfVideo();
|
||||
break;
|
||||
default:
|
||||
DecodeError(aError);
|
||||
}
|
||||
})
|
||||
);
|
||||
mReader->RequestVideoData(aSkipToNextKeyframe, aCurrentTime)->Then(
|
||||
OwnerThread(), __func__,
|
||||
[this, videoDecodeStartTime] (MediaData* aVideo) {
|
||||
MOZ_ASSERT(aVideo);
|
||||
mVideoDataRequest.Complete();
|
||||
// Handle abnormal or negative timestamps.
|
||||
mDecodedVideoEndTime = std::max(mDecodedVideoEndTime, aVideo->GetEndTime());
|
||||
SAMPLE_LOG("OnVideoDecoded [%lld,%lld]", aVideo->mTime, aVideo->GetEndTime());
|
||||
mStateObj->HandleVideoDecoded(aVideo, videoDecodeStartTime);
|
||||
},
|
||||
[this] (const MediaResult& aError) {
|
||||
SAMPLE_LOG("OnVideoNotDecoded aError=%u", aError.Code());
|
||||
mVideoDataRequest.Complete();
|
||||
switch (aError.Code()) {
|
||||
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
|
||||
mStateObj->HandleWaitingForVideo();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_CANCELED:
|
||||
mStateObj->HandleVideoCanceled();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
|
||||
mStateObj->HandleEndOfVideo();
|
||||
break;
|
||||
default:
|
||||
DecodeError(aError);
|
||||
}
|
||||
})->Track(mVideoDataRequest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -3089,33 +3086,29 @@ MediaDecoderStateMachine::WaitForData(MediaData::Type aType)
|
||||
MOZ_ASSERT(OnTaskQueue());
|
||||
MOZ_ASSERT(aType == MediaData::AUDIO_DATA || aType == MediaData::VIDEO_DATA);
|
||||
if (aType == MediaData::AUDIO_DATA) {
|
||||
mAudioWaitRequest.Begin(
|
||||
mReader->WaitForData(MediaData::AUDIO_DATA)->Then(
|
||||
OwnerThread(), __func__,
|
||||
[this] (MediaData::Type aType) {
|
||||
mAudioWaitRequest.Complete();
|
||||
MOZ_ASSERT(aType == MediaData::AUDIO_DATA);
|
||||
mStateObj->HandleAudioWaited(aType);
|
||||
},
|
||||
[this] (const WaitForDataRejectValue& aRejection) {
|
||||
mAudioWaitRequest.Complete();
|
||||
DecodeError(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
|
||||
})
|
||||
);
|
||||
mReader->WaitForData(MediaData::AUDIO_DATA)->Then(
|
||||
OwnerThread(), __func__,
|
||||
[this] (MediaData::Type aType) {
|
||||
mAudioWaitRequest.Complete();
|
||||
MOZ_ASSERT(aType == MediaData::AUDIO_DATA);
|
||||
mStateObj->HandleAudioWaited(aType);
|
||||
},
|
||||
[this] (const WaitForDataRejectValue& aRejection) {
|
||||
mAudioWaitRequest.Complete();
|
||||
DecodeError(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
|
||||
})->Track(mAudioWaitRequest);
|
||||
} else {
|
||||
mVideoWaitRequest.Begin(
|
||||
mReader->WaitForData(MediaData::VIDEO_DATA)->Then(
|
||||
OwnerThread(), __func__,
|
||||
[this] (MediaData::Type aType) {
|
||||
mVideoWaitRequest.Complete();
|
||||
MOZ_ASSERT(aType == MediaData::VIDEO_DATA);
|
||||
mStateObj->HandleVideoWaited(aType);
|
||||
},
|
||||
[this] (const WaitForDataRejectValue& aRejection) {
|
||||
mVideoWaitRequest.Complete();
|
||||
DecodeError(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
|
||||
})
|
||||
);
|
||||
mReader->WaitForData(MediaData::VIDEO_DATA)->Then(
|
||||
OwnerThread(), __func__,
|
||||
[this] (MediaData::Type aType) {
|
||||
mVideoWaitRequest.Complete();
|
||||
MOZ_ASSERT(aType == MediaData::VIDEO_DATA);
|
||||
mStateObj->HandleVideoWaited(aType);
|
||||
},
|
||||
[this] (const WaitForDataRejectValue& aRejection) {
|
||||
mVideoWaitRequest.Complete();
|
||||
DecodeError(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
|
||||
})->Track(mVideoWaitRequest);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3131,16 +3124,18 @@ MediaDecoderStateMachine::StartMediaSink()
|
||||
auto audioPromise = mMediaSink->OnEnded(TrackInfo::kAudioTrack);
|
||||
|
||||
if (audioPromise) {
|
||||
mMediaSinkAudioPromise.Begin(audioPromise->Then(
|
||||
audioPromise->Then(
|
||||
OwnerThread(), __func__, this,
|
||||
&MediaDecoderStateMachine::OnMediaSinkAudioComplete,
|
||||
&MediaDecoderStateMachine::OnMediaSinkAudioError));
|
||||
&MediaDecoderStateMachine::OnMediaSinkAudioError)
|
||||
->Track(mMediaSinkAudioPromise);
|
||||
}
|
||||
if (videoPromise) {
|
||||
mMediaSinkVideoPromise.Begin(videoPromise->Then(
|
||||
videoPromise->Then(
|
||||
OwnerThread(), __func__, this,
|
||||
&MediaDecoderStateMachine::OnMediaSinkVideoComplete,
|
||||
&MediaDecoderStateMachine::OnMediaSinkVideoError));
|
||||
&MediaDecoderStateMachine::OnMediaSinkVideoError)
|
||||
->Track(mMediaSinkVideoPromise);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -290,7 +290,7 @@ MediaFormatReader::DecoderFactory::RunStage(TrackType aTrack)
|
||||
switch (data.mStage) {
|
||||
case Stage::None: {
|
||||
MOZ_ASSERT(!data.mToken);
|
||||
data.mTokenPromise.Begin(DecoderAllocPolicy::Instance(aTrack).Alloc()->Then(
|
||||
DecoderAllocPolicy::Instance(aTrack).Alloc()->Then(
|
||||
mOwner->OwnerThread(), __func__,
|
||||
[this, &data, aTrack] (Token* aToken) {
|
||||
data.mTokenPromise.Complete();
|
||||
@ -301,7 +301,7 @@ MediaFormatReader::DecoderFactory::RunStage(TrackType aTrack)
|
||||
[&data] () {
|
||||
data.mTokenPromise.Complete();
|
||||
data.mStage = Stage::None;
|
||||
}));
|
||||
})->Track(data.mTokenPromise);
|
||||
data.mStage = Stage::WaitForToken;
|
||||
break;
|
||||
}
|
||||
@ -409,7 +409,7 @@ MediaFormatReader::DecoderFactory::DoInitDecoder(TrackType aTrack)
|
||||
auto& ownerData = mOwner->GetDecoderData(aTrack);
|
||||
auto& data = aTrack == TrackInfo::kAudioTrack ? mAudio : mVideo;
|
||||
|
||||
data.mInitPromise.Begin(data.mDecoder->Init()->Then(
|
||||
data.mDecoder->Init()->Then(
|
||||
mOwner->OwnerThread(), __func__,
|
||||
[this, &data, &ownerData] (TrackType aTrack) {
|
||||
data.mInitPromise.Complete();
|
||||
@ -426,7 +426,7 @@ MediaFormatReader::DecoderFactory::DoInitDecoder(TrackType aTrack)
|
||||
data.mDecoder->Shutdown();
|
||||
data.mDecoder = nullptr;
|
||||
mOwner->NotifyError(aTrack, aError);
|
||||
}));
|
||||
})->Track(data.mInitPromise);
|
||||
}
|
||||
|
||||
// DemuxerProxy ensures that the original main demuxer is only ever accessed
|
||||
@ -977,10 +977,11 @@ MediaFormatReader::AsyncReadMetadata()
|
||||
|
||||
RefPtr<MetadataPromise> p = mMetadataPromise.Ensure(__func__);
|
||||
|
||||
mDemuxerInitRequest.Begin(mDemuxer->Init()
|
||||
->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnDemuxerInitDone,
|
||||
&MediaFormatReader::OnDemuxerInitFailed));
|
||||
mDemuxer->Init()
|
||||
->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnDemuxerInitDone,
|
||||
&MediaFormatReader::OnDemuxerInitFailed)
|
||||
->Track(mDemuxerInitRequest);
|
||||
return p;
|
||||
}
|
||||
|
||||
@ -1277,9 +1278,10 @@ MediaFormatReader::DoDemuxVideo()
|
||||
});
|
||||
}
|
||||
|
||||
mVideo.mDemuxRequest.Begin(p->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnVideoDemuxCompleted,
|
||||
&MediaFormatReader::OnVideoDemuxFailed));
|
||||
p->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnVideoDemuxCompleted,
|
||||
&MediaFormatReader::OnVideoDemuxFailed)
|
||||
->Track(mVideo.mDemuxRequest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1343,9 +1345,10 @@ MediaFormatReader::DoDemuxAudio()
|
||||
});
|
||||
}
|
||||
|
||||
mAudio.mDemuxRequest.Begin(p->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnAudioDemuxCompleted,
|
||||
&MediaFormatReader::OnAudioDemuxFailed));
|
||||
p->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnAudioDemuxCompleted,
|
||||
&MediaFormatReader::OnAudioDemuxFailed)
|
||||
->Track(mAudio.mDemuxRequest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1705,37 +1708,38 @@ MediaFormatReader::InternalSeek(TrackType aTrack, const InternalSeekTarget& aTar
|
||||
decoder.ResetDemuxer();
|
||||
decoder.mTimeThreshold = Some(aTarget);
|
||||
RefPtr<MediaFormatReader> self = this;
|
||||
decoder.mSeekRequest.Begin(decoder.mTrackDemuxer->Seek(decoder.mTimeThreshold.ref().Time())
|
||||
->Then(OwnerThread(), __func__,
|
||||
[self, aTrack] (media::TimeUnit aTime) {
|
||||
auto& decoder = self->GetDecoderData(aTrack);
|
||||
decoder.mSeekRequest.Complete();
|
||||
MOZ_ASSERT(decoder.mTimeThreshold,
|
||||
"Seek promise must be disconnected when timethreshold is reset");
|
||||
decoder.mTimeThreshold.ref().mHasSeeked = true;
|
||||
self->SetVideoDecodeThreshold();
|
||||
self->ScheduleUpdate(aTrack);
|
||||
},
|
||||
[self, aTrack] (const MediaResult& aError) {
|
||||
auto& decoder = self->GetDecoderData(aTrack);
|
||||
decoder.mSeekRequest.Complete();
|
||||
switch (aError.Code()) {
|
||||
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
|
||||
self->NotifyWaitingForData(aTrack);
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
|
||||
decoder.mTimeThreshold.reset();
|
||||
self->NotifyEndOfStream(aTrack);
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_CANCELED:
|
||||
decoder.mTimeThreshold.reset();
|
||||
break;
|
||||
default:
|
||||
decoder.mTimeThreshold.reset();
|
||||
self->NotifyError(aTrack, aError);
|
||||
break;
|
||||
}
|
||||
}));
|
||||
decoder.mTrackDemuxer->Seek(decoder.mTimeThreshold.ref().Time())
|
||||
->Then(OwnerThread(), __func__,
|
||||
[self, aTrack] (media::TimeUnit aTime) {
|
||||
auto& decoder = self->GetDecoderData(aTrack);
|
||||
decoder.mSeekRequest.Complete();
|
||||
MOZ_ASSERT(decoder.mTimeThreshold,
|
||||
"Seek promise must be disconnected when timethreshold is reset");
|
||||
decoder.mTimeThreshold.ref().mHasSeeked = true;
|
||||
self->SetVideoDecodeThreshold();
|
||||
self->ScheduleUpdate(aTrack);
|
||||
},
|
||||
[self, aTrack] (const MediaResult& aError) {
|
||||
auto& decoder = self->GetDecoderData(aTrack);
|
||||
decoder.mSeekRequest.Complete();
|
||||
switch (aError.Code()) {
|
||||
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
|
||||
self->NotifyWaitingForData(aTrack);
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
|
||||
decoder.mTimeThreshold.reset();
|
||||
self->NotifyEndOfStream(aTrack);
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_CANCELED:
|
||||
decoder.mTimeThreshold.reset();
|
||||
break;
|
||||
default:
|
||||
decoder.mTimeThreshold.reset();
|
||||
self->NotifyError(aTrack, aError);
|
||||
break;
|
||||
}
|
||||
})
|
||||
->Track(decoder.mSeekRequest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -2197,10 +2201,11 @@ MediaFormatReader::SkipVideoDemuxToNextKeyFrame(media::TimeUnit aTimeThreshold)
|
||||
// decoder threshold to the value of currentTime.
|
||||
DropDecodedSamples(TrackInfo::kVideoTrack);
|
||||
|
||||
mSkipRequest.Begin(mVideo.mTrackDemuxer->SkipToNextRandomAccessPoint(aTimeThreshold)
|
||||
->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnVideoSkipCompleted,
|
||||
&MediaFormatReader::OnVideoSkipFailed));
|
||||
mVideo.mTrackDemuxer->SkipToNextRandomAccessPoint(aTimeThreshold)
|
||||
->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnVideoSkipCompleted,
|
||||
&MediaFormatReader::OnVideoSkipFailed)
|
||||
->Track(mSkipRequest);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2408,10 +2413,11 @@ MediaFormatReader::DoVideoSeek()
|
||||
MOZ_ASSERT(mPendingSeekTime.isSome());
|
||||
LOGV("Seeking video to %lld", mPendingSeekTime.ref().ToMicroseconds());
|
||||
media::TimeUnit seekTime = mPendingSeekTime.ref();
|
||||
mVideo.mSeekRequest.Begin(mVideo.mTrackDemuxer->Seek(seekTime)
|
||||
->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnVideoSeekCompleted,
|
||||
&MediaFormatReader::OnVideoSeekFailed));
|
||||
mVideo.mTrackDemuxer->Seek(seekTime)
|
||||
->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnVideoSeekCompleted,
|
||||
&MediaFormatReader::OnVideoSeekFailed)
|
||||
->Track(mVideo.mSeekRequest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -2490,10 +2496,11 @@ MediaFormatReader::DoAudioSeek()
|
||||
MOZ_ASSERT(mPendingSeekTime.isSome());
|
||||
LOGV("Seeking audio to %lld", mPendingSeekTime.ref().ToMicroseconds());
|
||||
media::TimeUnit seekTime = mPendingSeekTime.ref();
|
||||
mAudio.mSeekRequest.Begin(mAudio.mTrackDemuxer->Seek(seekTime)
|
||||
->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnAudioSeekCompleted,
|
||||
&MediaFormatReader::OnAudioSeekFailed));
|
||||
mAudio.mTrackDemuxer->Seek(seekTime)
|
||||
->Then(OwnerThread(), __func__, this,
|
||||
&MediaFormatReader::OnAudioSeekCompleted,
|
||||
&MediaFormatReader::OnAudioSeekFailed)
|
||||
->Track(mAudio.mSeekRequest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -2564,14 +2571,15 @@ MediaFormatReader::NotifyDataArrived()
|
||||
}
|
||||
|
||||
RefPtr<MediaFormatReader> self = this;
|
||||
mNotifyDataArrivedPromise.Begin(mDemuxer->NotifyDataArrived()->Then(
|
||||
OwnerThread(), __func__,
|
||||
[self]() {
|
||||
self->mNotifyDataArrivedPromise.Complete();
|
||||
self->UpdateBuffered();
|
||||
self->NotifyTrackDemuxers();
|
||||
},
|
||||
[self]() { self->mNotifyDataArrivedPromise.Complete(); }));
|
||||
mDemuxer->NotifyDataArrived()
|
||||
->Then(OwnerThread(), __func__,
|
||||
[self]() {
|
||||
self->mNotifyDataArrivedPromise.Complete();
|
||||
self->UpdateBuffered();
|
||||
self->NotifyTrackDemuxers();
|
||||
},
|
||||
[self]() { self->mNotifyDataArrivedPromise.Complete(); })
|
||||
->Track(mNotifyDataArrivedPromise);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -145,10 +145,11 @@ public:
|
||||
}
|
||||
Reset();
|
||||
mTarget = aTarget;
|
||||
mRequest.Begin(mMediaTimer->WaitUntil(mTarget, __func__)->Then(
|
||||
mMediaTimer->WaitUntil(mTarget, __func__)->Then(
|
||||
mTargetThread, __func__,
|
||||
Forward<ResolveFunc>(aResolver),
|
||||
Forward<RejectFunc>(aRejector)));
|
||||
Forward<RejectFunc>(aRejector))
|
||||
->Track(mRequest);
|
||||
}
|
||||
|
||||
void CompleteRequest()
|
||||
|
@ -330,7 +330,7 @@ AndroidMediaReader::Seek(const SeekTarget& aTarget)
|
||||
mVideoSeekTimeUs = aTarget.GetTime().ToMicroseconds();
|
||||
|
||||
RefPtr<AndroidMediaReader> self = this;
|
||||
mSeekRequest.Begin(DecodeToFirstVideoData()->Then(OwnerThread(), __func__, [self] (MediaData* v) {
|
||||
DecodeToFirstVideoData()->Then(OwnerThread(), __func__, [self] (MediaData* v) {
|
||||
self->mSeekRequest.Complete();
|
||||
self->mAudioSeekTimeUs = v->mTime;
|
||||
self->mSeekPromise.Resolve(media::TimeUnit::FromMicroseconds(self->mAudioSeekTimeUs), __func__);
|
||||
@ -338,7 +338,7 @@ AndroidMediaReader::Seek(const SeekTarget& aTarget)
|
||||
self->mSeekRequest.Complete();
|
||||
self->mAudioSeekTimeUs = aTarget.GetTime().ToMicroseconds();
|
||||
self->mSeekPromise.Resolve(aTarget.GetTime(), __func__);
|
||||
}));
|
||||
})->Track(mSeekRequest);
|
||||
} else {
|
||||
mAudioSeekTimeUs = mVideoSeekTimeUs = aTarget.GetTime().ToMicroseconds();
|
||||
mSeekPromise.Resolve(aTarget.GetTime(), __func__);
|
||||
|
@ -280,7 +280,7 @@ TEST(MozPromise, Chaining)
|
||||
}
|
||||
// We will hit the assertion if we don't disconnect the leaf Request
|
||||
// in the promise chain.
|
||||
holder.Begin(p->Then(queue, __func__, [] () {}, [] () {}));
|
||||
p->Then(queue, __func__, [] () {}, [] () {})->Track(holder);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -193,10 +193,11 @@ AudioSinkWrapper::Start(int64_t aStartTime, const MediaInfo& aInfo)
|
||||
mAudioSink = mCreator->Create();
|
||||
mEndPromise = mAudioSink->Init(mParams);
|
||||
|
||||
mAudioSinkPromise.Begin(mEndPromise->Then(
|
||||
mEndPromise->Then(
|
||||
mOwnerThread.get(), __func__, this,
|
||||
&AudioSinkWrapper::OnAudioEnded,
|
||||
&AudioSinkWrapper::OnAudioEnded));
|
||||
&AudioSinkWrapper::OnAudioEnded
|
||||
)->Track(mAudioSinkPromise);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -185,7 +185,7 @@ VideoSink::Start(int64_t aStartTime, const MediaInfo& aInfo)
|
||||
RefPtr<GenericPromise> p = mAudioSink->OnEnded(TrackInfo::kVideoTrack);
|
||||
if (p) {
|
||||
RefPtr<VideoSink> self = this;
|
||||
mVideoSinkEndRequest.Begin(p->Then(mOwnerThread, __func__,
|
||||
p->Then(mOwnerThread, __func__,
|
||||
[self] () {
|
||||
self->mVideoSinkEndRequest.Complete();
|
||||
self->TryUpdateRenderedVideoFrames();
|
||||
@ -197,7 +197,8 @@ VideoSink::Start(int64_t aStartTime, const MediaInfo& aInfo)
|
||||
self->mVideoSinkEndRequest.Complete();
|
||||
self->TryUpdateRenderedVideoFrames();
|
||||
self->MaybeResolveEndPromise();
|
||||
}));
|
||||
})
|
||||
->Track(mVideoSinkEndRequest);
|
||||
}
|
||||
|
||||
ConnectListener();
|
||||
|
@ -258,7 +258,6 @@ SourceBuffer::RangeRemoval(double aStart, double aEnd)
|
||||
StartUpdating();
|
||||
|
||||
RefPtr<SourceBuffer> self = this;
|
||||
mPendingRemoval.Begin(
|
||||
mTrackBuffersManager->RangeRemoval(TimeUnit::FromSeconds(aStart),
|
||||
TimeUnit::FromSeconds(aEnd))
|
||||
->Then(AbstractThread::MainThread(), __func__,
|
||||
@ -266,7 +265,8 @@ SourceBuffer::RangeRemoval(double aStart, double aEnd)
|
||||
self->mPendingRemoval.Complete();
|
||||
self->StopUpdating();
|
||||
},
|
||||
[]() { MOZ_ASSERT(false); }));
|
||||
[]() { MOZ_ASSERT(false); })
|
||||
->Track(mPendingRemoval);
|
||||
}
|
||||
|
||||
void
|
||||
@ -415,10 +415,11 @@ SourceBuffer::AppendData(const uint8_t* aData, uint32_t aLength, ErrorResult& aR
|
||||
}
|
||||
StartUpdating();
|
||||
|
||||
mPendingAppend.Begin(mTrackBuffersManager->AppendData(data, mCurrentAttributes)
|
||||
->Then(AbstractThread::MainThread(), __func__, this,
|
||||
&SourceBuffer::AppendDataCompletedWithSuccess,
|
||||
&SourceBuffer::AppendDataErrored));
|
||||
mTrackBuffersManager->AppendData(data, mCurrentAttributes)
|
||||
->Then(AbstractThread::MainThread(), __func__, this,
|
||||
&SourceBuffer::AppendDataCompletedWithSuccess,
|
||||
&SourceBuffer::AppendDataErrored)
|
||||
->Track(mPendingAppend);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -733,20 +733,21 @@ TrackBuffersManager::SegmentParserLoop()
|
||||
|
||||
// 3. If the input buffer contains one or more complete coded frames, then run the coded frame processing algorithm.
|
||||
RefPtr<TrackBuffersManager> self = this;
|
||||
mProcessingRequest.Begin(CodedFrameProcessing()
|
||||
->Then(GetTaskQueue(), __func__,
|
||||
[self] (bool aNeedMoreData) {
|
||||
self->mProcessingRequest.Complete();
|
||||
if (aNeedMoreData) {
|
||||
self->NeedMoreData();
|
||||
} else {
|
||||
self->ScheduleSegmentParserLoop();
|
||||
}
|
||||
},
|
||||
[self] (const MediaResult& aRejectValue) {
|
||||
self->mProcessingRequest.Complete();
|
||||
self->RejectAppend(aRejectValue, __func__);
|
||||
}));
|
||||
CodedFrameProcessing()
|
||||
->Then(GetTaskQueue(), __func__,
|
||||
[self] (bool aNeedMoreData) {
|
||||
self->mProcessingRequest.Complete();
|
||||
if (aNeedMoreData) {
|
||||
self->NeedMoreData();
|
||||
} else {
|
||||
self->ScheduleSegmentParserLoop();
|
||||
}
|
||||
},
|
||||
[self] (const MediaResult& aRejectValue) {
|
||||
self->mProcessingRequest.Complete();
|
||||
self->RejectAppend(aRejectValue, __func__);
|
||||
})
|
||||
->Track(mProcessingRequest);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -842,11 +843,12 @@ TrackBuffersManager::ResetDemuxingState()
|
||||
RejectAppend(NS_ERROR_FAILURE, __func__);
|
||||
return;
|
||||
}
|
||||
mDemuxerInitRequest.Begin(mInputDemuxer->Init()
|
||||
->Then(GetTaskQueue(), __func__,
|
||||
this,
|
||||
&TrackBuffersManager::OnDemuxerResetDone,
|
||||
&TrackBuffersManager::OnDemuxerInitFailed));
|
||||
mInputDemuxer->Init()
|
||||
->Then(GetTaskQueue(), __func__,
|
||||
this,
|
||||
&TrackBuffersManager::OnDemuxerResetDone,
|
||||
&TrackBuffersManager::OnDemuxerInitFailed)
|
||||
->Track(mDemuxerInitRequest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -916,11 +918,12 @@ TrackBuffersManager::InitializationSegmentReceived()
|
||||
RejectAppend(NS_ERROR_DOM_NOT_SUPPORTED_ERR, __func__);
|
||||
return;
|
||||
}
|
||||
mDemuxerInitRequest.Begin(mInputDemuxer->Init()
|
||||
->Then(GetTaskQueue(), __func__,
|
||||
this,
|
||||
&TrackBuffersManager::OnDemuxerInitDone,
|
||||
&TrackBuffersManager::OnDemuxerInitFailed));
|
||||
mInputDemuxer->Init()
|
||||
->Then(GetTaskQueue(), __func__,
|
||||
this,
|
||||
&TrackBuffersManager::OnDemuxerInitDone,
|
||||
&TrackBuffersManager::OnDemuxerInitFailed)
|
||||
->Track(mDemuxerInitRequest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1200,10 +1203,11 @@ TrackBuffersManager::DoDemuxVideo()
|
||||
DoDemuxAudio();
|
||||
return;
|
||||
}
|
||||
mVideoTracks.mDemuxRequest.Begin(mVideoTracks.mDemuxer->GetSamples(-1)
|
||||
->Then(GetTaskQueue(), __func__, this,
|
||||
&TrackBuffersManager::OnVideoDemuxCompleted,
|
||||
&TrackBuffersManager::OnVideoDemuxFailed));
|
||||
mVideoTracks.mDemuxer->GetSamples(-1)
|
||||
->Then(GetTaskQueue(), __func__, this,
|
||||
&TrackBuffersManager::OnVideoDemuxCompleted,
|
||||
&TrackBuffersManager::OnVideoDemuxFailed)
|
||||
->Track(mVideoTracks.mDemuxRequest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1224,10 +1228,11 @@ TrackBuffersManager::DoDemuxAudio()
|
||||
CompleteCodedFrameProcessing();
|
||||
return;
|
||||
}
|
||||
mAudioTracks.mDemuxRequest.Begin(mAudioTracks.mDemuxer->GetSamples(-1)
|
||||
->Then(GetTaskQueue(), __func__, this,
|
||||
&TrackBuffersManager::OnAudioDemuxCompleted,
|
||||
&TrackBuffersManager::OnAudioDemuxFailed));
|
||||
mAudioTracks.mDemuxer->GetSamples(-1)
|
||||
->Then(GetTaskQueue(), __func__, this,
|
||||
&TrackBuffersManager::OnAudioDemuxCompleted,
|
||||
&TrackBuffersManager::OnAudioDemuxFailed)
|
||||
->Track(mAudioTracks.mDemuxRequest);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -60,10 +60,11 @@ public:
|
||||
writer->mCrypto.mSessionIds);
|
||||
|
||||
mDecrypts.Put(aSample, new DecryptPromiseRequestHolder());
|
||||
mDecrypts.Get(aSample)->Begin(mProxy->Decrypt(aSample)->Then(
|
||||
mProxy->Decrypt(aSample)->Then(
|
||||
mTaskQueue, __func__, this,
|
||||
&EMEDecryptor::Decrypted,
|
||||
&EMEDecryptor::Decrypted));
|
||||
&EMEDecryptor::Decrypted)
|
||||
->Track(*mDecrypts.Get(aSample));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -242,23 +242,23 @@ DecoderCallbackFuzzingWrapper::ScheduleOutputDelayedFrame()
|
||||
return;
|
||||
}
|
||||
RefPtr<DecoderCallbackFuzzingWrapper> self = this;
|
||||
mDelayedOutputRequest.Begin(
|
||||
mDelayedOutputTimer->WaitUntil(
|
||||
mPreviousOutput + mFrameOutputMinimumInterval,
|
||||
__func__)
|
||||
->Then(mTaskQueue, __func__,
|
||||
[self] () -> void {
|
||||
if (self->mDelayedOutputRequest.Exists()) {
|
||||
self->mDelayedOutputRequest.Complete();
|
||||
self->OutputDelayedFrame();
|
||||
}
|
||||
},
|
||||
[self] () -> void {
|
||||
if (self->mDelayedOutputRequest.Exists()) {
|
||||
self->mDelayedOutputRequest.Complete();
|
||||
self->ClearDelayedOutput();
|
||||
}
|
||||
}));
|
||||
mDelayedOutputTimer->WaitUntil(
|
||||
mPreviousOutput + mFrameOutputMinimumInterval,
|
||||
__func__)
|
||||
->Then(mTaskQueue, __func__,
|
||||
[self] () -> void {
|
||||
if (self->mDelayedOutputRequest.Exists()) {
|
||||
self->mDelayedOutputRequest.Complete();
|
||||
self->OutputDelayedFrame();
|
||||
}
|
||||
},
|
||||
[self] () -> void {
|
||||
if (self->mDelayedOutputRequest.Exists()) {
|
||||
self->mDelayedOutputRequest.Complete();
|
||||
self->ClearDelayedOutput();
|
||||
}
|
||||
})
|
||||
->Track(mDelayedOutputRequest);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -231,10 +231,11 @@ H264Converter::CreateDecoderAndInit(MediaRawData* aSample)
|
||||
// Queue the incoming sample.
|
||||
mMediaRawSamples.AppendElement(aSample);
|
||||
|
||||
mInitPromiseRequest.Begin(mDecoder->Init()
|
||||
mDecoder->Init()
|
||||
->Then(AbstractThread::GetCurrent()->AsTaskQueue(), __func__, this,
|
||||
&H264Converter::OnDecoderInitDone,
|
||||
&H264Converter::OnDecoderInitFailed));
|
||||
&H264Converter::OnDecoderInitFailed)
|
||||
->Track(mInitPromiseRequest);
|
||||
return NS_ERROR_NOT_INITIALIZED;
|
||||
}
|
||||
return rv;
|
||||
|
@ -1060,18 +1060,6 @@ public:
|
||||
MozPromiseRequestHolder() {}
|
||||
~MozPromiseRequestHolder() { MOZ_ASSERT(!mRequest); }
|
||||
|
||||
void Begin(RefPtr<typename PromiseType::Request>&& aRequest)
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(!Exists());
|
||||
mRequest = Move(aRequest);
|
||||
}
|
||||
|
||||
void Begin(typename PromiseType::Request* aRequest)
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(!Exists());
|
||||
mRequest = aRequest;
|
||||
}
|
||||
|
||||
void Track(RefPtr<typename PromiseType::Request>&& aRequest)
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(!Exists());
|
||||
|
Loading…
x
Reference in New Issue
Block a user