ifw-rtmslib 1.0.0
 
Loading...
Searching...
No Matches
rtmsReceiver.hpp
Go to the documentation of this file.
1
7
8#pragma once
9
10#include <atomic>
11#include <chrono>
12#include <condition_variable>
13#include <csignal>
14#include <cstddef>
15#include <mutex>
16#include <string>
17#include <thread>
18#include <vector>
19
20#include <boost/endian/arithmetic.hpp>
21
22#include <fmt/format.h>
23
24#include <llnetio/ipv4.hpp>
25#include <llnetio/mudpi/io.hpp>
26#include <llnetio/rtms/io.hpp>
27#include <llnetio/rtms/rtms.hpp>
28#include <llnetio/udpSocket.hpp>
29#include <llnetio/mockSocket.hpp>
30
34
35namespace ifw::rtmslib {
36
42
44 std::size_t rxbuf_size{16777216};
45 int32_t topic_id{10};
46 uint16_t mtu_size{1500};
47 int32_t width{0};
48 int32_t height{0};
52 };
53
64 public:
65 static std::atomic<bool> s_execute;
66
74 RtmsReceiver(const std::string& receiver_ip,
75 const std::string& interface_name,
76 const int port,
77 const ifw::fnd::datatype::DataType data_type,
78 const ReceiverConfig& rcv_cfg = ReceiverConfig());
79
80 virtual ~RtmsReceiver();
81
83 void ReceiveLoop();
84
86 virtual void StopReceiver();
87
93 bool ReceiveSample(SampleExtInfo& ext_info,
94 std::vector<uint8_t>& sample_payload,
95 std::chrono::nanoseconds timeout);
96
100 virtual void HandleSampleUser(SampleExtInfo& ext_info,
101 std::vector<uint8_t>& sample_payload) = 0;
102
103 int64_t GetLostFramesCount() const;
104
105 protected:
106
107 int64_t GetSampleId() const;
108 ifw::fnd::datatype::DataType GetDataType() const;
110 void RequestStop();
111
112 private:
113 void EnsureInitialised();
114 void Initialise();
115
116 std::string m_receiver_ip;
117 std::string m_interface_name;
118 int m_port;
119 ifw::fnd::datatype::DataType m_data_type;
120 int8_t m_bpp;
121 std::once_flag m_init_once;
122
123 ReceiverConfig m_rcv_cfg;
124 uint16_t m_leader_extinfo_capacity{
125 static_cast<uint16_t>(SIZE_SAMPLE_EXT_INFO)};
126 ExtendedInfoMode m_current_extinfo_mode{ExtendedInfoMode::None};
127 SampleFailureKind m_last_failure_kind{SampleFailureKind::None};
128 int64_t m_samples_received{0};
129 int64_t m_sample_failures{0};
130 int64_t m_sample_timeouts{0};
131 std::chrono::steady_clock::time_point m_last_status_log{};
132
133 std::unique_ptr<llnetio::rtms::Receiver> m_rtms_receiver;
134 std::string m_last_receive_error;
135 std::chrono::steady_clock::time_point m_last_loss_log{};
136 std::chrono::steady_clock::time_point m_last_sample_log{};
137 std::chrono::steady_clock::time_point m_last_extinfo_log{};
138
139 int64_t m_lost_frames{0};
140 unsigned int m_sample_id{0};
141 int64_t m_extinfo_mismatches{0};
142 int m_consecutive_leader_timeouts{0};
143
144 llnetio::UdpRxSocket* m_udp_sock;
145 std::unique_ptr<llnetio::mudpi::Receiver> m_mudpi;
146
147 std::atomic<bool> m_ongoing_recording;
148 std::mutex m_recording_mutex;
149 std::condition_variable m_recording_cv;
150 bool m_dynamic_sample_bytes_logged{false};
151 bool m_missing_bpp_logged{false};
152
153 void ResetTransport();
154 void LogStatus(bool force = false);
155 bool UpdateGeometryFromExtInfo(const SampleExtInfo& ext_info);
156 std::size_t ComputeSampleBytesHint() const;
157
158 };
159}
160
161inline void IfwRtmsLibStopExecution(int signum) {
163}
SampleFailureKind
Definition rtmsReceiver.hpp:37
virtual void StopReceiver()
Signal to RTMS receiver to stop execution.
Definition rtmsReceiver.cpp:56
void ReceiveLoop()
Receiver loop running until RtmsReceiver::StopReceiver() is invoked.
Definition rtmsReceiver.cpp:87
bool ReceiveSample(SampleExtInfo &ext_info, std::vector< uint8_t > &sample_payload, std::chrono::nanoseconds timeout)
Receives one sample. Returns true if a sample received within the timeout.
Definition rtmsReceiver.cpp:318
ReceiverConfig GetConfig() const
Definition rtmsReceiver.cpp:607
ifw::fnd::datatype::DataType GetDataType() const
Definition rtmsReceiver.cpp:603
virtual void HandleSampleUser(SampleExtInfo &ext_info, std::vector< uint8_t > &sample_payload)=0
User provided method to handle an RTMS Sample received.
void RequestStop()
Definition rtmsReceiver.cpp:52
virtual ~RtmsReceiver()
Definition rtmsReceiver.cpp:83
static std::atomic< bool > s_execute
Definition rtmsReceiver.hpp:65
int64_t GetSampleId() const
Definition rtmsReceiver.cpp:599
int64_t GetLostFramesCount() const
Definition rtmsReceiver.cpp:595
RtmsReceiver(const std::string &receiver_ip, const std::string &interface_name, const int port, const ifw::fnd::datatype::DataType data_type, const ReceiverConfig &rcv_cfg=ReceiverConfig())
RTMS Receiver class.
Definition rtmsReceiver.cpp:63
Definition sampleExtInfo.hpp:33
Common utilities for RTMS Lib.
Definition common.cpp:21
SampleFailureKind
Definition rtmsReceiver.hpp:37
@ None
Definition rtmsReceiver.hpp:38
@ SampleError
Definition rtmsReceiver.hpp:40
@ Timeout
Definition rtmsReceiver.hpp:39
constexpr std::size_t SIZE_SAMPLE_EXT_INFO
Definition sampleExtInfo.hpp:22
ExtendedInfoMode
Definition common.hpp:29
@ None
Leader packets carry no extended info.
Definition common.hpp:30
void IfwRtmsLibStopExecution(int signum)
Definition rtmsReceiver.hpp:161
Definition rtmsReceiver.hpp:43
bool checksum_force_ignore
Definition rtmsReceiver.hpp:49
int32_t width
Definition rtmsReceiver.hpp:47
int32_t height
Definition rtmsReceiver.hpp:48
uint16_t mtu_size
Definition rtmsReceiver.hpp:46
std::size_t rxbuf_size
Definition rtmsReceiver.hpp:44
ExtendedInfoMode ext_info_mode
Expected leader extended-info layout; must match the sender configuration.
Definition rtmsReceiver.hpp:51
int32_t topic_id
Definition rtmsReceiver.hpp:45