Working ogg.

This commit is contained in:
Erik Zandvliet 2013-09-12 11:06:17 +02:00
parent c28e34e482
commit 1c37d06e16
2 changed files with 7 additions and 23 deletions

View file

@ -44,7 +44,6 @@ namespace Connector_HTTP {
std::vector<unsigned int> curSegTable; std::vector<unsigned int> curSegTable;
long long int currID = 0; long long int currID = 0;
long long int currGran = 0; long long int currGran = 0;
long long int prevID = 0;
long long int prevGran = 0; long long int prevGran = 0;
std::string sendBuffer; std::string sendBuffer;
bool OggEOS = false; bool OggEOS = false;
@ -169,17 +168,11 @@ namespace Connector_HTTP {
progressive_has_sent_header = true; progressive_has_sent_header = true;
//setting sendReady to not ready //setting sendReady to not ready
sendReady.clear(); sendReady.clear();
//prevID = Strm.getPacket()["trackid"].asInt();
//prevGran = Strm.getPacket()["granule"].asInt();
} }
//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(); currID = Strm.getPacket()["trackid"].asInt();
currGran = Strm.getPacket()["granule"].asInt(); currGran = Strm.getPacket()["granule"].asInt();
if (prevID == 0){
prevID == currID;
}
if (DTSCBuffer.count(currID) && !DTSCBuffer[currID].empty()){ if (DTSCBuffer.count(currID) && !DTSCBuffer[currID].empty()){
prevGran = DTSCBuffer[currID][0]["granule"].asInt(); prevGran = DTSCBuffer[currID][0]["granule"].asInt();
}else{ }else{
@ -187,19 +180,12 @@ namespace Connector_HTTP {
} }
if ((prevGran != 0 && (prevGran == -1 || currGran != prevGran)) ){ if ((prevGran != 0 && (prevGran == -1 || currGran != prevGran)) ){
curOggPage.readDTSCVector(DTSCBuffer[currID], oggMeta.DTSCID2OGGSerial[currID], oggMeta.DTSCID2seqNum[currID]); curOggPage.readDTSCVector(DTSCBuffer[currID], oggMeta.DTSCID2OGGSerial[currID], oggMeta.DTSCID2seqNum[currID]);
//conn.SendNow((char*)curOggPage.getPage(), curOggPage.getPageSize()); conn.SendNow((char*)curOggPage.getPage(), curOggPage.getPageSize());
sendBuffer += std::string((char*)curOggPage.getPage(), curOggPage.getPageSize());
DTSCBuffer[currID].clear(); DTSCBuffer[currID].clear();
sendReady.insert(currID); sendReady.insert(currID);
oggMeta.DTSCID2seqNum[currID]++; oggMeta.DTSCID2seqNum[currID]++;
} }
if (sendReady.size()==oggMeta.DTSCID2OGGSerial.size()){
conn.SendNow(sendBuffer);
sendBuffer = "";
sendReady.clear();
}
DTSCBuffer[currID].push_back(Strm.getPacket()); DTSCBuffer[currID].push_back(Strm.getPacket());
prevID = currID;
} }
if (Strm.lastType() == DTSC::PAUSEMARK){ if (Strm.lastType() == DTSC::PAUSEMARK){
conn.close(); conn.close();

View file

@ -20,7 +20,7 @@ namespace Converters{
codecType codec; codecType codec;
std::string name; std::string name;
long long unsigned int dtscID; long long unsigned int dtscID;
long long unsigned int lastTime; double lastTime;
bool parsedHeaders; bool parsedHeaders;
//Codec specific elements //Codec specific elements
theora::header idHeader;//needed to determine keyframe theora::header idHeader;//needed to determine keyframe
@ -30,8 +30,8 @@ namespace Converters{
std::string oggBuffer; std::string oggBuffer;
OGG::Page oggPage; OGG::Page oggPage;
//Read all of std::cin to oggBuffer //Read all of std::cin to oggBuffer
int mspft;//microseconds per frame double mspft;//microseconds per frame
int mspfv;//microseconds per frame vorbis double mspfv;//microseconds per frame vorbis
JSON::Value DTSCOut; JSON::Value DTSCOut;
JSON::Value DTSCHeader; JSON::Value DTSCHeader;
DTSCHeader.null(); DTSCHeader.null();
@ -59,15 +59,13 @@ namespace Converters{
theora::header tempHead; theora::header tempHead;
tempHead.read(oggPage.getFullPayload(), oggPage.getPayloadSize()); tempHead.read(oggPage.getFullPayload(), oggPage.getPayloadSize());
mspft = (double)(tempHead.getFRD() * 1000) / tempHead.getFRN(); mspft = (double)(tempHead.getFRD() * 1000) / tempHead.getFRN();
std::cerr << "Snr " << sNum << "=theora" << std::endl;
}else if(memcmp(oggPage.getFullPayload()+1, "vorbis", 6) == 0){ }else if(memcmp(oggPage.getFullPayload()+1, "vorbis", 6) == 0){
headerSeen += 1; headerSeen += 1;
headerWritten = false; headerWritten = false;
std::cerr << "Snr " << sNum << "=vorbis" << std::endl;
trackData[sNum].codec = VORBIS; trackData[sNum].codec = VORBIS;
vorbis::header tempHead; vorbis::header tempHead;
tempHead.read(oggPage.getFullPayload(), oggPage.getPayloadSize()); tempHead.read(oggPage.getFullPayload(), oggPage.getPayloadSize());
mspfv = 1000/tempHead.getAudioSampleRate(); mspfv = ntohl(tempHead.getAudioSampleRate()) / 1000;
}else{ }else{
std::cerr << "Unknown Codec, " << std::string(oggPage.getFullPayload()+1, 6)<<" skipping" << std::endl; std::cerr << "Unknown Codec, " << std::string(oggPage.getFullPayload()+1, 6)<<" skipping" << std::endl;
continue; continue;
@ -89,9 +87,9 @@ namespace Converters{
DTSCOut["granule"] = (long long)temp; DTSCOut["granule"] = (long long)temp;
DTSCOut["time"] = (long long)trackData[sNum].lastTime; DTSCOut["time"] = (long long)trackData[sNum].lastTime;
if (trackData[sNum].codec == THEORA){ if (trackData[sNum].codec == THEORA){
trackData[sNum].lastTime += mspft; trackData[sNum].lastTime += (mspft / 4);
}else{ }else{
trackData[sNum].lastTime += mspfv; trackData[sNum].lastTime += (mspfv / 4);
} }
DTSCOut["data"] = std::string(oggPage.getFullPayload()+offset, (*it)); //segment content put in JSON DTSCOut["data"] = std::string(oggPage.getFullPayload()+offset, (*it)); //segment content put in JSON
if (trackData[sNum].codec == THEORA){ if (trackData[sNum].codec == THEORA){