OGG support almost working

This commit is contained in:
Oswald Auguste de Bruin 2013-07-18 16:41:53 +02:00 committed by Thulinma
parent be81fb6262
commit dfee0feb8b
2 changed files with 37 additions and 5 deletions

View file

@ -9,6 +9,8 @@
#include <mist/config.h> #include <mist/config.h>
#include <mist/json.h> #include <mist/json.h>
///\todo FIX SEQUENCE NUMBERS!
namespace Converters{ namespace Converters{
int DTSC2OGG(Util::Config & conf){ int DTSC2OGG(Util::Config & conf){
DTSC::File DTSCFile(conf.getString("filename")); DTSC::File DTSCFile(conf.getString("filename"));
@ -18,6 +20,7 @@ namespace Converters{
std::vector<unsigned int> curSegTable; std::vector<unsigned int> curSegTable;
char* curNewPayload; char* curNewPayload;
std::map <long long unsigned int, unsigned int> DTSCID2OGGSerial; std::map <long long unsigned int, unsigned int> DTSCID2OGGSerial;
unsigned int seqNum = 0;
//Creating ID headers for theora and vorbis //Creating ID headers for theora and vorbis
for ( JSON::ObjIter it = meta["tracks"].ObjBegin(); it != meta["tracks"].ObjEnd(); it ++) { for ( JSON::ObjIter it = meta["tracks"].ObjBegin(); it != meta["tracks"].ObjEnd(); it ++) {
curOggPage.clear(); curOggPage.clear();
@ -26,7 +29,7 @@ namespace Converters{
curOggPage.setGranulePosition(0); curOggPage.setGranulePosition(0);
DTSCID2OGGSerial[it->second["trackid"].asInt()] = rand() % 0xFFFFFFFE +1; //initialising on a random not 0 number DTSCID2OGGSerial[it->second["trackid"].asInt()] = rand() % 0xFFFFFFFE +1; //initialising on a random not 0 number
curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[it->second["trackid"].asInt()]); curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[it->second["trackid"].asInt()]);
curOggPage.setPageSequenceNumber(0); curOggPage.setPageSequenceNumber(seqNum++);
curSegTable.clear(); curSegTable.clear();
curSegTable.push_back(it->second["IDHeader"].asString().size()); curSegTable.push_back(it->second["IDHeader"].asString().size());
curOggPage.setSegmentTable(curSegTable); curOggPage.setSegmentTable(curSegTable);
@ -35,13 +38,15 @@ namespace Converters{
std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize()); std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize());
} }
//Creating remaining headers for theora and vorbis //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 ++) { for ( JSON::ObjIter it = meta["tracks"].ObjBegin(); it != meta["tracks"].ObjEnd(); it ++) {
curOggPage.clear(); curOggPage.clear();
curOggPage.setVersion(); curOggPage.setVersion();
curOggPage.setHeaderType(0);//headertype 0 = normal curOggPage.setHeaderType(0);//headertype 0 = normal
curOggPage.setGranulePosition(0); curOggPage.setGranulePosition(0);
curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[it->second["trackid"].asInt()]); curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[it->second["trackid"].asInt()]);
curOggPage.setPageSequenceNumber(1); curOggPage.setPageSequenceNumber(seqNum++);
curSegTable.clear(); curSegTable.clear();
curSegTable.push_back(it->second["CommentHeader"].asString().size()); curSegTable.push_back(it->second["CommentHeader"].asString().size());
curSegTable.push_back(it->second["init"].asString().size()); curSegTable.push_back(it->second["init"].asString().size());
@ -52,8 +57,35 @@ namespace Converters{
curOggPage.calcChecksum(); curOggPage.calcChecksum();
std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize()); std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize());
} }
//for tracks in header //create DTSC in OGG pages
//create standard page with comment (empty) en setup header(init) 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; return 0;
} }
} }

View file

@ -79,7 +79,7 @@ namespace Converters{
DTSCOut.null();//clearing DTSC buffer DTSCOut.null();//clearing DTSC buffer
DTSCOut["trackid"] = (long long)trackData[sNum].dtscID; DTSCOut["trackid"] = (long long)trackData[sNum].dtscID;
long long unsigned int temp = oggPage.getGranulePosition(); long long unsigned int temp = oggPage.getGranulePosition();
DTSCOut["granule"] = temp; DTSCOut["granule"] = (long long)temp;
DTSCOut["time"] = (long long)trackData[sNum].lastTime ++; DTSCOut["time"] = (long long)trackData[sNum].lastTime ++;
DTSCOut["data"] = std::string(oggPage.getFullPayload()+offset, (*it)); //segment content put in JSON DTSCOut["data"] = std::string(oggPage.getFullPayload()+offset, (*it)); //segment content put in JSON
if (trackData[sNum].codec == THEORA){ if (trackData[sNum].codec == THEORA){