Index: content/renderer/media/recorder/media_recorder_handler.cc |
diff --git a/content/renderer/media/recorder/media_recorder_handler.cc b/content/renderer/media/recorder/media_recorder_handler.cc |
index 3c3d2e8787e48b478f083739b4a9ed65e638d09c..ec557b41777f168e4cfc912e43f8bf5c7c749fa8 100644 |
--- a/content/renderer/media/recorder/media_recorder_handler.cc |
+++ b/content/renderer/media/recorder/media_recorder_handler.cc |
@@ -58,6 +58,7 @@ MediaRecorderHandler::MediaRecorderHandler() |
audio_bits_per_second_(0), |
codec_id_(VideoTrackRecorder::CodecId::VP8), |
recording_(false), |
+ media_stream_num_tracks_(0), |
client_(nullptr), |
weak_factory_(this) {} |
@@ -146,6 +147,7 @@ bool MediaRecorderHandler::initialize( |
<< static_cast<int>(codec_id_); |
media_stream_ = media_stream; |
+ media_stream_num_tracks_ = 0; // Will be updated in start(); |
emircan
2017/02/17 00:19:07
Should we set it to 0 in Stop() as well?
mcasas
2017/02/17 01:46:14
Not really because after stop(), we'd need to
ha
|
DCHECK(client); |
client_ = client; |
@@ -167,6 +169,7 @@ bool MediaRecorderHandler::start(int timeslice) { |
blink::WebVector<blink::WebMediaStreamTrack> video_tracks, audio_tracks; |
media_stream_.videoTracks(video_tracks); |
media_stream_.audioTracks(audio_tracks); |
+ media_stream_num_tracks_ = video_tracks.size() + audio_tracks.size(); |
if (video_tracks.isEmpty() && audio_tracks.isEmpty()) { |
LOG(WARNING) << __func__ << ": no media tracks."; |
@@ -237,6 +240,7 @@ void MediaRecorderHandler::stop() { |
DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
// Don't check |recording_| since we can go directly from pause() to stop(). |
+ weak_factory_.InvalidateWeakPtrs(); |
recording_ = false; |
timeslice_ = TimeDelta::FromMilliseconds(0); |
video_recorders_.clear(); |
@@ -272,6 +276,11 @@ void MediaRecorderHandler::OnEncodedVideo( |
TimeTicks timestamp, |
bool is_key_frame) { |
DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
+ |
+ if (CheckAndUpdateAmountOfTracks()) { |
+ client_->onError("Amount of tracks in MediaStream has changed."); |
+ return; |
+ } |
if (!webm_muxer_) |
return; |
if (!webm_muxer_->OnEncodedVideo(params, std::move(encoded_data), timestamp, |
@@ -286,6 +295,11 @@ void MediaRecorderHandler::OnEncodedAudio( |
std::unique_ptr<std::string> encoded_data, |
base::TimeTicks timestamp) { |
DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
+ |
+ if (CheckAndUpdateAmountOfTracks()) { |
+ client_->onError("Amount of tracks in MediaStream has changed."); |
+ return; |
+ } |
if (!webm_muxer_) |
return; |
if (!webm_muxer_->OnEncodedAudio(params, std::move(encoded_data), |
@@ -313,6 +327,20 @@ void MediaRecorderHandler::WriteData(base::StringPiece data) { |
(now - TimeTicks::UnixEpoch()).InMillisecondsF()); |
} |
+bool MediaRecorderHandler::CheckAndUpdateAmountOfTracks() { |
+ DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
+ |
+ blink::WebVector<blink::WebMediaStreamTrack> video_tracks, audio_tracks; |
+ media_stream_.videoTracks(video_tracks); |
+ media_stream_.audioTracks(audio_tracks); |
+ const size_t current_num_tracks = video_tracks.size() + audio_tracks.size(); |
+ if (media_stream_num_tracks_ == current_num_tracks) |
emircan
2017/02/17 00:19:07
What about the case where one is added another is
mcasas
2017/02/17 01:46:14
Hmm good point, modified.
|
+ return false; |
+ |
+ media_stream_num_tracks_ = current_num_tracks; |
emircan
2017/02/17 00:19:07
Is it necessary to update |media_stream_num_tracks
mcasas
2017/02/17 01:46:14
I still need the update because at the end of the
|
+ return true; |
+} |
+ |
void MediaRecorderHandler::OnVideoFrameForTesting( |
const scoped_refptr<media::VideoFrame>& frame, |
const TimeTicks& timestamp) { |