Fixed infinite loops in MP4 connector when selecting invalid tracks.

This commit is contained in:
Thulinma 2014-01-31 15:30:23 +01:00
parent 57967696c2
commit 83ae5aeccd

View file

@ -151,13 +151,14 @@ namespace Connector_HTTP {
}//hdlr box }//hdlr box
{ {
MP4::MINF minfBox; MP4::MINF minfBox;
unsigned int minf_offset = 0;
if (metaData.tracks[*it].type== "video"){ if (metaData.tracks[*it].type== "video"){
MP4::VMHD vmhdBox; MP4::VMHD vmhdBox;
vmhdBox.setFlags(1); vmhdBox.setFlags(1);
minfBox.setContent(vmhdBox,0); minfBox.setContent(vmhdBox,minf_offset++);
}else if (metaData.tracks[*it].type == "audio"){ }else if (metaData.tracks[*it].type == "audio"){
MP4::SMHD smhdBox; MP4::SMHD smhdBox;
minfBox.setContent(smhdBox,0); minfBox.setContent(smhdBox,minf_offset++);
}//type box }//type box
{ {
MP4::DINF dinfBox; MP4::DINF dinfBox;
@ -167,10 +168,11 @@ namespace Connector_HTTP {
urlBox.setFlags(1); urlBox.setFlags(1);
drefBox.setDataEntry(urlBox,0); drefBox.setDataEntry(urlBox,0);
dinfBox.setContent(drefBox,0); dinfBox.setContent(drefBox,0);
minfBox.setContent(dinfBox,1); minfBox.setContent(dinfBox,minf_offset++);
}//dinf box }//dinf box
{ {
MP4::STBL stblBox; MP4::STBL stblBox;
unsigned int offset = 0;
{ {
MP4::STSD stsdBox; MP4::STSD stsdBox;
stsdBox.setVersion(0); stsdBox.setVersion(0);
@ -219,7 +221,7 @@ namespace Connector_HTTP {
ase.setCodecBox(esdsBox); ase.setCodecBox(esdsBox);
stsdBox.setEntry(ase,0); stsdBox.setEntry(ase,0);
} }
stblBox.setContent(stsdBox,0); stblBox.setContent(stsdBox,offset++);
}//stsd box }//stsd box
/// \todo update following stts lines /// \todo update following stts lines
{ {
@ -230,7 +232,7 @@ namespace Connector_HTTP {
//42, Used as magic number for timescale calculation //42, Used as magic number for timescale calculation
newEntry.sampleDelta = 42; newEntry.sampleDelta = 42;
sttsBox.setSTTSEntry(newEntry, 0); sttsBox.setSTTSEntry(newEntry, 0);
stblBox.setContent(sttsBox,1); stblBox.setContent(sttsBox,offset++);
}//stts box }//stts box
if (metaData.tracks[*it].type == "video"){ if (metaData.tracks[*it].type == "video"){
//STSS Box here //STSS Box here
@ -243,10 +245,8 @@ namespace Connector_HTTP {
tmpCount += tmpIt->getParts(); tmpCount += tmpIt->getParts();
tmpItCount ++; tmpItCount ++;
} }
stblBox.setContent(stssBox,2); stblBox.setContent(stssBox,offset++);
}//stss box }//stss box
int offset = (metaData.tracks[*it].type == "video");
{ {
MP4::STSC stscBox; MP4::STSC stscBox;
stscBox.setVersion(0); stscBox.setVersion(0);
@ -255,7 +255,7 @@ namespace Connector_HTTP {
stscEntry.samplesPerChunk = 1; stscEntry.samplesPerChunk = 1;
stscEntry.sampleDescriptionIndex = 1; stscEntry.sampleDescriptionIndex = 1;
stscBox.setSTSCEntry(stscEntry, 0); stscBox.setSTSCEntry(stscEntry, 0);
stblBox.setContent(stscBox,2 + offset); stblBox.setContent(stscBox,offset++);
}//stsc box }//stsc box
{ {
uint32_t total = 0; uint32_t total = 0;
@ -266,7 +266,7 @@ namespace Connector_HTTP {
stszBox.setEntrySize(partIt->getSize(), total);//in bytes in file stszBox.setEntrySize(partIt->getSize(), total);//in bytes in file
total++; total++;
} }
stblBox.setContent(stszBox,3 + offset); stblBox.setContent(stszBox,offset++);
}//stsz box }//stsz box
//add STCO boxes here //add STCO boxes here
{ {
@ -276,9 +276,9 @@ namespace Connector_HTTP {
if (metaData.tracks[*it].parts.size() != 0){ if (metaData.tracks[*it].parts.size() != 0){
stcoBox.setChunkOffset(0, metaData.tracks[*it].parts.size() - 1);//this inserts all empty entries at once stcoBox.setChunkOffset(0, metaData.tracks[*it].parts.size() - 1);//this inserts all empty entries at once
} }
stblBox.setContent(stcoBox,4 + offset); stblBox.setContent(stcoBox,offset++);
}//stco box }//stco box
minfBox.setContent(stblBox,2); minfBox.setContent(stblBox,minf_offset++);
}//stbl box }//stbl box
mdiaBox.setContent(minfBox, 2); mdiaBox.setContent(minfBox, 2);
}//minf box }//minf box