#ifndef MEDIA_CAPTURE_VIDEO_FAKE_VIDEO_CAPTURE_DEVICE_FACTORY_H_
#define MEDIA_CAPTURE_VIDEO_FAKE_VIDEO_CAPTURE_DEVICE_FACTORY_H_
#include <algorithm>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "build/build_config.h"
#include "media/base/video_facing.h"
#include "media/capture/video/fake_video_capture_device.h"
#include "media/capture/video/video_capture_device_descriptor.h"
#include "media/capture/video/video_capture_device_factory.h"
#if BUILDFLAG(IS_WIN)
#include "base/win/windows_types.h"
#include "media/base/win/dxgi_device_manager.h"
#endif
namespace media {
struct CAPTURE_EXPORT FakeVideoCaptureDeviceSettings {
FakeVideoCaptureDeviceSettings();
~FakeVideoCaptureDeviceSettings();
FakeVideoCaptureDeviceSettings(const FakeVideoCaptureDeviceSettings& other);
std::string device_id;
FakeVideoCaptureDevice::DeliveryMode delivery_mode;
VideoCaptureFormats supported_formats;
FakePhotoDeviceConfig photo_device_config;
FakeVideoCaptureDevice::DisplayMediaType display_media_type;
std::optional<media::CameraAvailability> availability;
};
class CAPTURE_EXPORT FakeVideoCaptureDeviceFactory
: public VideoCaptureDeviceFactory {
public:
static constexpr const char kDeviceConfigForGetPhotoStateFails[] =
"GetPhotoStateFails";
static constexpr const char kDeviceConfigForSetPhotoOptionsFails[] =
"SetPhotoOptionsFails";
static constexpr const char kDeviceConfigForTakePhotoFails[] =
"TakePhotoFails";
FakeVideoCaptureDeviceFactory();
~FakeVideoCaptureDeviceFactory() override;
static std::unique_ptr<VideoCaptureDevice> CreateDeviceWithSettings(
const FakeVideoCaptureDeviceSettings& settings);
static std::unique_ptr<VideoCaptureDevice> CreateDeviceWithDefaultResolutions(
VideoPixelFormat pixel_format,
FakeVideoCaptureDevice::DeliveryMode delivery_mode,
float frame_rate);
static std::unique_ptr<VideoCaptureDevice> CreateErrorDevice();
static void ParseFakeDevicesConfigFromOptionsString(
const std::string options_string,
std::vector<FakeVideoCaptureDeviceSettings>* config);
void SetToDefaultDevicesConfig(int device_count);
void SetToCustomDevicesConfig(
const std::vector<FakeVideoCaptureDeviceSettings>& config);
VideoCaptureErrorOrDevice CreateDevice(
const VideoCaptureDeviceDescriptor& device_descriptor) override;
void GetDevicesInfo(GetDevicesInfoCallback callback) override;
int number_of_devices() {
DCHECK(thread_checker_.CalledOnValidThread());
return static_cast<int>(devices_config_.size());
}
#if BUILDFLAG(IS_WIN)
void OnGpuInfoUpdate(const CHROME_LUID& luid) override;
scoped_refptr<DXGIDeviceManager> GetDxgiDeviceManager() override;
#endif
private:
VideoCaptureFormats GetSupportedFormats(const std::string& device_id);
std::vector<FakeVideoCaptureDeviceSettings> devices_config_;
#if BUILDFLAG(IS_WIN)
scoped_refptr<DXGIDeviceManager> dxgi_device_manager_;
CHROME_LUID luid_ = {0, 0};
#endif
};
}
#endif