diff --git a/lib/ogg.cpp b/lib/ogg.cpp index 8064b59f..d15a7600 100644 --- a/lib/ogg.cpp +++ b/lib/ogg.cpp @@ -483,4 +483,54 @@ namespace OGG{ setPayload((char*)pageBuffer.c_str(), pageBuffer.size()); setCRCChecksum(calcChecksum()); } + + void headerPages::readDTSCHeader(JSON::Value meta){ + //pages.clear(); + parsedPages = ""; + Page curOggPage; + srand (Util::getMS());//randomising with milliseconds from boot + std::vector curSegTable; + DTSCID2OGGSerial.clear(); + DTSCID2seqNum.clear(); + //Creating ID headers for theora and vorbis + for ( JSON::ObjIter it = meta["tracks"].ObjBegin(); it != meta["tracks"].ObjEnd(); it ++) { + curOggPage.clear(); + curOggPage.setVersion(); + curOggPage.setHeaderType(2);//headertype 2 = Begin of Stream + curOggPage.setGranulePosition(0); + DTSCID2OGGSerial[it->second["trackid"].asInt()] = rand() % 0xFFFFFFFE +1; //initialising on a random not 0 number + curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[it->second["trackid"].asInt()]); + DTSCID2seqNum[it->second["trackid"].asInt()] = 0; + curOggPage.setPageSequenceNumber(DTSCID2seqNum[it->second["trackid"].asInt()]++); + curSegTable.clear(); + curSegTable.push_back(it->second["IDHeader"].asString().size()); + curOggPage.setSegmentTable(curSegTable); + curOggPage.setPayload((char*)it->second["IDHeader"].asString().c_str(), it->second["IDHeader"].asString().size()); + curOggPage.setCRCChecksum(curOggPage.calcChecksum()); + //std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize()); + //pages.push_back(curOggPage); + parsedPages += std::string(curOggPage.getPage(), curOggPage.getPageSize()); + } + //Creating remaining headers for theora and vorbis + //for tracks in header + //create standard page with comment (empty) en setup header(init) + for ( JSON::ObjIter it = meta["tracks"].ObjBegin(); it != meta["tracks"].ObjEnd(); it ++) { + curOggPage.clear(); + curOggPage.setVersion(); + curOggPage.setHeaderType(0);//headertype 0 = normal + curOggPage.setGranulePosition(0); + curOggPage.setBitstreamSerialNumber(DTSCID2OGGSerial[it->second["trackid"].asInt()]); + curOggPage.setPageSequenceNumber(DTSCID2seqNum[it->second["trackid"].asInt()]++); + curSegTable.clear(); + curSegTable.push_back(it->second["CommentHeader"].asString().size()); + curSegTable.push_back(it->second["init"].asString().size()); + curOggPage.setSegmentTable(curSegTable); + std::string fullHeader = it->second["CommentHeader"].asString() + it->second["init"].asString(); + curOggPage.setPayload((char*)fullHeader.c_str(),fullHeader.size()); + curOggPage.setCRCChecksum(curOggPage.calcChecksum()); + //std::cout << std::string(curOggPage.getPage(), curOggPage.getPageSize()); + //pages.push_back(curOggPage); + parsedPages += std::string(curOggPage.getPage(), curOggPage.getPageSize()); + } + } } diff --git a/lib/ogg.h b/lib/ogg.h index 4797c6f4..b0abcf20 100644 --- a/lib/ogg.h +++ b/lib/ogg.h @@ -54,4 +54,12 @@ namespace OGG{ bool checkDataSize(unsigned int size); std::string codec;//codec in the page }; + + class headerPages{ + public: + void readDTSCHeader(JSON::Value meta); + std::map DTSCID2OGGSerial; + std::map DTSCID2seqNum; + std::string parsedPages; + }; }