Added proper buffering of not-yet-accepted tracks.

This commit is contained in:
Thulinma 2016-06-07 23:24:52 +02:00
parent 7c89122a52
commit a131557a43
2 changed files with 18 additions and 5 deletions

View file

@ -408,10 +408,25 @@ namespace Mist {
//If the track is declined, stop here
if (trackState[tid] == FILL_DEC) {
INFO_MSG("Track %lu Declined", tid);
preBuffer[tid].clear();
return;
}
//Not accepted yet? Buffer.
if (trackState[tid] != FILL_ACC) {
preBuffer[tid].push_back(packet);
}else{
while (preBuffer[tid].size()){
bufferSinglePacket(preBuffer[tid].front(), myMeta);
preBuffer[tid].pop_front();
}
bufferSinglePacket(packet, myMeta);
}
}
void negotiationProxy::bufferSinglePacket(DTSC::Packet & packet, DTSC::Meta & myMeta){
//Store the trackid for easier access
unsigned long tid = packet.getTrackId();
//This update needs to happen whether the track is accepted or not.
///\todo Figure out how to act with declined track here
bool isKeyframe = false;
if (myMeta.tracks[tid].type == "video") {
if (packet.hasMember("keyframe") && packet.getFlag("keyframe")) {
@ -462,10 +477,6 @@ namespace Mist {
if (!pagesByTrack.count(tid) || pagesByTrack[tid].size() == 0){
return;
}
//At this point we can stop parsing when the track is not accepted
if (trackState[tid] != FILL_ACC) {
return;
}
//Check if the correct page is opened
if (!curPageNum.count(tid) || nextPageNum != curPageNum[tid]) {

View file

@ -32,6 +32,7 @@ namespace Mist {
void bufferNext(DTSC::Packet & pack, DTSC::Meta & myMeta);
void bufferFinalize(unsigned long tid, DTSC::Meta &myMeta);
void bufferLivePacket(DTSC::Packet & packet, DTSC::Meta & myMeta);
void bufferSinglePacket(DTSC::Packet & packet, DTSC::Meta & myMeta);
bool isBuffered(unsigned long tid, unsigned long keyNum);
unsigned long bufferedOnPage(unsigned long tid, unsigned long keyNum);
@ -47,6 +48,7 @@ namespace Mist {
std::map<unsigned long, IPC::sharedPage> metaPages;///< For each track, holds the page that describes which dataPages are mapped
std::map<unsigned long, unsigned long> curPageNum;///< For each track, holds the number page that is currently being written.
std::map<unsigned long, IPC::sharedPage> curPage;///< For each track, holds the page that is currently being written.
std::map<unsigned long, std::deque<DTSC::Packet> > preBuffer;///< For each track, holds to-be-buffered packets.
IPC::sharedClient userClient;///< Shared memory used for connection to Mixer process.