Bug 1407549 - Avoid copying principal handles as much as possible. r?padenot
MozReview-Commit-ID: EMX2nf5nk1L
--- a/dom/media/AudioSegment.h
+++ b/dom/media/AudioSegment.h
@@ -240,17 +240,17 @@ struct AudioChunk {
template<typename T>
T* ChannelDataForWrite(size_t aChannel)
{
MOZ_ASSERT(AudioSampleTypeToFormat<T>::Format == mBufferFormat);
MOZ_ASSERT(!mBuffer->IsShared());
return static_cast<T*>(const_cast<void*>(mChannelData[aChannel]));
}
- PrincipalHandle GetPrincipalHandle() const { return mPrincipalHandle; }
+ const PrincipalHandle& GetPrincipalHandle() const { return mPrincipalHandle; }
StreamTime mDuration = 0; // in frames within the buffer
RefPtr<ThreadSharedObject> mBuffer; // the buffer object whose lifetime is managed; null means data is all zeroes
// one pointer per channel; empty if and only if mBuffer is null
AutoTArray<const void*,GUESS_AUDIO_CHANNELS> mChannelData;
float mVolume = 1.0f; // volume multiplier to apply
// format of frames in mBuffer (or silence if mBuffer is null)
SampleFormat mBufferFormat = AUDIO_FORMAT_SILENCE;
--- a/dom/media/MediaSegment.h
+++ b/dom/media/MediaSegment.h
@@ -79,23 +79,23 @@ inline PrincipalHandle MakePrincipalHand
RefPtr<nsMainThreadPtrHolder<nsIPrincipal>> holder =
new nsMainThreadPtrHolder<nsIPrincipal>(
"MakePrincipalHandle::nsIPrincipal", aPrincipal);
return PrincipalHandle(holder);
}
#define PRINCIPAL_HANDLE_NONE nullptr
-inline nsIPrincipal* GetPrincipalFromHandle(PrincipalHandle& aPrincipalHandle)
+inline nsIPrincipal* GetPrincipalFromHandle(const PrincipalHandle& aPrincipalHandle)
{
MOZ_ASSERT(NS_IsMainThread());
return aPrincipalHandle.get();
}
-inline bool PrincipalHandleMatches(PrincipalHandle& aPrincipalHandle,
+inline bool PrincipalHandleMatches(const PrincipalHandle& aPrincipalHandle,
nsIPrincipal* aOther)
{
if (!aOther) {
return false;
}
nsIPrincipal* principal = GetPrincipalFromHandle(aPrincipalHandle);
if (!principal) {
@@ -143,24 +143,24 @@ public:
* Gets the total duration of the segment.
*/
StreamTime GetDuration() const { return mDuration; }
Type GetType() const { return mType; }
/**
* Gets the last principal id that was appended to this segment.
*/
- PrincipalHandle GetLastPrincipalHandle() const { return mLastPrincipalHandle; }
+ const PrincipalHandle& GetLastPrincipalHandle() const { return mLastPrincipalHandle; }
/**
* Called by the MediaStreamGraph as it appends a chunk with a different
* principal id than the current one.
*/
- void SetLastPrincipalHandle(const PrincipalHandle& aLastPrincipalHandle)
+ void SetLastPrincipalHandle(PrincipalHandle aLastPrincipalHandle)
{
- mLastPrincipalHandle = aLastPrincipalHandle;
+ mLastPrincipalHandle = Forward<PrincipalHandle>(aLastPrincipalHandle);
}
/**
* Returns true if all chunks in this segment are null.
*/
virtual bool IsNull() const = 0;
/**
--- a/dom/media/MediaStreamGraph.cpp
+++ b/dom/media/MediaStreamGraph.cpp
@@ -238,17 +238,17 @@ MediaStreamGraphImpl::ProcessChunkMetada
!chunk.IsEnded(); chunk.Next()) {
if (offset >= aEnd) {
break;
}
offset += chunk->GetDuration();
if (chunk->IsNull() || offset < aStart) {
continue;
}
- PrincipalHandle principalHandle = chunk->GetPrincipalHandle();
+ const PrincipalHandle& principalHandle = chunk->GetPrincipalHandle();
if (principalHandle != aSegment.GetLastPrincipalHandle()) {
aSegment.SetLastPrincipalHandle(principalHandle);
LOG(LogLevel::Debug,
("MediaStream %p track %d, principalHandle "
"changed in %sChunk with duration %lld",
aStream,
aTrackID,
aSegment.GetType() == MediaSegment::AUDIO ? "Audio" : "Video",
--- a/dom/media/VideoSegment.h
+++ b/dom/media/VideoSegment.h
@@ -35,18 +35,21 @@ public:
bool operator!=(const VideoFrame& aFrame) const
{
return !operator==(aFrame);
}
Image* GetImage() const { return mImage; }
void SetForceBlack(bool aForceBlack) { mForceBlack = aForceBlack; }
bool GetForceBlack() const { return mForceBlack; }
- void SetPrincipalHandle(const PrincipalHandle& aPrincipalHandle) { mPrincipalHandle = aPrincipalHandle; }
- PrincipalHandle GetPrincipalHandle() const { return mPrincipalHandle; }
+ void SetPrincipalHandle(PrincipalHandle aPrincipalHandle)
+ {
+ mPrincipalHandle = Forward<PrincipalHandle>(aPrincipalHandle);
+ }
+ const PrincipalHandle& GetPrincipalHandle() const { return mPrincipalHandle; }
const gfx::IntSize& GetIntrinsicSize() const { return mIntrinsicSize; }
void SetNull();
void TakeFrom(VideoFrame* aFrame);
// Create a planar YCbCr black image.
static already_AddRefed<Image> CreateBlackImage(const gfx::IntSize& aSize);
protected:
@@ -84,17 +87,17 @@ struct VideoChunk {
size_t SizeOfExcludingThisIfUnshared(MallocSizeOf aMallocSizeOf) const
{
// Future:
// - mFrame
return 0;
}
- PrincipalHandle GetPrincipalHandle() const { return mFrame.GetPrincipalHandle(); }
+ const PrincipalHandle& GetPrincipalHandle() const { return mFrame.GetPrincipalHandle(); }
StreamTime mDuration;
VideoFrame mFrame;
TimeStamp mTimeStamp;
};
class VideoSegment : public MediaSegmentBase<VideoSegment, VideoChunk> {
public: