Files
OpenIPC_RTL8812AU_Forword_cpp/src/relay/stream.h
T
2026-09-13 13:30:21 +08:00

61 lines
1.8 KiB
C++

#pragma once
#include <atomic>
#include <cstdint>
#include <memory>
#include <mutex>
#include <string>
#include <vector>
#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<std::string>& 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<std::unique_ptr<Sink>> sinks_;
std::unique_ptr<H265Depacketizer> paramExtractor_;
std::mutex subMutex_;
std::vector<RtpSubscriber*> subscribers_;
mutable std::mutex recordMutex_;
std::unique_ptr<DvrSink> dvr_;
std::atomic<std::uint64_t> recv_ {0};
std::atomic<std::uint64_t> forward_ {0};
};
} // namespace fpv