DTSC 2 OGG outputs valid headers

This commit is contained in:
Oswald Auguste de Bruin 2013-07-18 16:00:12 +02:00 committed by Thulinma
parent 4b6c6aacea
commit be81fb6262
2 changed files with 72 additions and 0 deletions

View file

@ -0,0 +1,66 @@
#include<iostream>
#include<vector>
#include <stdlib.h>
#include <mist/timing.h>
#include <mist/dtsc.h>
#include <mist/ogg.h>
#include <mist/theora.h>
#include <mist/vorbis.h>
#include <mist/config.h>
#include <mist/json.h>
namespace Converters{
int DTSC2OGG(Util::Config & conf){
DTSC::File DTSCFile(conf.getString("filename"));
JSON::Value meta = DTSCFile.getMeta();
OGG::Page curOggPage;
srand (Util::getMS());//randomising with milliseconds from boot
std::vector<unsigned int> curSegTable;
char* curNewPayload;
std::map <long long unsigned int, unsigned int> DTSCID2OGGSerial;
//Creating ID headers for theora and vorbis
for ( JSON::ObjIter it = meta["tracks"].ObjBegin(); it != meta["tracks"].ObjEnd(); it ++) {
curOggPage.clear();
curOggPage.setVersion();
curOggPage.setHeaderType(2);//headertype 2 = Begin of Stream
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);
curSegTable.clear();
curSegTable.push_back(it->second["IDHeader"].asString().size());
curOggPage.setSegmentTable(curSegTable);
curOggPage.setPayload((char*)it->second["IDHeader"].asString().c_str(), it->second["IDHeader"].asString().size());
curOggPage.calcChecksum();
std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize());
}
//Creating remaining headers for theora and vorbis
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);
curSegTable.clear();
curSegTable.push_back(it->second["CommentHeader"].asString().size());
curSegTable.push_back(it->second["init"].asString().size());
curOggPage.setSegmentTable(curSegTable);
std::string fullHeader = it->second["CommentHeader"].asString() + it->second["init"].asString();
std::cerr << fullHeader.size() << std::endl;
std::cerr << "setPayload: " << curOggPage.setPayload((char*)fullHeader.c_str(), fullHeader.size()) << std::endl;
curOggPage.calcChecksum();
std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize());
}
//for tracks in header
//create standard page with comment (empty) en setup header(init)
return 0;
}
}
int main(int argc, char ** argv){
Util::Config conf = Util::Config(argv[0], PACKAGE_VERSION);
conf.addOption("filename", JSON::fromString("{\"arg_num\":1, \"arg\":\"string\", \"help\":\"Filename of the DTSC file to analyse.\"}"));
conf.parseArgs(argc, argv);
return Converters::DTSC2OGG(conf);
}

View file

@ -79,6 +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["time"] = (long long)trackData[sNum].lastTime ++;
DTSCOut["data"] = std::string(oggPage.getFullPayload()+offset, (*it)); //segment content put in JSON
if (trackData[sNum].codec == THEORA){
@ -108,6 +109,7 @@ namespace Converters{
}
case 1: //comment header
std::cerr << "Theora comment header found" << std::endl;
DTSCHeader["tracks"][trackData[sNum].name]["CommentHeader"] = std::string(oggPage.getFullPayload()+offset, (*it));
break;
case 2:{ //setup header, also the point to start writing the header
DTSCHeader["tracks"][trackData[sNum].name]["codec"] = "theora";
@ -132,6 +134,10 @@ namespace Converters{
DTSCHeader["tracks"][trackData[sNum].name]["IDHeader"] = std::string(oggPage.getFullPayload()+offset, (*it));
break;
}
case 3:{
DTSCHeader["tracks"][trackData[sNum].name]["CommentHeader"] = std::string(oggPage.getFullPayload()+offset, (*it));
break;
}
case 5:{
std::cerr << "Vorbis init header" << std::endl;
DTSCHeader["tracks"][trackData[sNum].name]["codec"] = "vorbis";