gpu_memory_buffer_virtual_device_mojo_adapter.cc 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. // Copyright 2020 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/gpu_memory_buffer_virtual_device_mojo_adapter.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "base/check_op.h"
  8. #include "base/memory/ptr_util.h"
  9. #include "media/base/bind_to_current_loop.h"
  10. #include "mojo/public/cpp/bindings/callback_helpers.h"
  11. #include "services/video_capture/public/mojom/constants.mojom.h"
  12. namespace video_capture {
  13. GpuMemoryBufferVirtualDeviceMojoAdapter::
  14. GpuMemoryBufferVirtualDeviceMojoAdapter() = default;
  15. GpuMemoryBufferVirtualDeviceMojoAdapter::
  16. ~GpuMemoryBufferVirtualDeviceMojoAdapter() {
  17. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  18. }
  19. void GpuMemoryBufferVirtualDeviceMojoAdapter::SetReceiverDisconnectedCallback(
  20. base::OnceClosure callback) {
  21. optional_receiver_disconnected_callback_ = std::move(callback);
  22. }
  23. void GpuMemoryBufferVirtualDeviceMojoAdapter::OnNewGpuMemoryBufferHandle(
  24. int32_t buffer_id,
  25. gfx::GpuMemoryBufferHandle gmb_handle) {
  26. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  27. // Keep track of the buffer handles in order to be able to forward them to
  28. // the Receiver when it connects. This includes cases where a new Receiver
  29. // connects after a previous one has disconnected.
  30. known_buffer_handles_.insert(std::make_pair(buffer_id, gmb_handle.Clone()));
  31. if (!video_frame_handler_.is_bound())
  32. return;
  33. media::mojom::VideoBufferHandlePtr buffer_handle =
  34. media::mojom::VideoBufferHandle::NewGpuMemoryBufferHandle(
  35. std::move(gmb_handle));
  36. video_frame_handler_->OnNewBuffer(buffer_id, std::move(buffer_handle));
  37. }
  38. void GpuMemoryBufferVirtualDeviceMojoAdapter::OnFrameAccessHandlerReady(
  39. mojo::PendingRemote<video_capture::mojom::VideoFrameAccessHandler>
  40. pending_frame_access_handler) {
  41. DCHECK(!frame_access_handler_remote_);
  42. frame_access_handler_remote_ =
  43. base::MakeRefCounted<VideoFrameAccessHandlerRemote>(
  44. mojo::Remote<video_capture::mojom::VideoFrameAccessHandler>(
  45. std::move(pending_frame_access_handler)));
  46. }
  47. void GpuMemoryBufferVirtualDeviceMojoAdapter::OnFrameReadyInBuffer(
  48. int32_t buffer_id,
  49. media::mojom::VideoFrameInfoPtr frame_info) {
  50. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  51. DCHECK(frame_access_handler_remote_);
  52. if (!video_frame_handler_.is_bound()) {
  53. (*frame_access_handler_remote_)->OnFinishedConsumingBuffer(buffer_id);
  54. return;
  55. }
  56. if (!video_frame_handler_has_forwarder_) {
  57. VideoFrameAccessHandlerForwarder::
  58. CreateForwarderAndSendVideoFrameAccessHandlerReady(
  59. video_frame_handler_, frame_access_handler_remote_);
  60. video_frame_handler_has_forwarder_ = true;
  61. }
  62. video_frame_handler_->OnFrameReadyInBuffer(
  63. mojom::ReadyFrameInBuffer::New(buffer_id, 0 /* frame_feedback_id */,
  64. std::move(frame_info)),
  65. {});
  66. }
  67. void GpuMemoryBufferVirtualDeviceMojoAdapter::OnBufferRetired(int buffer_id) {
  68. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  69. known_buffer_handles_.erase(buffer_id);
  70. if (!video_frame_handler_.is_bound())
  71. return;
  72. video_frame_handler_->OnBufferRetired(buffer_id);
  73. }
  74. void GpuMemoryBufferVirtualDeviceMojoAdapter::Start(
  75. const media::VideoCaptureParams& requested_settings,
  76. mojo::PendingRemote<mojom::VideoFrameHandler> handler) {
  77. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  78. video_frame_handler_.Bind(std::move(handler));
  79. video_frame_handler_.set_disconnect_handler(
  80. base::BindOnce(&GpuMemoryBufferVirtualDeviceMojoAdapter::
  81. OnReceiverConnectionErrorOrClose,
  82. base::Unretained(this)));
  83. video_frame_handler_->OnStarted();
  84. // Notify receiver of known buffer handles */
  85. for (auto& entry : known_buffer_handles_) {
  86. media::mojom::VideoBufferHandlePtr buffer_handle =
  87. media::mojom::VideoBufferHandle::NewGpuMemoryBufferHandle(
  88. entry.second.Clone());
  89. video_frame_handler_->OnNewBuffer(entry.first, std::move(buffer_handle));
  90. }
  91. }
  92. void GpuMemoryBufferVirtualDeviceMojoAdapter::MaybeSuspend() {
  93. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  94. }
  95. void GpuMemoryBufferVirtualDeviceMojoAdapter::Resume() {
  96. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  97. }
  98. void GpuMemoryBufferVirtualDeviceMojoAdapter::GetPhotoState(
  99. GetPhotoStateCallback callback) {
  100. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  101. std::move(callback).Run(nullptr);
  102. }
  103. void GpuMemoryBufferVirtualDeviceMojoAdapter::SetPhotoOptions(
  104. media::mojom::PhotoSettingsPtr settings,
  105. SetPhotoOptionsCallback callback) {
  106. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  107. }
  108. void GpuMemoryBufferVirtualDeviceMojoAdapter::TakePhoto(
  109. TakePhotoCallback callback) {
  110. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  111. }
  112. void GpuMemoryBufferVirtualDeviceMojoAdapter::ProcessFeedback(
  113. const media::VideoCaptureFeedback& feedback) {
  114. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  115. }
  116. void GpuMemoryBufferVirtualDeviceMojoAdapter::RequestRefreshFrame() {
  117. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  118. }
  119. void GpuMemoryBufferVirtualDeviceMojoAdapter::Stop() {
  120. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  121. if (!video_frame_handler_.is_bound())
  122. return;
  123. // Unsubscribe from connection error callbacks.
  124. video_frame_handler_.set_disconnect_handler(base::OnceClosure());
  125. // Send out OnBufferRetired events and OnStopped.
  126. for (const auto& entry : known_buffer_handles_)
  127. video_frame_handler_->OnBufferRetired(entry.first);
  128. video_frame_handler_->OnStopped();
  129. video_frame_handler_.reset();
  130. video_frame_handler_has_forwarder_ = false;
  131. }
  132. void GpuMemoryBufferVirtualDeviceMojoAdapter::
  133. OnReceiverConnectionErrorOrClose() {
  134. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  135. Stop();
  136. if (optional_receiver_disconnected_callback_)
  137. std::move(optional_receiver_disconnected_callback_).Run();
  138. }
  139. } // namespace video_capture