OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 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 "chrome/browser/extensions/api/webcam_private/webcam_private_api.h" | |
6 | |
7 #include "chrome/common/extensions/api/webcam_private.h" | |
8 | |
9 #include "content/browser/browser_main_loop.h" | |
10 #include "content/public/common/media_stream_request.h" | |
11 #include "content/public/browser/browser_context.h" | |
12 #include "content/public/browser/resource_context.h" | |
13 #include "content/browser/renderer_host/media/media_stream_manager.h" | |
14 | |
15 #include <stdio.h> | |
16 #include <sys/ioctl.h> | |
17 #include <fcntl.h> | |
18 #include <unistd.h> | |
19 #include <linux/videodev2.h> | |
20 | |
21 namespace { | |
22 int OpenWebcam(const std::string& extension_id, | |
23 content::BrowserContext* browser_context, | |
24 const std::string& webcam_id) { | |
25 content::MediaStreamManager* manager = | |
26 content::BrowserMainLoop::GetInstance()->media_stream_manager(); | |
27 | |
28 GURL security_origin = | |
29 extensions::Extension::GetBaseURLFromExtensionId(extension_id); | |
30 | |
31 std::string device_id; | |
32 bool success = manager->TranslateSourceIdToDeviceId( | |
33 content::MEDIA_DEVICE_VIDEO_CAPTURE, | |
34 browser_context->GetResourceContext()->GetMediaDeviceIDSalt(), | |
35 security_origin, | |
36 webcam_id, | |
37 &device_id); | |
38 | |
39 if (!success) | |
40 return -1; | |
41 | |
42 return open(device_id.c_str(), 0); | |
43 } | |
44 | |
45 const char kUnknownWebcam[] = "Unknown webcam id"; | |
46 const char kCommandFailed[] = "Failed to send command to webcam"; | |
47 } // namespace | |
48 | |
49 namespace extensions { | |
50 | |
51 WebcamPrivateSetFunction::WebcamPrivateSetFunction() { | |
52 } | |
53 | |
54 WebcamPrivateSetFunction::~WebcamPrivateSetFunction() { | |
55 } | |
56 | |
57 bool WebcamPrivateSetFunction::RunImpl() { | |
58 // Get parameters | |
59 scoped_ptr<api::webcam_private::Set::Params> params( | |
60 api::webcam_private::Set::Params::Create(*args_)); | |
61 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
62 | |
63 int fd = OpenWebcam(extension_id(), browser_context(), params->webcam_id); | |
64 if (fd < 0) { | |
65 SetError(kUnknownWebcam); | |
66 return false; | |
67 } | |
68 | |
69 struct v4l2_control v4l2_ctrl; | |
70 v4l2_ctrl.id = V4L2_CID_ZOOM_ABSOLUTE; | |
71 v4l2_ctrl.value = *(params->config.zoom); | |
72 | |
73 if (ioctl(fd, VIDIOC_S_CTRL, &v4l2_ctrl)) { | |
74 SetError(kCommandFailed); | |
75 return false; | |
76 } | |
77 | |
78 close(fd); | |
79 | |
80 return true; | |
81 } | |
82 | |
83 WebcamPrivateGetFunction::WebcamPrivateGetFunction() { | |
84 } | |
85 | |
86 WebcamPrivateGetFunction::~WebcamPrivateGetFunction() { | |
87 } | |
88 | |
89 bool WebcamPrivateGetFunction::RunImpl() { | |
90 // Get parameters | |
91 scoped_ptr<api::webcam_private::Get::Params> params( | |
92 api::webcam_private::Get::Params::Create(*args_)); | |
93 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
94 | |
95 int fd = OpenWebcam(extension_id(), browser_context(), params->webcam_id); | |
96 if (fd < 0) { | |
97 SetError(kUnknownWebcam); | |
98 return false; | |
99 } | |
100 | |
101 struct v4l2_control v4l2_ctrl; | |
102 v4l2_ctrl.id = V4L2_CID_ZOOM_ABSOLUTE; | |
103 | |
104 if (ioctl(fd, VIDIOC_G_CTRL, &v4l2_ctrl)) { | |
105 SetError(kCommandFailed); | |
106 return false; | |
107 } | |
108 | |
109 close(fd); | |
110 | |
111 api::webcam_private::WebcamConfiguration result; | |
112 result.zoom = make_scoped_ptr(new double(v4l2_ctrl.value)); | |
not at google - send to devlin
2014/04/10 20:06:00
result.zoom.reset(new double(..)) would be slightl
| |
113 SetResult(result.ToValue().release()); | |
114 | |
115 return true; | |
116 } | |
117 | |
118 WebcamPrivateResetFunction::WebcamPrivateResetFunction() { | |
119 } | |
120 | |
121 WebcamPrivateResetFunction::~WebcamPrivateResetFunction() { | |
122 } | |
123 | |
124 bool WebcamPrivateResetFunction::RunImpl() { | |
125 // Get parameters | |
126 scoped_ptr<api::webcam_private::Reset::Params> params( | |
127 api::webcam_private::Reset::Params::Create(*args_)); | |
128 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
129 | |
130 int fd = OpenWebcam(extension_id(), browser_context(), params->webcam_id); | |
131 if (fd < 0) { | |
132 SetError(kUnknownWebcam); | |
133 return false; | |
134 } | |
135 | |
136 struct v4l2_control v4l2_ctrl; | |
137 v4l2_ctrl.id = V4L2_CID_ZOOM_ABSOLUTE; | |
138 v4l2_ctrl.value = 100; | |
139 | |
140 if (ioctl(fd, VIDIOC_S_CTRL, &v4l2_ctrl)) { | |
141 SetError(kCommandFailed); | |
142 return false; | |
143 } | |
144 | |
145 close(fd); | |
146 | |
147 return true; | |
148 } | |
149 | |
150 } // namespace extensions | |
OLD | NEW |