Bug 1407549 - Avoid copying principal handles as much as possible. r?padenot draft
authorAndreas Pehrson <pehrsons@mozilla.com>
Thu, 29 Mar 2018 16:15:51 +0200
changeset 776613 00adaf71bc82264f939d47fa366c9558f1589090
parent 776612 9718e6839a85839a191e1aca7a0349ead59ffc6c
child 777130 52455b919314b2b5b7c86a5d7f8b82a637fe857e
child 777234 10cd06f955bcefbfdf279a89ae1c577edb696b70
push id104925
push userbmo:apehrson@mozilla.com
push dateTue, 03 Apr 2018 13:43:03 +0000
reviewerspadenot
bugs1407549
milestone61.0a1
Bug 1407549 - Avoid copying principal handles as much as possible. r?padenot MozReview-Commit-ID: EMX2nf5nk1L
dom/media/AudioSegment.h
dom/media/MediaSegment.h
dom/media/MediaStreamGraph.cpp
dom/media/VideoSegment.h
--- 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: