TSSRT: fixes to timestamp rewriting
This commit is contained in:
		
							parent
							
								
									d2d4b0acbe
								
							
						
					
					
						commit
						3fb92a01d3
					
				
					 4 changed files with 30 additions and 16 deletions
				
			
		|  | @ -51,6 +51,7 @@ namespace Mist{ | ||||||
|   inputTSSRT::inputTSSRT(Util::Config *cfg, Socket::SRTConnection s) : Input(cfg){ |   inputTSSRT::inputTSSRT(Util::Config *cfg, Socket::SRTConnection s) : Input(cfg){ | ||||||
|     rawIdx = INVALID_TRACK_ID; |     rawIdx = INVALID_TRACK_ID; | ||||||
|     lastRawPacket = 0; |     lastRawPacket = 0; | ||||||
|  |     bootMSOffsetCalculated = false; | ||||||
|     assembler.setLive(); |     assembler.setLive(); | ||||||
|     capa["name"] = "TSSRT"; |     capa["name"] = "TSSRT"; | ||||||
|     capa["desc"] = "This input allows for processing MPEG2-TS-based SRT streams. Use mode=listener " |     capa["desc"] = "This input allows for processing MPEG2-TS-based SRT streams. Use mode=listener " | ||||||
|  | @ -264,18 +265,23 @@ namespace Mist{ | ||||||
|     thisIdx = M.trackIDToIndex(thisPacket.getTrackId(), getpid()); |     thisIdx = M.trackIDToIndex(thisPacket.getTrackId(), getpid()); | ||||||
|     if (thisIdx == INVALID_TRACK_ID){getNext(idx);} |     if (thisIdx == INVALID_TRACK_ID){getNext(idx);} | ||||||
| 
 | 
 | ||||||
|     uint64_t adjustTime = thisPacket.getTime() + timeStampOffset; |     uint64_t pktTimeWithOffset = thisPacket.getTime() + timeStampOffset; | ||||||
|     if (lastTimeStamp || timeStampOffset){ |     if (lastTimeStamp || timeStampOffset){ | ||||||
|       if (lastTimeStamp + 5000 < adjustTime || lastTimeStamp > adjustTime + 5000){ |       uint64_t targetTime = Util::bootMS() - M.getBootMsOffset(); | ||||||
|  |       if (targetTime + 5000 < pktTimeWithOffset || targetTime > pktTimeWithOffset + 5000){ | ||||||
|         INFO_MSG("Timestamp jump " PRETTY_PRINT_MSTIME " -> " PRETTY_PRINT_MSTIME ", compensating.", |         INFO_MSG("Timestamp jump " PRETTY_PRINT_MSTIME " -> " PRETTY_PRINT_MSTIME ", compensating.", | ||||||
|                  PRETTY_ARG_MSTIME(lastTimeStamp), PRETTY_ARG_MSTIME(adjustTime)); |                  PRETTY_ARG_MSTIME(targetTime), PRETTY_ARG_MSTIME(pktTimeWithOffset)); | ||||||
|         timeStampOffset += (lastTimeStamp - adjustTime); |         timeStampOffset += (targetTime - pktTimeWithOffset); | ||||||
|         adjustTime = thisPacket.getTime() + timeStampOffset; |         pktTimeWithOffset = thisPacket.getTime() + timeStampOffset; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     if (!lastTimeStamp){meta.setBootMsOffset(Util::bootMS() - adjustTime);} |     if (!bootMSOffsetCalculated){ | ||||||
|     lastTimeStamp = adjustTime; |       meta.setBootMsOffset((int64_t)Util::bootMS() - (int64_t)pktTimeWithOffset); | ||||||
|     thisPacket.setTime(adjustTime); |       bootMSOffsetCalculated = true; | ||||||
|  |     } | ||||||
|  |     lastTimeStamp = pktTimeWithOffset; | ||||||
|  |     thisPacket.setTime(pktTimeWithOffset); | ||||||
|  |     thisTime = pktTimeWithOffset; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   bool inputTSSRT::openStreamSource(){return true;} |   bool inputTSSRT::openStreamSource(){return true;} | ||||||
|  |  | ||||||
|  | @ -45,6 +45,7 @@ namespace Mist{ | ||||||
|     Util::ResizeablePointer rawBuffer; |     Util::ResizeablePointer rawBuffer; | ||||||
|     size_t rawIdx; |     size_t rawIdx; | ||||||
|     uint64_t lastRawPacket; |     uint64_t lastRawPacket; | ||||||
|  |     bool bootMSOffsetCalculated; | ||||||
|   }; |   }; | ||||||
| }// namespace Mist
 | }// namespace Mist
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ namespace Mist{ | ||||||
|     streamName = config->getString("streamname"); |     streamName = config->getString("streamname"); | ||||||
|     Util::setStreamName(streamName); |     Util::setStreamName(streamName); | ||||||
|     pushOut = false; |     pushOut = false; | ||||||
|  |     bootMSOffsetCalculated = false; | ||||||
|     assembler.setLive(); |     assembler.setLive(); | ||||||
|     // Push output configuration
 |     // Push output configuration
 | ||||||
|     if (config->getString("target").size()){ |     if (config->getString("target").size()){ | ||||||
|  | @ -382,18 +383,23 @@ namespace Mist{ | ||||||
|         userSelect[thisIdx].reload(streamName, thisIdx, COMM_STATUS_SOURCE | COMM_STATUS_DONOTTRACK); |         userSelect[thisIdx].reload(streamName, thisIdx, COMM_STATUS_SOURCE | COMM_STATUS_DONOTTRACK); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       uint64_t adjustTime = thisPacket.getTime() + timeStampOffset; |       uint64_t pktTimeWithOffset = thisPacket.getTime() + timeStampOffset; | ||||||
|       if (lastTimeStamp || timeStampOffset){ |       if (lastTimeStamp || timeStampOffset){ | ||||||
|         if (lastTimeStamp + 5000 < adjustTime || lastTimeStamp > adjustTime + 5000){ |         uint64_t targetTime = Util::bootMS() - M.getBootMsOffset(); | ||||||
|  |         if (targetTime + 5000 < pktTimeWithOffset || targetTime > pktTimeWithOffset + 5000){ | ||||||
|           INFO_MSG("Timestamp jump " PRETTY_PRINT_MSTIME " -> " PRETTY_PRINT_MSTIME ", compensating.", |           INFO_MSG("Timestamp jump " PRETTY_PRINT_MSTIME " -> " PRETTY_PRINT_MSTIME ", compensating.", | ||||||
|                    PRETTY_ARG_MSTIME(lastTimeStamp), PRETTY_ARG_MSTIME(adjustTime)); |                   PRETTY_ARG_MSTIME(targetTime), PRETTY_ARG_MSTIME(pktTimeWithOffset)); | ||||||
|           timeStampOffset += (lastTimeStamp - adjustTime); |           timeStampOffset += (targetTime - pktTimeWithOffset); | ||||||
|           adjustTime = thisPacket.getTime() + timeStampOffset; |           pktTimeWithOffset = thisPacket.getTime() + timeStampOffset; | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       if (!lastTimeStamp){meta.setBootMsOffset(Util::bootMS() - adjustTime);} |       if (!bootMSOffsetCalculated){ | ||||||
|       lastTimeStamp = adjustTime; |         meta.setBootMsOffset(Util::bootMS() - pktTimeWithOffset); | ||||||
|       thisPacket.setTime(adjustTime); |         bootMSOffsetCalculated = true; | ||||||
|  |       } | ||||||
|  |       lastTimeStamp = pktTimeWithOffset; | ||||||
|  |       thisPacket.setTime(pktTimeWithOffset); | ||||||
|  |       thisTime = pktTimeWithOffset; | ||||||
|       bufferLivePacket(thisPacket); |       bufferLivePacket(thisPacket); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ namespace Mist{ | ||||||
|     Socket::UDPConnection pushSock; |     Socket::UDPConnection pushSock; | ||||||
|     TS::Stream tsIn; |     TS::Stream tsIn; | ||||||
|     TS::Assembler assembler; |     TS::Assembler assembler; | ||||||
|  |     bool bootMSOffsetCalculated; | ||||||
| 
 | 
 | ||||||
|     Socket::SRTConnection & srtConn; |     Socket::SRTConnection & srtConn; | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Marco van Dijk
						Marco van Dijk