Optimizations in packet parsing
This commit is contained in:
parent
f14a4fb75e
commit
d2597101fc
1 changed files with 24 additions and 90 deletions
114
lib/dtsc.cpp
114
lib/dtsc.cpp
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue