Improved track handling for live streams.
This commit is contained in:
parent
733868aa70
commit
a60b674471
3 changed files with 45 additions and 1 deletions
|
@ -59,12 +59,18 @@ namespace Buffer {
|
||||||
pthread_setname_np(pthread_self(), "Push Input");
|
pthread_setname_np(pthread_self(), "Push Input");
|
||||||
#endif
|
#endif
|
||||||
conn.setBlocking(true);
|
conn.setBlocking(true);
|
||||||
|
int sockNo = 0;
|
||||||
while (buffer_running && conn.connected()){
|
while (buffer_running && conn.connected()){
|
||||||
thisStream->parsePacket(conn);
|
thisStream->parsePacket(conn);
|
||||||
}
|
}
|
||||||
if (buffer_running){
|
if (buffer_running){
|
||||||
thisStream->endStream();
|
thisStream->endStream();
|
||||||
}
|
}
|
||||||
|
long long int wait_time = Util::getMS();
|
||||||
|
while (Util::getMS() - wait_time < thisStream->metadata.bufferWindow){
|
||||||
|
Util::sleep(thisStream->metadata.bufferWindow);
|
||||||
|
}
|
||||||
|
thisStream->removeSocket(sockNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
///\brief A function running a thread to handle input data through stdin.
|
///\brief A function running a thread to handle input data through stdin.
|
||||||
|
|
|
@ -175,6 +175,39 @@ namespace Buffer {
|
||||||
return DTSC::Stream::getNext(pos, allowedTracks);
|
return DTSC::Stream::getNext(pos, allowedTracks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Removes a track and all related buffers from the stream.
|
||||||
|
void Stream::removeTrack(int trackId){
|
||||||
|
metadata.tracks.erase(trackId);
|
||||||
|
std::set<DTSC::livePos> toDelete;
|
||||||
|
for (std::map<DTSC::livePos, JSON::Value >::iterator it = buffers.begin(); it != buffers.end(); it++){
|
||||||
|
if (it->first.trackID == trackId){
|
||||||
|
toDelete.insert(it->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (toDelete.size()){
|
||||||
|
deletionCallback(*toDelete.begin());
|
||||||
|
buffers.erase(*toDelete.begin());
|
||||||
|
keyframes[trackId].erase(*toDelete.begin());
|
||||||
|
toDelete.erase(toDelete.begin());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Calls removeTrack on all tracks that were streaming from this socket number.
|
||||||
|
void Stream::removeSocket(int sockNo){
|
||||||
|
std::set<int> toDelete;
|
||||||
|
std::map<int,DTSC::Track>::iterator it;
|
||||||
|
for (it = metadata.tracks.begin(); it != metadata.tracks.end(); ++it){
|
||||||
|
if ((it->first & (sockNo << 16)) == (sockNo << 16)){
|
||||||
|
toDelete.insert(it->first);
|
||||||
|
std::cout << "Input lost, removing track: " << it->second.getIdentifier() << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (toDelete.size()){
|
||||||
|
removeTrack(*toDelete.begin());
|
||||||
|
toDelete.erase(toDelete.begin());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// parsePacket override that will lock the rw_mutex during parsing.
|
/// parsePacket override that will lock the rw_mutex during parsing.
|
||||||
bool Stream::parsePacket(Socket::Connection & c){
|
bool Stream::parsePacket(Socket::Connection & c){
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
|
@ -73,8 +73,13 @@ namespace Buffer {
|
||||||
void sendMeta(Socket::Connection & s);
|
void sendMeta(Socket::Connection & s);
|
||||||
/// Cleanup function
|
/// Cleanup function
|
||||||
~Stream();
|
~Stream();
|
||||||
/// TODO: WRITEME
|
/// Removes a track and all related buffers from the stream.
|
||||||
|
void removeTrack(int trackId);
|
||||||
|
/// Calls removeTrack on all tracks that were streaming from this socket number.
|
||||||
|
void removeSocket(int sockNo);
|
||||||
|
/// Thread-safe parsePacket override.
|
||||||
bool parsePacket(std::string & buffer);
|
bool parsePacket(std::string & buffer);
|
||||||
|
/// Thread-safe parsePacket override.
|
||||||
bool parsePacket(Socket::Connection & c);
|
bool parsePacket(Socket::Connection & c);
|
||||||
DTSC::livePos getNext(DTSC::livePos & pos, std::set<int> & allowedTracks);
|
DTSC::livePos getNext(DTSC::livePos & pos, std::set<int> & allowedTracks);
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Add table
Reference in a new issue