OLD | NEW |
---|---|
1 // Copyright (c) 2012 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/pepper/pepper_platform_video_capture.h" | 5 #include "content/renderer/pepper/pepper_platform_image_capture.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback_helpers.h" | |
8 #include "base/logging.h" | 9 #include "base/logging.h" |
9 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
10 #include "content/renderer/media/video_capture_impl_manager.h" | 11 #include "content/renderer/media/video_capture_impl_manager.h" |
12 #include "content/renderer/pepper/gfx_conversion.h" | |
13 #include "content/renderer/pepper/pepper_image_capture_host.h" | |
11 #include "content/renderer/pepper/pepper_media_device_manager.h" | 14 #include "content/renderer/pepper/pepper_media_device_manager.h" |
12 #include "content/renderer/pepper/pepper_video_capture_host.h" | |
13 #include "content/renderer/render_frame_impl.h" | 15 #include "content/renderer/render_frame_impl.h" |
14 #include "content/renderer/render_thread_impl.h" | 16 #include "content/renderer/render_thread_impl.h" |
15 #include "media/base/bind_to_current_loop.h" | 17 #include "media/base/bind_to_current_loop.h" |
16 #include "url/gurl.h" | 18 #include "url/gurl.h" |
17 | 19 |
18 namespace content { | 20 namespace content { |
19 | 21 |
20 PepperPlatformVideoCapture::PepperPlatformVideoCapture( | 22 PepperPlatformImageCapture::PepperPlatformImageCapture( |
21 int render_frame_id, | 23 int render_frame_id, |
22 const std::string& device_id, | 24 const std::string& device_id, |
23 const GURL& document_url, | 25 const GURL& document_url, |
24 PepperVideoCaptureHost* handler) | 26 PepperImageCaptureHost* handler) |
25 : render_frame_id_(render_frame_id), | 27 : render_frame_id_(render_frame_id), |
26 device_id_(device_id), | 28 device_id_(device_id), |
27 session_id_(0), | 29 session_id_(0), |
28 handler_(handler), | 30 handler_(handler), |
29 pending_open_device_(false), | 31 pending_open_device_(false), |
30 pending_open_device_id_(-1), | 32 pending_open_device_id_(-1), |
31 weak_factory_(this) { | 33 weak_factory_(this) { |
32 // We need to open the device and obtain the label and session ID before | 34 // We need to open the device and obtain the label and session ID before |
33 // initializing. | 35 // initializing. |
34 PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager(); | 36 PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager(); |
35 if (device_manager) { | 37 if (device_manager) { |
36 pending_open_device_id_ = device_manager->OpenDevice( | 38 pending_open_device_id_ = device_manager->OpenDevice( |
37 PP_DEVICETYPE_DEV_VIDEOCAPTURE, | 39 PP_DEVICETYPE_DEV_VIDEOCAPTURE, device_id, document_url, |
38 device_id, | 40 base::Bind(&PepperPlatformImageCapture::OnDeviceOpened, |
39 document_url, | |
40 base::Bind(&PepperPlatformVideoCapture::OnDeviceOpened, | |
41 weak_factory_.GetWeakPtr())); | 41 weak_factory_.GetWeakPtr())); |
42 pending_open_device_ = true; | 42 pending_open_device_ = true; |
43 } | 43 } |
44 } | 44 } |
45 | 45 |
46 void PepperPlatformVideoCapture::StartCapture( | 46 void PepperPlatformImageCapture::GetPreviewSizes() { |
47 const media::VideoCaptureParams& params) { | |
48 DCHECK(thread_checker_.CalledOnValidThread()); | 47 DCHECK(thread_checker_.CalledOnValidThread()); |
49 if (!stop_capture_cb_.is_null()) | |
50 return; | |
51 VideoCaptureImplManager* manager = | 48 VideoCaptureImplManager* manager = |
52 RenderThreadImpl::current()->video_capture_impl_manager(); | 49 RenderThreadImpl::current()->video_capture_impl_manager(); |
53 stop_capture_cb_ = | 50 manager->GetDeviceSupportedFormats( |
54 manager->StartCapture(session_id_, | 51 session_id_, |
55 params, | 52 media::BindToCurrentLoop(base::Bind( |
56 media::BindToCurrentLoop(base::Bind( | 53 &PepperPlatformImageCapture::OnDeviceSupportedFormatsEnumerated, |
57 &PepperPlatformVideoCapture::OnStateUpdate, | 54 weak_factory_.GetWeakPtr()))); |
58 weak_factory_.GetWeakPtr())), | |
59 media::BindToCurrentLoop(base::Bind( | |
60 &PepperPlatformVideoCapture::OnFrameReady, | |
61 weak_factory_.GetWeakPtr()))); | |
62 } | 55 } |
63 | 56 |
64 void PepperPlatformVideoCapture::StopCapture() { | 57 void PepperPlatformImageCapture::DetachEventHandler() { |
65 DCHECK(thread_checker_.CalledOnValidThread()); | 58 DCHECK(thread_checker_.CalledOnValidThread()); |
66 if (stop_capture_cb_.is_null()) | |
67 return; | |
68 stop_capture_cb_.Run(); | |
69 stop_capture_cb_.Reset(); | |
70 } | |
71 | |
72 void PepperPlatformVideoCapture::DetachEventHandler() { | |
73 handler_ = NULL; | 59 handler_ = NULL; |
74 StopCapture(); | |
75 if (!release_device_cb_.is_null()) { | 60 if (!release_device_cb_.is_null()) { |
76 release_device_cb_.Run(); | 61 base::ResetAndReturn(&release_device_cb_).Run(); |
77 release_device_cb_.Reset(); | |
78 } | 62 } |
79 if (!label_.empty()) { | 63 if (!label_.empty()) { |
80 PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager(); | 64 PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager(); |
81 if (device_manager) | 65 if (device_manager) |
82 device_manager->CloseDevice(label_); | 66 device_manager->CloseDevice(label_); |
83 label_.clear(); | 67 label_.clear(); |
84 } | 68 } |
85 if (pending_open_device_) { | 69 if (pending_open_device_) { |
86 PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager(); | 70 PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager(); |
87 if (device_manager) | 71 if (device_manager) |
88 device_manager->CancelOpenDevice(pending_open_device_id_); | 72 device_manager->CancelOpenDevice(pending_open_device_id_); |
89 pending_open_device_ = false; | 73 pending_open_device_ = false; |
90 pending_open_device_id_ = -1; | 74 pending_open_device_id_ = -1; |
91 } | 75 } |
92 } | 76 } |
93 | 77 |
94 PepperPlatformVideoCapture::~PepperPlatformVideoCapture() { | 78 PepperPlatformImageCapture::~PepperPlatformImageCapture() { |
95 DCHECK(stop_capture_cb_.is_null()); | 79 DCHECK(thread_checker_.CalledOnValidThread()); |
96 DCHECK(release_device_cb_.is_null()); | 80 DCHECK(release_device_cb_.is_null()); |
97 DCHECK(label_.empty()); | 81 DCHECK(label_.empty()); |
98 DCHECK(!pending_open_device_); | 82 DCHECK(!pending_open_device_); |
99 } | 83 } |
100 | 84 |
101 void PepperPlatformVideoCapture::OnDeviceOpened(int request_id, | 85 void PepperPlatformImageCapture::OnDeviceOpened(int request_id, |
102 bool succeeded, | 86 bool succeeded, |
103 const std::string& label) { | 87 const std::string& label) { |
88 DCHECK(thread_checker_.CalledOnValidThread()); | |
89 DCHECK(handler_); | |
90 | |
104 pending_open_device_ = false; | 91 pending_open_device_ = false; |
105 pending_open_device_id_ = -1; | 92 pending_open_device_id_ = -1; |
106 | 93 |
107 PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager(); | 94 PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager(); |
108 succeeded = succeeded && device_manager; | 95 succeeded = succeeded && device_manager; |
109 if (succeeded) { | 96 if (succeeded) { |
110 label_ = label; | 97 label_ = label; |
111 session_id_ = device_manager->GetSessionID( | 98 session_id_ = |
112 PP_DEVICETYPE_DEV_VIDEOCAPTURE, label); | 99 device_manager->GetSessionID(PP_DEVICETYPE_DEV_VIDEOCAPTURE, label); |
113 VideoCaptureImplManager* manager = | 100 VideoCaptureImplManager* manager = |
114 RenderThreadImpl::current()->video_capture_impl_manager(); | 101 RenderThreadImpl::current()->video_capture_impl_manager(); |
115 release_device_cb_ = manager->UseDevice(session_id_); | 102 release_device_cb_ = manager->UseDevice(session_id_); |
116 } | 103 } |
117 | 104 |
118 if (handler_) | 105 handler_->OnInitialized(succeeded); |
119 handler_->OnInitialized(succeeded); | |
120 } | 106 } |
121 | 107 |
122 void PepperPlatformVideoCapture::OnStateUpdate(VideoCaptureState state) { | 108 void PepperPlatformImageCapture::OnDeviceSupportedFormatsEnumerated( |
123 if (!handler_) | 109 const media::VideoCaptureFormats& formats) { |
124 return; | 110 DCHECK(thread_checker_.CalledOnValidThread()); |
125 switch (state) { | 111 DCHECK(handler_); |
126 case VIDEO_CAPTURE_STATE_STARTED: | 112 |
127 handler_->OnStarted(); | 113 std::vector<PP_Size> sizes; |
128 break; | 114 for (media::VideoCaptureFormats::const_iterator it = formats.begin(); |
dcheng
2015/02/12 21:47:20
Consider using a for each?
for (const auto& forma
Justin Chuang
2015/02/16 19:15:24
Done. Interesting.
| |
129 case VIDEO_CAPTURE_STATE_STOPPED: | 115 it != formats.end(); it++) { |
130 handler_->OnStopped(); | 116 sizes.push_back(PP_FromGfxSize(it->frame_size)); |
131 break; | |
132 case VIDEO_CAPTURE_STATE_PAUSED: | |
133 handler_->OnPaused(); | |
134 break; | |
135 case VIDEO_CAPTURE_STATE_ERROR: | |
136 handler_->OnError(); | |
137 break; | |
138 default: | |
139 NOTREACHED() << "Unexpected state: " << state << "."; | |
140 } | 117 } |
118 handler_->OnPreviewSizesEnumerated(sizes); | |
141 } | 119 } |
142 | 120 |
143 void PepperPlatformVideoCapture::OnFrameReady( | 121 PepperMediaDeviceManager* PepperPlatformImageCapture::GetMediaDeviceManager() { |
144 const scoped_refptr<media::VideoFrame>& frame, | |
145 const media::VideoCaptureFormat& format, | |
146 const base::TimeTicks& estimated_capture_time) { | |
147 if (handler_ && !stop_capture_cb_.is_null()) | |
148 handler_->OnFrameReady(frame, format); | |
149 } | |
150 | |
151 PepperMediaDeviceManager* PepperPlatformVideoCapture::GetMediaDeviceManager() { | |
152 RenderFrameImpl* const render_frame = | 122 RenderFrameImpl* const render_frame = |
153 RenderFrameImpl::FromRoutingID(render_frame_id_); | 123 RenderFrameImpl::FromRoutingID(render_frame_id_); |
154 return render_frame ? | 124 return render_frame |
155 PepperMediaDeviceManager::GetForRenderFrame(render_frame).get() : NULL; | 125 ? PepperMediaDeviceManager::GetForRenderFrame(render_frame).get() |
126 : NULL; | |
156 } | 127 } |
157 | 128 |
158 } // namespace content | 129 } // namespace content |
OLD | NEW |