String copies omitted

This commit is contained in:
Oswald Auguste de Bruin 2014-01-20 10:49:50 +01:00
parent 6b78cad546
commit 9812ab6f41
4 changed files with 104 additions and 111 deletions

View file

@ -41,7 +41,6 @@ namespace Connector_HTTP {
//OGG::Page curOggPage; //OGG::Page curOggPage;
OGG::converter oggConv; OGG::converter oggConv;
std::map <long long unsigned int, std::vector<JSON::Value> > DTSCBuffer; std::map <long long unsigned int, std::vector<JSON::Value> > DTSCBuffer;
std::set <long long unsigned int> sendReady;
//std::map <long long unsigned int, long long unsigned int> prevGran; //std::map <long long unsigned int, long long unsigned int> prevGran;
std::vector<unsigned int> curSegTable; std::vector<unsigned int> curSegTable;
long long int currID = 0; long long int currID = 0;
@ -127,17 +126,13 @@ namespace Connector_HTTP {
oggConv.readDTSCHeader(Strm.metadata); oggConv.readDTSCHeader(Strm.metadata);
conn.SendNow((char*)oggConv.parsedPages.c_str(), oggConv.parsedPages.size()); conn.SendNow((char*)oggConv.parsedPages.c_str(), oggConv.parsedPages.size());
progressive_has_sent_header = true; progressive_has_sent_header = true;
//setting sendReady to not ready
sendReady.clear();
} }
//parse DTSC to Ogg here //parse DTSC to Ogg here
if (Strm.lastType() == DTSC::AUDIO || Strm.lastType() == DTSC::VIDEO){ if (Strm.lastType() == DTSC::AUDIO || Strm.lastType() == DTSC::VIDEO){
currID = Strm.getPacket()["trackid"].asInt(); std::string tmpString;
DTSCBuffer[currID].push_back(Strm.getPacket()); oggConv.readDTSCVector(Strm.getPacket(), tmpString);
std::string tmpString = oggConv.readDTSCVector(DTSCBuffer[currID]); conn.SendNow(tmpString);
conn.SendNow((char*)tmpString.c_str(), tmpString.size());
DTSCBuffer[currID].clear();
sendReady.insert(currID);
} }
if (Strm.lastType() == DTSC::PAUSEMARK){ if (Strm.lastType() == DTSC::PAUSEMARK){
conn.close(); conn.close();

View file

@ -33,21 +33,23 @@ namespace Converters{
while(DTSCFile.getJSON()){ while(DTSCFile.getJSON()){
currID = DTSCFile.getJSON()["trackid"].asInt(); //currID = DTSCFile.getJSON()["trackid"].asInt();
if (!DTSCBuffer[currID].empty()){ //if (!DTSCBuffer[currID].empty()){
std::cout << oggMeta.readDTSCVector(DTSCBuffer[currID]); std::string tmpString;
DTSCBuffer[currID].clear(); oggMeta.readDTSCVector(DTSCFile.getJSON(), tmpString);
} std::cout << tmpString;
DTSCBuffer[currID].push_back(DTSCFile.getJSON()); //DTSCBuffer[currID].clear();
//}
//DTSCBuffer[currID].push_back(DTSCFile.getJSON());
DTSCFile.parseNext(); DTSCFile.parseNext();
} }
//outputting end of stream pages //outputting end of stream pages
for (std::map< long long int, std::vector<JSON::Value> >::iterator it = DTSCBuffer.begin(); it != DTSCBuffer.end(); it++){ //for (std::map< long long int, std::vector<JSON::Value> >::iterator it = DTSCBuffer.begin(); it != DTSCBuffer.end(); it++){
if (!DTSCBuffer[it->first].empty() && DTSCBuffer[it->first][0]["data"].asString() != ""){ //if (!DTSCBuffer[it->first].empty() && DTSCBuffer[it->first][0]["data"].asString() != ""){
std::cout << oggMeta.readDTSCVector(DTSCBuffer[it->first]); //std::cout << oggMeta.readDTSCVector(DTSCBuffer[it->first]);
} //}
} //}
return 0; return 0;
} }
} }

View file

