Bug 1402728 - Use RefPtr<TrackBuffersManager> instead of raw pointers - r=jya

All in MediaSourceDemuxer:
- GetManager returns a RefPtr<TBM>. Probably unneeded as the only call stores
the pointer in a RefPtr, but I'm adding it for peace of mind, and it's very
low cost.
- AttachSourceBuffer takes a RefPtr& and explicitly stores the given TBM in a
RefPtr in the dispatched task, then DoAttachSourceBuffer takes a
RefPtr<TBM>&&. This should not be needed, as it should already be done
implicitly. But now it's more obvious, and a bit more optimized thanks to move
semantics.
- DetachSourceBuffer takes a RefPtr& and explicitly stores the given TBM in a
RefPtr in the dispatched task, then DoDetachSourceBuffer takes a
RefPtr<TBM>&&; And changed the loop to use RemoveElementsBy. Same as above,
probably not needed, but it's now obvious that we keep a RefPtr.

MozReview-Commit-ID: 9aOZtV7uS1P

--HG--
extra : rebase_source : 1e33cffd5686e2d73f02976794d6b27861eb0391
This commit is contained in:
Gerald Squelart 2017-09-25 11:19:05 +13:00
Родитель b9a549d819
Коммит f54bfaa676
3 изменённых файлов: 24 добавлений и 21 удалений

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

@ -58,7 +58,7 @@ MediaSourceDemuxer::AddSizeOfResources(
RefPtr<MediaSourceDecoder::ResourceSizes> sizes = aSizes;
nsCOMPtr<nsIRunnable> task = NS_NewRunnableFunction(
"MediaSourceDemuxer::AddSizeOfResources", [self, sizes]() {
for (TrackBuffersManager* manager : self->mSourceBuffers) {
for (const RefPtr<TrackBuffersManager>& manager : self->mSourceBuffers) {
manager->AddSizeOfResources(sizes);
}
});
@ -167,9 +167,10 @@ MediaSourceDemuxer::GetCrypto()
}
void
MediaSourceDemuxer::AttachSourceBuffer(TrackBuffersManager* aSourceBuffer)
MediaSourceDemuxer::AttachSourceBuffer(
RefPtr<TrackBuffersManager>& aSourceBuffer)
{
nsCOMPtr<nsIRunnable> task = NewRunnableMethod<TrackBuffersManager*>(
nsCOMPtr<nsIRunnable> task = NewRunnableMethod<RefPtr<TrackBuffersManager>&&>(
"MediaSourceDemuxer::DoAttachSourceBuffer",
this,
&MediaSourceDemuxer::DoAttachSourceBuffer,
@ -178,17 +179,19 @@ MediaSourceDemuxer::AttachSourceBuffer(TrackBuffersManager* aSourceBuffer)
}
void
MediaSourceDemuxer::DoAttachSourceBuffer(mozilla::TrackBuffersManager* aSourceBuffer)
MediaSourceDemuxer::DoAttachSourceBuffer(
RefPtr<mozilla::TrackBuffersManager>&& aSourceBuffer)
{
MOZ_ASSERT(OnTaskQueue());
mSourceBuffers.AppendElement(aSourceBuffer);
mSourceBuffers.AppendElement(Move(aSourceBuffer));
ScanSourceBuffersForContent();
}
void
MediaSourceDemuxer::DetachSourceBuffer(TrackBuffersManager* aSourceBuffer)
MediaSourceDemuxer::DetachSourceBuffer(
RefPtr<TrackBuffersManager>& aSourceBuffer)
{
nsCOMPtr<nsIRunnable> task = NewRunnableMethod<TrackBuffersManager*>(
nsCOMPtr<nsIRunnable> task = NewRunnableMethod<RefPtr<TrackBuffersManager>&&>(
"MediaSourceDemuxer::DoDetachSourceBuffer",
this,
&MediaSourceDemuxer::DoDetachSourceBuffer,
@ -197,14 +200,14 @@ MediaSourceDemuxer::DetachSourceBuffer(TrackBuffersManager* aSourceBuffer)
}
void
MediaSourceDemuxer::DoDetachSourceBuffer(TrackBuffersManager* aSourceBuffer)
MediaSourceDemuxer::DoDetachSourceBuffer(
RefPtr<TrackBuffersManager>&& aSourceBuffer)
{
MOZ_ASSERT(OnTaskQueue());
for (uint32_t i = 0; i < mSourceBuffers.Length(); i++) {
if (mSourceBuffers[i].get() == aSourceBuffer) {
mSourceBuffers.RemoveElementAt(i);
}
}
mSourceBuffers.RemoveElementsBy(
[&aSourceBuffer](const RefPtr<TrackBuffersManager> aLinkedSourceBuffer) {
return aLinkedSourceBuffer == aSourceBuffer;
});
{
MonitorAutoLock mon(mMonitor);
if (aSourceBuffer == mAudioTrack) {
@ -231,7 +234,7 @@ MediaSourceDemuxer::GetTrackInfo(TrackType aTrack)
}
}
TrackBuffersManager*
RefPtr<TrackBuffersManager>
MediaSourceDemuxer::GetManager(TrackType aTrack)
{
MonitorAutoLock mon(mMonitor);

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

@ -44,8 +44,8 @@ public:
bool ShouldComputeStartTime() const override { return false; }
/* interface for TrackBuffersManager */
void AttachSourceBuffer(TrackBuffersManager* aSourceBuffer);
void DetachSourceBuffer(TrackBuffersManager* aSourceBuffer);
void AttachSourceBuffer(RefPtr<TrackBuffersManager>& aSourceBuffer);
void DetachSourceBuffer(RefPtr<TrackBuffersManager>& aSourceBuffer);
AutoTaskQueue* GetTaskQueue() { return mTaskQueue; }
void NotifyInitDataArrived();
@ -66,10 +66,10 @@ private:
friend class MediaSourceTrackDemuxer;
// Scan source buffers and update information.
bool ScanSourceBuffersForContent();
TrackBuffersManager* GetManager(TrackInfo::TrackType aType);
RefPtr<TrackBuffersManager> GetManager(TrackInfo::TrackType aType);
TrackInfo* GetTrackInfo(TrackInfo::TrackType);
void DoAttachSourceBuffer(TrackBuffersManager* aSourceBuffer);
void DoDetachSourceBuffer(TrackBuffersManager* aSourceBuffer);
void DoAttachSourceBuffer(RefPtr<TrackBuffersManager>&& aSourceBuffer);
void DoDetachSourceBuffer(RefPtr<TrackBuffersManager>&& aSourceBuffer);
bool OnTaskQueue()
{
return !GetTaskQueue() || GetTaskQueue()->IsCurrentThreadIn();

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

@ -282,7 +282,7 @@ SourceBuffer::Detach()
if (mTrackBuffersManager) {
mTrackBuffersManager->Detach();
mMediaSource->GetDecoder()->GetDemuxer()->DetachSourceBuffer(
mTrackBuffersManager.get());
mTrackBuffersManager);
}
mTrackBuffersManager = nullptr;
mMediaSource = nullptr;
@ -324,7 +324,7 @@ SourceBuffer::SourceBuffer(MediaSource* aMediaSource,
SetMode(SourceBufferAppendMode::Segments, dummy);
}
mMediaSource->GetDecoder()->GetDemuxer()->AttachSourceBuffer(
mTrackBuffersManager.get());
mTrackBuffersManager);
}
SourceBuffer::~SourceBuffer()