Changes for propagating fragment numbers if the stream is live
This commit is contained in:
parent
4dbca1e680
commit
12db927cbf
2 changed files with 25 additions and 4 deletions
28
lib/dtsc.cpp
28
lib/dtsc.cpp
|
@ -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(){
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue