Fixed ogg problems with sintel.ogv. Note that sintel.ogv was already slightly corrupt.

This commit is contained in:
Oswald Auguste de Bruin 2013-08-29 13:06:19 +02:00 committed by Thulinma
parent fcd697e6bb
commit 8099d035a7
3 changed files with 18 additions and 8 deletions

View file

@ -160,7 +160,7 @@ namespace Connector_HTTP {
}
//parse DTSC to Ogg here
long long unsigned int temp = Strm.getPacket()["trackid"].asInt();
if(prevGran[temp] != Strm.getPacket()["granule"].asInt() && DTSCBuffer[temp].size() != 0){
if((prevGran[temp] != Strm.getPacket()["granule"].asInt() || prevGran[temp] == -1) && DTSCBuffer[temp].size() != 0){
curOggPage.readDTSCVector(DTSCBuffer[temp], oggMeta.DTSCID2OGGSerial[temp], oggMeta.DTSCID2seqNum[temp]);
conn.SendNow((char*)curOggPage.getPage(), curOggPage.getPageSize());
DTSCBuffer[temp].clear();
@ -168,11 +168,10 @@ namespace Connector_HTTP {
if (Strm.lastType() == DTSC::PAUSEMARK){
conn.close();
}
if (Strm.lastType() == DTSC::AUDIO || Strm.lastType() == DTSC::VIDEO){
//long long unsigned int prevID = Strm.getPacket()["trackid"].asInt();
//if (Strm.lastType() == DTSC::AUDIO || Strm.lastType() == DTSC::VIDEO){
DTSCBuffer[temp].push_back(Strm.getPacket());
prevGran[temp] = Strm.getPacket()["granule"].asInt();
}
//}
}
}else{
Util::sleep(1);

View file

@ -69,7 +69,7 @@ namespace Converters{
std::string pageBuffer;
while(DTSCFile.getJSON()){
if(DTSCFile.getJSON()["trackid"].asInt()!=prevID || DTSCFile.getJSON()["granule"].asInt()!=prevGran){
if(DTSCFile.getJSON()["trackid"].asInt()!=prevID || DTSCFile.getJSON()["granule"].asInt()!=prevGran || DTSCFile.getJSON()["granule"].asInt() == -1){
curOggPage.clear();
curOggPage.setVersion();
if (OggCont){
@ -82,7 +82,13 @@ namespace Converters{
curOggPage.setGranulePosition(prevGran);
curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[prevID]);
curOggPage.setPageSequenceNumber(DTSCID2seqNum[prevID]++);
curOggPage.setSegmentTable(curSegTable);
if(!curOggPage.setSegmentTable(curSegTable)){
std::cerr << "Troubling segTable:";
for (unsigned int i = 0; i<curSegTable.size(); i++){
std::cerr << " " << curSegTable[i];
}
std::cerr << std::endl;
}
curOggPage.setPayload((char*)pageBuffer.c_str(), pageBuffer.size());
curOggPage.setCRCChecksum(curOggPage.calcChecksum());
std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize());

View file

@ -83,7 +83,7 @@ namespace Converters{
DTSCOut["time"] = (long long)trackData[sNum].lastTime ++;
DTSCOut["data"] = std::string(oggPage.getFullPayload()+offset, (*it)); //segment content put in JSON
if (trackData[sNum].codec == THEORA){
if (trackData[sNum].idHeader.parseGranuleLower(temp) == 0){ //granule mask equals zero when on keyframe
if (trackData[sNum].idHeader.parseGranuleUpper(temp) == 0){ //granule mask equals zero when on keyframe
DTSCOut["keyframe"] = 1;
}else{
DTSCOut["interframe"] = 1;
@ -133,8 +133,9 @@ namespace Converters{
break;
}
case VORBIS:{
std::cerr << "Parsing part of the vorbis header\n";
vorbis::header vHead;
if(vHead.read(oggPage.getFullPayload()+offset, (*it))){//if the current segment is a Theora header part
if(vHead.read(oggPage.getFullPayload()+offset, (*it))){//if the current segment is a Vorbis header part
switch(vHead.getHeaderType()){
case 1:{
std::cerr << "Vorbis ID header" << std::endl;
@ -156,8 +157,12 @@ namespace Converters{
trackData[sNum].parsedHeaders = true;
break;
}
default:{
std::cerr << "Unsupported header type for vorbis\n";
}
}
}else{
std::cerr << "Not a header??\n";
//buffer vorbis
}
break;