#include "services/video_capture/device_media_to_mojo_adapter.h"
#include "base/check.h"
#include "base/functional/bind.h"
#include "base/task/bind_post_task.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "media/base/scoped_async_trace.h"
#include "media/capture/video/video_capture_buffer_pool_impl.h"
#include "media/capture/video/video_capture_buffer_pool_util.h"
#include "media/capture/video/video_capture_buffer_tracker_factory_impl.h"
#include "media/capture/video/video_capture_metrics.h"
#include "media/capture/video/video_frame_receiver_on_task_runner.h"
#include "mojo/public/cpp/bindings/callback_helpers.h"
#include "services/video_capture/public/cpp/receiver_mojo_to_media_adapter.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "media/capture/video/chromeos/scoped_video_capture_jpeg_decoder.h"
#include "media/capture/video/chromeos/video_capture_jpeg_decoder_impl.h"
#elif BUILDFLAG(IS_WIN)
#include "media/capture/video/win/video_capture_device_factory_win.h"
#endif
namespace {
ScopedCaptureTrace;
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::unique_ptr<media::VideoCaptureJpegDecoder> CreateGpuJpegDecoder(
scoped_refptr<base::SequencedTaskRunner> decoder_task_runner,
media::MojoMjpegDecodeAcceleratorFactoryCB jpeg_decoder_factory_callback,
media::VideoCaptureJpegDecoder::DecodeDoneCB decode_done_cb,
base::RepeatingCallback<void(const std::string&)> send_log_message_cb) {
return std::make_unique<media::ScopedVideoCaptureJpegDecoder>(
std::make_unique<media::VideoCaptureJpegDecoderImpl>(
jpeg_decoder_factory_callback, decoder_task_runner,
std::move(decode_done_cb), std::move(send_log_message_cb)),
decoder_task_runner);
}
#endif
void TakePhotoCallbackTrampoline(
media::VideoCaptureDevice::TakePhotoCallback callback,
std::unique_ptr<ScopedCaptureTrace> trace,
media::mojom::BlobPtr blob) { … }
}
namespace video_capture {
#if BUILDFLAG(IS_CHROMEOS_ASH)
DeviceMediaToMojoAdapter::DeviceMediaToMojoAdapter(
std::unique_ptr<media::VideoCaptureDevice> device,
media::MojoMjpegDecodeAcceleratorFactoryCB jpeg_decoder_factory_callback,
scoped_refptr<base::SequencedTaskRunner> jpeg_decoder_task_runner)
: device_(std::move(device)),
jpeg_decoder_factory_callback_(std::move(jpeg_decoder_factory_callback)),
jpeg_decoder_task_runner_(std::move(jpeg_decoder_task_runner)) {}
#elif BUILDFLAG(IS_WIN)
DeviceMediaToMojoAdapter::DeviceMediaToMojoAdapter(
std::unique_ptr<media::VideoCaptureDevice> device,
media::VideoCaptureDeviceFactory* factory)
: device_(std::move(device)),
device_started_(false),
dxgi_device_manager_(factory ? factory->GetDxgiDeviceManager()
: nullptr) {}
#else
DeviceMediaToMojoAdapter::DeviceMediaToMojoAdapter(
std::unique_ptr<media::VideoCaptureDevice> device)
: … { … }
#endif
DeviceMediaToMojoAdapter::~DeviceMediaToMojoAdapter() { … }
void DeviceMediaToMojoAdapter::Start(
const media::VideoCaptureParams& requested_settings,
mojo::PendingRemote<mojom::VideoFrameHandler>
video_frame_handler_pending_remote) { … }
void DeviceMediaToMojoAdapter::StartInProcess(
const media::VideoCaptureParams& requested_settings,
const base::WeakPtr<media::VideoFrameReceiver>& frame_handler,
media::VideoEffectsContext context) { … }
void DeviceMediaToMojoAdapter::StartInternal(
const media::VideoCaptureParams& requested_settings,
std::optional<mojo::PendingRemote<mojom::VideoFrameHandler>>
handler_pending_remote,
const base::WeakPtr<media::VideoFrameReceiver>& frame_handler,
bool start_in_process,
media::VideoEffectsContext context) { … }
void DeviceMediaToMojoAdapter::StopInProcess() { … }
void DeviceMediaToMojoAdapter::MaybeSuspend() { … }
void DeviceMediaToMojoAdapter::Resume() { … }
void DeviceMediaToMojoAdapter::GetPhotoState(GetPhotoStateCallback callback) { … }
void DeviceMediaToMojoAdapter::SetPhotoOptions(
media::mojom::PhotoSettingsPtr settings,
SetPhotoOptionsCallback callback) { … }
void DeviceMediaToMojoAdapter::TakePhoto(TakePhotoCallback callback) { … }
void DeviceMediaToMojoAdapter::ProcessFeedback(
const media::VideoCaptureFeedback& feedback) { … }
void DeviceMediaToMojoAdapter::RequestRefreshFrame() { … }
void DeviceMediaToMojoAdapter::Stop() { … }
void DeviceMediaToMojoAdapter::OnClientConnectionErrorOrClose() { … }
int DeviceMediaToMojoAdapter::max_buffer_pool_buffer_count() { … }
}