mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
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:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)");
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user