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:
Karl Tomlinson 2014-10-15 17:02:43 +13:00
Родитель ee59dd7387
Коммит 9d6c291e29
2 изменённых файлов: 15 добавлений и 6 удалений

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

@ -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.