Almost working Ogg, already playing.

This commit is contained in:
Oswald Auguste de Bruin 2013-08-06 11:15:17 +02:00 committed by Thulinma
parent dfee0feb8b
commit 636ec3b39c
2 changed files with 30 additions and 12 deletions

View file

@ -9,8 +9,6 @@
#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"));
@ -20,7 +18,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; std::map <long long unsigned int, unsigned int> DTSCID2seqNum;
//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();
@ -29,12 +27,13 @@ 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(seqNum++); DTSCID2seqNum[it->second["trackid"].asInt()] = 0;
curOggPage.setPageSequenceNumber(DTSCID2seqNum[it->second["trackid"].asInt()]++);
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);
curOggPage.setPayload((char*)it->second["IDHeader"].asString().c_str(), it->second["IDHeader"].asString().size()); curOggPage.setPayload((char*)it->second["IDHeader"].asString().c_str(), it->second["IDHeader"].asString().size());
curOggPage.calcChecksum(); curOggPage.setCRCChecksum(curOggPage.calcChecksum());
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
@ -46,15 +45,16 @@ namespace Converters{
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(seqNum++); curOggPage.setPageSequenceNumber(DTSCID2seqNum[it->second["trackid"].asInt()]++);
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());
curOggPage.setSegmentTable(curSegTable); curOggPage.setSegmentTable(curSegTable);
std::string fullHeader = it->second["CommentHeader"].asString() + it->second["init"].asString(); std::string fullHeader = it->second["CommentHeader"].asString() + it->second["init"].asString();
std::cerr << fullHeader.size() << std::endl; curOggPage.setPayload((char*)fullHeader.c_str(),fullHeader.size());
std::cerr << "setPayload: " << curOggPage.setPayload((char*)fullHeader.c_str(), fullHeader.size()) << std::endl; //std::cerr << fullHeader.size() << std::endl;
curOggPage.calcChecksum(); //std::cerr << "setPayload: " << curOggPage.setPayload((char*)fullHeader.c_str(), fullHeader.size()) << std::endl;
curOggPage.setCRCChecksum(curOggPage.calcChecksum());
std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize()); std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize());
} }
//create DTSC in OGG pages //create DTSC in OGG pages
@ -62,28 +62,41 @@ namespace Converters{
curSegTable.clear(); curSegTable.clear();
long long int prevID = DTSCFile.getJSON()["trackid"].asInt(); long long int prevID = DTSCFile.getJSON()["trackid"].asInt();
long long int prevGran = DTSCFile.getJSON()["granule"].asInt(); long long int prevGran = DTSCFile.getJSON()["granule"].asInt();
bool OggEOS = false;
//bool IDChange = false;
//bool GranChange = false;
std::string pageBuffer; std::string pageBuffer;
while(DTSCFile.getJSON()){ while(DTSCFile.getJSON()){
if(DTSCFile.getJSON()["trackid"].asInt()!=prevID || DTSCFile.getJSON()["granule"].asInt()!=prevGran){ if(DTSCFile.getJSON()["trackid"].asInt()!=prevID || DTSCFile.getJSON()["granule"].asInt()!=prevGran){
curOggPage.clear(); curOggPage.clear();
curOggPage.setVersion(); curOggPage.setVersion();
curOggPage.setHeaderType(0);//headertype 0 = normal if (OggEOS){
curOggPage.setHeaderType(4);//headertype 4 = end of stream
}else{
curOggPage.setHeaderType(0);//headertype 0 = normal
}
curOggPage.setGranulePosition(prevGran); curOggPage.setGranulePosition(prevGran);
curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[prevID]); curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[prevID]);
curOggPage.setPageSequenceNumber(seqNum++); curOggPage.setPageSequenceNumber(DTSCID2seqNum[prevID]++);
curOggPage.setSegmentTable(curSegTable); curOggPage.setSegmentTable(curSegTable);
curOggPage.setPayload((char*)pageBuffer.c_str(), pageBuffer.size()); curOggPage.setPayload((char*)pageBuffer.c_str(), pageBuffer.size());
curOggPage.calcChecksum(); curOggPage.setCRCChecksum(curOggPage.calcChecksum());
std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize()); std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize());
pageBuffer = ""; pageBuffer = "";
curSegTable.clear(); curSegTable.clear();
//write one pagebuffer as Ogg page //write one pagebuffer as Ogg page
} }
pageBuffer += DTSCFile.getJSON()["data"].asString(); pageBuffer += DTSCFile.getJSON()["data"].asString();
curSegTable.push_back(DTSCFile.getJSON()["data"].asString().size()); curSegTable.push_back(DTSCFile.getJSON()["data"].asString().size());
prevID = DTSCFile.getJSON()["trackid"].asInt(); prevID = DTSCFile.getJSON()["trackid"].asInt();
prevGran = DTSCFile.getJSON()["granule"].asInt(); prevGran = DTSCFile.getJSON()["granule"].asInt();
if (DTSCFile.getJSON()["OggEOS"]){
OggEOS=true;
}else{
OggEOS=false;
}
DTSCFile.parseNext(); DTSCFile.parseNext();
} }
return 0; return 0;

View file

@ -89,6 +89,11 @@ namespace Converters{
DTSCOut["interframe"] = 1; DTSCOut["interframe"] = 1;
} }
} }
// Ending packet
if (oggPage.typeEOS()){//ending page
DTSCOut["OggEOS"] = 1;
}
std::cout << DTSCOut.toNetPacked(); std::cout << DTSCOut.toNetPacked();
}else{ }else{
//switch on codec //switch on codec