From 867bb457600a4497332ee42cb019916838151ccf Mon Sep 17 00:00:00 2001 From: Oswald de Bruin Date: Fri, 14 Jun 2013 16:31:45 +0200 Subject: [PATCH] Ogg2 dtsc start on DTSC packets --- src/converters/ogg2dtsc.cpp | 118 +++++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 28 deletions(-) diff --git a/src/converters/ogg2dtsc.cpp b/src/converters/ogg2dtsc.cpp index e6b300e2..3e4c320b 100644 --- a/src/converters/ogg2dtsc.cpp +++ b/src/converters/ogg2dtsc.cpp @@ -3,17 +3,22 @@ #include #include #include -#include +#include #include #include +#include #include #include namespace Converters{ + enum codecType {THEORA, VORBIS}; + 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 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 }; @@ -25,59 +30,116 @@ namespace Converters{ //while stream busy JSON::Value DTSCOut; - std::vector trackData; + std::map trackData; long long int lastTrackID = 1; 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(); } //while OGG::page check functie{ read while (oggPage.read(oggBuffer)){//reading ogg to ogg::page //on succes, we handle one page + long unsigned int sNum = oggPage.getBitstreamSerialNumber(); if (oggPage.typeBOS()){//defines a new track - //std::cout << oggPage.getFullPayload() << std::endl; - oggTrack temp; - temp.serialNumber = oggPage.getBitstreamSerialNumber(); - std::cerr << "Begin "<< temp.serialNumber << std::endl; - temp.lastSequenceNumber = oggPage.getPageSequenceNumber(); - temp.dtscID = lastTrackID; - lastTrackID++; - if (memcmp(oggPage.getFullPayload()+1, "theora", 6)){ - temp.type = DTSC::VIDEO; - std::cerr << "Snr " << temp.serialNumber << "=theora" << std::endl; - }else if(memcmp(oggPage.getFullPayload()+2, "vorbis", 6)){ - std::cerr << "Snr " << temp.serialNumber << "=vorbis" << std::endl; - temp.type = DTSC::AUDIO; + std::cerr << "Begin "<< sNum << std::endl; + trackData[sNum].lastSequenceNumber = oggPage.getPageSequenceNumber(); + trackData[sNum].dtscID = lastTrackID++; + if (memcmp(oggPage.getFullPayload()+1, "theora", 6) == 0){ + trackData[sNum].type = DTSC::VIDEO; + trackData[sNum].codec = THEORA; + std::cerr << "Snr " << sNum << "=theora" << std::endl; + }else if(memcmp(oggPage.getFullPayload()+1, "vorbis", 6) == 0){ + std::cerr << "Snr " << sNum << "=vorbis" << std::endl; + trackData[sNum].codec = VORBIS; + trackData[sNum].type = DTSC::AUDIO; }else{ std::cerr << "Unknown Codec!" << std::endl; } - trackData.insert(trackData.end(), temp); - }else if (oggPage.typeEOS()){//ending page - std::cerr << std::hex << oggPage.getGranulePosition() < 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 - //for elk segment + //for every segment DTSCOut.null();//clearing DTSC buffer DTSCOut["trackid"] = 1; //video DTSCOut["trackid"] = 2; //audio DTSCOut["time"] = 0; //timestamp DTSCOut["data"] = 0; //segment inhoud DTSCOut["keyframe"] = "x"; //Aanmaken als eerste segment = keyframe + else DTSCOut["interframe"] = "x"; //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; } } int main(int argc, char ** argv){ - Util::Config conf = Util::Config(argv[0], PACKAGE_VERSION); - conf.parseArgs(argc, argv); + //Util::Config conf = Util::Config(argv[0], PACKAGE_VERSION); + //conf.parseArgs(argc, argv); return Converters::OGG2DTSC(); }