Bug 1323152 - protect DurationQueue with lock. r?snorp draft
authorJohn Lin <jolin@mozilla.com>
Tue, 13 Dec 2016 16:41:37 +0800
changeset 448907 39b225f6d2110037a0ce2043254407685ecaeaab
parent 448906 c67162483777c4b3786f211dc5fb597a1f1d33f8
child 539422 baa10b9e919eb8668636a27a49ddb021822c4979
push id38484
push userbmo:jolin@mozilla.com
push dateTue, 13 Dec 2016 08:45:03 +0000
reviewerssnorp
bugs1323152
milestone53.0a1
Bug 1323152 - protect DurationQueue with lock. r?snorp Remove an unused class too. MozReview-Commit-ID: KlUKMIPbMuo
dom/media/platforms/android/RemoteDataDecoder.cpp
--- a/dom/media/platforms/android/RemoteDataDecoder.cpp
+++ b/dom/media/platforms/android/RemoteDataDecoder.cpp
@@ -94,28 +94,16 @@ public:
   {
     mDecoderCallback = nullptr;
   }
 
 protected:
   MediaDataDecoderCallback* mDecoderCallback;
 };
 
-struct SampleTime final
-{
-  SampleTime(int64_t aStart, int64_t aDuration)
-    : mStart(aStart)
-    , mDuration(aDuration)
-  {}
-
-  int64_t mStart;
-  int64_t mDuration;
-};
-
-
 class RemoteVideoDecoder final : public RemoteDataDecoder
 {
 public:
   // Hold an output buffer and render it to the surface when the frame is sent to compositor, or
   // release it if not presented.
   class RenderOrReleaseOutput : public VideoData::Listener
   {
   public:
@@ -283,39 +271,45 @@ public:
   }
 
   bool SupportDecoderRecycling() const override { return mIsCodecSupportAdaptivePlayback; }
 
 private:
   class DurationQueue {
   public:
 
+    DurationQueue() : mMutex("Video duration queue") {}
+
     void Clear()
     {
+      MutexAutoLock lock(mMutex);
       mValues.clear();
     }
 
     void Put(int64_t aDurationUs)
     {
+      MutexAutoLock lock(mMutex);
       mValues.emplace_back(aDurationUs);
     }
 
     Maybe<int64_t> Get()
     {
+      MutexAutoLock lock(mMutex);
       if (mValues.empty()) {
         return Nothing();
       }
 
       auto value = Some(mValues.front());
       mValues.pop_front();
 
       return value;
     }
 
   private:
+    Mutex mMutex; // To protect mValues.
     std::deque<int64_t> mValues;
   };
 
   layers::ImageContainer* mImageContainer;
   const VideoInfo& mConfig;
   RefPtr<AndroidSurfaceTexture> mSurfaceTexture;
   DurationQueue mInputDurations;
   bool mIsCodecSupportAdaptivePlayback = false;