first
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user