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

@ -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;