Cogs.Core
RTP.h
1#pragma once
2
3#include "../Video/IVideoDecoder.h"
4
5#include "Base.h"
6
7#include "Foundation/Network/Address.h"
8#include "Foundation/Network/Connection.h"
9
10#include <unordered_map>
11#include <mutex>
12
13namespace jrtplib{
14 class RTPSession;
15}// namespace ...
16
17namespace Cogs{
18 namespace Core{ class Context; };
19
20 struct COGSCORE_DLL_API RTPStream
21 {
22 RTPStream(Core::Context * context,
23 uint32_t clock_rate = 90000,
24 uint16_t client_port = 0,
26 bool udp = true);
27 ~RTPStream();
28
29 RTPStream(const RTPStream&) = delete;
30 RTPStream& operator=(const RTPStream&) = delete;
31 RTPStream(RTPStream&&) = delete;
32 RTPStream& operator=(RTPStream&&) = delete;
33
34 void setUserData(intptr_t data) { userData = data; }
35 void setConnectTimeout(int64_t milliseconds) { tcpConnection.setConnectTimeout(milliseconds); }
36
37 uint16_t GetRTPPort() const { return rtp_port; }
38 uint16_t GetRTCPPort() const { return rtcp_port; }
39 intptr_t getUserData() const { return userData; }
40
41 void AddDestination(const uint8_t ip[4], uint16_t server_port);
42 void JoinMulticastGroup(const uint8_t ip[4], uint16_t server_port);
43
44 void SendPacket(const uint8_t *buffer, size_t size);
45
46 void AddSSRC(uint32_t ssrc, Cogs::Core::Codec codec, ResourceId textureId);
47
48 struct Dest;
49 void WriteData(Dest &dest);
50
51 Dest *GetLatestStream();
52
53 void Update();
54
55 Core::Context * context = nullptr;
56 bool use_pool_thread = false;
57 bool useUDP = true;
58
59 uint32_t clock_rate = 0;
60 uint16_t client_port = 0;
61 uint16_t server_port = 0;
62 uint8_t ip[4] = {};
63
64 uint16_t rtp_port = 0;
65 uint16_t rtcp_port = 0;
66 jrtplib::RTPSession *session = nullptr;
67
68 Cogs::Core::Codec codec = Cogs::Core::Codec::None;
69
70 bool rtp_one_byte_header_extension = true; // rfc5285
71 bool rtp_two_byte_header_extension = false; // rfc5285
72
73 uint16_t rfc6051_ext_id = 1; // rfc6051: Synchronisation metadata: 64-bit timestamp format
74
75 uint32_t stream_number = 0;
76 struct Dest{
77 Cogs::Core::TextureHandle textureHandle;
78 Cogs::Core::Codec codec;
79
80 bool first = true;
81 uint64_t receive_time = 0, prev_receive_time = 0; // us
82 uint64_t timestamp = 0, prev_timestamp = 0; // us
83 size_t size = 0;
84 uint32_t eseq = 0, prev_eseq = 0;
85 uint32_t dropped_packages = 0, last_dropped = 0;
86
87 uint32_t size_akk = 0;
88 double rate = 0.0;
89 uint64_t rate_time = 0;
90
91 FILE *fp = nullptr;
92 char *buffer = nullptr;
93 size_t buffer_use = 0;
94 size_t buffer_size = 0;
95 uint64_t buffer_timestamp = 0;
96 bool buffer_first = false;
97 bool buffer_last = false;
98 bool buffer_discontinuity = false;
99
100 std::string vps;
101 std::string sps;
102 std::string pps;
103 Memory::MemoryBuffer nalu; // Current NALU being processed.
104 };
105 std::mutex dest_mu;
106 std::unordered_map<uint32_t, Dest> dest;
107
108 private:
109 Cogs::Network::ConnectionTCP tcpConnection;
110 intptr_t userData;
111
112 void processH264NALU(Dest& dest, uint32_t rtpType, const void* data, size_t size);
113 void processH265NALU(Dest& dest, uint32_t rtpType, const void* data, size_t size);
114 };
115}// namespace ...
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Definition: Context.h:83
Contains all Cogs related functionality.
Definition: FieldSetter.h:23