Simplified and fortified MP4 live code.

This commit is contained in:
Thulinma 2016-06-07 14:27:22 +02:00
parent fecfc20052
commit 7c46f008a8
2 changed files with 7 additions and 58 deletions

View file

@ -509,7 +509,7 @@ namespace Mist {
uint64_t mdatSize = 8;
MP4::MOOF moofBox;
MP4::MFHD mfhdBox;
mfhdBox.setSequenceNumber(fragSeqNum);
mfhdBox.setSequenceNumber(fragSeqNum++);
moofBox.setContent(mfhdBox, 0);
unsigned int moofIndex = 1;
std::vector<keyPart> trunOrderWithOffset;
@ -662,22 +662,6 @@ namespace Mist {
fragSeqNum = 0;
partListSent = 0;
partListLength = 0;
//seek to first video keyframe here
setvidTrack();
//making sure we have a first keyframe
if (!vidTrack || !myMeta.tracks[vidTrack].keys.size() || !myMeta.tracks[vidTrack].keys.begin()->getLength()) {
WARN_MSG("Stream not ready yet");
myConn.close();
parseData = false;
return;
}
std::deque<DTSC::Key>::reverse_iterator fromHere = myMeta.tracks[vidTrack].keys.rbegin();
if (myMeta.tracks[vidTrack].keys.size() > 1) {
fromHere++;
}
///\todo Note: Not necessary, but we might want to think of a method that does not use seeking
seekPoint = fromHere->getTime();
fragKeyNumberShift = fromHere->getNumber() - 1;
}
byteStart = 0;
byteEnd = fileSize - 1;
@ -747,50 +731,16 @@ namespace Mist {
currPos += headerData.size();//we're now guaranteed to be past the header point, no matter what
}
void OutProgressiveMP4::setvidTrack() {
vidTrack = 0;
if (!selectedTracks.size()){
selectDefaultTracks();
}
for (std::set<long unsigned int>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++) {
//Find video track
if (myMeta.tracks[*it].type == "video") {
vidTrack = *it;
break;
}
}
}
///Builds up a datastructure that allows for access in the fragment send header function
///using the fragment number **FOR THIS USER, NOT ACTUAL FRAGMENT NUMBER, HAS NOTHING TO DO WITH ACTUAL FRAGMENTS EVEN**
///We take the corresponding keyframe and interframes of the main video track and take concurrent frames from its secondary (audio) tracks
///\todo See if we can use something more elegant than a member variable...
void OutProgressiveMP4::buildFragment() {
currentPartSet.clear();
DTSC::Track & mainTrack = myMeta.tracks[vidTrack];
DTSC::Key & currKey = myMeta.tracks[vidTrack].getKey(getKeyForTime(vidTrack, thisPacket.getTime()));
long long int startms = currKey.getTime();
long long int endms = startms + currKey.getLength();
long int keyIndex = fragSeqNum + fragKeyNumberShift - (mainTrack.keys.begin()->getNumber() - 1); //here we set the index of the video keyframe we are going to make a fragment of
if (keyIndex < 0 || keyIndex >= mainTrack.keys.size()) {//if the fragnum is not in the keys
if (keyIndex < 0){
WARN_MSG("Connection went out of buffer. Closing.");
myConn.close();
}else{
FAIL_MSG("Too far ahead - this should be impossible.");
}
return;
}
long long int startms = mainTrack.keys[keyIndex].getTime();
long long int endms;// = startms;
if (mainTrack.keys.size() > keyIndex + 1) {
endms = mainTrack.keys[keyIndex + 1].getTime();
} else {
endms = mainTrack.lastms;
}
for (std::set<long unsigned int>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++) {
DTSC::Track & thisTrack = myMeta.tracks[*it];
fragSet thisRange;
@ -833,7 +783,6 @@ namespace Mist {
buildFragment();//map with metadata for keyframe
if (!currentPartSet.size()){return;}//we're seeking, send nothing
sendFragmentHeader();
++fragSeqNum;
partListSent = 0;
//convert map to list here, apologies for inefficiency, but this works best
//partList = x1 * track y1 + x2 * track y2 * etc.
@ -917,9 +866,10 @@ namespace Mist {
}
void OutProgressiveMP4::sendHeader() {
seek(seekPoint);
if (myMeta.live) {
setvidTrack();
vidTrack = getMainSelectedTrack();
}else{
seek(seekPoint);
}
sentHeader = true;
}

View file

@ -62,7 +62,6 @@ namespace Mist {
//functions for fragmented MP4
void buildTrafPart();
void setvidTrack();//searching for the current vid track
//variables for fragmented
int fragSeqNum;//the sequence number of the next keyframe/fragment when producing fragmented MP4's