Index: ppapi/proxy/ppb_video_capture_proxy.cc |
diff --git a/ppapi/proxy/ppb_video_capture_proxy.cc b/ppapi/proxy/ppb_video_capture_proxy.cc |
index af39587de5704913190476b032a9e2de1e82ca60..8477d530b74e595c3b5991f694e69582b63ff37c 100644 |
--- a/ppapi/proxy/ppb_video_capture_proxy.cc |
+++ b/ppapi/proxy/ppb_video_capture_proxy.cc |
@@ -4,8 +4,7 @@ |
#include "ppapi/proxy/ppb_video_capture_proxy.h" |
-#include <vector> |
- |
+#include "base/compiler_specific.h" |
#include "base/logging.h" |
#include "build/build_config.h" |
#include "ppapi/c/pp_errors.h" |
@@ -18,6 +17,10 @@ |
#include "ppapi/proxy/plugin_dispatcher.h" |
#include "ppapi/proxy/ppapi_messages.h" |
#include "ppapi/proxy/ppb_buffer_proxy.h" |
+#include "ppapi/shared_impl/ppapi_globals.h" |
+#include "ppapi/shared_impl/ppb_video_capture_shared.h" |
+#include "ppapi/shared_impl/resource_tracker.h" |
+#include "ppapi/shared_impl/tracked_callback.h" |
#include "ppapi/thunk/ppb_buffer_api.h" |
#include "ppapi/thunk/ppb_buffer_trusted_api.h" |
#include "ppapi/thunk/ppb_video_capture_api.h" |
@@ -137,131 +140,151 @@ PPP_VideoCapture_Dev ppp_video_capture = { |
} // namespace |
-class VideoCapture : public ppapi::thunk::PPB_VideoCapture_API, |
- public Resource { |
+class VideoCapture : public PPB_VideoCapture_Shared { |
public: |
- VideoCapture(const HostResource& resource); |
+ explicit VideoCapture(const HostResource& resource); |
virtual ~VideoCapture(); |
- // Resource overrides. |
- virtual ppapi::thunk::PPB_VideoCapture_API* AsPPB_VideoCapture_API() OVERRIDE; |
- |
- // PPB_VideoCapture_API implementation. |
- virtual int32_t StartCapture( |
- const PP_VideoCaptureDeviceInfo_Dev& requested_info, |
- uint32_t buffer_count) { |
- switch (status_) { |
- case PP_VIDEO_CAPTURE_STATUS_STARTING: |
- case PP_VIDEO_CAPTURE_STATUS_STARTED: |
- case PP_VIDEO_CAPTURE_STATUS_PAUSED: |
- default: |
- return PP_ERROR_FAILED; |
- case PP_VIDEO_CAPTURE_STATUS_STOPPED: |
- case PP_VIDEO_CAPTURE_STATUS_STOPPING: |
- break; |
- } |
- status_ = PP_VIDEO_CAPTURE_STATUS_STARTING; |
- GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_StartCapture( |
- API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource(), |
- requested_info, buffer_count)); |
- return PP_OK; |
- } |
- |
- virtual int32_t ReuseBuffer(uint32_t buffer) { |
- if (buffer >= buffer_in_use_.size() || !buffer_in_use_[buffer]) |
- return PP_ERROR_BADARGUMENT; |
- GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_ReuseBuffer( |
- API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource(), buffer)); |
- return PP_OK; |
- } |
- |
- virtual int32_t StopCapture() { |
- switch (status_) { |
- case PP_VIDEO_CAPTURE_STATUS_STOPPED: |
- case PP_VIDEO_CAPTURE_STATUS_STOPPING: |
- default: |
- return PP_ERROR_FAILED; |
- case PP_VIDEO_CAPTURE_STATUS_STARTING: |
- case PP_VIDEO_CAPTURE_STATUS_STARTED: |
- case PP_VIDEO_CAPTURE_STATUS_PAUSED: |
- break; |
- } |
- buffer_in_use_.clear(); |
- status_ = PP_VIDEO_CAPTURE_STATUS_STOPPING; |
- GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_StopCapture( |
- API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource())); |
- return PP_OK; |
- } |
+ bool OnStatus(PP_VideoCaptureStatus_Dev status); |
- bool OnStatus(uint32_t status) { |
- switch (status) { |
- case PP_VIDEO_CAPTURE_STATUS_STARTING: |
- case PP_VIDEO_CAPTURE_STATUS_STOPPING: |
- default: |
- // Those states are not sent by the browser. |
- NOTREACHED(); |
- return false; |
- case PP_VIDEO_CAPTURE_STATUS_STARTED: |
- switch (status_) { |
- case PP_VIDEO_CAPTURE_STATUS_STARTING: |
- case PP_VIDEO_CAPTURE_STATUS_PAUSED: |
- break; |
- default: |
- return false; |
- } |
- break; |
- case PP_VIDEO_CAPTURE_STATUS_PAUSED: |
- switch (status_) { |
- case PP_VIDEO_CAPTURE_STATUS_STARTING: |
- case PP_VIDEO_CAPTURE_STATUS_STARTED: |
- break; |
- default: |
- return false; |
- } |
- break; |
- case PP_VIDEO_CAPTURE_STATUS_STOPPED: |
- if (status_ != PP_VIDEO_CAPTURE_STATUS_STOPPING) |
- return false; |
- break; |
- } |
- status_ = status; |
- return true; |
+ void set_status(PP_VideoCaptureStatus_Dev status) { |
+ SetStatus(status, true); |
} |
- void set_status(uint32_t status) { status_ = status; } |
- |
void SetBufferCount(size_t count) { |
buffer_in_use_ = std::vector<bool>(count); |
} |
+ |
void SetBufferInUse(uint32_t buffer) { |
DCHECK(buffer < buffer_in_use_.size()); |
buffer_in_use_[buffer] = true; |
} |
private: |
+ // PPB_VideoCapture_Shared implementation. |
+ virtual int32_t InternalEnumerateDevices( |
+ PP_Resource* devices, |
+ PP_CompletionCallback callback) OVERRIDE; |
+ virtual int32_t InternalOpen( |
+ const std::string& device_id, |
+ const PP_VideoCaptureDeviceInfo_Dev& requested_info, |
+ uint32_t buffer_count, |
+ PP_CompletionCallback callback) OVERRIDE; |
+ virtual int32_t InternalStartCapture() OVERRIDE; |
+ virtual int32_t InternalReuseBuffer(uint32_t buffer) OVERRIDE; |
+ virtual int32_t InternalStopCapture() OVERRIDE; |
+ virtual void InternalClose() OVERRIDE; |
+ virtual int32_t InternalStartCapture0_1( |
+ const PP_VideoCaptureDeviceInfo_Dev& requested_info, |
+ uint32_t buffer_count) OVERRIDE; |
+ virtual const std::vector<DeviceRefData>& |
+ InternalGetDeviceRefData() const OVERRIDE; |
+ |
PluginDispatcher* GetDispatcher() const { |
return PluginDispatcher::GetForResource(this); |
} |
- uint32_t status_; |
std::vector<bool> buffer_in_use_; |
+ |
DISALLOW_COPY_AND_ASSIGN(VideoCapture); |
}; |
VideoCapture::VideoCapture(const HostResource& resource) |
- : Resource(OBJECT_IS_PROXY, resource), |
- status_(PP_VIDEO_CAPTURE_STATUS_STOPPED) { |
+ : PPB_VideoCapture_Shared(resource) { |
} |
VideoCapture::~VideoCapture() { |
+ Close(); |
+} |
+ |
+bool VideoCapture::OnStatus(PP_VideoCaptureStatus_Dev status) { |
+ switch (status) { |
+ case PP_VIDEO_CAPTURE_STATUS_STARTED: |
+ case PP_VIDEO_CAPTURE_STATUS_PAUSED: |
+ case PP_VIDEO_CAPTURE_STATUS_STOPPED: |
+ return SetStatus(status, false); |
+ case PP_VIDEO_CAPTURE_STATUS_STARTING: |
+ case PP_VIDEO_CAPTURE_STATUS_STOPPING: |
+ // Those states are not sent by the browser. |
+ break; |
+ } |
+ |
+ NOTREACHED(); |
+ return false; |
+} |
+ |
+int32_t VideoCapture::InternalEnumerateDevices(PP_Resource* devices, |
+ PP_CompletionCallback callback) { |
+ devices_ = devices; |
+ enumerate_devices_callback_ = new TrackedCallback(this, callback); |
+ GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_EnumerateDevices( |
+ API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource())); |
+ return PP_OK_COMPLETIONPENDING; |
+} |
+ |
+int32_t VideoCapture::InternalOpen( |
+ const std::string& device_id, |
+ const PP_VideoCaptureDeviceInfo_Dev& requested_info, |
+ uint32_t buffer_count, |
+ PP_CompletionCallback callback) { |
+ // Disallow blocking call. The base class doesn't check this. |
+ if (!callback.func) |
+ return PP_ERROR_BLOCKS_MAIN_THREAD; |
+ |
+ open_callback_ = new TrackedCallback(this, callback); |
+ GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_Open( |
+ API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource(), device_id, requested_info, |
+ buffer_count)); |
+ return PP_OK_COMPLETIONPENDING; |
+} |
+ |
+int32_t VideoCapture::InternalStartCapture() { |
+ buffer_in_use_.clear(); |
+ GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_StartCapture( |
+ API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource())); |
+ return PP_OK; |
} |
-ppapi::thunk::PPB_VideoCapture_API* VideoCapture::AsPPB_VideoCapture_API() { |
- return this; |
+int32_t VideoCapture::InternalReuseBuffer(uint32_t buffer) { |
+ if (buffer >= buffer_in_use_.size() || !buffer_in_use_[buffer]) |
+ return PP_ERROR_BADARGUMENT; |
+ GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_ReuseBuffer( |
+ API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource(), buffer)); |
+ return PP_OK; |
+} |
+ |
+int32_t VideoCapture::InternalStopCapture() { |
+ GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_StopCapture( |
+ API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource())); |
+ return PP_OK; |
+} |
+ |
+void VideoCapture::InternalClose() { |
+ GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_Close( |
+ API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource())); |
+} |
+ |
+int32_t VideoCapture::InternalStartCapture0_1( |
+ const PP_VideoCaptureDeviceInfo_Dev& requested_info, |
+ uint32_t buffer_count) { |
+ buffer_in_use_.clear(); |
+ GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_StartCapture0_1( |
+ API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource(), requested_info, |
+ buffer_count)); |
+ return PP_OK; |
+} |
+ |
+const std::vector<DeviceRefData>& |
+ VideoCapture::InternalGetDeviceRefData() const { |
+ // This should never be called at the plugin side. |
+ NOTREACHED(); |
+ static std::vector<DeviceRefData> result; |
+ return result; |
} |
PPB_VideoCapture_Proxy::PPB_VideoCapture_Proxy(Dispatcher* dispatcher) |
- : InterfaceProxy(dispatcher) { |
+ : InterfaceProxy(dispatcher), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)) { |
} |
PPB_VideoCapture_Proxy::~PPB_VideoCapture_Proxy() { |
@@ -285,12 +308,23 @@ bool PPB_VideoCapture_Proxy::OnMessageReceived(const IPC::Message& msg) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(PPB_VideoCapture_Proxy, msg) |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_Create, OnMsgCreate) |
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_EnumerateDevices, |
+ OnMsgEnumerateDevices) |
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_Open, OnMsgOpen) |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_StartCapture, |
OnMsgStartCapture) |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_ReuseBuffer, |
OnMsgReuseBuffer) |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_StopCapture, |
OnMsgStopCapture) |
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_Close, OnMsgClose) |
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_StartCapture0_1, |
+ OnMsgStartCapture0_1) |
+ |
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBVideoCapture_EnumerateDevicesACK, |
+ OnMsgEnumerateDevicesACK) |
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBVideoCapture_OpenACK, |
+ OnMsgOpenACK) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
// TODO(brettw) handle bad messages! |
@@ -307,13 +341,35 @@ void PPB_VideoCapture_Proxy::OnMsgCreate(PP_Instance instance, |
} |
} |
-void PPB_VideoCapture_Proxy::OnMsgStartCapture( |
- const HostResource& resource, |
+void PPB_VideoCapture_Proxy::OnMsgEnumerateDevices( |
+ const HostResource& resource) { |
+ EnterHostFromHostResourceForceCallback<PPB_VideoCapture_API> enter( |
+ resource, callback_factory_, |
+ &PPB_VideoCapture_Proxy::EnumerateDevicesACKInHost, resource); |
+ |
+ if (enter.succeeded()) |
+ enter.SetResult(enter.object()->EnumerateDevices(NULL, enter.callback())); |
+} |
+ |
+void PPB_VideoCapture_Proxy::OnMsgOpen( |
+ const ppapi::HostResource& resource, |
+ const std::string& device_id, |
const PP_VideoCaptureDeviceInfo_Dev& info, |
uint32_t buffers) { |
+ EnterHostFromHostResourceForceCallback<PPB_VideoCapture_API> enter( |
+ resource, callback_factory_, &PPB_VideoCapture_Proxy::OpenACKInHost, |
+ resource); |
+ |
+ if (enter.succeeded()) { |
+ enter.SetResult(enter.object()->Open(device_id, info, buffers, |
+ enter.callback())); |
+ } |
+} |
+ |
+void PPB_VideoCapture_Proxy::OnMsgStartCapture(const HostResource& resource) { |
EnterHostFromHostResource<PPB_VideoCapture_API> enter(resource); |
if (enter.succeeded()) |
- enter.object()->StartCapture(info, buffers); |
+ enter.object()->StartCapture(); |
} |
void PPB_VideoCapture_Proxy::OnMsgReuseBuffer(const HostResource& resource, |
@@ -329,6 +385,56 @@ void PPB_VideoCapture_Proxy::OnMsgStopCapture(const HostResource& resource) { |
enter.object()->StopCapture(); |
} |
+void PPB_VideoCapture_Proxy::OnMsgClose(const HostResource& resource) { |
+ EnterHostFromHostResource<PPB_VideoCapture_API> enter(resource); |
+ if (enter.succeeded()) |
+ enter.object()->Close(); |
+} |
+ |
+void PPB_VideoCapture_Proxy::OnMsgStartCapture0_1( |
+ const HostResource& resource, |
+ const PP_VideoCaptureDeviceInfo_Dev& info, |
+ uint32_t buffers) { |
+ EnterHostFromHostResource<PPB_VideoCapture_API> enter(resource); |
+ if (enter.succeeded()) |
+ enter.object()->StartCapture0_1(info, buffers); |
+} |
+ |
+void PPB_VideoCapture_Proxy::OnMsgEnumerateDevicesACK( |
+ const HostResource& resource, |
+ int32_t result, |
+ const std::vector<ppapi::DeviceRefData>& devices) { |
+ EnterPluginFromHostResource<PPB_VideoCapture_API> enter(resource); |
+ if (enter.succeeded()) { |
+ static_cast<VideoCapture*>(enter.object())->OnEnumerateDevicesComplete( |
+ result, devices); |
+ } |
+} |
+ |
+void PPB_VideoCapture_Proxy::OnMsgOpenACK( |
+ const HostResource& resource, |
+ int32_t result) { |
+ EnterPluginFromHostResource<PPB_VideoCapture_API> enter(resource); |
+ if (enter.succeeded()) |
+ static_cast<VideoCapture*>(enter.object())->OnOpenComplete(result); |
+} |
+ |
+void PPB_VideoCapture_Proxy::EnumerateDevicesACKInHost( |
+ int32_t result, |
+ const HostResource& resource) { |
+ EnterHostFromHostResource<PPB_VideoCapture_API> enter(resource); |
+ dispatcher()->Send(new PpapiMsg_PPBVideoCapture_EnumerateDevicesACK( |
+ API_ID_PPB_VIDEO_CAPTURE_DEV, resource, result, |
+ enter.succeeded() && result == PP_OK ? |
+ enter.object()->GetDeviceRefData() : std::vector<DeviceRefData>())); |
+} |
+ |
+void PPB_VideoCapture_Proxy::OpenACKInHost(int32_t result, |
+ const HostResource& resource) { |
+ dispatcher()->Send(new PpapiMsg_PPBVideoCapture_OpenACK( |
+ API_ID_PPB_VIDEO_CAPTURE_DEV, resource, result)); |
+} |
+ |
PPP_VideoCapture_Proxy::PPP_VideoCapture_Proxy(Dispatcher* dispatcher) |
: InterfaceProxy(dispatcher), |
ppp_video_capture_impl_(NULL) { |
@@ -406,7 +512,7 @@ void PPP_VideoCapture_Proxy::OnMsgOnStatus(const HostResource& host_resource, |
return; |
VideoCapture* capture = static_cast<VideoCapture*>(enter.object()); |
- if (!capture->OnStatus(status)) |
+ if (!capture->OnStatus(static_cast<PP_VideoCaptureStatus_Dev>(status))) |
return; |
ppp_video_capture_impl_->OnStatus( |
host_resource.instance(), capture->pp_resource(), status); |