mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-07-04 01:37:33 +08:00
add cyclebuffer for recv buf
This commit is contained in:
@@ -7,14 +7,34 @@
|
||||
#include <memory>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace SRT {
|
||||
|
||||
class PacketQueueInterface {
|
||||
public:
|
||||
using Ptr = std::shared_ptr<PacketQueueInterface>;
|
||||
using LostPair = std::pair<uint32_t, uint32_t>;
|
||||
|
||||
PacketQueueInterface() = default;
|
||||
virtual ~PacketQueueInterface() = default;
|
||||
virtual bool inputPacket(DataPacket::Ptr pkt, std::list<DataPacket::Ptr> &out) = 0;
|
||||
|
||||
virtual uint32_t timeLatency() = 0;
|
||||
virtual std::list<LostPair> getLostSeq() = 0;
|
||||
|
||||
virtual size_t getSize() = 0;
|
||||
virtual size_t getExpectedSize() = 0;
|
||||
virtual size_t getAvailableBufferSize() = 0;
|
||||
virtual uint32_t getExpectedSeq() = 0;
|
||||
|
||||
virtual std::string dump() = 0;
|
||||
virtual bool drop(uint32_t first, uint32_t last, std::list<DataPacket::Ptr> &out) = 0;
|
||||
};
|
||||
// for recv
|
||||
class PacketQueue {
|
||||
class PacketQueue : public PacketQueueInterface {
|
||||
public:
|
||||
using Ptr = std::shared_ptr<PacketQueue>;
|
||||
using LostPair = std::pair<uint32_t, uint32_t>;
|
||||
|
||||
PacketQueue(uint32_t max_size, uint32_t init_seq, uint32_t latency);
|
||||
~PacketQueue() = default;
|
||||
@@ -37,10 +57,46 @@ private:
|
||||
private:
|
||||
uint32_t _pkt_cap;
|
||||
uint32_t _pkt_latency;
|
||||
uint32_t _pkt_expected_seq = 0;
|
||||
uint32_t _pkt_expected_seq;
|
||||
std::map<uint32_t, DataPacket::Ptr> _pkt_map;
|
||||
};
|
||||
|
||||
class PacketRecvQueue : public PacketQueueInterface {
|
||||
public:
|
||||
using Ptr = std::shared_ptr<PacketRecvQueue>;
|
||||
|
||||
PacketRecvQueue(uint32_t max_size, uint32_t init_seq, uint32_t latency);
|
||||
~PacketRecvQueue() = default;
|
||||
bool inputPacket(DataPacket::Ptr pkt, std::list<DataPacket::Ptr> &out);
|
||||
|
||||
uint32_t timeLatency();
|
||||
std::list<LostPair> getLostSeq();
|
||||
|
||||
size_t getSize();
|
||||
size_t getExpectedSize();
|
||||
size_t getAvailableBufferSize();
|
||||
uint32_t getExpectedSeq();
|
||||
|
||||
std::string dump();
|
||||
bool drop(uint32_t first, uint32_t last, std::list<DataPacket::Ptr> &out);
|
||||
|
||||
private:
|
||||
void tryInsertPkt(DataPacket::Ptr pkt);
|
||||
void insertToCycleBuf(DataPacket::Ptr pkt, uint32_t diff);
|
||||
DataPacket::Ptr getFirst();
|
||||
DataPacket::Ptr getLast();
|
||||
|
||||
private:
|
||||
uint32_t _pkt_cap;
|
||||
uint32_t _pkt_latency;
|
||||
uint32_t _pkt_expected_seq;
|
||||
|
||||
std::vector<DataPacket::Ptr> _pkt_buf;
|
||||
uint32_t _start = 0;
|
||||
uint32_t _end = 0;
|
||||
size_t _size = 0;
|
||||
};
|
||||
|
||||
} // namespace SRT
|
||||
|
||||
#endif // ZLMEDIAKIT_SRT_PACKET_QUEUE_H
|
||||
Reference in New Issue
Block a user