From 9812ab6f41319c9059d99834620ee204ec29d3ea Mon Sep 17 00:00:00 2001 From: Oswald Auguste de Bruin Date: Mon, 20 Jan 2014 10:49:50 +0100 Subject: [PATCH] String copies omitted --- src/connectors/conn_http_progressive_ogg.cpp | 13 +- src/converters/dtsc2ogg.cpp | 24 +-- src/converters/oggconv.cpp | 176 +++++++++---------- src/converters/oggconv.h | 2 +- 4 files changed, 104 insertions(+), 111 deletions(-) diff --git a/src/connectors/conn_http_progressive_ogg.cpp b/src/connectors/conn_http_progressive_ogg.cpp index 02033c99..9033db03 100644 --- a/src/connectors/conn_http_progressive_ogg.cpp +++ b/src/connectors/conn_http_progressive_ogg.cpp @@ -41,7 +41,6 @@ namespace Connector_HTTP { //OGG::Page curOggPage; OGG::converter oggConv; std::map > DTSCBuffer; - std::set sendReady; //std::map prevGran; std::vector curSegTable; long long int currID = 0; @@ -127,17 +126,13 @@ namespace Connector_HTTP { oggConv.readDTSCHeader(Strm.metadata); conn.SendNow((char*)oggConv.parsedPages.c_str(), oggConv.parsedPages.size()); progressive_has_sent_header = true; - //setting sendReady to not ready - sendReady.clear(); } //parse DTSC to Ogg here if (Strm.lastType() == DTSC::AUDIO || Strm.lastType() == DTSC::VIDEO){ - currID = Strm.getPacket()["trackid"].asInt(); - DTSCBuffer[currID].push_back(Strm.getPacket()); - std::string tmpString = oggConv.readDTSCVector(DTSCBuffer[currID]); - conn.SendNow((char*)tmpString.c_str(), tmpString.size()); - DTSCBuffer[currID].clear(); - sendReady.insert(currID); + std::string tmpString; + oggConv.readDTSCVector(Strm.getPacket(), tmpString); + conn.SendNow(tmpString); + } if (Strm.lastType() == DTSC::PAUSEMARK){ conn.close(); diff --git a/src/converters/dtsc2ogg.cpp b/src/converters/dtsc2ogg.cpp index 4bb1f263..5040ad99 100644 --- a/src/converters/dtsc2ogg.cpp +++ b/src/converters/dtsc2ogg.cpp @@ -33,21 +33,23 @@ namespace Converters{ while(DTSCFile.getJSON()){ - currID = DTSCFile.getJSON()["trackid"].asInt(); - if (!DTSCBuffer[currID].empty()){ - std::cout << oggMeta.readDTSCVector(DTSCBuffer[currID]); - DTSCBuffer[currID].clear(); - } - DTSCBuffer[currID].push_back(DTSCFile.getJSON()); + //currID = DTSCFile.getJSON()["trackid"].asInt(); + //if (!DTSCBuffer[currID].empty()){ + std::string tmpString; + oggMeta.readDTSCVector(DTSCFile.getJSON(), tmpString); + std::cout << tmpString; + //DTSCBuffer[currID].clear(); + //} + //DTSCBuffer[currID].push_back(DTSCFile.getJSON()); DTSCFile.parseNext(); } //outputting end of stream pages - for (std::map< long long int, std::vector >::iterator it = DTSCBuffer.begin(); it != DTSCBuffer.end(); it++){ - if (!DTSCBuffer[it->first].empty() && DTSCBuffer[it->first][0]["data"].asString() != ""){ - std::cout << oggMeta.readDTSCVector(DTSCBuffer[it->first]); - } - } + //for (std::map< long long int, std::vector >::iterator it = DTSCBuffer.begin(); it != DTSCBuffer.end(); it++){ + //if (!DTSCBuffer[it->first].empty() && DTSCBuffer[it->first][0]["data"].asString() != ""){ + //std::cout << oggMeta.readDTSCVector(DTSCBuffer[it->first]); + //} + //} return 0; } } diff --git a/src/converters/oggconv.cpp b/src/converters/oggconv.cpp index 32b56813..40d8daea 100644 --- a/src/converters/oggconv.cpp +++ b/src/converters/oggconv.cpp @@ -80,105 +80,102 @@ namespace OGG{ } } - std::string converter::readDTSCVector(std::vector DTSCVec){ + void converter::readDTSCVector(JSON::Value & DTSCPart, std::string & pageBuffer){ Page retVal; int typeFlag = 0;//flag to remember if the page has a continued segment - std::string pageBuffer = ""; - long long int DTSCID = DTSCVec[0]["trackid"].asInt(); + long long int DTSCID = DTSCPart["trackid"].asInt(); std::vector curSegTable; std::string dataBuffer; long long unsigned int lastGran = 0; - for (unsigned int i = 0; i < DTSCVec.size(); i++){ - OGG::Page tempPage; - tempPage.setSegmentTable(curSegTable); - if (DTSCVec[i]["data"].asString().size() >= (255-tempPage.getPageSegments())*255u){//if segment is too big - //Put page in Buffer and start next page - if (!curSegTable.empty()){ - //output page - retVal.clear(); - retVal.setVersion(); - retVal.setHeaderType(typeFlag);//headertype 0 = normal - retVal.setGranulePosition(lastGran); - retVal.setBitstreamSerialNumber(trackInf[DTSCID].OGGSerial); - retVal.setPageSequenceNumber(trackInf[DTSCID].seqNum); - retVal.setSegmentTable(curSegTable); - retVal.setPayload((char*)dataBuffer.c_str(), dataBuffer.size()); - retVal.setCRCChecksum(retVal.calcChecksum()); - trackInf[DTSCID].seqNum++; - pageBuffer += std::string((char*)retVal.getPage(), retVal.getPageSize()); - - curSegTable.clear(); - dataBuffer = ""; - } - std::string remainingData = DTSCVec[i]["data"].asString(); - typeFlag = 0; - while (remainingData.size() > 255*255){ - //output part of the segment - //granule -1 - curSegTable.clear(); - curSegTable.push_back(255*255); - retVal.clear(); - retVal.setVersion(); - retVal.setHeaderType(typeFlag);//normal Page - retVal.setGranulePosition(-1); - retVal.setBitstreamSerialNumber(trackInf[DTSCID].OGGSerial); - retVal.setPageSequenceNumber(trackInf[DTSCID].seqNum); - retVal.setSegmentTable(curSegTable); - retVal.setPayload((char*)remainingData.substr(0,255*255).c_str(), 255*255); - retVal.setCRCChecksum(retVal.calcChecksum()); - trackInf[DTSCID].seqNum++; - pageBuffer += std::string((char*)retVal.getPage(), retVal.getPageSize()); - remainingData = remainingData.substr(255*255); - typeFlag = 1;//1 = continued page - } - //output last remaining data + //for (unsigned int i = 0; i < DTSCVec.size(); i++){ + OGG::Page tempPage; + tempPage.setSegmentTable(curSegTable); + if (DTSCPart["data"].asString().size() >= (255-tempPage.getPageSegments())*255u){//if segment is too big + //Put page in Buffer and start next page + if (!curSegTable.empty()){ + //output page + retVal.clear(); + retVal.setVersion(); + retVal.setHeaderType(typeFlag);//headertype 0 = normal + retVal.setGranulePosition(lastGran); + retVal.setBitstreamSerialNumber(trackInf[DTSCID].OGGSerial); + retVal.setPageSequenceNumber(trackInf[DTSCID].seqNum); + retVal.setSegmentTable(curSegTable); + retVal.setPayload((char*)dataBuffer.c_str(), dataBuffer.size()); + retVal.setCRCChecksum(retVal.calcChecksum()); + trackInf[DTSCID].seqNum++; + pageBuffer += std::string((char*)retVal.getPage(), retVal.getPageSize()); + curSegTable.clear(); - curSegTable.push_back(remainingData.size()); - dataBuffer += remainingData; - }else{//build data for page - curSegTable.push_back(DTSCVec[i]["data"].asString().size()); - dataBuffer += DTSCVec[i]["data"].asString(); + dataBuffer = ""; } - //lastGran = calcGranule(DTSCID, DTSCVec[i]["keyframe"].asBool()); - //calculating granule position - if (trackInf[DTSCID].codec == "theora"){ - if (DTSCVec[i]["keyframe"].asBool()){ - trackInf[DTSCID].lastKeyFrame += trackInf[DTSCID].sinceKeyFrame + 1; - trackInf[DTSCID].sinceKeyFrame = 0; - }else{ - trackInf[DTSCID].sinceKeyFrame ++; - } - lastGran = (trackInf[DTSCID].lastKeyFrame << trackInf[DTSCID].significantValue) + trackInf[DTSCID].sinceKeyFrame; - } else if (trackInf[DTSCID].codec == "vorbis"){ - //decode DTSCVec[i]["data"].asString() for mode index - Utils::bitstreamLSBF packet; - packet.append(DTSCVec[i]["data"].asString()); - //calculate amount of samples associated with that block (from ID header) - //check mode block in deque for index - int curPCMSamples = 0; - if (packet.get(1) == 0){ - int tempModes = vorbis::ilog(trackInf[DTSCID].vorbisModes.size()-1); - int tempPacket = packet.get(tempModes); - int curBlockFlag = trackInf[DTSCID].vorbisModes[tempPacket].blockFlag; - curPCMSamples = (1 << trackInf[DTSCID].blockSize[curBlockFlag]); - if (trackInf[DTSCID].prevBlockFlag!= -1){ - if (curBlockFlag == trackInf[DTSCID].prevBlockFlag){ - curPCMSamples /= 2; - }else{ - curPCMSamples -= (1 << trackInf[DTSCID].blockSize[0]) / 4 + (1 << trackInf[DTSCID].blockSize[1]) / 4; - } - } - trackInf[DTSCID].sinceKeyFrame = (1 << trackInf[DTSCID].blockSize[curBlockFlag]); - trackInf[DTSCID].prevBlockFlag = curBlockFlag; - }else{ - std::cerr << "Error, Vorbis packet type !=0" << std::endl; - } - //add to granule position - trackInf[DTSCID].lastKeyFrame += curPCMSamples; - lastGran = trackInf[DTSCID].lastKeyFrame; + std::string remainingData = DTSCPart["data"].asString(); + typeFlag = 0; + while (remainingData.size() > 255*255){ + //output part of the segment + //granule -1 + curSegTable.clear(); + curSegTable.push_back(255*255); + retVal.clear(); + retVal.setVersion(); + retVal.setHeaderType(typeFlag);//normal Page + retVal.setGranulePosition(-1); + retVal.setBitstreamSerialNumber(trackInf[DTSCID].OGGSerial); + retVal.setPageSequenceNumber(trackInf[DTSCID].seqNum); + retVal.setSegmentTable(curSegTable); + retVal.setPayload((char*)remainingData.substr(0,255*255).c_str(), 255*255); + retVal.setCRCChecksum(retVal.calcChecksum()); + trackInf[DTSCID].seqNum++; + pageBuffer += std::string((char*)retVal.getPage(), retVal.getPageSize()); + remainingData = remainingData.substr(255*255); + typeFlag = 1;//1 = continued page } + //output last remaining data + curSegTable.clear(); + curSegTable.push_back(remainingData.size()); + dataBuffer += remainingData; + }else{//build data for page + curSegTable.push_back(DTSCPart["data"].asString().size()); + dataBuffer += DTSCPart["data"].asString(); } + //calculating granule position + if (trackInf[DTSCID].codec == "theora"){ + if (DTSCPart["keyframe"].asBool()){ + trackInf[DTSCID].lastKeyFrame += trackInf[DTSCID].sinceKeyFrame + 1; + trackInf[DTSCID].sinceKeyFrame = 0; + }else{ + trackInf[DTSCID].sinceKeyFrame ++; + } + lastGran = (trackInf[DTSCID].lastKeyFrame << trackInf[DTSCID].significantValue) + trackInf[DTSCID].sinceKeyFrame; + } else if (trackInf[DTSCID].codec == "vorbis"){ + Utils::bitstreamLSBF packet; + packet.append(DTSCPart["data"].asString()); + //calculate amount of samples associated with that block (from ID header) + //check mode block in deque for index + int curPCMSamples = 0; + if (packet.get(1) == 0){ + int tempModes = vorbis::ilog(trackInf[DTSCID].vorbisModes.size()-1); + int tempPacket = packet.get(tempModes); + int curBlockFlag = trackInf[DTSCID].vorbisModes[tempPacket].blockFlag; + curPCMSamples = (1 << trackInf[DTSCID].blockSize[curBlockFlag]); + if (trackInf[DTSCID].prevBlockFlag!= -1){ + if (curBlockFlag == trackInf[DTSCID].prevBlockFlag){ + curPCMSamples /= 2; + }else{ + curPCMSamples -= (1 << trackInf[DTSCID].blockSize[0]) / 4 + (1 << trackInf[DTSCID].blockSize[1]) / 4; + } + } + trackInf[DTSCID].sinceKeyFrame = (1 << trackInf[DTSCID].blockSize[curBlockFlag]); + trackInf[DTSCID].prevBlockFlag = curBlockFlag; + }else{ + std::cerr << "Error, Vorbis packet type !=0" << std::endl; + } + //add to granule position + trackInf[DTSCID].lastKeyFrame += curPCMSamples; + lastGran = trackInf[DTSCID].lastKeyFrame; + } + //} //last parts of page put out if (!curSegTable.empty()){ retVal.clear(); @@ -193,6 +190,5 @@ namespace OGG{ trackInf[DTSCID].seqNum++; pageBuffer += std::string((char*)retVal.getPage(), retVal.getPageSize()); } - return pageBuffer; } } diff --git a/src/converters/oggconv.h b/src/converters/oggconv.h index ca9fa3d7..5d9aad8d 100644 --- a/src/converters/oggconv.h +++ b/src/converters/oggconv.h @@ -19,7 +19,7 @@ namespace OGG { class converter{ public: void readDTSCHeader(DTSC::Meta & meta); - std::string readDTSCVector(std::vector DTSCVec); + void readDTSCVector(JSON::Value & DTSCPart, std::string & pageBuffer); std::string parsedPages; private: std::map trackInf;