texture_virtual_device_mojo_adapter.cc 5.8 KB

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