Ogg conversion now gives sensible output
This commit is contained in:
parent
867bb45760
commit
ef98b5c284
1 changed files with 31 additions and 7 deletions
|
@ -2,7 +2,8 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string.h>
|
#include <sstream>
|
||||||
|
//#include <string.h>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <mist/dtsc.h>
|
#include <mist/dtsc.h>
|
||||||
#include <mist/ogg.h>
|
#include <mist/ogg.h>
|
||||||
|
@ -19,6 +20,10 @@ namespace Converters{
|
||||||
codecType codec;
|
codecType codec;
|
||||||
long long unsigned int dtscID;
|
long long unsigned int dtscID;
|
||||||
long long signed int fpks; //frames per kilo second
|
long long signed int fpks; //frames per kilo second
|
||||||
|
char KFGShift;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int bps;
|
||||||
DTSC::datatype type; //type of stream in DTSC
|
DTSC::datatype type; //type of stream in DTSC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -30,6 +35,9 @@ namespace Converters{
|
||||||
|
|
||||||
//while stream busy
|
//while stream busy
|
||||||
JSON::Value DTSCOut;
|
JSON::Value DTSCOut;
|
||||||
|
JSON::Value DTSCHeader;
|
||||||
|
DTSCHeader.null();
|
||||||
|
DTSCHeader["moreheader"] = 0ll;
|
||||||
std::map<long unsigned int, oggTrack> trackData;
|
std::map<long unsigned int, oggTrack> trackData;
|
||||||
long long int lastTrackID = 1;
|
long long int lastTrackID = 1;
|
||||||
while (std::cin.good()){
|
while (std::cin.good()){
|
||||||
|
@ -82,11 +90,18 @@ namespace Converters{
|
||||||
switch(tHead.getHeaderType()){
|
switch(tHead.getHeaderType()){
|
||||||
case 0: //identification header
|
case 0: //identification header
|
||||||
trackData[sNum].fpks = ((long long int)tHead.getFRN() * 1000) / tHead.getFRD();
|
trackData[sNum].fpks = ((long long int)tHead.getFRN() * 1000) / tHead.getFRD();
|
||||||
std::cerr << trackData[sNum].fpks << std::endl;
|
trackData[sNum].KFGShift = tHead.getKFGShift();
|
||||||
|
//std::cerr << trackData[sNum].fpks << std::endl;
|
||||||
break;
|
break;
|
||||||
case 1: //comment header
|
case 1: //comment header
|
||||||
break;
|
break;
|
||||||
case 2: //setup header
|
case 2: //setup header, also the point to start writing the header
|
||||||
|
std::stringstream tID;
|
||||||
|
tID << "track" << trackData[sNum].dtscID;
|
||||||
|
DTSCHeader["tracks"][tID.str()]["codec"] = "THEORA";
|
||||||
|
DTSCHeader["tracks"][tID.str()]["fpks"] = (long long)trackData[sNum].fpks;
|
||||||
|
DTSCHeader["tracks"][tID.str()]["trackid"] = (long long)trackData[sNum].dtscID;
|
||||||
|
std::cout << DTSCHeader.toNetPacked();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,11 +110,20 @@ namespace Converters{
|
||||||
//output DTSC packet
|
//output DTSC packet
|
||||||
DTSCOut.null();//clearing DTSC buffer
|
DTSCOut.null();//clearing DTSC buffer
|
||||||
DTSCOut["trackid"] = (long long)trackData[sNum].dtscID;
|
DTSCOut["trackid"] = (long long)trackData[sNum].dtscID;
|
||||||
DTSCOut["time"] = 0; //timestamp
|
long long unsigned int temp = oggPage.getGranulePosition();
|
||||||
|
//std::cerr << std::hex << temp << std::dec << " " << (temp >> trackData[sNum].KFGShift) << " " << (temp & (trackData[sNum].KFGShift * 2 -1));
|
||||||
|
//std::cerr << " " << (unsigned int)trackData[sNum].KFGShift << std::endl;
|
||||||
|
DTSCOut["time"] = (long long)(((temp >> trackData[sNum].KFGShift) + (temp & (trackData[sNum].KFGShift * 2 -1))) * 1000000 / trackData[sNum].fpks);
|
||||||
|
//std::cerr << DTSCOut["time"].asInt() << std::endl;
|
||||||
|
//timestamp calculated by frames * FPS. Amount of frames is calculated by:
|
||||||
|
// granule position using keyframe (bitshift) and distance from keyframe (mask)
|
||||||
DTSCOut["data"] = std::string(curSeg + curPlace, curLength); //segment content put in JSON
|
DTSCOut["data"] = std::string(curSeg + curPlace, curLength); //segment content put in JSON
|
||||||
//DTSCOut["keyframe"] = "x"; //Aanmaken als eerste segment = keyframe
|
if ((temp & (trackData[sNum].KFGShift * 2 -1)) == 0){ //granule mask equals zero when on keyframe
|
||||||
//else DTSCOut["interframe"] = "x";
|
DTSCOut["keyframe"] = 1;
|
||||||
std::cout << DTSCOut.toString();
|
}else{
|
||||||
|
DTSCOut["interframe"] = 1;
|
||||||
|
}
|
||||||
|
std::cout << DTSCOut.toNetPacked();
|
||||||
}
|
}
|
||||||
curPlace += curLength;
|
curPlace += curLength;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue