@@ -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);
0 commit comments