From be81fb6262ca7ad5a93e82cbefb2a160dbfa21ba Mon Sep 17 00:00:00 2001 From: Oswald Auguste de Bruin Date: Thu, 18 Jul 2013 16:00:12 +0200 Subject: [PATCH] DTSC 2 OGG outputs valid headers --- src/converters/dtsc2ogg.cpp | 66 +++++++++++++++++++++++++++++++++++++ src/converters/ogg2dtsc.cpp | 6 ++++ 2 files changed, 72 insertions(+) create mode 100644 src/converters/dtsc2ogg.cpp diff --git a/src/converters/dtsc2ogg.cpp b/src/converters/dtsc2ogg.cpp new file mode 100644 index 00000000..977365e8 --- /dev/null +++ b/src/converters/dtsc2ogg.cpp @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 curSegTable; + char* curNewPayload; + std::map 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); +} diff --git a/src/converters/ogg2dtsc.cpp b/src/converters/ogg2dtsc.cpp index 9aa0c443..d290a009 100644 --- a/src/converters/ogg2dtsc.cpp +++ b/src/converters/ogg2dtsc.cpp @@ -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";