#pragma once #include #include #include #include #include #include #include #include "cvmmap_streamer/ipc/contracts.hpp" namespace cvmmap_streamer { enum class CodecType { H264, H265, }; enum class RunMode { Pipeline, Ingest, }; enum class InputMode { Real, Dummy, }; enum class RtmpMode { Enhanced, Domestic, }; struct InputConfig { std::string shm_name{"cvmmap_default"}; std::string zmq_endpoint{"ipc:///tmp/cvmmap_default"}; }; struct DummyInputConfig { std::uint32_t frames{0}; std::uint32_t fps{60}; std::uint16_t width{64}; std::uint16_t height{48}; std::optional emit_reset_at{}; std::optional emit_reset_every{}; std::string label{"dummy"}; std::uint8_t channels{3}; ipc::Depth depth{ipc::Depth::U8}; ipc::PixelFormat pixel_format{ipc::PixelFormat::BGR}; std::uint64_t start_timestamp_ns{1'000'000'000ull}; std::uint32_t startup_delay_ms{100}; }; struct RtmpOutputConfig { bool enabled{false}; std::vector urls{}; RtmpMode mode{RtmpMode::Enhanced}; }; struct RtpOutputConfig { bool enabled{false}; std::optional endpoint{std::nullopt}; std::optional host{std::nullopt}; std::optional port{std::nullopt}; std::uint8_t payload_type{96}; std::optional sdp_path{std::nullopt}; }; struct OutputsConfig { RtmpOutputConfig rtmp{}; RtpOutputConfig rtp{}; }; struct LatencyConfig { std::size_t queue_size{1}; std::uint32_t gop{30}; std::uint32_t b_frames{0}; bool realtime_sync{true}; bool force_idr_on_reset{true}; std::uint32_t ingest_max_frames{0}; std::uint32_t ingest_idle_timeout_ms{1000}; std::uint32_t ingest_consumer_delay_ms{0}; std::uint32_t snapshot_copy_delay_us{0}; std::uint32_t emit_stall_ms{0}; }; struct RuntimeConfig { InputConfig input{}; DummyInputConfig dummy{}; InputMode input_mode{InputMode::Real}; RunMode run_mode{RunMode::Pipeline}; CodecType codec{CodecType::H264}; OutputsConfig outputs{}; LatencyConfig latency{}; static RuntimeConfig defaults(); }; std::string_view to_string(CodecType codec); std::string_view to_string(RunMode mode); std::string_view to_string(InputMode mode); std::string_view to_string(RtmpMode mode); std::expected parse_runtime_config(int argc, char **argv); std::expected validate_runtime_config(const RuntimeConfig &config); std::string summarize_runtime_config(const RuntimeConfig &config); }