Optimizations in packet parsing
This commit is contained in:
		
							parent
							
								
									f14a4fb75e
								
							
						
					
					
						commit
						d2597101fc
					
				
					 1 changed files with 24 additions and 90 deletions
				
			
		
							
								
								
									
										110
									
								
								lib/dtsc.cpp
									
										
									
									
									
								
							
							
						
						
									
										110
									
								
								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; | ||||||
|  |       if (version == 1){ | ||||||
|         buffers.front() = JSON::fromDTMI((unsigned char*)buffer.c_str() + 8, len, i); |         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); | ||||||
|  |       if (version == 1){ | ||||||
|         buffers.front() = JSON::fromDTMI((unsigned char*)wholepacket.c_str() + 8, len, i); |         buffers.front() = JSON::fromDTMI((unsigned char*)wholepacket.c_str() + 8, len, i); | ||||||
|       datapointertype = INVALID; |  | ||||||
|       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
		Add a link
		
	
		Reference in a new issue
	
	 Erik Zandvliet
						Erik Zandvliet