| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/canvas_capture_handler.h" | 5 #include "content/renderer/media/canvas_capture_handler.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 11 #include "base/macros.h" | 11 #include "base/macros.h" |
| 12 #include "base/rand_util.h" | 12 #include "base/rand_util.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "content/public/renderer/render_thread.h" | 14 #include "content/public/renderer/render_thread.h" |
| 15 #include "content/renderer/media/media_stream_video_capturer_source.h" | 15 #include "content/renderer/media/media_stream_video_capturer_source.h" |
| 16 #include "content/renderer/media/media_stream_video_source.h" | 16 #include "content/renderer/media/media_stream_video_source.h" |
| 17 #include "content/renderer/media/media_stream_video_track.h" | 17 #include "content/renderer/media/media_stream_video_track.h" |
| 18 #include "content/renderer/media/webrtc_uma_histograms.h" | 18 #include "content/renderer/media/webrtc_uma_histograms.h" |
| 19 #include "content/renderer/render_thread_impl.h" | 19 #include "content/renderer/render_thread_impl.h" |
| 20 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | 20 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" |
| 21 #include "third_party/WebKit/public/platform/WebString.h" | 21 #include "third_party/WebKit/public/platform/WebString.h" |
| 22 #include "third_party/libyuv/include/libyuv.h" | 22 #include "third_party/libyuv/include/libyuv.h" |
| 23 | 23 |
| 24 namespace content { | 24 namespace content { |
| 25 | 25 |
| 26 class CanvasCaptureHandler::VideoCapturerSource | 26 // Implementation VideoCapturerSource that is owned by |
| 27 : public media::VideoCapturerSource { | 27 // MediaStreamVideoCapturerSource and delegates the Start/Stop calls to |
| 28 // CanvasCaptureHandler. |
| 29 // This class is single threaded and pinned to main render thread. |
| 30 class VideoCapturerSource : public media::VideoCapturerSource { |
| 28 public: | 31 public: |
| 29 explicit VideoCapturerSource(base::WeakPtr<CanvasCaptureHandler> | 32 explicit VideoCapturerSource(base::WeakPtr<CanvasCaptureHandler> |
| 30 canvas_handler, | 33 canvas_handler, |
| 31 double frame_rate) | 34 double frame_rate) |
| 32 : frame_rate_(frame_rate), | 35 : frame_rate_(frame_rate), |
| 33 canvas_handler_(canvas_handler) {} | 36 canvas_handler_(canvas_handler) {} |
| 34 | 37 |
| 35 protected: | 38 protected: |
| 36 void GetCurrentSupportedFormats( | 39 void GetCurrentSupportedFormats( |
| 37 int max_requested_width, | 40 int max_requested_width, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 51 } | 54 } |
| 52 void StartCapture(const media::VideoCaptureParams& params, | 55 void StartCapture(const media::VideoCaptureParams& params, |
| 53 const VideoCaptureDeliverFrameCB& frame_callback, | 56 const VideoCaptureDeliverFrameCB& frame_callback, |
| 54 const RunningCallback& running_callback) override { | 57 const RunningCallback& running_callback) override { |
| 55 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 58 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| 56 canvas_handler_->StartVideoCapture(params, frame_callback, | 59 canvas_handler_->StartVideoCapture(params, frame_callback, |
| 57 running_callback); | 60 running_callback); |
| 58 } | 61 } |
| 59 void StopCapture() override { | 62 void StopCapture() override { |
| 60 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 63 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| 61 canvas_handler_->StopVideoCapture(); | 64 if (canvas_handler_.get()) |
| 65 canvas_handler_->StopVideoCapture(); |
| 62 } | 66 } |
| 63 | 67 |
| 64 private: | 68 private: |
| 65 double frame_rate_; | 69 const double frame_rate_; |
| 66 // Bound to Main Render thread. | 70 // Bound to Main Render thread. |
| 67 base::ThreadChecker main_render_thread_checker_; | 71 base::ThreadChecker main_render_thread_checker_; |
| 68 // CanvasCaptureHandler is owned by CanvasDrawListener in blink and | 72 // CanvasCaptureHandler is owned by CanvasDrawListener in blink and might be |
| 69 // guaranteed to be alive during the lifetime of this class. | 73 // destroyed before StopCapture() call. |
| 70 base::WeakPtr<CanvasCaptureHandler> canvas_handler_; | 74 base::WeakPtr<CanvasCaptureHandler> canvas_handler_; |
| 71 }; | 75 }; |
| 72 | 76 |
| 73 class CanvasCaptureHandler::CanvasCaptureHandlerDelegate { | 77 class CanvasCaptureHandler::CanvasCaptureHandlerDelegate { |
| 74 public: | 78 public: |
| 75 explicit CanvasCaptureHandlerDelegate( | 79 explicit CanvasCaptureHandlerDelegate( |
| 76 media::VideoCapturerSource::VideoCaptureDeliverFrameCB new_frame_callback) | 80 media::VideoCapturerSource::VideoCaptureDeliverFrameCB new_frame_callback) |
| 77 : new_frame_callback_(new_frame_callback), | 81 : new_frame_callback_(new_frame_callback), |
| 78 weak_ptr_factory_(this) { | 82 weak_ptr_factory_(this) { |
| 79 io_thread_checker_.DetachFromThread(); | 83 io_thread_checker_.DetachFromThread(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 106 CanvasCaptureHandler::CanvasCaptureHandler( | 110 CanvasCaptureHandler::CanvasCaptureHandler( |
| 107 const blink::WebSize& size, | 111 const blink::WebSize& size, |
| 108 double frame_rate, | 112 double frame_rate, |
| 109 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, | 113 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, |
| 110 blink::WebMediaStreamTrack* track) | 114 blink::WebMediaStreamTrack* track) |
| 111 : ask_for_new_frame_(false), | 115 : ask_for_new_frame_(false), |
| 112 size_(size), | 116 size_(size), |
| 113 io_task_runner_(io_task_runner), | 117 io_task_runner_(io_task_runner), |
| 114 weak_ptr_factory_(this) { | 118 weak_ptr_factory_(this) { |
| 115 scoped_ptr<media::VideoCapturerSource> video_source( | 119 scoped_ptr<media::VideoCapturerSource> video_source( |
| 116 new CanvasCaptureHandler::VideoCapturerSource( | 120 new VideoCapturerSource(weak_ptr_factory_.GetWeakPtr(), frame_rate)); |
| 117 weak_ptr_factory_.GetWeakPtr(), frame_rate)); | |
| 118 AddVideoCapturerSourceToVideoTrack(std::move(video_source), track); | 121 AddVideoCapturerSourceToVideoTrack(std::move(video_source), track); |
| 119 } | 122 } |
| 120 | 123 |
| 121 CanvasCaptureHandler::~CanvasCaptureHandler() { | 124 CanvasCaptureHandler::~CanvasCaptureHandler() { |
| 122 DVLOG(3) << __FUNCTION__; | 125 DVLOG(3) << __FUNCTION__; |
| 123 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 126 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| 124 io_task_runner_->DeleteSoon(FROM_HERE, delegate_.release()); | 127 io_task_runner_->DeleteSoon(FROM_HERE, delegate_.release()); |
| 125 } | 128 } |
| 126 | 129 |
| 127 // static | 130 // static |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 | 241 |
| 239 web_track->initialize(webkit_source); | 242 web_track->initialize(webkit_source); |
| 240 blink::WebMediaConstraints constraints; | 243 blink::WebMediaConstraints constraints; |
| 241 constraints.initialize(); | 244 constraints.initialize(); |
| 242 web_track->setExtraData(new MediaStreamVideoTrack( | 245 web_track->setExtraData(new MediaStreamVideoTrack( |
| 243 media_stream_source.release(), constraints, | 246 media_stream_source.release(), constraints, |
| 244 MediaStreamVideoSource::ConstraintsCallback(), true)); | 247 MediaStreamVideoSource::ConstraintsCallback(), true)); |
| 245 } | 248 } |
| 246 | 249 |
| 247 } // namespace content | 250 } // namespace content |
| OLD | NEW |