#pragma once #include #include #include #include #include #include #include "config/config.h" #include "relay/dvr_sink.h" #include "relay/h265.h" #include "relay/rtp_subscriber.h" #include "relay/sink.h" namespace fpv { // 一路图传的数据流。 // 采集模块把 RTP 数据交给 onRtp,本类解析后分发给所有出口(转发/录制/RTSP), // 并维护 H.265 参数集供 RTSP 的 SDP 使用。 class Stream { public: Stream(std::string name, std::string codec, const std::vector& targets, const RecordConfig& record); // 收到一个 RTP 数据报(来自采集),解析后分发给各出口。 void onRtp(const std::uint8_t* data, std::size_t size); const std::string& name() const { return name_; } const std::string& codec() const { return codec_; } // RTSP 订阅管理。 void addSubscriber(RtpSubscriber* sub); void removeSubscriber(RtpSubscriber* sub); // 动态开关录制。 void setRecording(bool on); bool recording() const; // H.265 参数集(VPS/SPS/PPS),供 SDP 使用。 const H265Depacketizer& params() const { return *paramExtractor_; } std::uint64_t recvCount() const { return recv_.load(std::memory_order_relaxed); } std::uint64_t forwardCount() const { return forward_.load(std::memory_order_relaxed); } private: std::string name_; std::string codec_; RecordConfig recordCfg_; std::vector> sinks_; std::unique_ptr paramExtractor_; std::mutex subMutex_; std::vector subscribers_; mutable std::mutex recordMutex_; std::unique_ptr dvr_; std::atomic recv_ {0}; std::atomic forward_ {0}; }; } // namespace fpv