refactor(input): consume cvmmap-core package
This commit is contained in:
@@ -42,20 +42,10 @@ std::string normalize_cli_error(std::string raw_message) {
|
||||
return "unknown argument";
|
||||
}
|
||||
|
||||
constexpr std::array<std::string_view, 27> kFlags{"--codec",
|
||||
constexpr std::array<std::string_view, 17> kFlags{"--codec",
|
||||
"--run-mode",
|
||||
"--input-mode",
|
||||
"--shm-name",
|
||||
"--zmq-endpoint",
|
||||
"--dummy-frames",
|
||||
"--dummy-fps",
|
||||
"--dummy-width",
|
||||
"--dummy-height",
|
||||
"--dummy-reset-at",
|
||||
"--dummy-reset-every",
|
||||
"--dummy-label",
|
||||
"--dummy-start-timestamp-ns",
|
||||
"--dummy-startup-delay-ms",
|
||||
"--rtmp-url",
|
||||
"--rtmp-mode",
|
||||
"--rtp-endpoint",
|
||||
@@ -95,19 +85,6 @@ parse_u32(std::string_view raw, std::string_view flag_name) {
|
||||
return value;
|
||||
}
|
||||
|
||||
std::expected<std::uint64_t, std::string>
|
||||
parse_u64(std::string_view raw, std::string_view flag_name) {
|
||||
std::uint64_t value{0};
|
||||
const auto *begin = raw.data();
|
||||
const auto *end = raw.data() + raw.size();
|
||||
const auto result = std::from_chars(begin, end, value, 10);
|
||||
if (result.ec != std::errc{} || result.ptr != end) {
|
||||
return std::unexpected("invalid value for " + std::string(flag_name) +
|
||||
": '" + std::string(raw) + "'");
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
std::expected<std::uint16_t, std::string>
|
||||
parse_u16(std::string_view raw, std::string_view flag_name) {
|
||||
std::uint16_t value{0};
|
||||
@@ -173,17 +150,6 @@ std::expected<RunMode, std::string> parse_run_mode(std::string_view raw) {
|
||||
"' (expected: pipeline|ingest)");
|
||||
}
|
||||
|
||||
std::expected<InputMode, std::string> parse_input_mode(std::string_view raw) {
|
||||
if (raw == "real") {
|
||||
return InputMode::Real;
|
||||
}
|
||||
if (raw == "dummy") {
|
||||
return InputMode::Dummy;
|
||||
}
|
||||
return std::unexpected("invalid input mode: '" + std::string(raw) +
|
||||
"' (expected: real|dummy)");
|
||||
}
|
||||
|
||||
std::expected<RtmpMode, std::string> parse_rtmp_mode(std::string_view raw) {
|
||||
if (raw == "enhanced") {
|
||||
return RtmpMode::Enhanced;
|
||||
@@ -254,17 +220,6 @@ std::string_view to_string(RunMode mode) {
|
||||
}
|
||||
}
|
||||
|
||||
std::string_view to_string(InputMode mode) {
|
||||
switch (mode) {
|
||||
case InputMode::Real:
|
||||
return "real";
|
||||
case InputMode::Dummy:
|
||||
return "dummy";
|
||||
default:
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
std::string_view to_string(RtmpMode mode) {
|
||||
switch (mode) {
|
||||
case RtmpMode::Enhanced:
|
||||
@@ -282,7 +237,6 @@ std::expected<RuntimeConfig, std::string> parse_runtime_config(int argc,
|
||||
|
||||
std::string codec_raw;
|
||||
std::string run_mode_raw;
|
||||
std::string input_mode_raw;
|
||||
std::string shm_name_raw;
|
||||
std::string zmq_endpoint_raw;
|
||||
std::vector<std::string> rtmp_urls_raw;
|
||||
@@ -300,16 +254,6 @@ std::expected<RuntimeConfig, std::string> parse_runtime_config(int argc,
|
||||
std::string ingest_consumer_delay_raw;
|
||||
std::string snapshot_copy_delay_raw;
|
||||
std::string emit_stall_raw;
|
||||
std::string dummy_frames_raw;
|
||||
std::string dummy_fps_raw;
|
||||
std::string dummy_width_raw;
|
||||
std::string dummy_height_raw;
|
||||
std::string dummy_reset_at_raw;
|
||||
std::string dummy_reset_every_raw;
|
||||
std::string dummy_label_raw;
|
||||
std::string dummy_start_timestamp_ns_raw;
|
||||
std::string dummy_startup_delay_ms_raw;
|
||||
|
||||
bool rtmp_enabled{false};
|
||||
bool rtp_enabled{false};
|
||||
bool version_requested{false};
|
||||
@@ -320,18 +264,8 @@ std::expected<RuntimeConfig, std::string> parse_runtime_config(int argc,
|
||||
|
||||
app.add_option("--codec", codec_raw);
|
||||
app.add_option("--run-mode", run_mode_raw);
|
||||
app.add_option("--input-mode", input_mode_raw);
|
||||
app.add_option("--shm-name", shm_name_raw);
|
||||
app.add_option("--zmq-endpoint", zmq_endpoint_raw);
|
||||
app.add_option("--dummy-frames", dummy_frames_raw);
|
||||
app.add_option("--dummy-fps", dummy_fps_raw);
|
||||
app.add_option("--dummy-width", dummy_width_raw);
|
||||
app.add_option("--dummy-height", dummy_height_raw);
|
||||
app.add_option("--dummy-reset-at", dummy_reset_at_raw);
|
||||
app.add_option("--dummy-reset-every", dummy_reset_every_raw);
|
||||
app.add_option("--dummy-label", dummy_label_raw);
|
||||
app.add_option("--dummy-start-timestamp-ns", dummy_start_timestamp_ns_raw);
|
||||
app.add_option("--dummy-startup-delay-ms", dummy_startup_delay_ms_raw);
|
||||
app.add_flag("--rtmp", rtmp_enabled);
|
||||
app.add_option("--rtmp-url", rtmp_urls_raw);
|
||||
app.add_option("--rtmp-mode", rtmp_mode_raw);
|
||||
@@ -378,14 +312,6 @@ std::expected<RuntimeConfig, std::string> parse_runtime_config(int argc,
|
||||
config.run_mode = *run_mode;
|
||||
}
|
||||
|
||||
if (!input_mode_raw.empty()) {
|
||||
auto input_mode = parse_input_mode(input_mode_raw);
|
||||
if (!input_mode) {
|
||||
return std::unexpected(input_mode.error());
|
||||
}
|
||||
config.input_mode = *input_mode;
|
||||
}
|
||||
|
||||
if (!shm_name_raw.empty()) {
|
||||
config.input.shm_name = shm_name_raw;
|
||||
}
|
||||
@@ -394,84 +320,6 @@ std::expected<RuntimeConfig, std::string> parse_runtime_config(int argc,
|
||||
config.input.zmq_endpoint = zmq_endpoint_raw;
|
||||
}
|
||||
|
||||
if (!dummy_frames_raw.empty()) {
|
||||
auto parsed = parse_u32(dummy_frames_raw, "--dummy-frames");
|
||||
if (!parsed) {
|
||||
return std::unexpected(parsed.error());
|
||||
}
|
||||
config.dummy.frames = *parsed;
|
||||
}
|
||||
|
||||
if (!dummy_fps_raw.empty()) {
|
||||
auto parsed = parse_u32(dummy_fps_raw, "--dummy-fps");
|
||||
if (!parsed) {
|
||||
return std::unexpected(parsed.error());
|
||||
}
|
||||
config.dummy.fps = *parsed;
|
||||
}
|
||||
|
||||
if (!dummy_width_raw.empty()) {
|
||||
auto parsed = parse_u32(dummy_width_raw, "--dummy-width");
|
||||
if (!parsed) {
|
||||
return std::unexpected(parsed.error());
|
||||
}
|
||||
if (*parsed > std::numeric_limits<std::uint16_t>::max()) {
|
||||
return std::unexpected("value out of range for --dummy-width: '" +
|
||||
dummy_width_raw + "'");
|
||||
}
|
||||
config.dummy.width = static_cast<std::uint16_t>(*parsed);
|
||||
}
|
||||
|
||||
if (!dummy_height_raw.empty()) {
|
||||
auto parsed = parse_u32(dummy_height_raw, "--dummy-height");
|
||||
if (!parsed) {
|
||||
return std::unexpected(parsed.error());
|
||||
}
|
||||
if (*parsed > std::numeric_limits<std::uint16_t>::max()) {
|
||||
return std::unexpected("value out of range for --dummy-height: '" +
|
||||
dummy_height_raw + "'");
|
||||
}
|
||||
config.dummy.height = static_cast<std::uint16_t>(*parsed);
|
||||
}
|
||||
|
||||
if (!dummy_reset_at_raw.empty()) {
|
||||
auto parsed = parse_u32(dummy_reset_at_raw, "--dummy-reset-at");
|
||||
if (!parsed) {
|
||||
return std::unexpected(parsed.error());
|
||||
}
|
||||
config.dummy.emit_reset_at = *parsed;
|
||||
}
|
||||
|
||||
if (!dummy_reset_every_raw.empty()) {
|
||||
auto parsed = parse_u32(dummy_reset_every_raw, "--dummy-reset-every");
|
||||
if (!parsed) {
|
||||
return std::unexpected(parsed.error());
|
||||
}
|
||||
config.dummy.emit_reset_every = *parsed;
|
||||
}
|
||||
|
||||
if (!dummy_label_raw.empty()) {
|
||||
config.dummy.label = dummy_label_raw;
|
||||
}
|
||||
|
||||
if (!dummy_start_timestamp_ns_raw.empty()) {
|
||||
auto parsed =
|
||||
parse_u64(dummy_start_timestamp_ns_raw, "--dummy-start-timestamp-ns");
|
||||
if (!parsed) {
|
||||
return std::unexpected(parsed.error());
|
||||
}
|
||||
config.dummy.start_timestamp_ns = *parsed;
|
||||
}
|
||||
|
||||
if (!dummy_startup_delay_ms_raw.empty()) {
|
||||
auto parsed =
|
||||
parse_u32(dummy_startup_delay_ms_raw, "--dummy-startup-delay-ms");
|
||||
if (!parsed) {
|
||||
return std::unexpected(parsed.error());
|
||||
}
|
||||
config.dummy.startup_delay_ms = *parsed;
|
||||
}
|
||||
|
||||
config.outputs.rtmp.enabled = rtmp_enabled;
|
||||
if (!rtmp_urls_raw.empty()) {
|
||||
config.outputs.rtmp.enabled = true;
|
||||
@@ -609,13 +457,6 @@ validate_runtime_config(const RuntimeConfig &config) {
|
||||
"invalid input config: --shm-name must not be empty");
|
||||
}
|
||||
|
||||
if (config.input_mode == InputMode::Dummy &&
|
||||
config.input.shm_name.starts_with("cvmmap://")) {
|
||||
return std::unexpected(
|
||||
"invalid input config: --input-mode dummy requires POSIX --shm-name, "
|
||||
"not cvmmap:// URI");
|
||||
}
|
||||
|
||||
if (config.input.zmq_endpoint.empty()) {
|
||||
return std::unexpected(
|
||||
"invalid input config: --zmq-endpoint must not be empty");
|
||||
@@ -680,39 +521,6 @@ validate_runtime_config(const RuntimeConfig &config) {
|
||||
"invalid ingest config: --ingest-idle-timeout-ms must be >= 1");
|
||||
}
|
||||
|
||||
if (config.dummy.width == 0 || config.dummy.height == 0) {
|
||||
return std::unexpected(
|
||||
"invalid dummy config: --dummy-width and --dummy-height must be >= 1");
|
||||
}
|
||||
|
||||
if (config.dummy.channels == 0) {
|
||||
return std::unexpected("invalid dummy config: channels must be >= 1");
|
||||
}
|
||||
|
||||
if (config.dummy.label.empty()) {
|
||||
return std::unexpected("invalid dummy config: --dummy-label must not be empty");
|
||||
}
|
||||
|
||||
if (config.dummy.label.size() > ipc::kLabelLenMax) {
|
||||
return std::unexpected("invalid dummy config: --dummy-label exceeds 24 bytes");
|
||||
}
|
||||
|
||||
if (config.dummy.emit_reset_at && *config.dummy.emit_reset_at == 0) {
|
||||
return std::unexpected(
|
||||
"invalid dummy config: --dummy-reset-at must be >= 1");
|
||||
}
|
||||
|
||||
if (config.dummy.frames > 0 && config.dummy.emit_reset_at &&
|
||||
*config.dummy.emit_reset_at > config.dummy.frames) {
|
||||
return std::unexpected("invalid dummy config: --dummy-reset-at must be <= "
|
||||
"--dummy-frames when --dummy-frames > 0");
|
||||
}
|
||||
|
||||
if (config.dummy.emit_reset_every && *config.dummy.emit_reset_every == 0) {
|
||||
return std::unexpected(
|
||||
"invalid dummy config: --dummy-reset-every must be >= 1");
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
@@ -721,12 +529,6 @@ std::string summarize_runtime_config(const RuntimeConfig &config) {
|
||||
ss << "input.shm=" << config.input.shm_name;
|
||||
ss << ", input.zmq=" << config.input.zmq_endpoint;
|
||||
ss << ", run_mode=" << to_string(config.run_mode);
|
||||
ss << ", input_mode=" << to_string(config.input_mode);
|
||||
ss << ", dummy.frames=" << config.dummy.frames;
|
||||
ss << ", dummy.fps=" << config.dummy.fps;
|
||||
ss << ", dummy.size=" << config.dummy.width << "x" << config.dummy.height;
|
||||
ss << ", dummy.label=" << config.dummy.label;
|
||||
ss << ", dummy.start_timestamp_ns=" << config.dummy.start_timestamp_ns;
|
||||
ss << ", codec=" << to_string(config.codec);
|
||||
ss << ", rtmp.enabled=" << (config.outputs.rtmp.enabled ? "true" : "false");
|
||||
ss << ", rtmp.mode=" << to_string(config.outputs.rtmp.mode);
|
||||
|
||||
Reference in New Issue
Block a user