blob: 1ec5af2b662a73bf7ca02ec4e00e99bbd6aab978 [file] [log] [blame]
jchuangadd2f052015-02-17 10:10:501// Copyright 2015 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
jchuangfa1f1432015-02-20 08:22:305#include "ppapi/proxy/camera_device_resource.h"
jchuangadd2f052015-02-17 10:10:506
7#include "ppapi/proxy/camera_capabilities_resource.h"
8#include "ppapi/proxy/plugin_resource_tracker.h"
9#include "ppapi/proxy/ppapi_messages.h"
10#include "ppapi/shared_impl/var.h"
11
12namespace ppapi {
13namespace proxy {
14
jchuangfa1f1432015-02-20 08:22:3015CameraDeviceResource::CameraDeviceResource(Connection connection,
jchuangadd2f052015-02-17 10:10:5016 PP_Instance instance)
17 : PluginResource(connection, instance),
18 open_state_(OpenState::BEFORE_OPEN) {
jchuangfa1f1432015-02-20 08:22:3019 SendCreate(RENDERER, PpapiHostMsg_CameraDevice_Create());
jchuangadd2f052015-02-17 10:10:5020}
21
jchuangfa1f1432015-02-20 08:22:3022CameraDeviceResource::~CameraDeviceResource() {
jchuangadd2f052015-02-17 10:10:5023}
24
jchuangfa1f1432015-02-20 08:22:3025int32_t CameraDeviceResource::Open(
jchuangadd2f052015-02-17 10:10:5026 PP_Var device_id,
27 const scoped_refptr<TrackedCallback>& callback) {
28 if (open_state_ != OpenState::BEFORE_OPEN)
29 return PP_ERROR_FAILED;
30
31 if (TrackedCallback::IsPending(open_callback_))
32 return PP_ERROR_INPROGRESS;
33
34 scoped_refptr<StringVar> source_string_var(StringVar::FromPPVar(device_id));
35 if (!source_string_var || source_string_var->value().empty())
36 return PP_ERROR_BADARGUMENT;
37
38 open_callback_ = callback;
39
jchuangfa1f1432015-02-20 08:22:3040 Call<PpapiPluginMsg_CameraDevice_OpenReply>(
41 RENDERER, PpapiHostMsg_CameraDevice_Open(source_string_var->value()),
42 base::Bind(&CameraDeviceResource::OnPluginMsgOpenReply,
jchuangadd2f052015-02-17 10:10:5043 base::Unretained(this)));
44 return PP_OK_COMPLETIONPENDING;
45}
46
jchuangfa1f1432015-02-20 08:22:3047void CameraDeviceResource::Close() {
jchuangadd2f052015-02-17 10:10:5048 if (open_state_ == OpenState::CLOSED)
49 return;
50
51 if (TrackedCallback::IsPending(open_callback_)) {
52 open_callback_->PostAbort();
53 open_callback_ = nullptr;
54 }
55
56 if (TrackedCallback::IsPending(get_capabilities_callback_)) {
57 get_capabilities_callback_->PostAbort();
58 get_capabilities_callback_ = nullptr;
59 }
60
jchuangfa1f1432015-02-20 08:22:3061 Post(RENDERER, PpapiHostMsg_CameraDevice_Close());
jchuangadd2f052015-02-17 10:10:5062
63 open_state_ = OpenState::CLOSED;
64}
65
jchuangfa1f1432015-02-20 08:22:3066int32_t CameraDeviceResource::GetCameraCapabilities(
jchuangadd2f052015-02-17 10:10:5067 PP_Resource* capabilities,
68 const scoped_refptr<TrackedCallback>& callback) {
69 if (!is_opened())
70 return PP_ERROR_FAILED;
71
72 if (TrackedCallback::IsPending(get_capabilities_callback_))
73 return PP_ERROR_INPROGRESS;
74
75 if (camera_capabilities_.get()) {
76 *capabilities = camera_capabilities_->GetReference();
77 return PP_OK;
78 }
79
80 get_capabilities_callback_ = callback;
jchuangfa1f1432015-02-20 08:22:3081 Call<PpapiPluginMsg_CameraDevice_GetSupportedVideoCaptureFormatsReply>(
82 RENDERER, PpapiHostMsg_CameraDevice_GetSupportedVideoCaptureFormats(),
83 base::Bind(&CameraDeviceResource::OnPluginMsgGetVideoCaptureFormatsReply,
jchuangadd2f052015-02-17 10:10:5084 base::Unretained(this), capabilities));
jchuang512b0a0d2015-02-20 03:42:4985
jchuangadd2f052015-02-17 10:10:5086 return PP_OK_COMPLETIONPENDING;
87}
88
jchuangfa1f1432015-02-20 08:22:3089void CameraDeviceResource::OnPluginMsgOpenReply(
jchuangadd2f052015-02-17 10:10:5090 const ResourceMessageReplyParams& params) {
91 // The callback may have been aborted by Close().
92 if (TrackedCallback::IsPending(open_callback_)) {
93 if (open_state_ == OpenState::BEFORE_OPEN && params.result() == PP_OK)
94 open_state_ = OpenState::OPENED;
95
96 open_callback_->Run(params.result());
97 }
98}
99
jchuangfa1f1432015-02-20 08:22:30100void CameraDeviceResource::OnPluginMsgGetVideoCaptureFormatsReply(
jchuangadd2f052015-02-17 10:10:50101 PP_Resource* capabilities_output,
102 const ResourceMessageReplyParams& params,
jchuang512b0a0d2015-02-20 03:42:49103 const std::vector<PP_VideoCaptureFormat>& formats) {
jchuangadd2f052015-02-17 10:10:50104 if (!TrackedCallback::IsPending(get_capabilities_callback_))
105 return;
106
107 // Return camera capabilities.
108 int32_t result = params.result();
109 scoped_refptr<TrackedCallback> callback;
110 callback.swap(get_capabilities_callback_);
111 if (result == PP_OK) {
112 camera_capabilities_ =
jchuang512b0a0d2015-02-20 03:42:49113 new CameraCapabilitiesResource(pp_instance(), formats);
jchuangadd2f052015-02-17 10:10:50114 *capabilities_output = camera_capabilities_->GetReference();
115 }
116 callback->Run(result == PP_OK ? PP_OK : PP_ERROR_FAILED);
117}
118
119} // namespace proxy
120} // namespace ppapi