Several fixes:
- Fixed bug in stream health function causing loop if track not active - Fixed DTSC pulls ignoring data before the live point - Improved async buffers (deque mode) to spread the tracks more fairly - DTSC pull now implements "ping" and "error" commands - DTSC pulls report suspicious keyframe intervals to the origin and ask for confirmation - DTSC output now accepts these reports and disconnects if there is no match in keyframe intervals - Outputs in async mode now keep the seek point in all tracks when reselecting - Outputs in async mode now default to a starting position in each track that is at a keyframe roughly halfway in the buffer - Outputs in async mode now ignore playback rate (always fastest possible) - Removed code duplication in prepareNext function - Reordered the prepareNext function somewhat to be easier to follow for humans - DTSC output no longer overrides initialSeek function, now uses default implementation - Sanitycheck output now supports both sync and async modes, supports printing multiple timestamps for multiple tracks
This commit is contained in:
		
							parent
							
								
									b89875ea37
								
							
						
					
					
						commit
						f560b88bfe
					
				
					 9 changed files with 257 additions and 222 deletions
				
			
		|  | @ -165,7 +165,7 @@ namespace Mist{ | |||
|       DTSC::Packet metaPack(dataPacket.data(), dataPacket.size()); | ||||
|       DTSC::Meta nM("", metaPack.getScan()); | ||||
|       meta.reInit(streamName, false); | ||||
|       meta.merge(nM); | ||||
|       meta.merge(nM, true, false); | ||||
|       std::set<size_t> validTracks = M.getMySourceTracks(getpid()); | ||||
|       userSelect.clear(); | ||||
|       for (std::set<size_t>::iterator it = validTracks.begin(); it != validTracks.end(); ++it){ | ||||
|  | @ -342,20 +342,39 @@ namespace Mist{ | |||
|         // userClient.keepAlive();
 | ||||
|         std::string cmd; | ||||
|         thisPacket.getString("cmd", cmd); | ||||
|         if (cmd != "reset"){ | ||||
|         if (cmd == "reset"){ | ||||
|           // Read next packet
 | ||||
|           thisPacket.reInit(srcConn); | ||||
|           if (thisPacket.getVersion() != DTSC::DTSC_HEAD){ | ||||
|             meta.clear(); | ||||
|             continue; | ||||
|           } | ||||
|           DTSC::Meta nM("", thisPacket.getScan()); | ||||
|           meta.merge(nM, true, false); | ||||
|           thisPacket.reInit(srcConn); // read the next packet before continuing
 | ||||
|           continue;                   // parse the next packet before returning
 | ||||
|         } | ||||
|         if (cmd == "error"){ | ||||
|           thisPacket.getString("msg", cmd); | ||||
|           Util::logExitReason("%s", cmd.c_str()); | ||||
|           thisPacket.null(); | ||||
|           return; | ||||
|         } | ||||
|         if (cmd == "ping"){ | ||||
|           thisPacket.reInit(srcConn); | ||||
|           JSON::Value prep; | ||||
|           prep["cmd"] = "ok"; | ||||
|           prep["msg"] = "Pong!"; | ||||
|           srcConn.SendNow("DTCM"); | ||||
|           char sSize[4] ={0, 0, 0, 0}; | ||||
|           Bit::htobl(sSize, prep.packedSize()); | ||||
|           srcConn.SendNow(sSize, 4); | ||||
|           prep.sendTo(srcConn); | ||||
|           continue; | ||||
|         } | ||||
|         // Read next packet
 | ||||
|         INFO_MSG("Unhandled command: %s", cmd.c_str()); | ||||
|         thisPacket.reInit(srcConn); | ||||
|         if (thisPacket.getVersion() != DTSC::DTSC_HEAD){ | ||||
|           meta.clear(); | ||||
|           continue; | ||||
|         } | ||||
|         DTSC::Meta nM("", thisPacket.getScan()); | ||||
|         meta.merge(nM, true, false); | ||||
|         thisPacket.reInit(srcConn); // read the next packet before continuing
 | ||||
|         continue;                   // parse the next packet before returning
 | ||||
|         continue; | ||||
|       } | ||||
|       if (thisPacket.getVersion() == DTSC::DTSC_HEAD){ | ||||
|         DTSC::Meta nM("", thisPacket.getScan()); | ||||
|  | @ -364,7 +383,33 @@ namespace Mist{ | |||
|         continue;                   // parse the next packet before returning
 | ||||
|       } | ||||
|       thisTime = thisPacket.getTime(); | ||||
|       thisIdx = thisPacket.getTrackId(); | ||||
|       thisIdx = M.trackIDToIndex(thisPacket.getTrackId()); | ||||
|       if (thisPacket.getFlag("keyframe") && M.trackValid(thisIdx)){ | ||||
|         uint32_t shrtest_key = 0xFFFFFFFFul; | ||||
|         uint32_t longest_key = 0; | ||||
|         DTSC::Keys Mkeys(M.keys(thisIdx)); | ||||
|         uint32_t firstKey = Mkeys.getFirstValid(); | ||||
|         uint32_t endKey = Mkeys.getEndValid(); | ||||
|         uint32_t checkKey = (endKey-firstKey <= 3)?firstKey:endKey-3; | ||||
|         for (uint32_t k = firstKey; k+1 < endKey; k++){ | ||||
|           uint64_t kDur = Mkeys.getDuration(k); | ||||
|           if (!kDur){continue;} | ||||
|           if (kDur > longest_key && k >= checkKey){longest_key = kDur;} | ||||
|           if (kDur < shrtest_key){shrtest_key = kDur;} | ||||
|         } | ||||
|         if (longest_key > shrtest_key*2){ | ||||
|           JSON::Value prep; | ||||
|           prep["cmd"] = "check_key_duration"; | ||||
|           prep["id"] = thisPacket.getTrackId(); | ||||
|           prep["duration"] = longest_key; | ||||
|           srcConn.SendNow("DTCM"); | ||||
|           char sSize[4] ={0, 0, 0, 0}; | ||||
|           Bit::htobl(sSize, prep.packedSize()); | ||||
|           srcConn.SendNow(sSize, 4); | ||||
|           prep.sendTo(srcConn); | ||||
|           INFO_MSG("Key duration %" PRIu32 " is quite long - confirming with upstream source", longest_key); | ||||
|         } | ||||
|       } | ||||
|       return; // we have a packet
 | ||||
|     } | ||||
|   } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Thulinma
						Thulinma