| 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 #include "third_party/WebKit/public/platform/WebMediaRecorderHandlerClient.h" | 
|  | 14 // | 
|  | 15 namespace content { | 
|  | 16 | 
|  | 17 MediaRecorderHandler::MediaRecorderHandler() | 
|  | 18     : recording_(false), client_(nullptr), weak_factory_(this) { | 
|  | 19   DVLOG(3) << __FUNCTION__; | 
|  | 20 } | 
|  | 21 | 
|  | 22 MediaRecorderHandler::~MediaRecorderHandler() { | 
|  | 23   DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 
|  | 24   // Send a |last_in_slice| to our |client_|. | 
|  | 25   if (client_) | 
|  | 26     client_->writeData(nullptr, 0u, true); | 
|  | 27 } | 
|  | 28 | 
|  | 29 bool MediaRecorderHandler::canSupportMimeType( | 
|  | 30     const blink::WebString& mimeType) { | 
|  | 31   DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 
|  | 32   NOTIMPLEMENTED(); | 
|  | 33   return false; | 
|  | 34 } | 
|  | 35 | 
|  | 36 bool MediaRecorderHandler::initialize( | 
|  | 37     blink::WebMediaRecorderHandlerClient* client, | 
|  | 38     const blink::WebMediaStream& media_stream, | 
|  | 39     const blink::WebString& mimeType) { | 
|  | 40   DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 
|  | 41   // TODO(mcasas): check canSupportMimeType(mimeType) is true. | 
|  | 42   media_stream_ = media_stream; | 
|  | 43   DCHECK(client); | 
|  | 44   client_ = client; | 
|  | 45 | 
|  | 46   return true; | 
|  | 47 } | 
|  | 48 | 
|  | 49 bool MediaRecorderHandler::start() { | 
|  | 50   DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 
|  | 51   DCHECK(!recording_); | 
|  | 52   return start(0); | 
|  | 53 } | 
|  | 54 | 
|  | 55 bool MediaRecorderHandler::start(int timeslice) { | 
|  | 56   DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 
|  | 57   DCHECK(!recording_); | 
|  | 58   DCHECK(!media_stream_.isNull()); | 
|  | 59 | 
|  | 60   webm_muxer_.reset(new media::WebmMuxer(media::BindToCurrentLoop(base::Bind( | 
|  | 61       &MediaRecorderHandler::WriteData, weak_factory_.GetWeakPtr())))); | 
|  | 62   DCHECK(webm_muxer_); | 
|  | 63 | 
|  | 64   blink::WebVector<blink::WebMediaStreamTrack> video_tracks; | 
|  | 65   media_stream_.videoTracks(video_tracks); | 
|  | 66   DCHECK(!video_tracks.isEmpty()); | 
|  | 67 | 
|  | 68   for (const auto& video_track : video_tracks) { | 
|  | 69     DCHECK(!video_track.isNull()); | 
|  | 70 | 
|  | 71     const VideoTrackRecorder::OnEncodedVideoCB on_encoded_video_cb = base::Bind( | 
|  | 72         &media::WebmMuxer::OnEncodedVideo, base::Unretained(webm_muxer_.get())); | 
|  | 73 | 
|  | 74     video_recorders_.push_back(new VideoTrackRecorder(video_track, | 
|  | 75                                                       on_encoded_video_cb)); | 
|  | 76   } | 
|  | 77 | 
|  | 78   // TODO(mcasas): Add audio_tracks. | 
|  | 79 | 
|  | 80   recording_ = true; | 
|  | 81   return true; | 
|  | 82 } | 
|  | 83 | 
|  | 84 void MediaRecorderHandler::stop() { | 
|  | 85   DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 
|  | 86   DCHECK(recording_); | 
|  | 87 | 
|  | 88   recording_ = false; | 
|  | 89   video_recorders_.clear(); | 
|  | 90   webm_muxer_.reset(NULL); | 
|  | 91 } | 
|  | 92 | 
|  | 93 void MediaRecorderHandler::pause() { | 
|  | 94   DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 
|  | 95   DCHECK(recording_); | 
|  | 96   recording_ = false; | 
|  | 97   NOTIMPLEMENTED(); | 
|  | 98 } | 
|  | 99 | 
|  | 100 void MediaRecorderHandler::resume() { | 
|  | 101   DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 
|  | 102   DCHECK(!recording_); | 
|  | 103   recording_ = true; | 
|  | 104   NOTIMPLEMENTED(); | 
|  | 105 } | 
|  | 106 | 
|  | 107 void MediaRecorderHandler::WriteData(const base::StringPiece& data) { | 
|  | 108   DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 
|  | 109   client_->writeData(data.data(), data.size(), false  /* lastInslice */); | 
|  | 110 } | 
|  | 111 | 
|  | 112 void MediaRecorderHandler::OnVideoFrameForTesting( | 
|  | 113     const scoped_refptr<media::VideoFrame>& frame, | 
|  | 114     const base::TimeTicks& timestamp) { | 
|  | 115   for (auto* recorder : video_recorders_) | 
|  | 116     recorder->OnVideoFrameForTesting(frame, timestamp); | 
|  | 117 } | 
|  | 118 | 
|  | 119 }  // namespace content | 
| OLD | NEW | 
|---|