From 12db927cbf5f77d1763bdebacecb24cccc4f64cf Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Wed, 27 Feb 2013 09:47:50 +0100 Subject: [PATCH] Changes for propagating fragment numbers if the stream is live --- lib/dtsc.cpp | 28 ++++++++++++++++++++++++---- lib/dtsc.h | 1 + 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/lib/dtsc.cpp b/lib/dtsc.cpp index 9999b7cf..5be18539 100644 --- a/lib/dtsc.cpp +++ b/lib/dtsc.cpp @@ -257,13 +257,17 @@ void DTSC::Stream::advanceRings(){ } } while( repeat ); } + static int fragNum = 1; if ((lastType() == VIDEO) && (buffers.front().isMember("keyframe"))){ keyframes.push_front(DTSC::Ring(0)); + if ( !buffers.front().isMember("fragnum")){ + buffers.front()["fragnum"] = fragNum++; + } } - int timeBuffered = 0; + unsigned int timeBuffered = 0; if (keyframes.size() > 1){ - //increase buffer size if no keyframes available or too little time available - timeBuffered = buffers[keyframes[keyframes.size() - 1].b]["time"].asInt() - buffers[keyframes[0].b]["time"].asInt(); + //increase buffer size if no keyframes available or too little time available + timeBuffered = buffers[keyframes[0].b]["time"].asInt() - buffers[keyframes[keyframes.size() - 1].b]["time"].asInt(); } if (buffercount > 1 && (keyframes.size() < 2 || timeBuffered < buffertime)){ buffercount++; @@ -304,9 +308,16 @@ void DTSC::Stream::dropRing(DTSC::Ring * ptr){ } void DTSC::Stream::updateHeaders(){ - if( keyframes.size() > 1 ) { + if( keyframes.size() > 2 ) { metadata["keytime"].shrink(keyframes.size() - 2); + metadata["keynum"].shrink(keyframes.size() - 2 ); metadata["keytime"].append(buffers[keyframes[1].b]["time"].asInt()); + if( metadata["keynum"].size() == 0 ) { + metadata["keynum"].append(1ll); + } else { + metadata["keynum"].append( metadata["keynum"][metadata["keynum"].size()-1].asInt() + 1 ); + } + metadata["lastms"] = buffers[keyframes[0].b]["time"].asInt(); metadata.toPacked(); updateRingHeaders(); } @@ -331,6 +342,15 @@ unsigned int DTSC::Stream::msSeek(unsigned int ms) { return keyframes[keyframes.size()-1].b; } +unsigned int DTSC::Stream::frameSeek(unsigned int frameno) { + for( std::deque::iterator it = keyframes.begin(); it != keyframes.end(); it++ ) { + if( buffers[it->b]["fragnum"].asInt( ) == frameno ) { + return it->b; + } + } + return keyframes[keyframes.size()-1].b; +} + /// Properly cleans up the object for erasing. /// Drops all Ring classes that have been given out. DTSC::Stream::~Stream(){ diff --git a/lib/dtsc.h b/lib/dtsc.h index a7329f3e..de199ebb 100644 --- a/lib/dtsc.h +++ b/lib/dtsc.h @@ -128,6 +128,7 @@ namespace DTSC { void dropRing(Ring * ptr); void updateHeaders(); unsigned int msSeek(unsigned int ms); + unsigned int frameSeek(unsigned int frameno); void setBufferTime(unsigned int ms); private: std::deque buffers;