No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

105 líneas
2.8KB

  1. #ifndef ZLMEDIAKIT_SRT_PACKET_QUEUE_H
  2. #define ZLMEDIAKIT_SRT_PACKET_QUEUE_H
  3. #include "Packet.hpp"
  4. #include <algorithm>
  5. #include <list>
  6. #include <map>
  7. #include <memory>
  8. #include <tuple>
  9. #include <utility>
  10. #include <vector>
  11. namespace SRT {
  12. class PacketQueueInterface {
  13. public:
  14. using Ptr = std::shared_ptr<PacketQueueInterface>;
  15. using LostPair = std::pair<uint32_t, uint32_t>;
  16. PacketQueueInterface() = default;
  17. virtual ~PacketQueueInterface() = default;
  18. virtual bool inputPacket(DataPacket::Ptr pkt, std::list<DataPacket::Ptr> &out) = 0;
  19. virtual uint32_t timeLatency() = 0;
  20. virtual std::list<LostPair> getLostSeq() = 0;
  21. virtual size_t getSize() = 0;
  22. virtual size_t getExpectedSize() = 0;
  23. virtual size_t getAvailableBufferSize() = 0;
  24. virtual uint32_t getExpectedSeq() = 0;
  25. virtual std::string dump() = 0;
  26. virtual bool drop(uint32_t first, uint32_t last, std::list<DataPacket::Ptr> &out) = 0;
  27. };
  28. // for recv
  29. class PacketQueue : public PacketQueueInterface {
  30. public:
  31. using Ptr = std::shared_ptr<PacketQueue>;
  32. PacketQueue(uint32_t max_size, uint32_t init_seq, uint32_t latency);
  33. ~PacketQueue() = default;
  34. bool inputPacket(DataPacket::Ptr pkt, std::list<DataPacket::Ptr> &out);
  35. uint32_t timeLatency();
  36. std::list<LostPair> getLostSeq();
  37. size_t getSize();
  38. size_t getExpectedSize();
  39. size_t getAvailableBufferSize();
  40. uint32_t getExpectedSeq();
  41. std::string dump();
  42. bool drop(uint32_t first, uint32_t last, std::list<DataPacket::Ptr> &out);
  43. private:
  44. void tryInsertPkt(DataPacket::Ptr pkt);
  45. private:
  46. uint32_t _pkt_cap;
  47. uint32_t _pkt_latency;
  48. uint32_t _pkt_expected_seq;
  49. std::map<uint32_t, DataPacket::Ptr> _pkt_map;
  50. };
  51. class PacketRecvQueue : public PacketQueueInterface {
  52. public:
  53. using Ptr = std::shared_ptr<PacketRecvQueue>;
  54. PacketRecvQueue(uint32_t max_size, uint32_t init_seq, uint32_t latency,uint32_t flag = 0xbf);
  55. ~PacketRecvQueue() = default;
  56. bool inputPacket(DataPacket::Ptr pkt, std::list<DataPacket::Ptr> &out);
  57. uint32_t timeLatency();
  58. std::list<LostPair> getLostSeq();
  59. size_t getSize();
  60. size_t getExpectedSize();
  61. size_t getAvailableBufferSize();
  62. uint32_t getExpectedSeq();
  63. std::string dump();
  64. bool drop(uint32_t first, uint32_t last, std::list<DataPacket::Ptr> &out);
  65. private:
  66. void tryInsertPkt(DataPacket::Ptr pkt);
  67. void insertToCycleBuf(DataPacket::Ptr pkt, uint32_t diff);
  68. DataPacket::Ptr getFirst();
  69. DataPacket::Ptr getLast();
  70. bool TLPKTDrop();
  71. private:
  72. uint32_t _pkt_cap;
  73. uint32_t _pkt_latency;
  74. uint32_t _pkt_expected_seq;
  75. uint32_t _srt_flag;
  76. std::vector<DataPacket::Ptr> _pkt_buf;
  77. uint32_t _start = 0;
  78. uint32_t _end = 0;
  79. size_t _size = 0;
  80. };
  81. } // namespace SRT
  82. #endif // ZLMEDIAKIT_SRT_PACKET_QUEUE_H