feat(downstream): add cvmmap downstream runtime implementation
This commit introduces the full downstream runtime implementation needed to ingest, transform, and publish streams. It preserves the original upstream request boundary by packaging the entire cvmmap-streamer module (build config, public API, protocol and IPC glue, and simulator/tester entrypoints) in one coherent core unit. Keeping this group isolated enables reviewers to validate runtime behavior and correctness without mixing test evidence or process documentation changes. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <expected>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
namespace cvmmap_streamer {
|
||||
|
||||
enum class CodecType {
|
||||
H264,
|
||||
H265,
|
||||
};
|
||||
|
||||
enum class RunMode {
|
||||
Pipeline,
|
||||
Ingest,
|
||||
};
|
||||
|
||||
enum class RtmpMode {
|
||||
Enhanced,
|
||||
Domestic,
|
||||
};
|
||||
|
||||
struct InputConfig {
|
||||
std::string shm_name{"cvmmap_default"};
|
||||
std::string zmq_endpoint{"ipc:///tmp/cvmmap_default"};
|
||||
};
|
||||
|
||||
struct RtmpOutputConfig {
|
||||
bool enabled{false};
|
||||
std::vector<std::string> urls{};
|
||||
RtmpMode mode{RtmpMode::Enhanced};
|
||||
};
|
||||
|
||||
struct RtpOutputConfig {
|
||||
bool enabled{false};
|
||||
std::optional<std::string> endpoint{std::nullopt};
|
||||
std::optional<std::string> host{std::nullopt};
|
||||
std::optional<std::uint16_t> port{std::nullopt};
|
||||
std::uint8_t payload_type{96};
|
||||
std::optional<std::string> 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{};
|
||||
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(RtmpMode mode);
|
||||
|
||||
std::expected<RuntimeConfig, std::string> parse_runtime_config(int argc, char **argv);
|
||||
std::expected<void, std::string> validate_runtime_config(const RuntimeConfig &config);
|
||||
std::string summarize_runtime_config(const RuntimeConfig &config);
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user