From dfee0feb8b50664a5aa0429fae5a01bc798c9eef Mon Sep 17 00:00:00 2001 From: Oswald Auguste de Bruin Date: Thu, 18 Jul 2013 16:41:53 +0200 Subject: [PATCH] OGG support almost working --- src/converters/dtsc2ogg.cpp | 40 +++++++++++++++++++++++++++++++++---- src/converters/ogg2dtsc.cpp | 2 +- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/converters/dtsc2ogg.cpp b/src/converters/dtsc2ogg.cpp index 977365e8..c4b503c3 100644 --- a/src/converters/dtsc2ogg.cpp +++ b/src/converters/dtsc2ogg.cpp @@ -9,6 +9,8 @@ #include #include +///\todo FIX SEQUENCE NUMBERS! + namespace Converters{ int DTSC2OGG(Util::Config & conf){ DTSC::File DTSCFile(conf.getString("filename")); @@ -18,6 +20,7 @@ namespace Converters{ std::vector curSegTable; char* curNewPayload; std::map DTSCID2OGGSerial; + unsigned int seqNum = 0; //Creating ID headers for theora and vorbis for ( JSON::ObjIter it = meta["tracks"].ObjBegin(); it != meta["tracks"].ObjEnd(); it ++) { curOggPage.clear(); @@ -26,7 +29,7 @@ namespace Converters{ curOggPage.setGranulePosition(0); DTSCID2OGGSerial[it->second["trackid"].asInt()] = rand() % 0xFFFFFFFE +1; //initialising on a random not 0 number curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[it->second["trackid"].asInt()]); - curOggPage.setPageSequenceNumber(0); + curOggPage.setPageSequenceNumber(seqNum++); curSegTable.clear(); curSegTable.push_back(it->second["IDHeader"].asString().size()); curOggPage.setSegmentTable(curSegTable); @@ -35,13 +38,15 @@ namespace Converters{ std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize()); } //Creating remaining headers for theora and vorbis + //for tracks in header + //create standard page with comment (empty) en setup header(init) for ( JSON::ObjIter it = meta["tracks"].ObjBegin(); it != meta["tracks"].ObjEnd(); it ++) { curOggPage.clear(); curOggPage.setVersion(); curOggPage.setHeaderType(0);//headertype 0 = normal curOggPage.setGranulePosition(0); curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[it->second["trackid"].asInt()]); - curOggPage.setPageSequenceNumber(1); + curOggPage.setPageSequenceNumber(seqNum++); curSegTable.clear(); curSegTable.push_back(it->second["CommentHeader"].asString().size()); curSegTable.push_back(it->second["init"].asString().size()); @@ -52,8 +57,35 @@ namespace Converters{ curOggPage.calcChecksum(); std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize()); } - //for tracks in header - //create standard page with comment (empty) en setup header(init) + //create DTSC in OGG pages + DTSCFile.parseNext(); + curSegTable.clear(); + long long int prevID = DTSCFile.getJSON()["trackid"].asInt(); + long long int prevGran = DTSCFile.getJSON()["granule"].asInt(); + std::string pageBuffer; + + while(DTSCFile.getJSON()){ + if(DTSCFile.getJSON()["trackid"].asInt()!=prevID || DTSCFile.getJSON()["granule"].asInt()!=prevGran){ + curOggPage.clear(); + curOggPage.setVersion(); + curOggPage.setHeaderType(0);//headertype 0 = normal + curOggPage.setGranulePosition(prevGran); + curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[prevID]); + curOggPage.setPageSequenceNumber(seqNum++); + curOggPage.setSegmentTable(curSegTable); + curOggPage.setPayload((char*)pageBuffer.c_str(), pageBuffer.size()); + curOggPage.calcChecksum(); + std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize()); + pageBuffer = ""; + curSegTable.clear(); + //write one pagebuffer as Ogg page + } + pageBuffer += DTSCFile.getJSON()["data"].asString(); + curSegTable.push_back(DTSCFile.getJSON()["data"].asString().size()); + prevID = DTSCFile.getJSON()["trackid"].asInt(); + prevGran = DTSCFile.getJSON()["granule"].asInt(); + DTSCFile.parseNext(); + } return 0; } } diff --git a/src/converters/ogg2dtsc.cpp b/src/converters/ogg2dtsc.cpp index d290a009..fb40fea8 100644 --- a/src/converters/ogg2dtsc.cpp +++ b/src/converters/ogg2dtsc.cpp @@ -79,7 +79,7 @@ namespace Converters{ DTSCOut.null();//clearing DTSC buffer DTSCOut["trackid"] = (long long)trackData[sNum].dtscID; long long unsigned int temp = oggPage.getGranulePosition(); - DTSCOut["granule"] = temp; + DTSCOut["granule"] = (long long)temp; 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){