зеркало из https://github.com/mozilla/gecko-dev.git
bug 1082206 detach TrackBuffer when unlinking SourceBuffer r=kinetik
When HTMLMediaElement initiates MediaSourceDecoder Shutdown() in cycle collection, it may no longer have access to the SourceBuffers to notify through Detach(). The DiscardDecoder() call in TrackBuffer::Shutdown() is too late as this runs after MediaDecoderStateMachine::FlushDecoding(), which waits for decode tasks waiting on the MediaSourceResource. --HG-- extra : rebase_source : 67e276044a251556eda2186d044c7f6b1f4363cd extra : histedit_source : 4d921a5d2f4c0bce9ed67a3cb769c0d407662d6c
This commit is contained in:
Родитель
ee59dd7387
Коммит
9d6c291e29
|
@ -416,8 +416,21 @@ SourceBuffer::Dump(const char* aPath)
|
|||
}
|
||||
#endif
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_INHERITED(SourceBuffer, DOMEventTargetHelper,
|
||||
mMediaSource)
|
||||
NS_IMPL_CYCLE_COLLECTION_CLASS(SourceBuffer)
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(SourceBuffer)
|
||||
// Tell the TrackBuffer to end its current SourceBufferResource.
|
||||
TrackBuffer* track = tmp->mTrackBuffer;
|
||||
if (track) {
|
||||
track->Detach();
|
||||
}
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mMediaSource)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(DOMEventTargetHelper)
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(SourceBuffer,
|
||||
DOMEventTargetHelper)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMediaSource)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(SourceBuffer, DOMEventTargetHelper)
|
||||
NS_IMPL_RELEASE_INHERITED(SourceBuffer, DOMEventTargetHelper)
|
||||
|
|
|
@ -70,10 +70,6 @@ private:
|
|||
void
|
||||
TrackBuffer::Shutdown()
|
||||
{
|
||||
// End the SourceBufferResource associated with mCurrentDecoder, which will
|
||||
// unblock any decoder initialization in ReadMetadata().
|
||||
DiscardDecoder();
|
||||
|
||||
// Finish any decoder initialization, which may add to mInitializedDecoders.
|
||||
// Shutdown waits for any pending events, which may require the monitor,
|
||||
// so we must not hold the monitor during this call.
|
||||
|
|
Загрузка…
Ссылка в новой задаче