video_source_provider_impl.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright 2019 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/video_source_provider_impl.h"
  5. #include "base/bind.h"
  6. #include "services/video_capture/public/mojom/producer.mojom.h"
  7. #include "services/video_capture/video_source_impl.h"
  8. #include "services/video_capture/virtual_device_enabled_device_factory.h"
  9. namespace video_capture {
  10. VideoSourceProviderImpl::VideoSourceProviderImpl(
  11. DeviceFactory* device_factory,
  12. base::RepeatingClosure on_last_client_disconnected_cb)
  13. : device_factory_(device_factory),
  14. on_last_client_disconnected_cb_(
  15. std::move(on_last_client_disconnected_cb)) {
  16. // Unretained |this| is safe because |receivers_| is owned by |this|.
  17. receivers_.set_disconnect_handler(base::BindRepeating(
  18. &VideoSourceProviderImpl::OnClientDisconnected, base::Unretained(this)));
  19. }
  20. VideoSourceProviderImpl::~VideoSourceProviderImpl() = default;
  21. void VideoSourceProviderImpl::AddClient(
  22. mojo::PendingReceiver<mojom::VideoSourceProvider> receiver) {
  23. receivers_.Add(this, std::move(receiver));
  24. client_count_++;
  25. }
  26. void VideoSourceProviderImpl::GetSourceInfos(GetSourceInfosCallback callback) {
  27. device_factory_->GetDeviceInfos(std::move(callback));
  28. }
  29. void VideoSourceProviderImpl::GetVideoSource(
  30. const std::string& device_id,
  31. mojo::PendingReceiver<mojom::VideoSource> source_receiver) {
  32. auto source_iter = sources_.find(device_id);
  33. if (source_iter == sources_.end()) {
  34. auto video_source = std::make_unique<VideoSourceImpl>(
  35. device_factory_, device_id,
  36. base::BindRepeating(
  37. &VideoSourceProviderImpl::OnVideoSourceLastClientDisconnected,
  38. base::Unretained(this), device_id));
  39. source_iter =
  40. sources_.insert(std::make_pair(device_id, std::move(video_source)))
  41. .first;
  42. }
  43. source_iter->second->AddToReceiverSet(std::move(source_receiver));
  44. }
  45. void VideoSourceProviderImpl::AddSharedMemoryVirtualDevice(
  46. const media::VideoCaptureDeviceInfo& device_info,
  47. mojo::PendingRemote<mojom::Producer> producer,
  48. bool send_buffer_handles_to_producer_as_raw_file_descriptors,
  49. mojo::PendingReceiver<mojom::SharedMemoryVirtualDevice>
  50. virtual_device_receiver) {
  51. device_factory_->AddSharedMemoryVirtualDevice(
  52. device_info, std::move(producer),
  53. send_buffer_handles_to_producer_as_raw_file_descriptors,
  54. std::move(virtual_device_receiver));
  55. }
  56. void VideoSourceProviderImpl::AddTextureVirtualDevice(
  57. const media::VideoCaptureDeviceInfo& device_info,
  58. mojo::PendingReceiver<mojom::TextureVirtualDevice>
  59. virtual_device_receiver) {
  60. device_factory_->AddTextureVirtualDevice(device_info,
  61. std::move(virtual_device_receiver));
  62. }
  63. void VideoSourceProviderImpl::RegisterVirtualDevicesChangedObserver(
  64. mojo::PendingRemote<mojom::DevicesChangedObserver> observer,
  65. bool raise_event_if_virtual_devices_already_present) {
  66. device_factory_->RegisterVirtualDevicesChangedObserver(
  67. std::move(observer), raise_event_if_virtual_devices_already_present);
  68. }
  69. void VideoSourceProviderImpl::Close(CloseCallback callback) {
  70. closed_but_not_yet_disconnected_client_count_++;
  71. // |callback must be run before OnClientDisconnectedOrClosed(), because if the
  72. // latter leads to the destruction of |this|, the message pipe to the client
  73. // gets severed, and the callback never makes it through.
  74. std::move(callback).Run();
  75. OnClientDisconnectedOrClosed();
  76. }
  77. void VideoSourceProviderImpl::OnClientDisconnected() {
  78. if (closed_but_not_yet_disconnected_client_count_ > 0) {
  79. closed_but_not_yet_disconnected_client_count_--;
  80. return;
  81. }
  82. OnClientDisconnectedOrClosed();
  83. }
  84. void VideoSourceProviderImpl::OnClientDisconnectedOrClosed() {
  85. client_count_--;
  86. if (client_count_ == 0) {
  87. // No member access allowed after this call, because it may lead to the
  88. // destruction of |this|.
  89. on_last_client_disconnected_cb_.Run();
  90. }
  91. }
  92. void VideoSourceProviderImpl::OnVideoSourceLastClientDisconnected(
  93. const std::string& device_id) {
  94. sources_.erase(device_id);
  95. }
  96. } // namespace video_capture