@@ -9178,6 +9178,131 @@ int srt::CUDT::packLostData(CPacket& w_packet, steady_clock::time_point& w_origi
9178
9178
return 0;
9179
9179
}
9180
9180
9181
+
#if SRT_DEBUG_TRACE_SND
9182
+
class snd_logger
9183
+
{
9184
+
typedef srt::sync::steady_clock steady_clock;
9185
+
9186
+
public:
9187
+
snd_logger() {}
9188
+
9189
+
~snd_logger()
9190
+
{
9191
+
ScopedLock lck(m_mtx);
9192
+
m_fout.close();
9193
+
}
9194
+
9195
+
struct
9196
+
{
9197
+
typedef srt::sync::steady_clock steady_clock;
9198
+
long long usElapsed;
9199
+
steady_clock::time_point tsNow;
9200
+
int usSRTT;
9201
+
int usRTTVar;
9202
+
int msSndBuffSpan;
9203
+
int msTimespanTh;
9204
+
int msNextUniqueToSend;
9205
+
long long usElapsedLastDrop;
9206
+
bool canRexmit;
9207
+
int iPktSeqno;
9208
+
bool isRetransmitted;
9209
+
} state;
9210
+
9211
+
void trace()
9212
+
{
9213
+
using namespace srt::sync;
9214
+
ScopedLock lck(m_mtx);
9215
+
create_file();
9216
+
9217
+
m_fout << state.usElapsed << ",";
9218
+
m_fout << state.usSRTT << ",";
9219
+
m_fout << state.usRTTVar << ",";
9220
+
m_fout << state.msSndBuffSpan << ",";
9221
+
m_fout << state.msTimespanTh << ",";
9222
+
m_fout << state.msNextUniqueToSend << ",";
9223
+
m_fout << state.usElapsedLastDrop << ",";
9224
+
m_fout << state.canRexmit << ",";
9225
+
m_fout << state.iPktSeqno << ',';
9226
+
m_fout << state.isRetransmitted << '\n';
9227
+
9228
+
m_fout.flush();
9229
+
}
9230
+
9231
+
private:
9232
+
void print_header()
9233
+
{
9234
+
m_fout << "usElapsed,usSRTT,usRTTVar,msSndBuffTimespan,msTimespanTh,msNextUniqueToSend,usDLastDrop,canRexmit,sndPktSeqno,isRexmit";
9235
+
m_fout << "\n";
9236
+
}
9237
+
9238
+
void create_file()
9239
+
{
9240
+
if (m_fout.is_open())
9241
+
return;
9242
+
9243
+
m_start_time = srt::sync::steady_clock::now();
9244
+
std::string str_tnow = srt::sync::FormatTimeSys(m_start_time);
9245
+
str_tnow.resize(str_tnow.size() - 7); // remove trailing ' [SYST]' part
9246
+
while (str_tnow.find(':') != std::string::npos)
9247
+
{
9248
+
str_tnow.replace(str_tnow.find(':'), 1, 1, '_');
9249
+
}
9250
+
const std::string fname = "snd_trace_" + str_tnow + ".csv";
9251
+
m_fout.open(fname, std::ofstream::out);
9252
+
if (!m_fout)
9253
+
std::cerr << "IPE: Failed to open " << fname << "!!!\n";
9254
+
9255
+
print_header();
9256
+
}
9257
+
9258
+
private:
9259
+
srt::sync::Mutex m_mtx;
9260
+
std::ofstream m_fout;
9261
+
srt::sync::steady_clock::time_point m_start_time;
9262
+
};
9263
+
9264
+
snd_logger g_snd_logger;
9265
+
#endif // SRT_DEBUG_TRACE_SND
9266
+
9267
+
bool srt::CUDT::isRetransmissionAllowed(const time_point& tnow SRT_ATR_UNUSED)
9268
+
{
9269
+
// Prioritization of original packets only applies to Live CC.
9270
+
if (!m_bPeerTLPktDrop || !m_config.bMessageAPI)
9271
+
return true;
9272
+
9273
+
// TODO: lock sender buffer?
9274
+
const time_point tsNextPacket = m_pSndBuffer->peekNextOriginal();
9275
+
9276
+
#if SRT_DEBUG_TRACE_SND
9277
+
const int buffdelay_ms = count_milliseconds(m_pSndBuffer->getBufferingDelay(tnow));
9278
+
// If there is a small loss, still better to retransmit. If timespan is already big,
9279
+
// then consider sending original packets.
9280
+
const int threshold_ms_min = (2 * m_iSRTT + 4 * m_iRTTVar + COMM_SYN_INTERVAL_US) / 1000;
9281
+
const int msNextUniqueToSend = count_milliseconds(tnow - tsNextPacket) + m_iPeerTsbPdDelay_ms;
9282
+
9283
+
g_snd_logger.state.tsNow = tnow;
9284
+
g_snd_logger.state.usElapsed = count_microseconds(tnow - m_stats.tsStartTime);
9285
+
g_snd_logger.state.usSRTT = m_iSRTT;
9286
+
g_snd_logger.state.usRTTVar = m_iRTTVar;
9287
+
g_snd_logger.state.msSndBuffSpan = buffdelay_ms;
9288
+
g_snd_logger.state.msTimespanTh = threshold_ms_min;
9289
+
g_snd_logger.state.msNextUniqueToSend = msNextUniqueToSend;
9290
+
g_snd_logger.state.usElapsedLastDrop = count_microseconds(tnow - m_tsLastTLDrop);
9291
+
g_snd_logger.state.canRexmit = false;
9292
+
#endif
9293
+
9294
+
if (tsNextPacket != time_point())
9295
+
{
9296
+
// Can send original packet, so just send it
9297
+
return false;
9298
+
}
9299
+
9300
+
#if SRT_DEBUG_TRACE_SND
9301
+
g_snd_logger.state.canRexmit = true;
9302
+
#endif
9303
+
return true;
9304
+
}
9305
+
9181
9306
std::pair<bool, steady_clock::time_point> srt::CUDT::packData(CPacket& w_packet)
9182
9307
{
9183
9308
int payload = 0;
@@ -9206,7 +9331,10 @@ std::pair<bool, steady_clock::time_point> srt::CUDT::packData(CPacket& w_packet)
9206
9331
if (!m_bOpened)
9207
9332
return std::make_pair(false, enter_time);
9208
9333
9209
-
payload = packLostData((w_packet), (origintime));
9334
+
payload = isRetransmissionAllowed(enter_time)
9335
+
? packLostData((w_packet), (origintime))
9336
+
: 0;
9337
+
9210
9338
if (payload > 0)
9211
9339
{
9212
9340
reason = "reXmit";
@@ -9459,6 +9587,12 @@ bool srt::CUDT::packUniqueData(CPacket& w_packet, time_point& w_origintime)
9459
9587
}
9460
9588
}
9461
9589
9590
+
#if SRT_DEBUG_TRACE_SND
9591
+
g_snd_logger.state.iPktSeqno = w_packet.m_iSeqNo;
9592
+
g_snd_logger.state.isRetransmitted = w_packet.getRexmitFlag();
9593
+
g_snd_logger.trace();
9594
+
#endif
9595
+
9462
9596
return true;
9463
9597
}
9464
9598
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4