61 lines
1.8 KiB
C++
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
|