@ -80,105 +80,102 @@ namespace OGG{
} }
} }
std::string converter::readDTSCVector(std::vector <JSON::Value> DTSCVec){ void converter::readDTSCVector(JSON::Value & DTSCPart, std::string & pageBuffer){
Page retVal; Page retVal;
int typeFlag = 0;//flag to remember if the page has a continued segment int typeFlag = 0;//flag to remember if the page has a continued segment
std::string pageBuffer = ""; long long int DTSCID = DTSCPart["trackid"].asInt();
long long int DTSCID = DTSCVec[0]["trackid"].asInt();
std::vector<unsigned int> curSegTable; std::vector<unsigned int> curSegTable;
std::string dataBuffer; std::string dataBuffer;
long long unsigned int lastGran = 0; long long unsigned int lastGran = 0;
for (unsigned int i = 0; i < DTSCVec.size(); i++){ //for (unsigned int i = 0; i < DTSCVec.size(); i++){
OGG::Page tempPage; OGG::Page tempPage;
tempPage.setSegmentTable(curSegTable); tempPage.setSegmentTable(curSegTable);
if (DTSCVec[i]["data"].asString().size() >= (255-tempPage.getPageSegments())*255u){//if segment is too big if (DTSCPart["data"].asString().size() >= (255-tempPage.getPageSegments())*255u){//if segment is too big
//Put page in Buffer and start next page //Put page in Buffer and start next page
if (!curSegTable.empty()){ if (!curSegTable.empty()){
//output page //output page
retVal.clear(); retVal.clear();
retVal.setVersion(); retVal.setVersion();
retVal.setHeaderType(typeFlag);//headertype 0 = normal retVal.setHeaderType(typeFlag);//headertype 0 = normal
retVal.setGranulePosition(lastGran); retVal.setGranulePosition(lastGran);
retVal.setBitstreamSerialNumber(trackInf[DTSCID].OGGSerial); retVal.setBitstreamSerialNumber(trackInf[DTSCID].OGGSerial);
retVal.setPageSequenceNumber(trackInf[DTSCID].seqNum); retVal.setPageSequenceNumber(trackInf[DTSCID].seqNum);
retVal.setSegmentTable(curSegTable); retVal.setSegmentTable(curSegTable);
retVal.setPayload((char*)dataBuffer.c_str(), dataBuffer.size()); retVal.setPayload((char*)dataBuffer.c_str(), dataBuffer.size());
retVal.setCRCChecksum(retVal.calcChecksum()); retVal.setCRCChecksum(retVal.calcChecksum());
trackInf[DTSCID].seqNum++; trackInf[DTSCID].seqNum++;
pageBuffer += std::string((char*)retVal.getPage(), retVal.getPageSize()); 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
curSegTable.clear(); curSegTable.clear();
curSegTable.push_back(remainingData.size()); dataBuffer = "";
dataBuffer += remainingData;
}else{//build data for page
curSegTable.push_back(DTSCVec[i]["data"].asString().size());
dataBuffer += DTSCVec[i]["data"].asString();
} }
//lastGran = calcGranule(DTSCID, DTSCVec[i]["keyframe"].asBool()); std::string remainingData = DTSCPart["data"].asString();
//calculating granule position typeFlag = 0;
if (trackInf[DTSCID].codec == "theora"){ while (remainingData.size() > 255*255){
if (DTSCVec[i]["keyframe"].asBool()){ //output part of the segment
trackInf[DTSCID].lastKeyFrame += trackInf[DTSCID].sinceKeyFrame + 1; //granule -1
trackInf[DTSCID].sinceKeyFrame = 0; curSegTable.clear();
}else{ curSegTable.push_back(255*255);
trackInf[DTSCID].sinceKeyFrame ++; retVal.clear();
} retVal.setVersion();
lastGran = (trackInf[DTSCID].lastKeyFrame << trackInf[DTSCID].significantValue) + trackInf[DTSCID].sinceKeyFrame; retVal.setHeaderType(typeFlag);//normal Page
} else if (trackInf[DTSCID].codec == "vorbis"){ retVal.setGranulePosition(-1);
//decode DTSCVec[i]["data"].asString() for mode index retVal.setBitstreamSerialNumber(trackInf[DTSCID].OGGSerial);
Utils::bitstreamLSBF packet; retVal.setPageSequenceNumber(trackInf[DTSCID].seqNum);
packet.append(DTSCVec[i]["data"].asString()); retVal.setSegmentTable(curSegTable);
//calculate amount of samples associated with that block (from ID header) retVal.setPayload((char*)remainingData.substr(0,255*255).c_str(), 255*255);
//check mode block in deque for index retVal.setCRCChecksum(retVal.calcChecksum());
int curPCMSamples = 0; trackInf[DTSCID].seqNum++;
if (packet.get(1) == 0){ pageBuffer += std::string((char*)retVal.getPage(), retVal.getPageSize());
int tempModes = vorbis::ilog(trackInf[DTSCID].vorbisModes.size()-1); remainingData = remainingData.substr(255*255);
int tempPacket = packet.get(tempModes); typeFlag = 1;//1 = continued page
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;
} }
//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 //last parts of page put out
if (!curSegTable.empty()){ if (!curSegTable.empty()){
retVal.clear(); retVal.clear();
@ -193,6 +190,5 @@ namespace OGG{
trackInf[DTSCID].seqNum++; trackInf[DTSCID].seqNum++;
pageBuffer += std::string((char*)retVal.getPage(), retVal.getPageSize()); pageBuffer += std::string((char*)retVal.getPage(), retVal.getPageSize());
} }
return pageBuffer;
} }
} }

View file

@ -19,7 +19,7 @@ namespace OGG {
class converter{ class converter{
public: public:
void readDTSCHeader(DTSC::Meta & meta); void readDTSCHeader(DTSC::Meta & meta);
std::string readDTSCVector(std::vector <JSON::Value> DTSCVec); void readDTSCVector(JSON::Value & DTSCPart, std::string & pageBuffer);
std::string parsedPages; std::string parsedPages;
private: private:
std::map <long long unsigned int, trackStats> trackInf; std::map <long long unsigned int, trackStats> trackInf;