Chromium Code Reviews| Index: content/renderer/media/media_recorder_handler.cc |
| diff --git a/content/renderer/media/media_recorder_handler.cc b/content/renderer/media/media_recorder_handler.cc |
| index e5c8ccfb6d530019dbab4d8afd61803d14e0b9ee..eef1bbb354e907c5763163d24e20f397720e532d 100644 |
| --- a/content/renderer/media/media_recorder_handler.cc |
| +++ b/content/renderer/media/media_recorder_handler.cc |
| @@ -7,8 +7,11 @@ |
| #include "base/bind.h" |
| #include "base/location.h" |
| #include "base/logging.h" |
| +#include "content/renderer/media/audio_track_recorder.h" |
| #include "content/renderer/media/video_track_recorder.h" |
| #include "content/renderer/media/webrtc_uma_histograms.h" |
| +#include "media/audio/audio_parameters.h" |
| +#include "media/base/audio_bus.h" |
| #include "media/base/bind_to_current_loop.h" |
| #include "media/base/video_frame.h" |
| #include "media/capture/webm_muxer.h" |
| @@ -24,9 +27,7 @@ MediaRecorderHandler::MediaRecorderHandler() |
| : use_vp9_(false), |
| recording_(false), |
| client_(nullptr), |
| - weak_factory_(this) { |
| - DVLOG(3) << __FUNCTION__; |
| -} |
| + weak_factory_(this) {} |
| MediaRecorderHandler::~MediaRecorderHandler() { |
| DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| @@ -38,9 +39,13 @@ MediaRecorderHandler::~MediaRecorderHandler() { |
| bool MediaRecorderHandler::canSupportMimeType( |
| const blink::WebString& mimeType) { |
| DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| - // TODO(mcasas): So far only empty or "video/vp{8,9}" are supported. |
| + // TODO(ajose): Not sure about some of these... |
| return mimeType.isEmpty() || mimeType.utf8().compare("video/vp8") == 0 || |
| - mimeType.utf8().compare("video/vp9") == 0; |
| + mimeType.utf8().compare("video/vp9") == 0 || |
| + mimeType.utf8().compare("audio/opus") == 0 || |
| + mimeType.utf8().compare("video/opus") == 0 || |
| + mimeType.utf8().compare("video/webm") == 0 || |
| + mimeType.utf8().compare("audio/webm") == 0; |
| } |
| bool MediaRecorderHandler::initialize( |
| @@ -80,36 +85,55 @@ bool MediaRecorderHandler::start(int timeslice) { |
| timeslice_ = TimeDelta::FromMilliseconds(timeslice); |
| slice_origin_timestamp_ = TimeTicks::Now(); |
| - webm_muxer_.reset( |
| - new media::WebmMuxer(use_vp9_ ? media::kCodecVP9 : media::kCodecVP8, |
| - base::Bind(&MediaRecorderHandler::WriteData, |
| - weak_factory_.GetWeakPtr()))); |
| - |
| - blink::WebVector<blink::WebMediaStreamTrack> video_tracks; |
| + blink::WebVector<blink::WebMediaStreamTrack> video_tracks, audio_tracks; |
| media_stream_.videoTracks(video_tracks); |
| + media_stream_.audioTracks(audio_tracks); |
| - if (video_tracks.isEmpty()) { |
| - // TODO(mcasas): Add audio_tracks and update the code in this function |
| - // correspondingly, see http://crbug.com/528519. As of now, only video |
| - // tracks are supported. |
| - LOG(WARNING) << "Recording no video tracks is not implemented"; |
| + if (video_tracks.isEmpty() && audio_tracks.isEmpty()) { |
| + LOG(WARNING) << __FUNCTION__ << ": no media tracks."; |
| return false; |
| } |
| - // 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) << "Recording multiple video" |
| - << " tracks is not implemented. Only recording first video track."; |
| - const blink::WebMediaStreamTrack& video_track = video_tracks[0]; |
| - if (video_track.isNull()) |
| - return false; |
| - const VideoTrackRecorder::OnEncodedVideoCB on_encoded_video_cb = |
| - media::BindToCurrentLoop(base::Bind(&MediaRecorderHandler::OnEncodedVideo, |
| - weak_factory_.GetWeakPtr())); |
| + webm_muxer_.reset(new media::WebmMuxer( |
| + use_vp9_ ? media::kCodecVP9 : media::kCodecVP8, video_tracks.size(), |
| + audio_tracks.size(), base::Bind(&MediaRecorderHandler::WriteData, |
| + weak_factory_.GetWeakPtr()))); |
| + |
| + if (!video_tracks.isEmpty()) { |
| + // 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) |
| + << "Recording multiple video tracks is not implemented. " |
| + << "Only recording first video track."; |
| + const blink::WebMediaStreamTrack& video_track = video_tracks[0]; |
| + if (video_track.isNull()) |
| + return false; |
| + |
| + const VideoTrackRecorder::OnEncodedVideoCB on_encoded_video_cb = |
| + media::BindToCurrentLoop(base::Bind( |
| + &MediaRecorderHandler::OnEncodedVideo, weak_factory_.GetWeakPtr())); |
| + |
| + video_recorders_.push_back( |
| + new VideoTrackRecorder(use_vp9_, video_track, on_encoded_video_cb)); |
| + } |
| - video_recorders_.push_back(new VideoTrackRecorder(use_vp9_, |
| - video_track, |
| - on_encoded_video_cb)); |
| + if (!audio_tracks.isEmpty()) { |
| + // TODO(ajose): The muxer API supports only one audio track. Extend it to |
| + // several tracks. |
| + 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]; |
| + if (audio_track.isNull()) |
| + return false; |
| + |
| + const AudioTrackRecorder::OnEncodedAudioCB on_encoded_audio_cb = |
| + media::BindToCurrentLoop(base::Bind( |
| + &MediaRecorderHandler::OnEncodedAudio, weak_factory_.GetWeakPtr())); |
| + |
| + audio_recorders_.push_back( |
| + new AudioTrackRecorder(audio_track, on_encoded_audio_cb)); |
| + } |
| recording_ = true; |
| return true; |
| @@ -122,6 +146,7 @@ void MediaRecorderHandler::stop() { |
| recording_ = false; |
| timeslice_ = TimeDelta::FromMilliseconds(0); |
| video_recorders_.clear(); |
| + audio_recorders_.clear(); |
| webm_muxer_.reset(); |
| } |
| @@ -153,6 +178,15 @@ void MediaRecorderHandler::OnEncodedVideo( |
| is_key_frame); |
| } |
| +void MediaRecorderHandler::OnEncodedAudio(const media::AudioParameters& params, |
| + scoped_ptr<std::string> encoded_data, |
| + base::TimeTicks timestamp) { |
| + DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| + if (webm_muxer_) { |
| + webm_muxer_->OnEncodedAudio(params, encoded_data.Pass(), timestamp); |
| + } |
|
mcasas
2015/11/10 18:18:58
No {}
ajose
2015/11/18 00:11:52
Done.
|
| +} |
| + |
| void MediaRecorderHandler::WriteData(base::StringPiece data) { |
| DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| @@ -177,4 +211,12 @@ void MediaRecorderHandler::OnVideoFrameForTesting( |
| recorder->OnVideoFrameForTesting(frame, timestamp); |
| } |
| +void MediaRecorderHandler::OnAudioBusForTesting( |
| + const media::AudioBus& audio_bus, |
| + const base::TimeTicks& timestamp) { |
| + for (auto* recorder : audio_recorders_) |
| + // recorder->OnVideoFrameForTesting(frame, timestamp); |
| + recorder->OnData(audio_bus, timestamp); |
| +} |
| + |
| } // namespace content |