8#include <condition_variable>
23#if defined(MAYAFLUX_PLATFORM_LINUX)
24inline constexpr std::string_view CAMERA_FORMAT =
"v4l2";
25#elif defined(MAYAFLUX_PLATFORM_MACOS)
26inline constexpr std::string_view CAMERA_FORMAT =
"avfoundation";
27#elif defined(MAYAFLUX_PLATFORM_WINDOWS)
28inline constexpr std::string_view CAMERA_FORMAT =
"dshow";
65 [[nodiscard]]
bool open(
const CameraConfig& config)
override;
67 [[nodiscard]] std::vector<CameraConfig> enumerate_configs()
const override;
69 [[nodiscard]] std::vector<CameraMode> preset_modes()
const override;
71 void close()
override;
72 [[nodiscard]]
bool is_open()
const override;
74 [[nodiscard]] std::shared_ptr<Kakshya::CameraContainer>
create_container()
const override;
76 bool pull_frame(
const std::shared_ptr<Kakshya::CameraContainer>& container)
override;
78 [[nodiscard]] uint32_t
width()
const override;
79 [[nodiscard]] uint32_t
height()
const override;
80 [[nodiscard]]
double frame_rate()
const override;
82 void set_container(
const std::shared_ptr<Kakshya::CameraContainer>& container)
override;
83 void pull_frame_all()
override;
85 [[nodiscard]]
const std::string& last_error()
const override;
94 void setup_io_service(uint64_t reader_id)
override;
97 std::shared_ptr<FFmpegDemuxContext>
m_demux;
98 std::shared_ptr<VideoStreamContext>
m_video;
105 uint64_t m_standalone_reader_id {};
106 bool m_owns_service {};
107 bool m_scaler_ready {};
112 std::atomic<bool> m_decode_stop {
false };
113 std::atomic<bool> m_decode_active {
false };
114 std::atomic<bool> m_frame_requested {
false };
116 void start_decode_thread();
117 void stop_decode_thread();
118 void decode_thread_func();
127 int m_requested_pixel_format { -1 };
Abstract interface for a live camera backend hosted by IOManager.
std::shared_ptr< FFmpegDemuxContext > m_demux
std::vector< uint8_t > m_sws_buf
std::weak_ptr< Kakshya::CameraContainer > m_container_ref
std::condition_variable m_decode_cv
std::shared_ptr< VideoStreamContext > m_video
FFmpegCameraReader(FFmpegCameraReader &&)=delete
FFmpegCameraReader & operator=(FFmpegCameraReader &&)=delete
std::thread m_decode_thread
FFmpegCameraReader(const FFmpegCameraReader &)=delete
std::mutex m_decode_mutex
std::shared_mutex m_ctx_mutex
std::shared_ptr< Registry::Service::IOService > m_standalone_service
FFmpegCameraReader & operator=(const FFmpegCameraReader &)=delete
Platform-specific FFmpeg input format string for camera devices.
auto create_container(Args &&... args) -> std::shared_ptr< ContainerType >
creates a new container of the specified type
Configuration for opening a camera device via FFmpeg.