| Index: ppapi/shared_impl/ppb_video_capture_shared.cc
|
| diff --git a/ppapi/shared_impl/ppb_video_capture_shared.cc b/ppapi/shared_impl/ppb_video_capture_shared.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a084d5e7f441f10a6d059790990ce7f9685e629a
|
| --- /dev/null
|
| +++ b/ppapi/shared_impl/ppb_video_capture_shared.cc
|
| @@ -0,0 +1,189 @@
|
| +// Copyright (c) 2012 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 "ppapi/shared_impl/ppb_video_capture_shared.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "ppapi/c/pp_errors.h"
|
| +#include "ppapi/shared_impl/ppb_device_ref_shared.h"
|
| +#include "ppapi/shared_impl/ppb_resource_array_shared.h"
|
| +
|
| +namespace ppapi {
|
| +
|
| +PPB_VideoCapture_Shared::PPB_VideoCapture_Shared(PP_Instance instance)
|
| + : Resource(OBJECT_IS_IMPL, instance),
|
| + open_state_(BEFORE_OPEN),
|
| + status_(PP_VIDEO_CAPTURE_STATUS_STOPPED),
|
| + devices_(NULL),
|
| + resource_object_type_(OBJECT_IS_IMPL) {
|
| +}
|
| +
|
| +PPB_VideoCapture_Shared::PPB_VideoCapture_Shared(
|
| + const HostResource& host_resource)
|
| + : Resource(OBJECT_IS_PROXY, host_resource),
|
| + open_state_(BEFORE_OPEN),
|
| + status_(PP_VIDEO_CAPTURE_STATUS_STOPPED),
|
| + devices_(NULL),
|
| + resource_object_type_(OBJECT_IS_PROXY) {
|
| +}
|
| +
|
| +PPB_VideoCapture_Shared::~PPB_VideoCapture_Shared() {
|
| +}
|
| +
|
| +thunk::PPB_VideoCapture_API* PPB_VideoCapture_Shared::AsPPB_VideoCapture_API() {
|
| + return this;
|
| +}
|
| +
|
| +int32_t PPB_VideoCapture_Shared::EnumerateDevices(
|
| + PP_Resource* devices,
|
| + PP_CompletionCallback callback) {
|
| + if (!callback.func)
|
| + return PP_ERROR_BLOCKS_MAIN_THREAD;
|
| + if (TrackedCallback::IsPending(enumerate_devices_callback_))
|
| + return PP_ERROR_INPROGRESS;
|
| +
|
| + return InternalEnumerateDevices(devices, callback);
|
| +}
|
| +
|
| +int32_t PPB_VideoCapture_Shared::Open(
|
| + const std::string& device_id,
|
| + const PP_VideoCaptureDeviceInfo_Dev& requested_info,
|
| + uint32_t buffer_count,
|
| + PP_CompletionCallback callback) {
|
| + if (open_state_ != BEFORE_OPEN)
|
| + return PP_ERROR_FAILED;
|
| +
|
| + if (TrackedCallback::IsPending(open_callback_))
|
| + return PP_ERROR_INPROGRESS;
|
| +
|
| + return InternalOpen(device_id, requested_info, buffer_count, callback);
|
| +}
|
| +
|
| +int32_t PPB_VideoCapture_Shared::StartCapture() {
|
| + if (open_state_ != OPENED ||
|
| + !SetStatus(PP_VIDEO_CAPTURE_STATUS_STARTING, false)) {
|
| + return PP_ERROR_FAILED;
|
| + }
|
| +
|
| + return InternalStartCapture();
|
| +}
|
| +
|
| +int32_t PPB_VideoCapture_Shared::ReuseBuffer(uint32_t buffer) {
|
| + return InternalReuseBuffer(buffer);
|
| +}
|
| +
|
| +int32_t PPB_VideoCapture_Shared::StopCapture() {
|
| + if (open_state_ != OPENED ||
|
| + !SetStatus(PP_VIDEO_CAPTURE_STATUS_STOPPING, false)) {
|
| + return PP_ERROR_FAILED;
|
| + }
|
| +
|
| + return InternalStopCapture();
|
| +}
|
| +
|
| +void PPB_VideoCapture_Shared::Close() {
|
| + if (open_state_ == CLOSED)
|
| + return;
|
| +
|
| + InternalClose();
|
| + open_state_ = CLOSED;
|
| +
|
| + if (TrackedCallback::IsPending(open_callback_))
|
| + open_callback_->PostAbort();
|
| +}
|
| +
|
| +int32_t PPB_VideoCapture_Shared::StartCapture0_1(
|
| + const PP_VideoCaptureDeviceInfo_Dev& requested_info,
|
| + uint32_t buffer_count) {
|
| + if (open_state_ == BEFORE_OPEN) {
|
| + if (TrackedCallback::IsPending(open_callback_))
|
| + return PP_ERROR_FAILED;
|
| + open_state_ = OPENED;
|
| + } else if (open_state_ == CLOSED) {
|
| + return PP_ERROR_FAILED;
|
| + }
|
| +
|
| + if (!SetStatus(PP_VIDEO_CAPTURE_STATUS_STARTING, false))
|
| + return PP_ERROR_FAILED;
|
| +
|
| + return InternalStartCapture0_1(requested_info, buffer_count);
|
| +}
|
| +
|
| +const std::vector<DeviceRefData>& PPB_VideoCapture_Shared::GetDeviceRefData(
|
| + ) const {
|
| + return InternalGetDeviceRefData();
|
| +}
|
| +
|
| +void PPB_VideoCapture_Shared::OnEnumerateDevicesComplete(
|
| + int32_t result,
|
| + const std::vector<DeviceRefData>& devices) {
|
| + DCHECK(TrackedCallback::IsPending(enumerate_devices_callback_));
|
| +
|
| + if (result == PP_OK && devices_) {
|
| + *devices_ = PPB_DeviceRef_Shared::CreateResourceArray(
|
| + resource_object_type_, pp_instance(), devices);
|
| + }
|
| + devices_ = NULL;
|
| +
|
| + TrackedCallback::ClearAndRun(&enumerate_devices_callback_, result);
|
| +}
|
| +
|
| +void PPB_VideoCapture_Shared::OnOpenComplete(int32_t result) {
|
| + if (open_state_ == BEFORE_OPEN && result == PP_OK)
|
| + open_state_ = OPENED;
|
| +
|
| + // The callback may have been aborted by Close(), or the open operation is
|
| + // completed synchronously.
|
| + if (TrackedCallback::IsPending(open_callback_))
|
| + TrackedCallback::ClearAndRun(&open_callback_, result);
|
| +}
|
| +
|
| +bool PPB_VideoCapture_Shared::SetStatus(PP_VideoCaptureStatus_Dev status,
|
| + bool forced) {
|
| + if (!forced) {
|
| + switch (status) {
|
| + case PP_VIDEO_CAPTURE_STATUS_STOPPED:
|
| + if (status_ != PP_VIDEO_CAPTURE_STATUS_STOPPING)
|
| + return false;
|
| + break;
|
| + case PP_VIDEO_CAPTURE_STATUS_STARTING:
|
| + if (status_ != PP_VIDEO_CAPTURE_STATUS_STOPPED)
|
| + return false;
|
| + break;
|
| + 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_STOPPING:
|
| + switch (status_) {
|
| + case PP_VIDEO_CAPTURE_STATUS_STARTING:
|
| + case PP_VIDEO_CAPTURE_STATUS_STARTED:
|
| + case PP_VIDEO_CAPTURE_STATUS_PAUSED:
|
| + break;
|
| + default:
|
| + return false;
|
| + }
|
| + break;
|
| + }
|
| + }
|
| +
|
| + status_ = status;
|
| + return true;
|
| +}
|
| +
|
| +} // namespace ppapi
|
|
|