Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/renderer/media/media_recorder_handler.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/location.h" | |
| 9 #include "base/logging.h" | |
| 10 #include "content/renderer/media/video_track_recorder.h" | |
| 11 #include "media/base/bind_to_current_loop.h" | |
| 12 #include "media/capture/webm_muxer.h" | |
| 13 // | |
| 14 namespace content { | |
| 15 | |
| 16 MediaRecorderHandler::MediaRecorderHandler() | |
| 17 : recording_(false), client_(nullptr), weak_factory_(this) { | |
| 18 DVLOG(3) << __FUNCTION__; | |
| 19 } | |
| 20 | |
| 21 MediaRecorderHandler::~MediaRecorderHandler() { | |
| 22 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | |
| 23 // Send a |last_in_slice| to our |client_|. | |
| 24 if (client_) | |
| 25 client_->writeData(nullptr, 0u, true); | |
| 26 } | |
| 27 | |
| 28 bool MediaRecorderHandler::canSupportMimeType( | |
| 29 const blink::WebString& mimeType) { | |
| 30 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | |
| 31 NOTIMPLEMENTED(); | |
|
miu
2015/09/04 21:48:52
Shouldn't this return true iff mimeType == "video/
mcasas
2015/09/05 02:43:02
Done.
| |
| 32 return false; | |
| 33 } | |
| 34 | |
| 35 bool MediaRecorderHandler::initialize( | |
| 36 blink::WebMediaRecorderHandlerClient* client, | |
| 37 const blink::WebMediaStream& media_stream, | |
| 38 const blink::WebString& mimeType) { | |
| 39 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | |
| 40 // 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.
| |
| 41 media_stream_ = media_stream; | |
| 42 DCHECK(client); | |
| 43 client_ = client; | |
| 44 | |
| 45 return true; | |
| 46 } | |
| 47 | |
| 48 bool MediaRecorderHandler::start() { | |
| 49 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | |
| 50 DCHECK(!recording_); | |
| 51 return start(0); | |
| 52 } | |
| 53 | |
| 54 bool MediaRecorderHandler::start(int timeslice) { | |
| 55 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | |
| 56 DCHECK(!recording_); | |
| 57 DCHECK(!media_stream_.isNull()); | |
| 58 | |
| 59 webm_muxer_.reset(new media::WebmMuxer(media::BindToCurrentLoop(base::Bind( | |
| 60 &MediaRecorderHandler::WriteData, weak_factory_.GetWeakPtr())))); | |
| 61 DCHECK(webm_muxer_); | |
| 62 | |
| 63 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; | |
| 64 media_stream_.videoTracks(video_tracks); | |
| 65 | |
| 66 // 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.
| |
| 67 // For the time being, only video tracks are supported. | |
| 68 DCHECK(!video_tracks.isEmpty()); | |
| 69 // 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.
| |
| 70 // several video tracks. | |
| 71 DCHECK_EQ(1u, video_tracks.size()); | |
| 72 | |
| 73 for (const auto& video_track : video_tracks) { | |
| 74 DCHECK(!video_track.isNull()); | |
| 75 | |
| 76 const VideoTrackRecorder::OnEncodedVideoCB on_encoded_video_cb = base::Bind( | |
| 77 &media::WebmMuxer::OnEncodedVideo, base::Unretained(webm_muxer_.get())); | |
| 78 | |
| 79 video_recorders_.push_back(new VideoTrackRecorder(video_track, | |
| 80 on_encoded_video_cb)); | |
| 81 } | |
| 82 | |
| 83 recording_ = true; | |
| 84 return true; | |
| 85 } | |
| 86 | |
| 87 void MediaRecorderHandler::stop() { | |
| 88 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | |
| 89 DCHECK(recording_); | |
| 90 | |
| 91 recording_ = false; | |
| 92 video_recorders_.clear(); | |
| 93 webm_muxer_.reset(NULL); | |
| 94 } | |
| 95 | |
| 96 void MediaRecorderHandler::pause() { | |
| 97 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | |
| 98 DCHECK(recording_); | |
| 99 recording_ = false; | |
| 100 NOTIMPLEMENTED(); | |
| 101 } | |
| 102 | |
| 103 void MediaRecorderHandler::resume() { | |
| 104 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | |
| 105 DCHECK(!recording_); | |
| 106 recording_ = true; | |
| 107 NOTIMPLEMENTED(); | |
| 108 } | |
| 109 | |
| 110 void MediaRecorderHandler::WriteData(const base::StringPiece& data) { | |
| 111 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | |
| 112 client_->writeData(data.data(), data.size(), false /* lastInSlice */); | |
| 113 } | |
| 114 | |
| 115 void MediaRecorderHandler::OnVideoFrameForTesting( | |
| 116 const scoped_refptr<media::VideoFrame>& frame, | |
| 117 const base::TimeTicks& timestamp) { | |
| 118 for (auto* recorder : video_recorders_) | |
| 119 recorder->OnVideoFrameForTesting(frame, timestamp); | |
| 120 } | |
| 121 | |
| 122 } // namespace content | |
| OLD | NEW |