Skip to content

Commit 0ec2800

Browse files
committed
Split out jitter timer to be one per metadata, clear out jitter data when clearing as well
1 parent 7d55a3f commit 0ec2800

2 files changed

Lines changed: 72 additions & 67 deletions

File tree

lib/dtsc.cpp

Lines changed: 58 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -2278,84 +2278,74 @@ namespace DTSC{
22782278
pack.getFlag("keyframe"), pack.getDataLen());
22792279
}
22802280

2281-
/// Helper class that calculates inter-packet jitter
2282-
class jitterTimer{
2283-
public:
2284-
uint64_t trueTime[8]; // Array of bootMS-based measurement points
2285-
uint64_t packTime[8]; // Array of corresponding packet times
2286-
uint64_t curJitter; // Maximum jitter measurement in past 10 seconds
2287-
unsigned int x; // Current indice within above two arrays
2288-
uint64_t maxJitter; // Highest jitter ever observed by this jitterTimer
2289-
uint64_t lastTime; // Last packet used for a measurement point
2290-
jitterTimer(){
2281+
jitterTimer::jitterTimer(){
2282+
for (int i = 0; i < 8; ++i){
2283+
trueTime[i] = 0;
2284+
packTime[i] = 0;
2285+
}
2286+
maxJitter = 200;
2287+
lastTime = 0;
2288+
x = 0;
2289+
}
2290+
2291+
uint64_t jitterTimer::addPack(uint64_t t){
2292+
if (veryUglyJitterOverride){return veryUglyJitterOverride;}
2293+
uint64_t curMs = Util::bootMS();
2294+
if (!x){
2295+
// First call, set the whole array to this packet
22912296
for (int i = 0; i < 8; ++i){
2292-
trueTime[i] = 0;
2293-
packTime[i] = 0;
2294-
}
2295-
maxJitter = 200;
2296-
lastTime = 0;
2297-
x = 0;
2298-
}
2299-
uint64_t addPack(uint64_t t){
2300-
if (veryUglyJitterOverride){return veryUglyJitterOverride;}
2301-
uint64_t curMs = Util::bootMS();
2302-
if (!x){
2303-
// First call, set the whole array to this packet
2304-
for (int i = 0; i < 8; ++i){
2305-
trueTime[i] = curMs;
2306-
packTime[i] = t;
2307-
}
2308-
++x;
2309-
trueTime[x % 8] = curMs;
2310-
packTime[x % 8] = t;
2311-
lastTime = t;
2312-
curJitter = 0;
2313-
}
2314-
if (t > lastTime + 2500){
2315-
if ((x % 4) == 0){
2316-
if (maxJitter > 50 && curJitter < maxJitter - 50){
2317-
MEDIUM_MSG("Jitter lowered from %" PRIu64 " to %" PRIu64 " ms", maxJitter, curJitter);
2318-
maxJitter = curJitter;
2319-
}
2320-
curJitter = maxJitter*0.90;
2297+
trueTime[i] = curMs;
2298+
packTime[i] = t;
2299+
}
2300+
++x;
2301+
trueTime[x % 8] = curMs;
2302+
packTime[x % 8] = t;
2303+
lastTime = t;
2304+
curJitter = 0;
2305+
}
2306+
if (t > lastTime + 2500){
2307+
if ((x % 4) == 0){
2308+
if (maxJitter > 50 && curJitter < maxJitter - 50){
2309+
MEDIUM_MSG("Jitter lowered from %" PRIu64 " to %" PRIu64 " ms", maxJitter, curJitter);
2310+
maxJitter = curJitter;
23212311
}
2322-
++x;
2323-
trueTime[x % 8] = curMs;
2324-
packTime[x % 8] = t;
2325-
lastTime = t;
2326-
}
2327-
uint64_t realTime = (curMs - trueTime[(x + 1) % 8]);
2328-
uint64_t arriTime = (t - packTime[(x + 1) % 8]);
2329-
int64_t jitter = (realTime - arriTime);
2330-
if (jitter < 0){
2331-
// Negative jitter = packets arriving too soon.
2332-
// This is... ehh... not a bad thing? I guess..?
2333-
// if (jitter < -1000){
2334-
// INFO_MSG("Jitter = %" PRId64 " ms (max: %" PRIu64 ")", jitter, maxJitter);
2335-
//}
2336-
}else{
2337-
// Positive jitter = packets arriving too late.
2338-
// We need to delay playback at least by this amount to account for it.
2339-
if ((uint64_t)jitter > maxJitter){
2340-
if (jitter - maxJitter > 420){
2341-
INFO_MSG("Jitter increased from %" PRIu64 " to %" PRId64 " ms", maxJitter, jitter);
2342-
}else{
2343-
HIGH_MSG("Jitter increased from %" PRIu64 " to %" PRId64 " ms", maxJitter, jitter);
2344-
}
2345-
maxJitter = (uint64_t)jitter;
2312+
curJitter = maxJitter*0.90;
2313+
}
2314+
++x;
2315+
trueTime[x % 8] = curMs;
2316+
packTime[x % 8] = t;
2317+
lastTime = t;
2318+
}
2319+
uint64_t realTime = (curMs - trueTime[(x + 1) % 8]);
2320+
uint64_t arriTime = (t - packTime[(x + 1) % 8]);
2321+
int64_t jitter = (realTime - arriTime);
2322+
if (jitter < 0){
2323+
// Negative jitter = packets arriving too soon.
2324+
// This is... ehh... not a bad thing? I guess..?
2325+
// if (jitter < -1000){
2326+
// INFO_MSG("Jitter = %" PRId64 " ms (max: %" PRIu64 ")", jitter, maxJitter);
2327+
//}
2328+
}else{
2329+
// Positive jitter = packets arriving too late.
2330+
// We need to delay playback at least by this amount to account for it.
2331+
if ((uint64_t)jitter > maxJitter){
2332+
if (jitter - maxJitter > 420){
2333+
INFO_MSG("Jitter increased from %" PRIu64 " to %" PRId64 " ms", maxJitter, jitter);
2334+
}else{
2335+
HIGH_MSG("Jitter increased from %" PRIu64 " to %" PRId64 " ms", maxJitter, jitter);
23462336
}
2347-
if (curJitter < (uint64_t)jitter){curJitter = (uint64_t)jitter;}
2337+
maxJitter = (uint64_t)jitter;
23482338
}
2349-
return maxJitter;
2339+
if (curJitter < (uint64_t)jitter){curJitter = (uint64_t)jitter;}
23502340
}
2351-
};
2341+
return maxJitter;
2342+
}
23522343

23532344
/// Updates the metadata given the packet's properties.
23542345
void Meta::update(uint64_t packTime, int64_t packOffset, uint32_t packTrack, uint64_t packDataSize,
23552346
uint64_t packBytePos, bool isKeyframe, uint64_t packSendSize){
23562347
///\todo warning Re-Implement Ivec
23572348
if (getLive()){
2358-
static std::map<size_t, jitterTimer> theJitters;
23592349
setMinKeepAway(packTrack, theJitters[packTrack].addPack(packTime));
23602350
}
23612351

@@ -2548,6 +2538,7 @@ namespace DTSC{
25482538
/// Wipes internal structures, also marking as outdated and deleting memory structures if in
25492539
/// master mode.
25502540
void Meta::clear(){
2541+
theJitters.clear();
25512542
if (isMemBuf){
25522543
isMemBuf = false;
25532544
free(streamMemBuf);

lib/dtsc.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,19 @@ namespace DTSC{
268268
Util::RelAccXFieldData fragmentSizeField;
269269
};
270270

271+
272+
class jitterTimer{
273+
public:
274+
uint64_t trueTime[8]; // Array of bootMS-based measurement points
275+
uint64_t packTime[8]; // Array of corresponding packet times
276+
uint64_t curJitter; // Maximum jitter measurement in past 10 seconds
277+
unsigned int x; // Current indice within above two arrays
278+
uint64_t maxJitter; // Highest jitter ever observed by this jitterTimer
279+
uint64_t lastTime; // Last packet used for a measurement point
280+
jitterTimer();
281+
uint64_t addPack(uint64_t t);
282+
};
283+
271284
class Meta{
272285
public:
273286
Meta(const std::string &_streamName, const DTSC::Scan &src);
@@ -499,6 +512,7 @@ namespace DTSC{
499512
std::map<size_t, size_t> sizeMemBuf;
500513

501514
private:
515+
std::map<size_t, jitterTimer> theJitters;
502516
// Internal buffers so we don't always need to search for everything
503517
Util::RelAccXFieldData streamVodField;
504518
Util::RelAccXFieldData streamLiveField;

0 commit comments

Comments
 (0)