Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: content/renderer/pepper/pepper_platform_image_capture.cc

Issue 848863002: PPAPI: implement GetSupportedPreviewSizes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update histogram.xml with pepper_hash_for_uma Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698