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

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

Issue 1407083006: Update MediaRecorderHandler to use AudioTrackRecorder (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add layout tests Created 5 years, 1 month 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/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

Powered by Google App Engine
This is Rietveld 408576698