Changes for propagating fragment numbers if the stream is live

This commit is contained in:
Erik Zandvliet 2013-02-27 09:47:50 +01:00
parent 4dbca1e680
commit 12db927cbf
2 changed files with 25 additions and 4 deletions

View file

@ -257,13 +257,17 @@ void DTSC::Stream::advanceRings(){
} }
} while( repeat ); } while( repeat );
} }
static int fragNum = 1;
if ((lastType() == VIDEO) && (buffers.front().isMember("keyframe"))){ if ((lastType() == VIDEO) && (buffers.front().isMember("keyframe"))){
keyframes.push_front(DTSC::Ring(0)); 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){ if (keyframes.size() > 1){
//increase buffer size if no keyframes available or too little time available //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(); timeBuffered = buffers[keyframes[0].b]["time"].asInt() - buffers[keyframes[keyframes.size() - 1].b]["time"].asInt();
} }
if (buffercount > 1 && (keyframes.size() < 2 || timeBuffered < buffertime)){ if (buffercount > 1 && (keyframes.size() < 2 || timeBuffered < buffertime)){
buffercount++; buffercount++;
@ -304,9 +308,16 @@ void DTSC::Stream::dropRing(DTSC::Ring * ptr){
} }
void DTSC::Stream::updateHeaders(){ void DTSC::Stream::updateHeaders(){
if( keyframes.size() > 1 ) { if( keyframes.size() > 2 ) {
metadata["keytime"].shrink(keyframes.size() - 2); metadata["keytime"].shrink(keyframes.size() - 2);
metadata["keynum"].shrink(keyframes.size() - 2 );
metadata["keytime"].append(buffers[keyframes[1].b]["time"].asInt()); 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(); metadata.toPacked();
updateRingHeaders(); updateRingHeaders();
} }
@ -331,6 +342,15 @@ unsigned int DTSC::Stream::msSeek(unsigned int ms) {
return keyframes[keyframes.size()-1].b; return keyframes[keyframes.size()-1].b;
} }
unsigned int DTSC::Stream::frameSeek(unsigned int frameno) {
for( std::deque<DTSC::Ring>::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. /// Properly cleans up the object for erasing.
/// Drops all Ring classes that have been given out. /// Drops all Ring classes that have been given out.
DTSC::Stream::~Stream(){ DTSC::Stream::~Stream(){

View file

@ -128,6 +128,7 @@ namespace DTSC {
void dropRing(Ring * ptr); void dropRing(Ring * ptr);
void updateHeaders(); void updateHeaders();
unsigned int msSeek(unsigned int ms); unsigned int msSeek(unsigned int ms);
unsigned int frameSeek(unsigned int frameno);
void setBufferTime(unsigned int ms); void setBufferTime(unsigned int ms);
private: private:
std::deque<JSON::Value> buffers; std::deque<JSON::Value> buffers;