device_factory_adapter_lacros.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/video_capture/lacros/device_factory_adapter_lacros.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/bind.h"
  8. #include "base/check.h"
  9. #include "base/notreached.h"
  10. #include "mojo/public/cpp/bindings/pending_remote.h"
  11. #include "services/video_capture/lacros/device_proxy_lacros.h"
  12. #include "services/video_capture/public/uma/video_capture_service_event.h"
  13. namespace video_capture {
  14. DeviceFactoryAdapterLacros::DeviceFactoryAdapterLacros(
  15. mojo::PendingRemote<crosapi::mojom::VideoCaptureDeviceFactory>
  16. device_factory_ash)
  17. : device_factory_ash_(std::move(device_factory_ash)) {}
  18. DeviceFactoryAdapterLacros::~DeviceFactoryAdapterLacros() = default;
  19. void DeviceFactoryAdapterLacros::GetDeviceInfos(
  20. GetDeviceInfosCallback callback) {
  21. DCHECK(device_factory_ash_.is_bound());
  22. device_factory_ash_->GetDeviceInfos(std::move(callback));
  23. }
  24. void DeviceFactoryAdapterLacros::CreateDevice(
  25. const std::string& device_id,
  26. mojo::PendingReceiver<mojom::Device> device_receiver,
  27. CreateDeviceCallback callback) {
  28. DCHECK(device_factory_ash_.is_bound());
  29. mojo::PendingRemote<crosapi::mojom::VideoCaptureDevice> proxy_remote;
  30. auto proxy_receiver = proxy_remote.InitWithNewPipeAndPassReceiver();
  31. // Since |device_proxy| is owned by this instance and the cleanup callback is
  32. // only called within the lifetime of |device_proxy|, it should be safe to use
  33. // base::Unretained(this) here.
  34. auto device_proxy = std::make_unique<DeviceProxyLacros>(
  35. std::move(device_receiver), std::move(proxy_remote),
  36. base::BindOnce(
  37. &DeviceFactoryAdapterLacros::OnClientConnectionErrorOrClose,
  38. base::Unretained(this), device_id));
  39. auto wrapped_callback = base::BindOnce(
  40. [](CreateDeviceCallback callback,
  41. crosapi::mojom::DeviceAccessResultCode code) {
  42. media::VideoCaptureError video_capture_result_code;
  43. switch (code) {
  44. case crosapi::mojom::DeviceAccessResultCode::NOT_INITIALIZED:
  45. video_capture_result_code = media::VideoCaptureError::
  46. kCrosHalV3DeviceDelegateFailedToInitializeCameraDevice;
  47. break;
  48. case crosapi::mojom::DeviceAccessResultCode::SUCCESS:
  49. video_capture_result_code = media::VideoCaptureError::kNone;
  50. break;
  51. case crosapi::mojom::DeviceAccessResultCode::ERROR_DEVICE_NOT_FOUND:
  52. video_capture_result_code = media::VideoCaptureError::
  53. kServiceDeviceLauncherServiceRespondedWithDeviceNotFound;
  54. break;
  55. default:
  56. NOTREACHED() << "Unexpected device access result code";
  57. }
  58. std::move(callback).Run(video_capture_result_code);
  59. },
  60. std::move(callback));
  61. devices_.emplace(device_id, std::move(device_proxy));
  62. device_factory_ash_->CreateDevice(device_id, std::move(proxy_receiver),
  63. std::move(wrapped_callback));
  64. }
  65. void DeviceFactoryAdapterLacros::AddSharedMemoryVirtualDevice(
  66. const media::VideoCaptureDeviceInfo& device_info,
  67. mojo::PendingRemote<mojom::Producer> producer,
  68. bool send_buffer_handles_to_producer_as_raw_file_descriptors,
  69. mojo::PendingReceiver<mojom::SharedMemoryVirtualDevice>
  70. virtual_device_receiver) {
  71. NOTREACHED();
  72. }
  73. void DeviceFactoryAdapterLacros::AddTextureVirtualDevice(
  74. const media::VideoCaptureDeviceInfo& device_info,
  75. mojo::PendingReceiver<mojom::TextureVirtualDevice>
  76. virtual_device_receiver) {
  77. NOTREACHED();
  78. }
  79. void DeviceFactoryAdapterLacros::AddGpuMemoryBufferVirtualDevice(
  80. const media::VideoCaptureDeviceInfo& device_info,
  81. mojo::PendingReceiver<mojom::GpuMemoryBufferVirtualDevice>
  82. virtual_device_receiver) {
  83. NOTREACHED();
  84. }
  85. void DeviceFactoryAdapterLacros::RegisterVirtualDevicesChangedObserver(
  86. mojo::PendingRemote<mojom::DevicesChangedObserver> observer,
  87. bool raise_event_if_virtual_devices_already_present) {
  88. NOTREACHED();
  89. }
  90. void DeviceFactoryAdapterLacros::OnClientConnectionErrorOrClose(
  91. std::string device_id) {
  92. video_capture::uma::LogVideoCaptureServiceEvent(
  93. video_capture::uma::SERVICE_LOST_CONNECTION_TO_BROWSER);
  94. devices_.erase(device_id);
  95. }
  96. } // namespace video_capture