Optimizations in packet parsing

This commit is contained in:
Erik Zandvliet 2013-04-30 10:35:36 +02:00
parent f14a4fb75e
commit d2597101fc

View file

@ -56,14 +56,26 @@ bool DTSC::Stream::parsePacket(std::string & buffer){
return false; return false;
} }
} }
int version = 0;
if (memcmp(buffer.c_str(), DTSC::Magic_Packet, 4) == 0){ if (memcmp(buffer.c_str(), DTSC::Magic_Packet, 4) == 0){
version = 1;
}
if (memcmp(buffer.c_str(), DTSC::Magic_Packet2, 4) == 0){
version = 2;
}
if (version){
len = ntohl(((uint32_t *)buffer.c_str())[1]); len = ntohl(((uint32_t *)buffer.c_str())[1]);
if (buffer.length() < len + 8){ if (buffer.length() < len + 8){
return false; return false;
} }
buffers.push_front(JSON::Value()); buffers.push_front(JSON::Value());
unsigned int i = 0; unsigned int i = 0;
buffers.front() = JSON::fromDTMI((unsigned char*)buffer.c_str() + 8, len, i); if (version == 1){
buffers.front() = JSON::fromDTMI((unsigned char*)buffer.c_str() + 8, len, i);
}
if (version == 2){
buffers.front() = JSON::fromDTMI2(buffer.substr(8));
}
datapointertype = INVALID; datapointertype = INVALID;
if (buffers.front().isMember("data")){ if (buffers.front().isMember("data")){
datapointer = &(buffers.front()["data"].strVal); datapointer = &(buffers.front()["data"].strVal);
@ -93,49 +105,6 @@ bool DTSC::Stream::parsePacket(std::string & buffer){
syncing = false; syncing = false;
return true; return true;
} }
if (memcmp(buffer.c_str(), DTSC::Magic_Packet2, 4) == 0){
len = ntohl(((uint32_t *)buffer.c_str())[1]);
if (buffer.length() < len + 20){
return false;
}
buffers.push_front(JSON::Value());
unsigned int i = 0;
long long int tmpTrackID = ntohl(((int*)(buffer.c_str() + 8))[0]);
long long int tmpTime = ntohl(((int*)(buffer.c_str() + 12))[0]);
tmpTime << 32;
tmpTime += ntohl(((int*)(buffer.c_str() + 16))[0]);
buffers.front() = JSON::fromDTMI((unsigned char*)buffer.c_str() + 20, len, i);
buffers.front()["time"] = tmpTime;
buffers.front()["trackid"] = tmpTrackID;
datapointertype = INVALID;
if (buffers.front().isMember("data")){
datapointer = &(buffers.front()["data"].strVal);
}else{
datapointer = 0;
}
if (buffers.front().isMember("datatype")){
std::string tmp = buffers.front()["datatype"].asString();
if (tmp == "video"){
datapointertype = VIDEO;
}
if (tmp == "audio"){
datapointertype = AUDIO;
}
if (tmp == "meta"){
datapointertype = META;
}
if (tmp == "pause_marker"){
datapointertype = PAUSEMARK;
}
}
buffer.erase(0, len + 20);
while (buffers.size() > buffercount){
buffers.pop_back();
}
advanceRings();
syncing = false;
return true;
}
#if DEBUG >= 2 #if DEBUG >= 2
if (!syncing){ if (!syncing){
std::cerr << "Error: Invalid DTMI data detected - re-syncing" << std::endl; std::cerr << "Error: Invalid DTMI data detected - re-syncing" << std::endl;
@ -181,7 +150,14 @@ bool DTSC::Stream::parsePacket(Socket::Buffer & buffer){
} }
header_bytes = buffer.copy(8); header_bytes = buffer.copy(8);
} }
int version = 0;
if (memcmp(header_bytes.c_str(), DTSC::Magic_Packet, 4) == 0){ if (memcmp(header_bytes.c_str(), DTSC::Magic_Packet, 4) == 0){
version = 1;
}
if (memcmp(header_bytes.c_str(), DTSC::Magic_Packet2, 4) == 0){
version = 2;
}
if (version){
len = ntohl(((uint32_t *)header_bytes.c_str())[1]); len = ntohl(((uint32_t *)header_bytes.c_str())[1]);
if ( !buffer.available(len + 8)){ if ( !buffer.available(len + 8)){
return false; return false;
@ -189,50 +165,12 @@ bool DTSC::Stream::parsePacket(Socket::Buffer & buffer){
buffers.push_front(JSON::Value()); buffers.push_front(JSON::Value());
unsigned int i = 0; unsigned int i = 0;
std::string wholepacket = buffer.remove(len + 8); std::string wholepacket = buffer.remove(len + 8);
buffers.front() = JSON::fromDTMI((unsigned char*)wholepacket.c_str() + 8, len, i); if (version == 1){
datapointertype = INVALID; buffers.front() = JSON::fromDTMI((unsigned char*)wholepacket.c_str() + 8, len, i);
if (buffers.front().isMember("data")){
datapointer = &(buffers.front()["data"].strVal);
}else{
datapointer = 0;
} }
if (buffers.front().isMember("datatype")){ if (version == 2){
std::string tmp = buffers.front()["datatype"].asString(); buffers.front() = JSON::fromDTMI2(wholepacket.substr(8));
if (tmp == "video"){
datapointertype = VIDEO;
}
if (tmp == "audio"){
datapointertype = AUDIO;
}
if (tmp == "meta"){
datapointertype = META;
}
if (tmp == "pause_marker"){
datapointertype = PAUSEMARK;
}
} }
while (buffers.size() > buffercount){
buffers.pop_back();
}
advanceRings();
syncing = false;
return true;
}
if (memcmp(header_bytes.c_str(), DTSC::Magic_Packet2, 4) == 0){
len = ntohl(((uint32_t *)header_bytes.c_str())[1]);
if ( !buffer.available(len + 20)){
return false;
}
buffers.push_front(JSON::Value());
unsigned int i = 0;
std::string wholepacket = buffer.remove(len + 20);
long long int tmpTrackID = ntohl(((int*)(wholepacket.c_str() + 8))[0]);
long long int tmpTime = ntohl(((int*)(wholepacket.c_str() + 12))[0]);
tmpTime << 32;
tmpTime += ntohl(((int*)(wholepacket.c_str() + 16))[0]);
buffers.front() = JSON::fromDTMI((unsigned char*)wholepacket.c_str() + 20, len, i);
buffers.front()["time"] = tmpTime;
buffers.front()["trackid"] = tmpTrackID;
datapointertype = INVALID; datapointertype = INVALID;
if (buffers.front().isMember("data")){ if (buffers.front().isMember("data")){
datapointer = &(buffers.front()["data"].strVal); datapointer = &(buffers.front()["data"].strVal);
@ -693,12 +631,8 @@ void DTSC::File::readHeader(int pos){
if (pos == 0){ if (pos == 0){
firstmetadata = metadata; firstmetadata = metadata;
} }
if (fread(buffer, 4, 1, F) != 1){
metadata["isFixed"] = true;
}
//if there is another header, read it and replace metadata with that one. //if there is another header, read it and replace metadata with that one.
if (metadata.isMember("moreheader") && metadata["moreheader"].asInt() > 0){ if (metadata.isMember("moreheader") && metadata["moreheader"].asInt() > 0){
metadata.removeMember("isFixed");
readHeader(metadata["moreheader"].asInt()); readHeader(metadata["moreheader"].asInt());
return; return;
} }