Bug 1362258 - Reduce ref-counting overhead of TrackBuffersManager::AppendData(). r?jya
http://searchfox.org/mozilla-central/rev/6580dd9a4eb0224773897388dba2ddf5ed7f4216/dom/media/mediasource/TrackBuffersManager.cpp#127
We can pass already_AddRefed<MediaByteBuffer> to InvokeAsync to avoid unnecessary AddRef/Release pairs.
MozReview-Commit-ID: ErXompyX8ua
--- a/dom/media/mediasource/SourceBuffer.cpp
+++ b/dom/media/mediasource/SourceBuffer.cpp
@@ -412,17 +412,17 @@ SourceBuffer::AppendData(const uint8_t*
MSE_DEBUG("AppendData(aLength=%u)", aLength);
RefPtr<MediaByteBuffer> data = PrepareAppend(aData, aLength, aRv);
if (!data) {
return;
}
StartUpdating();
- mTrackBuffersManager->AppendData(data, mCurrentAttributes)
+ mTrackBuffersManager->AppendData(data.forget(), mCurrentAttributes)
->Then(mAbstractMainThread, __func__, this,
&SourceBuffer::AppendDataCompletedWithSuccess,
&SourceBuffer::AppendDataErrored)
->Track(mPendingAppend);
}
void
SourceBuffer::AppendDataCompletedWithSuccess(const SourceBufferTask::AppendBufferResult& aResult)
--- a/dom/media/mediasource/SourceBufferTask.h
+++ b/dom/media/mediasource/SourceBufferTask.h
@@ -42,17 +42,17 @@ public:
}
protected:
virtual ~SourceBufferTask() {}
};
class AppendBufferTask : public SourceBufferTask {
public:
- AppendBufferTask(MediaByteBuffer* aData,
+ AppendBufferTask(already_AddRefed<MediaByteBuffer> aData,
const SourceBufferAttributes& aAttributes)
: mBuffer(aData)
, mAttributes(aAttributes)
{}
static const Type sType = Type::AppendBuffer;
Type GetType() const override { return Type::AppendBuffer; }
--- a/dom/media/mediasource/TrackBuffersManager.cpp
+++ b/dom/media/mediasource/TrackBuffersManager.cpp
@@ -111,34 +111,34 @@ TrackBuffersManager::TrackBuffersManager
}
TrackBuffersManager::~TrackBuffersManager()
{
ShutdownDemuxers();
}
RefPtr<TrackBuffersManager::AppendPromise>
-TrackBuffersManager::AppendData(MediaByteBuffer* aData,
+TrackBuffersManager::AppendData(already_AddRefed<MediaByteBuffer> aData,
const SourceBufferAttributes& aAttributes)
{
MOZ_ASSERT(NS_IsMainThread());
- MSE_DEBUG("Appending %" PRIuSIZE " bytes", aData->Length());
+ RefPtr<MediaByteBuffer> data(aData);
+ MSE_DEBUG("Appending %" PRIuSIZE " bytes", data->Length());
mEnded = false;
- return InvokeAsync<RefPtr<MediaByteBuffer>, SourceBufferAttributes&&>(
- GetTaskQueue(), this, __func__,
- &TrackBuffersManager::DoAppendData, aData, aAttributes);
+ return InvokeAsync(GetTaskQueue(), this, __func__,
+ &TrackBuffersManager::DoAppendData, data.forget(), aAttributes);
}
RefPtr<TrackBuffersManager::AppendPromise>
-TrackBuffersManager::DoAppendData(MediaByteBuffer* aData,
+TrackBuffersManager::DoAppendData(already_AddRefed<MediaByteBuffer> aData,
const SourceBufferAttributes& aAttributes)
{
- RefPtr<AppendBufferTask> task = new AppendBufferTask(aData, aAttributes);
+ RefPtr<AppendBufferTask> task = new AppendBufferTask(Move(aData), aAttributes);
RefPtr<AppendPromise> p = task->mPromise.Ensure(__func__);
QueueTask(task);
return p;
}
void
TrackBuffersManager::QueueTask(SourceBufferTask* aTask)
--- a/dom/media/mediasource/TrackBuffersManager.h
+++ b/dom/media/mediasource/TrackBuffersManager.h
@@ -93,17 +93,17 @@ public:
// Interface for SourceBuffer
TrackBuffersManager(MediaSourceDecoder* aParentDecoder,
const MediaContainerType& aType);
// Queue a task to add data to the end of the input buffer and run the MSE
// Buffer Append Algorithm
// 3.5.5 Buffer Append Algorithm.
// http://w3c.github.io/media-source/index.html#sourcebuffer-buffer-append
- RefPtr<AppendPromise> AppendData(MediaByteBuffer* aData,
+ RefPtr<AppendPromise> AppendData(already_AddRefed<MediaByteBuffer> aData,
const SourceBufferAttributes& aAttributes);
// Queue a task to abort any pending AppendData.
// Does nothing at this stage.
void AbortAppendData();
// Queue a task to run MSE Reset Parser State Algorithm.
// 3.5.2 Reset Parser State
@@ -169,17 +169,17 @@ public:
private:
typedef MozPromise<bool, MediaResult, /* IsExclusive = */ true> CodedFrameProcessingPromise;
// for MediaSourceDemuxer::GetMozDebugReaderData
friend class MediaSourceDemuxer;
~TrackBuffersManager();
// All following functions run on the taskqueue.
- RefPtr<AppendPromise> DoAppendData(MediaByteBuffer* aData,
+ RefPtr<AppendPromise> DoAppendData(already_AddRefed<MediaByteBuffer> aData,
const SourceBufferAttributes& aAttributes);
void ScheduleSegmentParserLoop();
void SegmentParserLoop();
void InitializationSegmentReceived();
void ShutdownDemuxers();
void CreateDemuxerforMIMEType();
void ResetDemuxingState();
void NeedMoreData();