| Index: media/capture/video/chromeos/camera_hal_delegate.cc
|
| diff --git a/media/capture/video/chromeos/camera_hal_delegate.cc b/media/capture/video/chromeos/camera_hal_delegate.cc
|
| index 1ede5fa2d8350bc0464d1d3edb09076f85d83562..f1a96e7bda550f6107e0e71a9759598e18a03a68 100644
|
| --- a/media/capture/video/chromeos/camera_hal_delegate.cc
|
| +++ b/media/capture/video/chromeos/camera_hal_delegate.cc
|
| @@ -16,13 +16,6 @@
|
| #include "media/capture/video/chromeos/camera_metadata_utils.h"
|
| #include "media/capture/video/chromeos/pixel_format_utils.h"
|
| #include "media/capture/video/chromeos/video_capture_device_arc_chromeos.h"
|
| -#include "mojo/edk/embedder/embedder.h"
|
| -#include "mojo/edk/embedder/incoming_broker_client_invitation.h"
|
| -#include "mojo/edk/embedder/named_platform_handle.h"
|
| -#include "mojo/edk/embedder/named_platform_handle_utils.h"
|
| -#include "mojo/edk/embedder/platform_channel_pair.h"
|
| -#include "mojo/edk/embedder/platform_channel_utils_posix.h"
|
| -#include "mojo/edk/embedder/platform_handle_vector.h"
|
|
|
| namespace media {
|
|
|
| @@ -35,9 +28,20 @@ const base::TimeDelta kEventWaitTimeoutMs =
|
|
|
| } // namespace
|
|
|
| +CameraHalDelegate::LocalCameraClient::LocalCameraClient(
|
| + scoped_refptr<CameraHalDelegate> camera_hal_delegate)
|
| + : camera_hal_delegate_(camera_hal_delegate) {}
|
| +
|
| +void CameraHalDelegate::LocalCameraClient::NotifyCameraHalRegistered(
|
| + arc::mojom::CameraModulePtr camera_module) {
|
| + camera_hal_delegate_->SetCameraModule(camera_module.PassInterface());
|
| +}
|
| +
|
| CameraHalDelegate::CameraHalDelegate(
|
| scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner)
|
| - : builtin_camera_info_updated_(
|
| + : camera_module_set_(base::WaitableEvent::ResetPolicy::MANUAL,
|
| + base::WaitableEvent::InitialState::NOT_SIGNALED),
|
| + builtin_camera_info_updated_(
|
| base::WaitableEvent::ResetPolicy::MANUAL,
|
| base::WaitableEvent::InitialState::NOT_SIGNALED),
|
| num_builtin_cameras_(0),
|
| @@ -48,59 +52,21 @@ CameraHalDelegate::CameraHalDelegate(
|
|
|
| CameraHalDelegate::~CameraHalDelegate() {}
|
|
|
| -bool CameraHalDelegate::StartCameraModuleIpc() {
|
| - // Non-blocking socket handle.
|
| - mojo::edk::ScopedPlatformHandle socket_handle = mojo::edk::CreateClientHandle(
|
| - mojo::edk::NamedPlatformHandle(kArcCamera3SocketPath));
|
| -
|
| - // Set socket to blocking
|
| - int flags = HANDLE_EINTR(fcntl(socket_handle.get().handle, F_GETFL));
|
| - if (flags == -1) {
|
| - PLOG(ERROR) << "fcntl(F_GETFL) failed: ";
|
| - return false;
|
| - }
|
| - if (HANDLE_EINTR(fcntl(socket_handle.get().handle, F_SETFL,
|
| - flags & ~O_NONBLOCK)) == -1) {
|
| - PLOG(ERROR) << "fcntl(F_SETFL) failed: ";
|
| - return false;
|
| - }
|
| -
|
| - const size_t kTokenSize = 32;
|
| - char token[kTokenSize] = {};
|
| - std::deque<mojo::edk::PlatformHandle> platform_handles;
|
| - ssize_t ret = mojo::edk::PlatformChannelRecvmsg(
|
| - socket_handle.get(), token, sizeof(token), &platform_handles, true);
|
| - if (ret == -1) {
|
| - PLOG(ERROR) << "PlatformChannelRecvmsg failed: ";
|
| - return false;
|
| - }
|
| - if (platform_handles.size() != 1) {
|
| - LOG(ERROR) << "Unexpected number of handles received, expected 1: "
|
| - << platform_handles.size();
|
| - return false;
|
| - }
|
| - mojo::edk::ScopedPlatformHandle parent_pipe(platform_handles.back());
|
| - platform_handles.pop_back();
|
| - if (!parent_pipe.is_valid()) {
|
| - LOG(ERROR) << "Invalid parent pipe";
|
| - return false;
|
| - }
|
| - std::unique_ptr<mojo::edk::IncomingBrokerClientInvitation> invitation =
|
| - mojo::edk::IncomingBrokerClientInvitation::Accept(
|
| - mojo::edk::ConnectionParams(mojo::edk::TransportProtocol::kLegacy,
|
| - std::move(parent_pipe)));
|
| - mojo::ScopedMessagePipeHandle child_pipe =
|
| - invitation->ExtractMessagePipe(token);
|
| - DCHECK(child_pipe.is_valid());
|
| +void CameraHalDelegate::RegisterCameraClient() {
|
| + auto client_observer = base::MakeUnique<LocalCameraClient>(this);
|
| + ArcCamera3Service::GetInstance()->AddClientObserver(
|
| + std::move(client_observer));
|
| +}
|
|
|
| +void CameraHalDelegate::SetCameraModule(
|
| + arc::mojom::CameraModulePtrInfo camera_module_ptr_info) {
|
| camera_module_ =
|
| - mojo::MakeProxy(mojo::InterfacePtrInfo<arc::mojom::CameraModule>(
|
| - std::move(child_pipe), 0u),
|
| - ipc_task_runner_);
|
| -
|
| - VLOG(1) << "Camera module IPC connection established";
|
| -
|
| - return true;
|
| + mojo::MakeProxy(std::move(camera_module_ptr_info), ipc_task_runner_);
|
| + camera_module_set_.Signal();
|
| + ipc_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&CameraHalDelegate::SetConnectionErrorHandlerOnModuleThread,
|
| + this));
|
| }
|
|
|
| void CameraHalDelegate::Reset() {
|
| @@ -113,6 +79,7 @@ std::unique_ptr<VideoCaptureDevice> CameraHalDelegate::CreateDevice(
|
| scoped_refptr<base::SingleThreadTaskRunner> task_runner_for_screen_observer,
|
| const VideoCaptureDeviceDescriptor& device_descriptor) {
|
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
| + camera_module_set_.Wait();
|
| std::unique_ptr<VideoCaptureDevice> capture_device;
|
| if (!UpdateBuiltInCameraInfo()) {
|
| return capture_device;
|
| @@ -131,6 +98,7 @@ void CameraHalDelegate::GetSupportedFormats(
|
| VideoCaptureFormats* supported_formats) {
|
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
|
|
| + camera_module_set_.Wait();
|
| if (!UpdateBuiltInCameraInfo()) {
|
| return;
|
| }
|
| @@ -187,6 +155,7 @@ void CameraHalDelegate::GetSupportedFormats(
|
| void CameraHalDelegate::GetDeviceDescriptors(
|
| VideoCaptureDeviceDescriptors* device_descriptors) {
|
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
| + camera_module_set_.Wait();
|
|
|
| if (!UpdateBuiltInCameraInfo()) {
|
| return;
|
| @@ -228,6 +197,7 @@ void CameraHalDelegate::GetCameraInfo(int32_t camera_id,
|
| const GetCameraInfoCallback& callback) {
|
| // This method may be called on any thread. Currently this method is used by
|
| // CameraDeviceDelegate to query camera info.
|
| + camera_module_set_.Wait();
|
| ipc_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&CameraHalDelegate::GetCameraInfoOnModuleThread,
|
| this, camera_id, callback));
|
| @@ -239,14 +209,27 @@ void CameraHalDelegate::OpenDevice(
|
| const OpenDeviceCallback& callback) {
|
| // This method may be called on any thread. Currently this method is used by
|
| // CameraDeviceDelegate to open a camera device.
|
| + camera_module_set_.Wait();
|
| ipc_task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&CameraHalDelegate::OpenDeviceOnModuleThread, this, camera_id,
|
| base::Passed(&device_ops_request), callback));
|
| }
|
|
|
| -void CameraHalDelegate::StartForTesting(arc::mojom::CameraModulePtrInfo info) {
|
| - camera_module_.Bind(std::move(info), ipc_task_runner_);
|
| +void CameraHalDelegate::SetConnectionErrorHandlerOnModuleThread() {
|
| + DCHECK(ipc_task_runner_->BelongsToCurrentThread());
|
| + DCHECK(camera_module_set_.IsSignaled());
|
| + camera_module_.set_connection_error_handler(base::Bind(
|
| + &CameraHalDelegate::HandleMojoConnectionErrorOnModuleThread, this));
|
| +}
|
| +
|
| +void CameraHalDelegate::HandleMojoConnectionErrorOnModuleThread() {
|
| + DCHECK(ipc_task_runner_->BelongsToCurrentThread());
|
| + camera_module_.reset();
|
| + if (camera_module_callbacks_.is_bound()) {
|
| + camera_module_callbacks_.Unbind();
|
| + }
|
| + camera_module_set_.Reset();
|
| }
|
|
|
| void CameraHalDelegate::ResetMojoInterfaceOnModuleThread() {
|
|
|