Bug 1272225. Part 2 - remove use of FlushableTaskQueue::Flush(). r=jya. draft
authorJW Wang <jwwang@mozilla.com>
Thu, 12 May 2016 16:02:50 +0800
changeset 366634 bee807080f561ae2e9282dc8ab2e01e0af17d8b5
parent 366633 af1f62cefd85e8d40736f87da86879fa0d5c2ead
child 366635 05819ba40a618295ef3b9e19a8083e50d2148631
push id18031
push userjwwang@mozilla.com
push dateFri, 13 May 2016 01:40:44 +0000
reviewersjya
bugs1272225
milestone49.0a1
Bug 1272225. Part 2 - remove use of FlushableTaskQueue::Flush(). r=jya. MozReview-Commit-ID: 6D9tfRhEbSk
dom/media/platforms/apple/AppleATDecoder.cpp
dom/media/platforms/apple/AppleATDecoder.h
--- a/dom/media/platforms/apple/AppleATDecoder.cpp
+++ b/dom/media/platforms/apple/AppleATDecoder.cpp
@@ -5,16 +5,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "AppleUtils.h"
 #include "MP4Decoder.h"
 #include "mp4_demuxer/Adts.h"
 #include "MediaInfo.h"
 #include "AppleATDecoder.h"
 #include "mozilla/Logging.h"
+#include "mozilla/SyncRunnable.h"
 #include "mozilla/UniquePtr.h"
 
 extern mozilla::LogModule* GetPDMLog();
 #define LOG(...) MOZ_LOG(GetPDMLog(), mozilla::LogLevel::Debug, (__VA_ARGS__))
 #define FourCC2Str(n) ((char[5]){(char)(n >> 24), (char)(n >> 16), (char)(n >> 8), (char)(n), 0})
 
 namespace mozilla {
 
@@ -22,16 +23,17 @@ AppleATDecoder::AppleATDecoder(const Aud
                                FlushableTaskQueue* aAudioTaskQueue,
                                MediaDataDecoderCallback* aCallback)
   : mConfig(aConfig)
   , mFileStreamError(false)
   , mTaskQueue(aAudioTaskQueue)
   , mCallback(aCallback)
   , mConverter(nullptr)
   , mStream(nullptr)
+  , mIsFlushing(false)
 {
   MOZ_COUNT_CTOR(AppleATDecoder);
   LOG("Creating Apple AudioToolbox decoder");
   LOG("Audio Decoder configuration: %s %d Hz %d channels %d bits per channel",
       mConfig.mMimeType.get(),
       mConfig.mRate,
       mConfig.mChannels,
       mConfig.mBitDepth);
@@ -80,31 +82,44 @@ AppleATDecoder::Input(MediaRawData* aSam
         &AppleATDecoder::SubmitSample,
         RefPtr<MediaRawData>(aSample));
   mTaskQueue->Dispatch(runnable.forget());
 
   return NS_OK;
 }
 
 nsresult
-AppleATDecoder::Flush()
+AppleATDecoder::ProcessFlush()
 {
-  MOZ_ASSERT(mCallback->OnReaderTaskQueue());
-  LOG("Flushing AudioToolbox AAC decoder");
-  mTaskQueue->Flush();
+  MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
   mQueuedSamples.Clear();
   OSStatus rv = AudioConverterReset(mConverter);
   if (rv) {
     LOG("Error %d resetting AudioConverter", rv);
     return NS_ERROR_FAILURE;
   }
   return NS_OK;
 }
 
 nsresult
+AppleATDecoder::Flush()
+{
+  MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+  LOG("Flushing AudioToolbox AAC decoder");
+  mIsFlushing = true;
+  nsresult rv = NS_OK;
+  nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([this, &rv] () {
+    rv = ProcessFlush();
+  });
+  SyncRunnable::DispatchToThread(mTaskQueue, r);
+  mIsFlushing = false;
+  return rv;
+}
+
+nsresult
 AppleATDecoder::Drain()
 {
   MOZ_ASSERT(mCallback->OnReaderTaskQueue());
   LOG("Draining AudioToolbox AAC decoder");
   mTaskQueue->AwaitIdle();
   mCallback->DrainComplete();
   return Flush();
 }
@@ -175,16 +190,20 @@ static OSStatus
   return noErr;
 }
 
 void
 AppleATDecoder::SubmitSample(MediaRawData* aSample)
 {
   MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
 
+  if (mIsFlushing) {
+    return;
+  }
+
   nsresult rv = NS_OK;
   if (!mConverter) {
     rv = SetupDecoder(aSample);
     if (rv != NS_OK && rv != NS_ERROR_NOT_INITIALIZED) {
       mCallback->Error();
       return;
     }
   }
--- a/dom/media/platforms/apple/AppleATDecoder.h
+++ b/dom/media/platforms/apple/AppleATDecoder.h
@@ -51,17 +51,19 @@ private:
   MediaDataDecoderCallback* mCallback;
   AudioConverterRef mConverter;
   AudioStreamBasicDescription mOutputFormat;
   UInt32 mFormatID;
   AudioFileStreamID mStream;
   nsTArray<RefPtr<MediaRawData>> mQueuedSamples;
   UniquePtr<AudioConfig::ChannelLayout> mChannelLayout;
   UniquePtr<AudioConverter> mAudioConverter;
+  Atomic<bool> mIsFlushing;
 
+  nsresult ProcessFlush();
   void SubmitSample(MediaRawData* aSample);
   nsresult DecodeSample(MediaRawData* aSample);
   nsresult GetInputAudioDescription(AudioStreamBasicDescription& aDesc,
                                     const nsTArray<uint8_t>& aExtraData);
   // Setup AudioConverter once all information required has been gathered.
   // Will return NS_ERROR_NOT_INITIALIZED if more data is required.
   nsresult SetupDecoder(MediaRawData* aSample);
   nsresult GetImplicitAACMagicCookie(const MediaRawData* aSample);