Bug 1336367 - Significantly lower TrackEncoder timeout, make best effort init audio encoder on timeout. r?pehrsons draft
authorBryce Van Dyk <bvandyk@mozilla.com>
Tue, 12 Sep 2017 09:32:17 +1200
changeset 664604 bb61ee31e33a1ebaf190f8e93f52199329895180
parent 662656 3a6d2e30bbe18b4ed6d3d964afe9c97237f0515d
child 664605 d2087d30ea5918b154a93ab87eacf07e6cf49eab
push id79747
push userbvandyk@mozilla.com
push dateThu, 14 Sep 2017 06:20:16 +0000
reviewerspehrsons
bugs1336367
milestone57.0a1
Bug 1336367 - Significantly lower TrackEncoder timeout, make best effort init audio encoder on timeout. r?pehrsons MozReview-Commit-ID: 2J5DPfkulIF
dom/media/encoder/TrackEncoder.cpp
--- a/dom/media/encoder/TrackEncoder.cpp
+++ b/dom/media/encoder/TrackEncoder.cpp
@@ -15,18 +15,20 @@ namespace mozilla {
 LazyLogModule gTrackEncoderLog("TrackEncoder");
 #define TRACK_LOG(type, msg) MOZ_LOG(gTrackEncoderLog, type, msg)
 
 static const int DEFAULT_CHANNELS = 1;
 static const int DEFAULT_SAMPLING_RATE = 16000;
 static const int DEFAULT_FRAME_WIDTH = 640;
 static const int DEFAULT_FRAME_HEIGHT = 480;
 static const int DEFAULT_TRACK_RATE = USECS_PER_S;
-// 30 seconds threshold if the encoder still can't not be initialized.
-static const int INIT_FAILED_DURATION = 30;
+// 1 second threshold if the audio encoder cannot be initialized.
+static const int AUDIO_INIT_FAILED_DURATION = 1;
+// 30 second threshold if the video encoder cannot be initialized.
+static const int VIDEO_INIT_FAILED_DURATION = 30;
 
 TrackEncoder::TrackEncoder()
   : mReentrantMonitor("media.TrackEncoder")
   , mEncodingComplete(false)
   , mEosSetInEncoder(false)
   , mInitialized(false)
   , mEndOfStream(false)
   , mCanceled(false)
@@ -77,21 +79,34 @@ AudioTrackEncoder::NotifyQueuedTrackChan
         break;
       }
 
       iter.Next();
     }
 
     mNotInitDuration += aQueuedMedia.GetDuration();
     if (!mInitialized &&
-        (mNotInitDuration / aGraph->GraphRate() > INIT_FAILED_DURATION) &&
+        (mNotInitDuration / aGraph->GraphRate() >=
+         AUDIO_INIT_FAILED_DURATION) &&
         mInitCounter > 1) {
-      TRACK_LOG(LogLevel::Warning, ("[AudioTrackEncoder]: Initialize failed for 30s."));
-      NotifyEndOfStream();
-      return;
+      // Perform a best effort initialization since we haven't gotten any
+      // data yet. Motivated by issues like Bug 1336367
+      TRACK_LOG(LogLevel::Warning,
+                ("[AudioTrackEncoder]: Initialize failed "
+                 "for %ds. Attempting to init with %d "
+                 "(default) channels!",
+                 AUDIO_INIT_FAILED_DURATION,
+                 DEFAULT_CHANNELS));
+      nsresult rv = Init(DEFAULT_CHANNELS, aGraph->GraphRate());
+      if (NS_FAILED(rv)) {
+        TRACK_LOG(LogLevel::Error,
+                  ("[AudioTrackEncoder]: Fail to initialize the encoder!"));
+        NotifyCancel();
+        return;
+      }
     }
   }
 
   // Append and consume this raw segment.
   AppendAudioSegment(audio);
 
 
   // The stream has stopped and reached the end of track.
@@ -216,19 +231,21 @@ VideoTrackEncoder::Init(const VideoSegme
      }
      break;
    }
 
    iter.Next();
   }
 
   mNotInitDuration += aSegment.GetDuration();
-  if ((mNotInitDuration / mTrackRate > INIT_FAILED_DURATION) &&
+  if ((mNotInitDuration / mTrackRate >= VIDEO_INIT_FAILED_DURATION) &&
       mInitCounter > 1) {
-    TRACK_LOG(LogLevel::Debug, ("[VideoTrackEncoder]: Initialize failed for %ds.", INIT_FAILED_DURATION));
+    TRACK_LOG(LogLevel::Debug,
+              ("[VideoTrackEncoder]: Initialize failed for %ds.",
+               VIDEO_INIT_FAILED_DURATION));
     NotifyEndOfStream();
     return;
   }
 }
 
 void
 VideoTrackEncoder::SetCurrentFrames(const VideoSegment& aSegment)
 {