Bug 1214073 - MediaDecoderReader::ReleaseMediaResources will do dispatch if necessary. r=gerald.

This commit is contained in:
JW Wang 2015-10-14 11:52:26 +08:00
Родитель 1cc6677a90
Коммит 6765563707
8 изменённых файлов: 32 добавлений и 14 удалений

Просмотреть файл

@ -96,7 +96,16 @@ public:
// Release media resources they should be released in dormant state
// The reader can be made usable again by calling ReadMetadata().
virtual void ReleaseMediaResources() {};
void ReleaseMediaResources()
{
if (OnTaskQueue()) {
ReleaseMediaResourcesInternal();
return;
}
nsCOMPtr<nsIRunnable> r = NS_NewRunnableMethod(
this, &MediaDecoderReader::ReleaseMediaResourcesInternal);
OwnerThread()->Dispatch(r.forget());
}
// Breaks reference-counted cycles. Called during shutdown.
// WARNING: If you override this, you must call the base implementation
// in your override.
@ -243,6 +252,9 @@ public:
virtual size_t SizeOfVideoQueueInFrames();
virtual size_t SizeOfAudioQueueInFrames();
private:
virtual void ReleaseMediaResourcesInternal() {}
protected:
friend class TrackBuffer;
virtual void NotifyDataArrivedInternal(uint32_t aLength, int64_t aOffset) { }

Просмотреть файл

@ -1269,8 +1269,7 @@ MediaDecoderStateMachine::SetDormant(bool aDormant)
// that run after ResetDecode are supposed to run with a clean slate. We rely
// on that in other places (i.e. seeking), so it seems reasonable to rely on
// it here as well.
nsCOMPtr<nsIRunnable> r = NS_NewRunnableMethod(mReader, &MediaDecoderReader::ReleaseMediaResources);
DecodeTaskQueue()->Dispatch(r.forget());
mReader->ReleaseMediaResources();
} else if ((aDormant != true) && (mState == DECODER_STATE_DORMANT)) {
ScheduleStateMachine();
mDecodingFirstFrame = true;

Просмотреть файл

@ -1569,8 +1569,9 @@ MediaFormatReader::GetBuffered()
return intervals.Shift(media::TimeUnit::FromMicroseconds(-startTime));
}
void MediaFormatReader::ReleaseMediaResources()
void MediaFormatReader::ReleaseMediaResourcesInternal()
{
MOZ_ASSERT(OnTaskQueue());
// Before freeing a video codec, all video buffers needed to be released
// even from graphics pipeline.
VideoFrameContainer* container =

Просмотреть файл

@ -70,9 +70,6 @@ public:
virtual bool ForceZeroStartTime() const override;
// For Media Resource Management
void ReleaseMediaResources() override;
nsresult ResetDecode() override;
nsRefPtr<ShutdownPromise> Shutdown() override;
@ -436,6 +433,10 @@ private:
#if defined(READER_DORMANT_HEURISTIC)
const bool mDormantEnabled;
#endif
private:
// For Media Resource Management
void ReleaseMediaResourcesInternal() override;
};
} // namespace mozilla

Просмотреть файл

@ -284,8 +284,10 @@ MediaCodecReader::~MediaCodecReader()
}
void
MediaCodecReader::ReleaseMediaResources()
MediaCodecReader::ReleaseMediaResourcesInternal()
{
MOZ_ASSERT(OnTaskQueue());
// Stop the mSource because we are in the dormant state and the stop function
// will rewind the mSource to the beginning of the stream.
if (mVideoTrack.mSource != nullptr && !mVideoTrack.mSourceIsStopped) {

Просмотреть файл

@ -60,9 +60,6 @@ public:
MediaCodecReader(AbstractMediaDecoder* aDecoder);
virtual ~MediaCodecReader();
// Release media resources they should be released in dormant state
virtual void ReleaseMediaResources();
// Destroys the decoding state. The reader cannot be made usable again.
// This is different from ReleaseMediaResources() as Shutdown() is
// irreversible, whereas ReleaseMediaResources() is reversible.
@ -436,6 +433,10 @@ private:
nsTArray<ReleaseItem> mPendingReleaseItems;
NotifyDataArrivedFilter mFilter;
private:
// Release media resources they should be released in dormant state
virtual void ReleaseMediaResourcesInternal() override;
};
} // namespace mozilla

Просмотреть файл

@ -170,8 +170,10 @@ MediaOmxReader::Shutdown()
return p;
}
void MediaOmxReader::ReleaseMediaResources()
void MediaOmxReader::ReleaseMediaResourcesInternal()
{
MOZ_ASSERT(OnTaskQueue());
mMediaResourceRequest.DisconnectIfExists();
mMetadataPromise.RejectIfExists(ReadMetadataFailureReason::METADATA_ERROR, __func__);

Просмотреть файл

@ -95,8 +95,6 @@ public:
return mHasVideo;
}
virtual void ReleaseMediaResources();
virtual nsRefPtr<MediaDecoderReader::MetadataPromise> AsyncReadMetadata() override;
virtual nsRefPtr<SeekPromise>
@ -118,6 +116,8 @@ private:
class ProcessCachedDataTask;
class NotifyDataArrivedRunnable;
virtual void ReleaseMediaResourcesInternal() override;
bool IsShutdown() {
MutexAutoLock lock(mShutdownMutex);
return mIsShutdown;