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

Unified Diff: chrome/browser/extensions/api/webcam_private/webcam_private_api.cc

Issue 205243005: Add chrome.webcamPrivate idl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: WIP Created 6 years, 8 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698