Ogg2 dtsc start on DTSC packets

This commit is contained in:
Oswald de Bruin 2013-06-14 16:31:45 +02:00 committed by Thulinma
parent 03d4d58cbe
commit 867bb45760

View file

@ -3,17 +3,22 @@
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <string.h> #include <string.h>
#include <vector> #include <map>
#include <mist/dtsc.h> #include <mist/dtsc.h>
#include <mist/ogg.h> #include <mist/ogg.h>
#include <mist/theora.h>
#include <mist/config.h> #include <mist/config.h>
#include <mist/json.h> #include <mist/json.h>
namespace Converters{ namespace Converters{
enum codecType {THEORA, VORBIS};
struct oggTrack{ struct oggTrack{
long unsigned int serialNumber; //serial number in read OGG file //long unsigned int serialNumber; //serial number in read OGG file
long unsigned int lastSequenceNumber;//error checking for lost pages in OGG long unsigned int lastSequenceNumber;//error checking for lost pages in OGG
long long int dtscID; //track ID for in the written DTSC file codecType codec;
long long unsigned int dtscID;
long long signed int fpks; //frames per kilo second
DTSC::datatype type; //type of stream in DTSC DTSC::datatype type; //type of stream in DTSC
}; };
@ -25,59 +30,116 @@ namespace Converters{
//while stream busy //while stream busy
JSON::Value DTSCOut; JSON::Value DTSCOut;
std::vector<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()){
for (unsigned int i = 0; (i < 1024) && (std::cin.good()); i++){ for (unsigned int i = 0; (i < 1024) && (std::cin.good()); i++){//buffering
oggBuffer += std::cin.get(); oggBuffer += std::cin.get();
} }
//while OGG::page check functie{ read //while OGG::page check functie{ read
while (oggPage.read(oggBuffer)){//reading ogg to ogg::page while (oggPage.read(oggBuffer)){//reading ogg to ogg::page
//on succes, we handle one page //on succes, we handle one page
long unsigned int sNum = oggPage.getBitstreamSerialNumber();
if (oggPage.typeBOS()){//defines a new track if (oggPage.typeBOS()){//defines a new track
//std::cout << oggPage.getFullPayload() << std::endl; std::cerr << "Begin "<< sNum << std::endl;
oggTrack temp; trackData[sNum].lastSequenceNumber = oggPage.getPageSequenceNumber();
temp.serialNumber = oggPage.getBitstreamSerialNumber(); trackData[sNum].dtscID = lastTrackID++;
std::cerr << "Begin "<< temp.serialNumber << std::endl; if (memcmp(oggPage.getFullPayload()+1, "theora", 6) == 0){
temp.lastSequenceNumber = oggPage.getPageSequenceNumber(); trackData[sNum].type = DTSC::VIDEO;
temp.dtscID = lastTrackID; trackData[sNum].codec = THEORA;
lastTrackID++; std::cerr << "Snr " << sNum << "=theora" << std::endl;
if (memcmp(oggPage.getFullPayload()+1, "theora", 6)){ }else if(memcmp(oggPage.getFullPayload()+1, "vorbis", 6) == 0){
temp.type = DTSC::VIDEO; std::cerr << "Snr " << sNum << "=vorbis" << std::endl;
std::cerr << "Snr " << temp.serialNumber << "=theora" << std::endl; trackData[sNum].codec = VORBIS;
}else if(memcmp(oggPage.getFullPayload()+2, "vorbis", 6)){ trackData[sNum].type = DTSC::AUDIO;
std::cerr << "Snr " << temp.serialNumber << "=vorbis" << std::endl;
temp.type = DTSC::AUDIO;
}else{ }else{
std::cerr << "Unknown Codec!" << std::endl; std::cerr << "Unknown Codec!" << std::endl;
} }
trackData.insert(trackData.end(), temp); }
}else if (oggPage.typeEOS()){//ending page //if Serial number is available in mapping
std::cerr << std::hex << oggPage.getGranulePosition() <<std::dec << "ending" << std::endl; if(trackData.find(sNum)!=trackData.end()){
}else{//normal page //switch on codec
std::cerr << std::hex << oggPage.getGranulePosition() <<std::dec<< std::endl; //oggTrack curTrack = trackData[oggPage.getBitstreamSerialNumber()];
switch(trackData[sNum].codec){
case THEORA:{
//std::cerr << "Theora" << std::endl;
char* curSeg;//current segment
curSeg = oggPage.getFullPayload();//setting pointer to first segment
std::deque<unsigned int> segTable;//
//oggPage.getSegmentTableDeque().swap(segTable);
segTable = oggPage.getSegmentTableDeque();
unsigned int curPlace = 0;
unsigned int curLength;
theora::header tHead;
while (!segTable.empty()) {
curLength = segTable.front();
segTable.pop_front();
//std::cerr << curLength << ", " << std::hex << curSeg << std::dec;
if(tHead.read(curSeg+curPlace, curLength)){//if the current segment is a header part
std::cerr << "Theora Header Segment " << tHead.getHeaderType() << std::endl;
//fillDTSC header
switch(tHead.getHeaderType()){
case 0: //identification header
trackData[sNum].fpks = ((long long int)tHead.getFRN() * 1000) / tHead.getFRD();
std::cerr << trackData[sNum].fpks << std::endl;
break;
case 1: //comment header
break;
case 2: //setup header
break;
}
}else{//if the current segment is a movie part
//std::cerr << "Theora Movie" << std::endl;
//output DTSC packet
DTSCOut.null();//clearing DTSC buffer
DTSCOut["trackid"] = (long long)trackData[sNum].dtscID;
DTSCOut["time"] = 0; //timestamp
DTSCOut["data"] = std::string(curSeg + curPlace, curLength); //segment content put in JSON
//DTSCOut["keyframe"] = "x"; //Aanmaken als eerste segment = keyframe
//else DTSCOut["interframe"] = "x";
std::cout << DTSCOut.toString();
}
curPlace += curLength;
}
break;
}
case VORBIS:
//std::cerr << oggPage.getFullPayload() << " ";
//std::cerr << "Vorbis Page" << std::endl;
break;
default:
std::cerr << "Can not handle this codec" << std::endl;
break;
}
/* /*
//ogg page 2 DTSC packet //ogg page 2 DTSC packet
//for elk segment //for every segment
DTSCOut.null();//clearing DTSC buffer DTSCOut.null();//clearing DTSC buffer
DTSCOut["trackid"] = 1; //video DTSCOut["trackid"] = 1; //video
DTSCOut["trackid"] = 2; //audio DTSCOut["trackid"] = 2; //audio
DTSCOut["time"] = 0; //timestamp DTSCOut["time"] = 0; //timestamp
DTSCOut["data"] = 0; //segment inhoud DTSCOut["data"] = 0; //segment inhoud
DTSCOut["keyframe"] = "x"; //Aanmaken als eerste segment = keyframe DTSCOut["keyframe"] = "x"; //Aanmaken als eerste segment = keyframe
else DTSCOut["interframe"] = "x";
//std::cout << "inner" << std::endl; //std::cout << "inner" << std::endl;
*/ */
}else{
std::cerr <<"Error! " << oggPage.getBitstreamSerialNumber() << "unknown bitstream serial number" << std::endl;
}
if (oggPage.typeEOS()){//ending page
std::cerr << oggPage.getBitstreamSerialNumber() << " ending" << std::endl;
//remove from trackdata
} }
} }
//std::cout << "outer" << std::endl;
} }
return 0; return 0;
} }
} }
int main(int argc, char ** argv){ int main(int argc, char ** argv){
Util::Config conf = Util::Config(argv[0], PACKAGE_VERSION); //Util::Config conf = Util::Config(argv[0], PACKAGE_VERSION);
conf.parseArgs(argc, argv); //conf.parseArgs(argc, argv);
return Converters::OGG2DTSC(); return Converters::OGG2DTSC();
} }