UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
recv_loss.cpp
Go to the documentation of this file.
1#include <QtGlobal>
2#if defined(Q_OS_WIN) || defined(Q_OS_MACOS)
3#include <QStyleFactory>
4#endif
5#include "recv_loss.hpp"
7
9 elapsedTimer.start();
10 reset();
11 QObject::connect(&timer, &QTimer::timeout, this, &RecvLossWidget::timeout);
12 timer.setInterval(timeout_msec);
13#if defined(Q_OS_WIN) || defined(Q_OS_MACOS)
14 setStyle(QStyleFactory::create("Fusion")); //mac style progressbars have no text
15#endif
16}
17
19 timer.stop();
20 setRange(0, 100);
21 setValue(0);
22 setFormat("Nothing received");
23 setTextVisible(true);
24 setToolTip("Nothing received");
25
26 reports.clear();
27}
28
29void RecvLossWidget::parseLine(std::string_view line){
30 if(!sv_is_prefix(line, "SSRC "))
31 return;
32
33 auto tmp = line;
34 tokenize(tmp, ' '); //"SSRC"
35 auto ssrc_sv = tokenize(tmp, ' '); //actual ssrc
36 if(ssrc_sv.substr(0, 2) == "0x")
37 ssrc_sv.remove_prefix(2);
38 auto packet_counts = tokenize(tmp, ' '); //received/total
39
40 auto received_sv = tokenize(packet_counts, '/');
41 auto total_sv = tokenize(packet_counts, '/');
42
43 int ssrc;
44 int received;
45 int total;
46
47 if(!parse_num(received_sv, received)
48 || !parse_num(total_sv, total)
49 || !parse_num(ssrc_sv, ssrc, 16))
50 return;
51
52 addReport(ssrc, received, total);
53 updateVal();
54}
55
56void RecvLossWidget::addReport(int ssrc, int received, int total){
57 SSRC_report rep;
58 rep.received = received;
59 rep.total = total;
60 reports.insert(ssrc, rep, elapsedTimer.elapsed());
61}
62
64 int received = 0;
65 int total = 0;
66
67 reports.remove_timed_out(timeout_msec, elapsedTimer.elapsed());
68
69 QString tooltip;
70 for(auto& r : reports.get()){
71 received += r.item.received;
72 total += r.item.total;
73 tooltip += QString::number(r.ssrc, 16) + ": "
74 + QString::number(r.item.received) + '/' + QString::number(r.item.total) + '\n';
75 }
76
77 if(tooltip.endsWith('\n'))
78 tooltip.chop(1);
79
80 if(total < 1)
81 total = 1;
82
83 float ratio = ((float) received / total) * 100.f;
84 setFormat("Received %p% of packets");
85 setValue(ratio);
86 setToolTip(tooltip);
87 timer.start();
88}
89
91 setValue(0);
92 setFormat("Nothing received");
93 setToolTip("Nothing received");
94}
void addReport(int ssrc, int received, int total)
Definition recv_loss.cpp:56
static const int timeout_msec
Definition recv_loss.hpp:26
QElapsedTimer elapsedTimer
Definition recv_loss.hpp:28
SSRC_container< SSRC_report, decltype(elapsedTimer.elapsed())> reports
Definition recv_loss.hpp:34
RecvLossWidget(QWidget *parent=nullptr)
Definition recv_loss.cpp:8
void parseLine(std::string_view)
Definition recv_loss.cpp:29
const char * parent
Definition settings.cpp:198
std::string_view tokenize(std::string_view &str, char delim, char quot)
Tokenizer for string_view.
bool parse_num(std::string_view sv, T &res, int base=10)
bool sv_is_prefix(std::string_view haystack, std::string_view needle)