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 |