From 8710a8b988503518de5998df99226518e08bd0ea Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 2 Sep 2016 18:07:38 +0200 Subject: [PATCH] Fixed RTMP offsets and VoD seeking --- src/io.cpp | 3 +++ src/output/output_rtmp.cpp | 30 ++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/io.cpp b/src/io.cpp index c9ccfa77..d17934b5 100644 --- a/src/io.cpp +++ b/src/io.cpp @@ -260,6 +260,9 @@ namespace Mist { static bool multiWrong = false; //Save the trackid of the track for easier access unsigned long tid = pack.getTrackId(); + if (myMeta.live && pack.getTime() > 0xFFFF0000 && !myMeta.tracks[tid].lastms){ + return;//ignore bullshit timestamps + } if (myMeta.live && pack.getTime() < myMeta.tracks[tid].lastms){ DEBUG_MSG(multiWrong?DLVL_HIGH:DLVL_WARN, "Wrong order on track %lu ignored: %lu < %lu", tid, pack.getTime(), myMeta.tracks[tid].lastms); multiWrong = true; diff --git a/src/output/output_rtmp.cpp b/src/output/output_rtmp.cpp index 549189f6..62ae4ac8 100644 --- a/src/output/output_rtmp.cpp +++ b/src/output/output_rtmp.cpp @@ -170,13 +170,21 @@ namespace Mist { //If there are now more selectable tracks, select the new track and do a seek to the current timestamp //Set sentHeader to false to force it to send init data - if (selectedTracks.size() < 2 && myMeta.tracks.size() > 1){ - size_t prevTrackCount = selectedTracks.size(); - selectDefaultTracks(); - if (selectedTracks.size() > prevTrackCount){ - INFO_MSG("Picked up new track - selecting it and resetting state."); - sentHeader = false; - seek(thisPacket.getTime()); + if (myMeta.live && selectedTracks.size() < 2){ + static unsigned long long lastMeta = 0; + if (Util::epoch() > lastMeta + 5){ + lastMeta = Util::epoch(); + updateMeta(); + if (myMeta.tracks.size() > 1){ + size_t prevTrackCount = selectedTracks.size(); + selectDefaultTracks(); + if (selectedTracks.size() > prevTrackCount){ + INFO_MSG("Picked up new track - selecting it and resetting state."); + sentHeader = false; + initialSeek(); + return; + } + } } return; } @@ -278,6 +286,7 @@ namespace Mist { data_len += dheader_len; unsigned int timestamp = thisPacket.getTime() - rtmpOffset; + if (rtmpOffset > thisPacket.getTime()){timestamp = 0;}//make sure we don't go negative bool allow_short = RTMPStream::lastsend.count(4); RTMPStream::Chunk & prev = RTMPStream::lastsend[4]; @@ -740,9 +749,10 @@ namespace Mist { amfreply.getContentP(3)->addContent(AMF::Object("description", "Playing!")); amfreply.getContentP(3)->addContent(AMF::Object("details", "DDV")); amfreply.getContentP(3)->addContent(AMF::Object("clientid", (double)1337)); - initialSeek(); - rtmpOffset = currentTime(); - amfreply.getContentP(3)->addContent(AMF::Object("timecodeOffset", (double)rtmpOffset)); + if (myMeta.live){ + rtmpOffset = currentTime(); + amfreply.getContentP(3)->addContent(AMF::Object("timecodeOffset", (double)rtmpOffset)); + } sendCommand(amfreply, playMessageType, playStreamId); RTMPStream::chunk_snd_max = 10240000; //10000KiB myConn.SendNow(RTMPStream::SendCTL(1, RTMPStream::chunk_snd_max)); //send chunk size max (msg 1)