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

Unified Diff: media/capture/video/chromeos/camera_hal_delegate.cc

Issue 2878233002: media: add ArcCamera3Service Mojo service (Closed)
Patch Set: rebase on latest patch set of issue 2837273004 Created 3 years, 6 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: 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() {
« no previous file with comments | « media/capture/video/chromeos/camera_hal_delegate.h ('k') | media/capture/video/chromeos/camera_hal_delegate_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698