Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(411)

Unified Diff: content/renderer/media/recorder/media_recorder_handler.cc

Issue 2697703003: MediaRecorder: make sure ondataavailable+onstop events are fired before onerror (Closed)
Patch Set: fix some naming confusion Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..9fcd2b9c00f90c078f0f22a1d49013707b699394 100644
--- a/content/renderer/media/recorder/media_recorder_handler.cc
+++ b/content/renderer/media/recorder/media_recorder_handler.cc
@@ -164,23 +164,23 @@ bool MediaRecorderHandler::start(int timeslice) {
timeslice_ = TimeDelta::FromMilliseconds(timeslice);
slice_origin_timestamp_ = TimeTicks::Now();
- blink::WebVector<blink::WebMediaStreamTrack> video_tracks, audio_tracks;
- media_stream_.videoTracks(video_tracks);
- media_stream_.audioTracks(audio_tracks);
+ media_stream_.videoTracks(video_tracks_);
+ media_stream_.audioTracks(audio_tracks_);
- if (video_tracks.isEmpty() && audio_tracks.isEmpty()) {
+ if (video_tracks_.isEmpty() && audio_tracks_.isEmpty()) {
LOG(WARNING) << __func__ << ": no media tracks.";
return false;
}
const bool use_video_tracks =
- !video_tracks.isEmpty() && video_tracks[0].isEnabled() &&
- video_tracks[0].source().getReadyState() !=
+ !video_tracks_.isEmpty() && video_tracks_[0].isEnabled() &&
+ video_tracks_[0].source().getReadyState() !=
blink::WebMediaStreamSource::ReadyStateEnded;
const bool use_audio_tracks =
- !audio_tracks.isEmpty() && MediaStreamAudioTrack::From(audio_tracks[0]) &&
- audio_tracks[0].isEnabled() &&
- audio_tracks[0].source().getReadyState() !=
+ !audio_tracks_.isEmpty() &&
+ MediaStreamAudioTrack::From(audio_tracks_[0]) &&
+ audio_tracks_[0].isEnabled() &&
+ audio_tracks_[0].source().getReadyState() !=
blink::WebMediaStreamSource::ReadyStateEnded;
if (!use_video_tracks && !use_audio_tracks) {
@@ -196,10 +196,10 @@ bool MediaRecorderHandler::start(int timeslice) {
if (use_video_tracks) {
// TODO(mcasas): The muxer API supports only one video track. Extend it to
// several video tracks, see http://crbug.com/528523.
- LOG_IF(WARNING, video_tracks.size() > 1u)
+ LOG_IF(WARNING, video_tracks_.size() > 1u)
<< "Recording multiple video tracks is not implemented. "
<< "Only recording first video track.";
- const blink::WebMediaStreamTrack& video_track = video_tracks[0];
+ const blink::WebMediaStreamTrack& video_track = video_tracks_[0];
if (video_track.isNull())
return false;
@@ -214,10 +214,10 @@ bool MediaRecorderHandler::start(int timeslice) {
if (use_audio_tracks) {
// TODO(ajose): The muxer API supports only one audio track. Extend it to
// several tracks.
- LOG_IF(WARNING, audio_tracks.size() > 1u)
+ LOG_IF(WARNING, audio_tracks_.size() > 1u)
<< "Recording multiple audio"
<< " tracks is not implemented. Only recording first audio track.";
- const blink::WebMediaStreamTrack& audio_track = audio_tracks[0];
+ const blink::WebMediaStreamTrack& audio_track = audio_tracks_[0];
if (audio_track.isNull())
return false;
@@ -237,6 +237,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 +273,11 @@ void MediaRecorderHandler::OnEncodedVideo(
TimeTicks timestamp,
bool is_key_frame) {
DCHECK(main_render_thread_checker_.CalledOnValidThread());
+
+ if (UpdateTracksAndCheckIfChanged()) {
+ 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 +292,11 @@ void MediaRecorderHandler::OnEncodedAudio(
std::unique_ptr<std::string> encoded_data,
base::TimeTicks timestamp) {
DCHECK(main_render_thread_checker_.CalledOnValidThread());
+
+ if (UpdateTracksAndCheckIfChanged()) {
+ 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 +324,41 @@ void MediaRecorderHandler::WriteData(base::StringPiece data) {
(now - TimeTicks::UnixEpoch()).InMillisecondsF());
}
+bool MediaRecorderHandler::UpdateTracksAndCheckIfChanged() {
+ DCHECK(main_render_thread_checker_.CalledOnValidThread());
+
+ blink::WebVector<blink::WebMediaStreamTrack> video_tracks, audio_tracks;
+ media_stream_.videoTracks(video_tracks);
+ media_stream_.audioTracks(audio_tracks);
+
+ bool video_tracks_changed = video_tracks_.size() != video_tracks.size();
+ bool audio_tracks_changed = audio_tracks_.size() != audio_tracks.size();
+
+ if (!video_tracks_changed) {
+ for (size_t i = 0; i < video_tracks.size(); ++i) {
+ if (video_tracks_[i].id() != video_tracks[i].id()) {
+ video_tracks_changed = true;
+ break;
+ }
+ }
+ }
+ if (!video_tracks_changed && !audio_tracks_changed) {
+ for (size_t i = 0; i < audio_tracks.size(); ++i) {
+ if (audio_tracks_[i].id() != audio_tracks[i].id()) {
+ audio_tracks_changed = true;
+ break;
+ }
+ }
+ }
+
+ if (video_tracks_changed)
+ video_tracks_ = video_tracks;
+ if (audio_tracks_changed)
+ audio_tracks_ = audio_tracks;
+
+ return video_tracks_changed || audio_tracks_changed;
+}
+
void MediaRecorderHandler::OnVideoFrameForTesting(
const scoped_refptr<media::VideoFrame>& frame,
const TimeTicks& timestamp) {

Powered by Google App Engine
This is Rietveld 408576698