refactor(input): consume cvmmap-core package

This commit is contained in:
2026-03-06 14:42:07 +08:00
parent b9161ad8b6
commit ec492fe985
8 changed files with 64 additions and 571 deletions
+1 -199
View File
@@ -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);