From 45022f36c905e6293d1258eecc417c7ba914c83c Mon Sep 17 00:00:00 2001 From: Ramoe Date: Fri, 31 Mar 2017 17:32:35 +0200 Subject: [PATCH] Added several DTSC packet convenience functions --- lib/dtsc.h | 5 ++++ lib/dtscmeta.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/lib/dtsc.h b/lib/dtsc.h index 89524610..c74bda4d 100644 --- a/lib/dtsc.h +++ b/lib/dtsc.h @@ -118,6 +118,7 @@ namespace DTSC { void reInit(Socket::Connection & src); void reInit(const char * data_, unsigned int len, bool noCopy = false); void genericFill(long long packTime, long long packOffset, long long packTrack, const char * packData, long long packDataSize, uint64_t packBytePos, bool isKeyframe); + void appendData(const char * appendData, uint32_t appendLen); void getString(const char * identifier, char *& result, unsigned int & len) const; void getString(const char * identifier, std::string & result) const; void getInt(const char * identifier, int & result) const; @@ -125,11 +126,15 @@ namespace DTSC { void getFlag(const char * identifier, bool & result) const; bool getFlag(const char * identifier) const; bool hasMember(const char * identifier) const; + void appendNal(const char * appendData, uint32_t appendLen, uint32_t totalLen); + void clearKeyFrame(); long long unsigned int getTime() const; long int getTrackId() const; char * getData() const; int getDataLen() const; int getPayloadLen() const; + uint32_t getDataStringLen(); + uint32_t getDataStringLenOffset(); JSON::Value toJSON() const; std::string toSummary() const; Scan getScan() const; diff --git a/lib/dtscmeta.cpp b/lib/dtscmeta.cpp index 67bc499d..aaa2f6ea 100644 --- a/lib/dtscmeta.cpp +++ b/lib/dtscmeta.cpp @@ -270,6 +270,71 @@ namespace DTSC { memcpy(data+offset+11+packDataSize, "\000\000\356", 3); } + ///clear the keyframe byte. + void Packet::clearKeyFrame(){ + uint32_t offset = 23; + while (data[offset] != 'd' && data[offset] != 'k'){ + switch (data[offset]){ + case 'o': offset += 17; break; + case 'b': offset += 15; break; + default: + FAIL_MSG("Errrrrrr"); + } + } + + if(data[offset] == 'k'){ + data[offset] = 'K'; + data[offset+16] = 0; + } + } + + void Packet::appendData(const char * appendData, uint32_t appendLen){ + resize(dataLen + appendLen); + memcpy(data + dataLen-3, appendData, appendLen); + memcpy(data + dataLen-3 + appendLen, "\000\000\356", 3); //end container + dataLen += appendLen; + Bit::htobl(data+4, Bit::btohl(data +4)+appendLen); + uint32_t offset = getDataStringLenOffset(); + Bit::htobl(data+offset, Bit::btohl(data+offset)+appendLen); + } + + void Packet::appendNal(const char * appendData, uint32_t appendLen, uint32_t totalLen){ + if(totalLen ==0){ + return; + } + +// INFO_MSG("totallen: %d, appendLen: %d",totalLen,appendLen); + resize(dataLen + appendLen +4); + Bit::htobl(data+dataLen -3, totalLen); + memcpy(data + dataLen-3+4, appendData, appendLen); + memcpy(data + dataLen-3+4 + appendLen, "\000\000\356", 3); //end container + dataLen += appendLen +4; + Bit::htobl(data+4, Bit::btohl(data +4)+appendLen+4); + uint32_t offset = getDataStringLenOffset(); + Bit::htobl(data+offset, Bit::btohl(data+offset)+appendLen+4); + } + + uint32_t Packet::getDataStringLen(){ + return Bit::btohl(data+getDataStringLenOffset()); + } + + ///Method can only be used when using internal functions to build the data. + uint32_t Packet::getDataStringLenOffset(){ + uint32_t offset = 23; + while (data[offset] != 'd'){ + switch (data[offset]){ + case 'o': offset += 17; break; + case 'b': offset += 15; break; + case 'k': offset += 19; break; + default: + FAIL_MSG("Errrrrrr"); + return -1; + } + } + return offset +5; + } + + /// Helper function for skipping over whole DTSC parts static char * skipDTSC(char * p, char * max) { if (p + 1 >= max || p[0] == 0x00) {