Bug 1336367 - Significantly lower TrackEncoder timeout, make best effort init audio encoder on timeout. r?pehrsons
MozReview-Commit-ID: 2J5DPfkulIF
--- 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)
{