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 |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..749748447361d51f4f4c8d12dc81cc1fc2fdc5e8 |
| --- /dev/null |
| +++ b/content/renderer/media/media_recorder_handler.cc |
| @@ -0,0 +1,122 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/renderer/media/media_recorder_handler.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/location.h" |
| +#include "base/logging.h" |
| +#include "content/renderer/media/video_track_recorder.h" |
| +#include "media/base/bind_to_current_loop.h" |
| +#include "media/capture/webm_muxer.h" |
| +// |
| +namespace content { |
| + |
| +MediaRecorderHandler::MediaRecorderHandler() |
| + : recording_(false), client_(nullptr), weak_factory_(this) { |
| + DVLOG(3) << __FUNCTION__; |
| +} |
| + |
| +MediaRecorderHandler::~MediaRecorderHandler() { |
| + DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| + // Send a |last_in_slice| to our |client_|. |
| + if (client_) |
| + client_->writeData(nullptr, 0u, true); |
| +} |
| + |
| +bool MediaRecorderHandler::canSupportMimeType( |
| + const blink::WebString& mimeType) { |
| + DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| + NOTIMPLEMENTED(); |
|
miu
2015/09/04 21:48:52
Shouldn't this return true iff mimeType == "video/
mcasas
2015/09/05 02:43:02
Done.
|
| + return false; |
| +} |
| + |
| +bool MediaRecorderHandler::initialize( |
| + blink::WebMediaRecorderHandlerClient* client, |
| + const blink::WebMediaStream& media_stream, |
| + const blink::WebString& mimeType) { |
| + DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| + // TODO(mcasas): check canSupportMimeType(mimeType) is true. |
|
miu
2015/09/04 21:48:52
Ditto here (return false iff mimeType != "video/vp
mcasas
2015/09/05 02:43:01
Done.
|
| + media_stream_ = media_stream; |
| + DCHECK(client); |
| + client_ = client; |
| + |
| + return true; |
| +} |
| + |
| +bool MediaRecorderHandler::start() { |
| + DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| + DCHECK(!recording_); |
| + return start(0); |
| +} |
| + |
| +bool MediaRecorderHandler::start(int timeslice) { |
| + DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| + DCHECK(!recording_); |
| + DCHECK(!media_stream_.isNull()); |
| + |
| + webm_muxer_.reset(new media::WebmMuxer(media::BindToCurrentLoop(base::Bind( |
| + &MediaRecorderHandler::WriteData, weak_factory_.GetWeakPtr())))); |
| + DCHECK(webm_muxer_); |
| + |
| + blink::WebVector<blink::WebMediaStreamTrack> video_tracks; |
| + media_stream_.videoTracks(video_tracks); |
| + |
| + // TODO(mcasas): Add audio_tracks and update this DCHECK() correspondingly. |
|
miu
2015/09/04 21:48:52
crbug link?
mcasas
2015/09/05 02:43:01
Done.
|
| + // For the time being, only video tracks are supported. |
| + DCHECK(!video_tracks.isEmpty()); |
| + // TOOD(mcasas): The muxer API supports only one video track. Extend it to |
|
miu
2015/09/04 21:48:52
crbug link here too
mcasas
2015/09/05 02:43:01
Done.
|
| + // several video tracks. |
| + DCHECK_EQ(1u, video_tracks.size()); |
| + |
| + for (const auto& video_track : video_tracks) { |
| + DCHECK(!video_track.isNull()); |
| + |
| + const VideoTrackRecorder::OnEncodedVideoCB on_encoded_video_cb = base::Bind( |
| + &media::WebmMuxer::OnEncodedVideo, base::Unretained(webm_muxer_.get())); |
| + |
| + video_recorders_.push_back(new VideoTrackRecorder(video_track, |
| + on_encoded_video_cb)); |
| + } |
| + |
| + recording_ = true; |
| + return true; |
| +} |
| + |
| +void MediaRecorderHandler::stop() { |
| + DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| + DCHECK(recording_); |
| + |
| + recording_ = false; |
| + video_recorders_.clear(); |
| + webm_muxer_.reset(NULL); |
| +} |
| + |
| +void MediaRecorderHandler::pause() { |
| + DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| + DCHECK(recording_); |
| + recording_ = false; |
| + NOTIMPLEMENTED(); |
| +} |
| + |
| +void MediaRecorderHandler::resume() { |
| + DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| + DCHECK(!recording_); |
| + recording_ = true; |
| + NOTIMPLEMENTED(); |
| +} |
| + |
| +void MediaRecorderHandler::WriteData(const base::StringPiece& data) { |
| + DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| + client_->writeData(data.data(), data.size(), false /* lastInSlice */); |
| +} |
| + |
| +void MediaRecorderHandler::OnVideoFrameForTesting( |
| + const scoped_refptr<media::VideoFrame>& frame, |
| + const base::TimeTicks& timestamp) { |
| + for (auto* recorder : video_recorders_) |
| + recorder->OnVideoFrameForTesting(frame, timestamp); |
| +} |
| + |
| +} // namespace content |