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

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

Issue 2878233002: media: add ArcCamera3Service Mojo service (Closed)
Patch Set: Created 3 years, 7 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 321f7f3fe3ab0a994a6b1b19825ab085f414b9b7..bb66afee869f5f1e2acbae25796dd15249cd42ff 100644
--- a/media/capture/video/chromeos/camera_hal_delegate.cc
+++ b/media/capture/video/chromeos/camera_hal_delegate.cc
@@ -12,13 +12,6 @@
#include "base/strings/string_piece.h"
#include "media/capture/video/chromeos/camera_metadata_utils.h"
#include "media/capture/video/chromeos/video_capture_device_arc_chromeos.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-#include "mojo/edk/embedder/pending_process_connection.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 {
@@ -31,9 +24,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(
const scoped_refptr<base::SingleThreadTaskRunner> module_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),
@@ -56,62 +60,28 @@ CameraHalDelegate::~CameraHalDelegate() {
interface_closed.Wait();
}
-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;
- }
- mojo::edk::SetParentPipeHandle(std::move(parent_pipe));
-
- mojo::ScopedMessagePipeHandle child_pipe =
- mojo::edk::CreateChildMessagePipe(std::string(token, kTokenSize));
+void CameraHalDelegate::Start() {
+ 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),
- module_task_runner_);
-
- VLOG(1) << "Camera module IPC connection established";
-
- return true;
+ mojo::MakeProxy(std::move(camera_module_ptr_info), module_task_runner_);
+ camera_module_set_.Signal();
+ module_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&CameraHalDelegate::SetConnectionErrorHandlerOnModuleThread,
+ this));
}
std::unique_ptr<VideoCaptureDevice> CameraHalDelegate::CreateDevice(
const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
const VideoCaptureDeviceDescriptor& device_descriptor) {
DCHECK(thread_checker_.CalledOnValidThread());
+ camera_module_set_.Wait();
std::unique_ptr<VideoCaptureDevice> capture_device;
if (!UpdateBuiltInCameraInfo()) {
return capture_device;
@@ -130,6 +100,7 @@ void CameraHalDelegate::GetSupportedFormats(
VideoCaptureFormats* supported_formats) {
DCHECK(thread_checker_.CalledOnValidThread());
+ camera_module_set_.Wait();
if (!UpdateBuiltInCameraInfo()) {
return;
}
@@ -200,6 +171,7 @@ void CameraHalDelegate::GetSupportedFormats(
void CameraHalDelegate::GetDeviceDescriptors(
VideoCaptureDeviceDescriptors* device_descriptors) {
DCHECK(thread_checker_.CalledOnValidThread());
+ camera_module_set_.Wait();
if (!UpdateBuiltInCameraInfo()) {
return;
@@ -238,6 +210,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
// VideoCaptureDeviceArcChromeOS to query camera info.
+ camera_module_set_.Wait();
module_task_runner_->PostTask(
FROM_HERE, base::Bind(&CameraHalDelegate::GetCameraInfoOnModuleThread,
this, camera_id, callback));
@@ -247,11 +220,28 @@ void CameraHalDelegate::OpenDevice(int32_t camera_id,
const OpenDeviceCallback& callback) {
// This method may be called on any thread. Currently this method is used by
// VideoCaptureDeviceArcChromeOS to open a camera device.
+ camera_module_set_.Wait();
module_task_runner_->PostTask(
FROM_HERE, base::Bind(&CameraHalDelegate::OpenDeviceOnModuleThread, this,
camera_id, callback));
}
+void CameraHalDelegate::SetConnectionErrorHandlerOnModuleThread() {
+ DCHECK(module_task_runner_->BelongsToCurrentThread());
+ DCHECK(camera_module_set_.IsSignaled());
+ camera_module_.set_connection_error_handler(base::Bind(
+ &CameraHalDelegate::HandleMojoConnectionErrorOnModuleThread, this));
+}
+
+void CameraHalDelegate::HandleMojoConnectionErrorOnModuleThread() {
+ DCHECK(module_task_runner_->BelongsToCurrentThread());
+ camera_module_.reset();
+ if (camera_module_callbacks_.is_bound()) {
+ camera_module_callbacks_.Unbind();
+ }
+ camera_module_set_.Reset();
+}
+
void CameraHalDelegate::ResetMojoInterfaceOnModuleThread(
base::WaitableEvent* interface_closed) {
DCHECK(module_task_runner_->BelongsToCurrentThread());

Powered by Google App Engine
This is Rietveld 408576698