Commit 8efbc16a authored by Shik Chen's avatar Shik Chen Committed by Commit Bot

[Video Capture, Chrome OS] Wait until all external cameras are ready

BUG=b:118418065,b:118415374,b:64996728,b:77833131
TEST=Check the result of getUserMedia() matches the external camera in
     settings 100 times when Video Capture Service is not running.

Change-Id: If83b5b3070724321b3524903505c98e6391a2dea
Reviewed-on: https://chromium-review.googlesource.com/c/1347961Reviewed-by: default avatarRicky Liang <jcliang@chromium.org>
Commit-Queue: Shik Chen <shik@chromium.org>
Cr-Commit-Position: refs/heads/master@{#610784}
parent fd875022
...@@ -90,6 +90,9 @@ CameraHalDelegate::CameraHalDelegate( ...@@ -90,6 +90,9 @@ CameraHalDelegate::CameraHalDelegate(
builtin_camera_info_updated_( builtin_camera_info_updated_(
base::WaitableEvent::ResetPolicy::MANUAL, base::WaitableEvent::ResetPolicy::MANUAL,
base::WaitableEvent::InitialState::NOT_SIGNALED), base::WaitableEvent::InitialState::NOT_SIGNALED),
external_camera_info_updated_(
base::WaitableEvent::ResetPolicy::MANUAL,
base::WaitableEvent::InitialState::SIGNALED),
has_camera_connected_(base::WaitableEvent::ResetPolicy::MANUAL, has_camera_connected_(base::WaitableEvent::ResetPolicy::MANUAL,
base::WaitableEvent::InitialState::NOT_SIGNALED), base::WaitableEvent::InitialState::NOT_SIGNALED),
num_builtin_cameras_(0), num_builtin_cameras_(0),
...@@ -213,6 +216,11 @@ void CameraHalDelegate::GetDeviceDescriptors( ...@@ -213,6 +216,11 @@ void CameraHalDelegate::GetDeviceDescriptors(
return; return;
} }
if (!external_camera_info_updated_.TimedWait(
base::TimeDelta::FromSeconds(1))) {
LOG(ERROR) << "Failed to get camera info from all external cameras";
}
if (IsRunningOnVM() && IsVividLoaded()) { if (IsRunningOnVM() && IsVividLoaded()) {
has_camera_connected_.TimedWait(base::TimeDelta::FromSeconds(1)); has_camera_connected_.TimedWait(base::TimeDelta::FromSeconds(1));
} }
...@@ -250,6 +258,7 @@ void CameraHalDelegate::GetDeviceDescriptors( ...@@ -250,6 +258,7 @@ void CameraHalDelegate::GetDeviceDescriptors(
// TODO(jcliang): Remove this after JS API supports query camera facing // TODO(jcliang): Remove this after JS API supports query camera facing
// (http://crbug.com/543997). // (http://crbug.com/543997).
std::sort(device_descriptors->begin(), device_descriptors->end()); std::sort(device_descriptors->begin(), device_descriptors->end());
DVLOG(1) << "Number of device descriptors: " << device_descriptors->size();
} }
void CameraHalDelegate::GetCameraInfo(int32_t camera_id, void CameraHalDelegate::GetCameraInfo(int32_t camera_id,
...@@ -300,9 +309,11 @@ void CameraHalDelegate::ResetMojoInterfaceOnIpcThread() { ...@@ -300,9 +309,11 @@ void CameraHalDelegate::ResetMojoInterfaceOnIpcThread() {
builtin_camera_info_updated_.Reset(); builtin_camera_info_updated_.Reset();
camera_module_has_been_set_.Reset(); camera_module_has_been_set_.Reset();
has_camera_connected_.Reset(); has_camera_connected_.Reset();
external_camera_info_updated_.Signal();
// Clear all cached camera info, especially external cameras. // Clear all cached camera info, especially external cameras.
camera_info_.clear(); camera_info_.clear();
pending_external_camera_info_.clear();
} }
bool CameraHalDelegate::UpdateBuiltInCameraInfo() { bool CameraHalDelegate::UpdateBuiltInCameraInfo() {
...@@ -414,6 +425,10 @@ void CameraHalDelegate::OnGotCameraInfoOnIpcThread( ...@@ -414,6 +425,10 @@ void CameraHalDelegate::OnGotCameraInfoOnIpcThread(
} }
} else { } else {
// It's an external camera. // It's an external camera.
pending_external_camera_info_.erase(camera_id);
if (pending_external_camera_info_.empty()) {
external_camera_info_updated_.Signal();
}
NotifyVideoCaptureDevicesChanged(); NotifyVideoCaptureDevicesChanged();
} }
...@@ -445,6 +460,10 @@ void CameraHalDelegate::CameraDeviceStatusChange( ...@@ -445,6 +460,10 @@ void CameraHalDelegate::CameraDeviceStatusChange(
// Get info for the newly connected external camera. // Get info for the newly connected external camera.
// |has_camera_connected_| might be signaled in // |has_camera_connected_| might be signaled in
// OnGotCameraInfoOnIpcThread(). // OnGotCameraInfoOnIpcThread().
pending_external_camera_info_.insert(camera_id);
if (pending_external_camera_info_.size() == 1) {
external_camera_info_updated_.Reset();
}
GetCameraInfoOnIpcThread( GetCameraInfoOnIpcThread(
camera_id, camera_id,
base::BindOnce(&CameraHalDelegate::OnGotCameraInfoOnIpcThread, this, base::BindOnce(&CameraHalDelegate::OnGotCameraInfoOnIpcThread, this,
......
...@@ -126,6 +126,10 @@ class CAPTURE_EXPORT CameraHalDelegate final ...@@ -126,6 +126,10 @@ class CAPTURE_EXPORT CameraHalDelegate final
// OnGotCameraInfoOnIpcThread. // OnGotCameraInfoOnIpcThread.
base::WaitableEvent builtin_camera_info_updated_; base::WaitableEvent builtin_camera_info_updated_;
// Signaled/Reset when |pending_external_camera_info_.empty()| is changed.
base::WaitableEvent external_camera_info_updated_;
std::unordered_set<int> pending_external_camera_info_;
// Signaled/Reset when |camera_info_.empty()| is changed. // Signaled/Reset when |camera_info_.empty()| is changed.
base::WaitableEvent has_camera_connected_; base::WaitableEvent has_camera_connected_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment