summaryrefslogtreecommitdiff
path: root/chromium/media/capture/video/chromeos/camera_app_device_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/capture/video/chromeos/camera_app_device_impl.cc')
-rw-r--r--chromium/media/capture/video/chromeos/camera_app_device_impl.cc87
1 files changed, 64 insertions, 23 deletions
diff --git a/chromium/media/capture/video/chromeos/camera_app_device_impl.cc b/chromium/media/capture/video/chromeos/camera_app_device_impl.cc
index d81afe5b3e5..3aba77a914c 100644
--- a/chromium/media/capture/video/chromeos/camera_app_device_impl.cc
+++ b/chromium/media/capture/video/chromeos/camera_app_device_impl.cc
@@ -4,6 +4,8 @@
#include "media/capture/video/chromeos/camera_app_device_impl.h"
+#include "media/base/bind_to_current_loop.h"
+#include "media/capture/video/chromeos/camera_app_device_bridge_impl.h"
#include "media/capture/video/chromeos/camera_metadata_utils.h"
namespace media {
@@ -61,20 +63,36 @@ CameraAppDeviceImpl::CameraAppDeviceImpl(const std::string& device_id,
cros::mojom::CameraInfoPtr camera_info)
: device_id_(device_id),
camera_info_(std::move(camera_info)),
- task_runner_(base::ThreadTaskRunnerHandle::Get()),
capture_intent_(cros::mojom::CaptureIntent::DEFAULT),
next_metadata_observer_id_(0),
- next_camera_event_observer_id_(0),
- weak_ptr_factory_(
- std::make_unique<base::WeakPtrFactory<CameraAppDeviceImpl>>(this)) {}
+ next_camera_event_observer_id_(0) {}
CameraAppDeviceImpl::~CameraAppDeviceImpl() {
- task_runner_->DeleteSoon(FROM_HERE, std::move(weak_ptr_factory_));
+ // If the instance is bound, then this instance should only be destroyed when
+ // the mojo connection is dropped, which also happens on the mojo thread.
+ DCHECK(!mojo_task_runner_ || mojo_task_runner_->BelongsToCurrentThread());
+
+ // All the weak pointers of |weak_ptr_factory_| should be invalidated on
+ // camera device IPC thread before destroying CameraAppDeviceImpl.
+ DCHECK(!weak_ptr_factory_.HasWeakPtrs());
}
void CameraAppDeviceImpl::BindReceiver(
mojo::PendingReceiver<cros::mojom::CameraAppDevice> receiver) {
receivers_.Add(this, std::move(receiver));
+ receivers_.set_disconnect_handler(
+ base::BindRepeating(&CameraAppDeviceImpl::OnMojoConnectionError,
+ weak_ptr_factory_for_mojo_.GetWeakPtr()));
+ mojo_task_runner_ = base::ThreadTaskRunnerHandle::Get();
+}
+
+base::WeakPtr<CameraAppDeviceImpl> CameraAppDeviceImpl::GetWeakPtr() {
+ return weak_ptr_factory_.GetWeakPtr();
+}
+
+void CameraAppDeviceImpl::InvalidatePtrs(base::OnceClosure callback) {
+ weak_ptr_factory_.InvalidateWeakPtrs();
+ std::move(callback).Run();
}
void CameraAppDeviceImpl::ConsumeReprocessOptions(
@@ -130,26 +148,30 @@ void CameraAppDeviceImpl::OnResultMetadataAvailable(
}
void CameraAppDeviceImpl::OnShutterDone() {
- base::AutoLock lock(camera_event_observers_lock_);
-
- for (auto& observer : camera_event_observers_) {
- observer.second->OnShutterDone();
- }
+ mojo_task_runner_->PostTask(
+ FROM_HERE,
+ base::BindOnce(&CameraAppDeviceImpl::NotifyShutterDoneOnMojoThread,
+ weak_ptr_factory_for_mojo_.GetWeakPtr()));
}
void CameraAppDeviceImpl::GetCameraInfo(GetCameraInfoCallback callback) {
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
DCHECK(camera_info_);
+
std::move(callback).Run(camera_info_.Clone());
}
void CameraAppDeviceImpl::SetReprocessOption(
cros::mojom::Effect effect,
SetReprocessOptionCallback reprocess_result_callback) {
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
+
ReprocessTask task;
task.effect = effect;
- task.callback = base::BindOnce(&CameraAppDeviceImpl::SetReprocessResult,
- weak_ptr_factory_->GetWeakPtr(),
- std::move(reprocess_result_callback));
+ task.callback = media::BindToCurrentLoop(
+ base::BindOnce(&CameraAppDeviceImpl::SetReprocessResultOnMojoThread,
+ weak_ptr_factory_for_mojo_.GetWeakPtr(),
+ std::move(reprocess_result_callback)));
if (effect == cros::mojom::Effect::PORTRAIT_MODE) {
auto e = BuildMetadataEntry(
@@ -165,6 +187,8 @@ void CameraAppDeviceImpl::SetReprocessOption(
void CameraAppDeviceImpl::SetFpsRange(const gfx::Range& fps_range,
SetFpsRangeCallback callback) {
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
+
const int entry_length = 2;
auto& static_metadata = camera_info_->static_camera_characteristics;
@@ -198,6 +222,8 @@ void CameraAppDeviceImpl::SetFpsRange(const gfx::Range& fps_range,
void CameraAppDeviceImpl::SetStillCaptureResolution(
const gfx::Size& resolution,
SetStillCaptureResolutionCallback callback) {
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
+
base::AutoLock lock(still_capture_resolution_lock_);
still_capture_resolution_ = resolution;
std::move(callback).Run();
@@ -206,6 +232,8 @@ void CameraAppDeviceImpl::SetStillCaptureResolution(
void CameraAppDeviceImpl::SetCaptureIntent(
cros::mojom::CaptureIntent capture_intent,
SetCaptureIntentCallback callback) {
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
+
base::AutoLock lock(capture_intent_lock_);
capture_intent_ = capture_intent;
std::move(callback).Run();
@@ -215,6 +243,8 @@ void CameraAppDeviceImpl::AddResultMetadataObserver(
mojo::PendingRemote<cros::mojom::ResultMetadataObserver> observer,
cros::mojom::StreamType stream_type,
AddResultMetadataObserverCallback callback) {
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
+
base::AutoLock lock(metadata_observers_lock_);
uint32_t id = next_metadata_observer_id_++;
@@ -228,6 +258,8 @@ void CameraAppDeviceImpl::AddResultMetadataObserver(
void CameraAppDeviceImpl::RemoveResultMetadataObserver(
uint32_t id,
RemoveResultMetadataObserverCallback callback) {
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
+
base::AutoLock lock(metadata_observers_lock_);
if (metadata_observers_.erase(id) == 0) {
@@ -245,7 +277,7 @@ void CameraAppDeviceImpl::RemoveResultMetadataObserver(
void CameraAppDeviceImpl::AddCameraEventObserver(
mojo::PendingRemote<cros::mojom::CameraEventObserver> observer,
AddCameraEventObserverCallback callback) {
- base::AutoLock lock(camera_event_observers_lock_);
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
uint32_t id = next_camera_event_observer_id_++;
camera_event_observers_[id] =
@@ -256,7 +288,7 @@ void CameraAppDeviceImpl::AddCameraEventObserver(
void CameraAppDeviceImpl::RemoveCameraEventObserver(
uint32_t id,
RemoveCameraEventObserverCallback callback) {
- base::AutoLock lock(camera_event_observers_lock_);
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
bool is_success = camera_event_observers_.erase(id) == 1;
std::move(callback).Run(is_success);
@@ -274,17 +306,26 @@ void CameraAppDeviceImpl::DisableEeNr(ReprocessTask* task) {
task->extra_metadata.push_back(std::move(nr_entry));
}
-void CameraAppDeviceImpl::SetReprocessResult(
+void CameraAppDeviceImpl::OnMojoConnectionError() {
+ CameraAppDeviceBridgeImpl::GetInstance()->OnDeviceMojoDisconnected(
+ device_id_);
+}
+
+void CameraAppDeviceImpl::SetReprocessResultOnMojoThread(
SetReprocessOptionCallback callback,
const int32_t status,
media::mojom::BlobPtr blob) {
- auto callback_on_mojo_thread = base::BindOnce(
- [](const int32_t status, media::mojom::BlobPtr blob,
- SetReprocessOptionCallback callback) {
- std::move(callback).Run(status, std::move(blob));
- },
- status, std::move(blob), std::move(callback));
- task_runner_->PostTask(FROM_HERE, std::move(callback_on_mojo_thread));
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
+
+ std::move(callback).Run(status, std::move(blob));
+}
+
+void CameraAppDeviceImpl::NotifyShutterDoneOnMojoThread() {
+ DCHECK(mojo_task_runner_->BelongsToCurrentThread());
+
+ for (auto& observer : camera_event_observers_) {
+ observer.second->OnShutterDone();
+ }
}
} // namespace media