#pragma once #include #include #include #include #include #include #include #include "video_reader.hpp" #include "rtsp_reader.hpp" #include "frame_queue.hpp" namespace pipeline { struct SourceStatus { bool is_connected{false}; int frame_count{0}; float current_fps{0.0f}; int error_count{0}; std::string last_error; }; class InputManager { public: explicit InputManager(size_t queue_capacity = 30); ~InputManager(); // 禁用拷贝 InputManager(const InputManager&) = delete; InputManager& operator=(const InputManager&) = delete; // 添加源 bool addSource(const std::string& name, const RtspReader::Config& config, const std::string& url, const std::vector& output_targets = {}); bool addVideoSource(const std::string& name, const VideoReader::Config& config, const std::string& path, const std::vector& output_targets = {}); // 移除源 bool removeSource(const std::string& name); // 获取下一批帧 bool getNextBatch(std::vector& frames, int timeout_ms = 1000); // 获取源状态 bool getSourceStatus(const std::string& name, SourceStatus& status); // 获取源名称列表 std::vector getSourceNames() const; // 获取源数量 size_t getSourceCount() const; // 获取源的输出目标 std::vector getSourceOutputTargets(const std::string& name) const; // 清空所有源 void clear(); private: enum class SourceType { RTSP, VIDEO }; mutable std::mutex sources_mutex_; std::unordered_map> rtsp_sources_; std::unordered_map> video_sources_; std::unordered_map> source_threads_; std::unordered_map source_types_; std::unordered_map source_status_; std::unordered_map> source_queues_; std::unordered_map> source_output_targets_; std::atomic running_{true}; std::atomic active_threads_{0}; void sourceThread(const std::string& name); void videoSourceThread(const std::string& name); void updateSourceStatus(const std::string& name, const SourceStatus& status); }; } // namespace pipeline