chromium/services/video_capture/lacros/device_proxy_lacros.cc

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "services/video_capture/lacros/device_proxy_lacros.h"

#include <memory>
#include <utility>

#include "media/capture/mojom/image_capture.mojom.h"
#include "media/capture/video/video_capture_device_client.h"
#include "services/video_capture/lacros/video_frame_handler_proxy_lacros.h"

namespace video_capture {

DeviceProxyLacros::DeviceProxyLacros(
    std::optional<mojo::PendingReceiver<mojom::Device>> device_receiver,
    mojo::PendingRemote<crosapi::mojom::VideoCaptureDevice> proxy_remote,
    base::OnceClosure cleanup_callback)
    : device_(std::move(proxy_remote)) {
  if (device_receiver) {
    receiver_.Bind(std::move(*device_receiver));
    receiver_.set_disconnect_handler(std::move(cleanup_callback));
  }

  // Note that currently all versioned calls that we need to make are
  // best effort, and can just be dropped if we haven't gotten an updated
  // version yet. If that changes, we'll need to track that we have an
  // outstanding query and respond accordingly.
  device_.QueryVersion(base::DoNothing());
}

DeviceProxyLacros::~DeviceProxyLacros() = default;

void DeviceProxyLacros::Start(
    const media::VideoCaptureParams& requested_settings,
    mojo::PendingRemote<mojom::VideoFrameHandler> handler) {
  mojo::PendingRemote<crosapi::mojom::VideoFrameHandler> proxy_handler_remote;
  handler_ = std::make_unique<VideoFrameHandlerProxyLacros>(
      proxy_handler_remote.InitWithNewPipeAndPassReceiver(), std::move(handler),
      /*handler_remote_in_process=*/nullptr);
  device_->Start(std::move(requested_settings),
                 std::move(proxy_handler_remote));
}

void DeviceProxyLacros::StartInProcess(
    const media::VideoCaptureParams& requested_settings,
    const base::WeakPtr<media::VideoFrameReceiver>& frame_handler,
    media::VideoEffectsContext context) {
  mojo::PendingRemote<crosapi::mojom::VideoFrameHandler> proxy_handler_remote;
  handler_ = std::make_unique<VideoFrameHandlerProxyLacros>(
      proxy_handler_remote.InitWithNewPipeAndPassReceiver(),
      /*handler_remote=*/std::nullopt, frame_handler);
  device_->Start(std::move(requested_settings),
                 std::move(proxy_handler_remote));
}

void DeviceProxyLacros::MaybeSuspend() {
  device_->MaybeSuspend();
}

void DeviceProxyLacros::Resume() {
  device_->Resume();
}

void DeviceProxyLacros::GetPhotoState(GetPhotoStateCallback callback) {
  device_->GetPhotoState(std::move(callback));
}

void DeviceProxyLacros::SetPhotoOptions(media::mojom::PhotoSettingsPtr settings,
                                        SetPhotoOptionsCallback callback) {
  device_->SetPhotoOptions(std::move(settings), std::move(callback));
}

void DeviceProxyLacros::TakePhoto(TakePhotoCallback callback) {
  device_->TakePhoto(std::move(callback));
}

void DeviceProxyLacros::ProcessFeedback(
    const media::VideoCaptureFeedback& feedback) {
  device_->ProcessFeedback(std::move(feedback));
}

void DeviceProxyLacros::RequestRefreshFrame() {
  if (device_.version() >=
      int{crosapi::mojom::VideoCaptureDevice::MethodMinVersions::
              kRequestRefreshFrameMinVersion}) {
    device_->RequestRefreshFrame();
  }
}

}  // namespace video_capture