From f69fe8a4fb48b3a1ca9c97a9bab33e3e6c28dc0f Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 24 Oct 2016 17:35:23 +0200 Subject: [PATCH] Moved HLS-specific TS output handling from output_ts_base to output_hls --- src/output/output_hls.cpp | 14 ++++++++++++++ src/output/output_hls.h | 2 ++ src/output/output_ts_base.cpp | 10 +--------- src/output/output_ts_base.h | 3 +-- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/output/output_hls.cpp b/src/output/output_hls.cpp index f25983f8..143e4c1c 100644 --- a/src/output/output_hls.cpp +++ b/src/output/output_hls.cpp @@ -108,6 +108,7 @@ namespace Mist { OutHLS::OutHLS(Socket::Connection & conn) : TSOutput(conn){ realTime = 0; + until=0xFFFFFFFFFFFFFFFFull; } OutHLS::~OutHLS() {} @@ -270,6 +271,19 @@ namespace Mist { } } + void OutHLS::sendNext(){ + //First check if we need to stop. + if (thisPacket.getTime() >= until){ + stop(); + wantRequest = true; + parseData = false; + //Ensure alignment of contCounters for selected tracks, to prevent discontinuities. + H.Chunkify("", 0, myConn); + return; + } + //Invoke the generic TS output sendNext handler + TSOutput::sendNext(); + } void OutHLS::sendTS(const char * tsData, unsigned int len){ H.Chunkify(tsData, len, myConn); diff --git a/src/output/output_hls.h b/src/output/output_hls.h index 7cbff9b9..903baf7d 100644 --- a/src/output/output_hls.h +++ b/src/output/output_hls.h @@ -8,6 +8,7 @@ namespace Mist { ~OutHLS(); static void init(Util::Config * cfg); void sendTS(const char * tsData, unsigned int len=188); + void sendNext(); void onHTTP(); bool isReadyForPlay(); protected: @@ -18,6 +19,7 @@ namespace Mist { int keysToSend; unsigned int vidTrack; unsigned int audTrack; + long long unsigned int until; }; } diff --git a/src/output/output_ts_base.cpp b/src/output/output_ts_base.cpp index a7bb5d00..78c9dce6 100644 --- a/src/output/output_ts_base.cpp +++ b/src/output/output_ts_base.cpp @@ -5,7 +5,6 @@ namespace Mist { packCounter=0; haveAvcc = false; ts_from = 0; - until=0xFFFFFFFFFFFFFFFFull; setBlocking(true); sendRepeatingHeaders = false; appleCompat=false; @@ -30,7 +29,7 @@ namespace Mist { if (!dataLen){return;} if (packData.getBytesFree() == 184){ - packData.clear(); + packData.clear(); packData.setPID(pkgPid); packData.setContinuityCounter(++contPkg); if (firstPack){ @@ -68,13 +67,6 @@ namespace Mist { char * dataPointer = 0; unsigned int dataLen = 0; thisPacket.getString("data", dataPointer, dataLen); //data - if (packTime >= until){ //this if should only trigger for HLS - stop(); - wantRequest = true; - parseData = false; - sendTS("",0); - return; - } //apple compatibility timestamp correction if (appleCompat){ packTime -= ts_from; diff --git a/src/output/output_ts_base.h b/src/output/output_ts_base.h index 6995bca5..90f17628 100644 --- a/src/output/output_ts_base.h +++ b/src/output/output_ts_base.h @@ -14,7 +14,7 @@ namespace Mist { public: TSOutput(Socket::Connection & conn); virtual ~TSOutput(){}; - void sendNext(); + virtual void sendNext(); virtual void sendTS(const char * tsData, unsigned int len=188){}; void fillPacket(char const * data, size_t dataLen, bool & firstPack, bool video, bool keyframe, uint32_t pkgPid, int & contPkg); protected: @@ -29,7 +29,6 @@ namespace Mist { bool appleCompat; bool sendRepeatingHeaders; long long unsigned int ts_from; - long long unsigned int until; long long unsigned int lastVid; }; }