DTSC 2 OGG outputs valid headers
This commit is contained in:
parent
4b6c6aacea
commit
be81fb6262
2 changed files with 72 additions and 0 deletions
66
src/converters/dtsc2ogg.cpp
Normal file
66
src/converters/dtsc2ogg.cpp
Normal 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);
|
||||
}
|
|
@ -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";
|
||||
|
|
Loading…
Add table
Reference in a new issue