mistserver/src/converters/dtsc2ogg.cpp
2013-09-10 15:28:55 +02:00

108 lines
4 KiB
C++

#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;
//std::map <long long unsigned int, unsigned int> DTSCID2seqNum;
OGG::headerPages oggMeta;
//Creating ID headers for theora and vorbis
oggMeta.readDTSCHeader(DTSCFile.getMeta());
std::cout << oggMeta.parsedPages;
//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();
bool OggEOS = false;
bool OggCont = false;
bool IDChange = false;
bool GranChange = false;
std::string pageBuffer;
while(DTSCFile.getJSON()){
if(DTSCFile.getJSON()["trackid"].asInt()!=prevID || DTSCFile.getJSON()["granule"].asInt()!=prevGran || DTSCFile.getJSON()["granule"].asInt() == -1){
curOggPage.clear();
curOggPage.setVersion();
if (OggCont){
curOggPage.setHeaderType(1);//headertype 1 = Continue Page
}else if (OggEOS){
curOggPage.setHeaderType(4);//headertype 4 = end of stream
}else{
curOggPage.setHeaderType(0);//headertype 0 = normal
}
curOggPage.setGranulePosition(prevGran);
curOggPage.setBitstreamSerialNumber(oggMeta.DTSCID2OGGSerial[prevID]);
curOggPage.setPageSequenceNumber(oggMeta.DTSCID2seqNum[prevID]++);
if(!curOggPage.setSegmentTable(curSegTable)){
std::cerr << "Troubling segTable:";
for (unsigned int i = 0; i<curSegTable.size(); i++){
std::cerr << " " << curSegTable[i];
}
std::cerr << std::endl;
}
curOggPage.setPayload((char*)pageBuffer.c_str(), pageBuffer.size());
curOggPage.setCRCChecksum(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();
if (DTSCFile.getJSON()["OggEOS"]){
OggEOS=true;
}else{
OggEOS=false;
}
if (DTSCFile.getJSON()["OggCont"]){
OggCont=true;
}else{
OggCont=false;
}
DTSCFile.parseNext();
}
//quick copy-paste fix to output the last ogg page
curOggPage.clear();
curOggPage.setVersion();
curOggPage.setHeaderType(4);//headertype 4 = end of stream
curOggPage.setGranulePosition(prevGran);
curOggPage.setBitstreamSerialNumber(oggMeta.DTSCID2OGGSerial[prevID]);
curOggPage.setPageSequenceNumber(oggMeta.DTSCID2seqNum[prevID]++);
curOggPage.setSegmentTable(curSegTable);
curOggPage.setPayload((char*)pageBuffer.c_str(), pageBuffer.size());
curOggPage.setCRCChecksum(curOggPage.calcChecksum());
std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize());
pageBuffer = "";
curSegTable.clear();
//write one pagebuffer as Ogg page
//end quick fix
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);
}