Index: chrome/browser/extensions/api/webcam_private/webcam_private_api.cc |
diff --git a/chrome/browser/extensions/api/webcam_private/webcam_private_api.cc b/chrome/browser/extensions/api/webcam_private/webcam_private_api.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8a613bd23ad9adb627077f5917a05eb2c06dec7f |
--- /dev/null |
+++ b/chrome/browser/extensions/api/webcam_private/webcam_private_api.cc |
@@ -0,0 +1,150 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/extensions/api/webcam_private/webcam_private_api.h" |
+ |
+#include "chrome/common/extensions/api/webcam_private.h" |
+ |
+#include "content/browser/browser_main_loop.h" |
+#include "content/public/common/media_stream_request.h" |
+#include "content/public/browser/browser_context.h" |
+#include "content/public/browser/resource_context.h" |
+#include "content/browser/renderer_host/media/media_stream_manager.h" |
+ |
+#include <stdio.h> |
+#include <sys/ioctl.h> |
+#include <fcntl.h> |
+#include <unistd.h> |
+#include <linux/videodev2.h> |
+ |
+namespace { |
+int OpenWebcam(const std::string& extension_id, |
+ content::BrowserContext* browser_context, |
+ const std::string& webcam_id) { |
+ content::MediaStreamManager* manager = |
+ content::BrowserMainLoop::GetInstance()->media_stream_manager(); |
+ |
+ GURL security_origin = |
+ extensions::Extension::GetBaseURLFromExtensionId(extension_id); |
+ |
+ std::string device_id; |
+ bool success = manager->TranslateSourceIdToDeviceId( |
+ content::MEDIA_DEVICE_VIDEO_CAPTURE, |
+ browser_context->GetResourceContext()->GetMediaDeviceIDSalt(), |
+ security_origin, |
+ webcam_id, |
+ &device_id); |
+ |
+ if (!success) |
+ return -1; |
+ |
+ return open(device_id.c_str(), 0); |
+} |
+ |
+const char kUnknownWebcam[] = "Unknown webcam id"; |
+const char kCommandFailed[] = "Failed to send command to webcam"; |
+} // namespace |
+ |
+namespace extensions { |
+ |
+WebcamPrivateSetFunction::WebcamPrivateSetFunction() { |
+} |
+ |
+WebcamPrivateSetFunction::~WebcamPrivateSetFunction() { |
+} |
+ |
+bool WebcamPrivateSetFunction::RunImpl() { |
+ // Get parameters |
+ scoped_ptr<api::webcam_private::Set::Params> params( |
+ api::webcam_private::Set::Params::Create(*args_)); |
+ EXTENSION_FUNCTION_VALIDATE(params.get()); |
+ |
+ int fd = OpenWebcam(extension_id(), browser_context(), params->webcam_id); |
+ if (fd < 0) { |
+ SetError(kUnknownWebcam); |
+ return false; |
+ } |
+ |
+ struct v4l2_control v4l2_ctrl; |
+ v4l2_ctrl.id = V4L2_CID_ZOOM_ABSOLUTE; |
+ v4l2_ctrl.value = *(params->config.zoom); |
+ |
+ if (ioctl(fd, VIDIOC_S_CTRL, &v4l2_ctrl)) { |
+ SetError(kCommandFailed); |
+ return false; |
+ } |
+ |
+ close(fd); |
+ |
+ return true; |
+} |
+ |
+WebcamPrivateGetFunction::WebcamPrivateGetFunction() { |
+} |
+ |
+WebcamPrivateGetFunction::~WebcamPrivateGetFunction() { |
+} |
+ |
+bool WebcamPrivateGetFunction::RunImpl() { |
+ // Get parameters |
+ scoped_ptr<api::webcam_private::Get::Params> params( |
+ api::webcam_private::Get::Params::Create(*args_)); |
+ EXTENSION_FUNCTION_VALIDATE(params.get()); |
+ |
+ int fd = OpenWebcam(extension_id(), browser_context(), params->webcam_id); |
+ if (fd < 0) { |
+ SetError(kUnknownWebcam); |
+ return false; |
+ } |
+ |
+ struct v4l2_control v4l2_ctrl; |
+ v4l2_ctrl.id = V4L2_CID_ZOOM_ABSOLUTE; |
+ |
+ if (ioctl(fd, VIDIOC_G_CTRL, &v4l2_ctrl)) { |
+ SetError(kCommandFailed); |
+ return false; |
+ } |
+ |
+ close(fd); |
+ |
+ api::webcam_private::WebcamConfiguration result; |
+ 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
|
+ SetResult(result.ToValue().release()); |
+ |
+ return true; |
+} |
+ |
+WebcamPrivateResetFunction::WebcamPrivateResetFunction() { |
+} |
+ |
+WebcamPrivateResetFunction::~WebcamPrivateResetFunction() { |
+} |
+ |
+bool WebcamPrivateResetFunction::RunImpl() { |
+ // Get parameters |
+ scoped_ptr<api::webcam_private::Reset::Params> params( |
+ api::webcam_private::Reset::Params::Create(*args_)); |
+ EXTENSION_FUNCTION_VALIDATE(params.get()); |
+ |
+ int fd = OpenWebcam(extension_id(), browser_context(), params->webcam_id); |
+ if (fd < 0) { |
+ SetError(kUnknownWebcam); |
+ return false; |
+ } |
+ |
+ struct v4l2_control v4l2_ctrl; |
+ v4l2_ctrl.id = V4L2_CID_ZOOM_ABSOLUTE; |
+ v4l2_ctrl.value = 100; |
+ |
+ if (ioctl(fd, VIDIOC_S_CTRL, &v4l2_ctrl)) { |
+ SetError(kCommandFailed); |
+ return false; |
+ } |
+ |
+ close(fd); |
+ |
+ return true; |
+} |
+ |
+} // namespace extensions |