From c7816c42f0d863ac57c3c29c1d8d8108369bea21 Mon Sep 17 00:00:00 2001 From: Ramkoemar Date: Mon, 26 Jun 2017 14:44:09 +0200 Subject: [PATCH] updated appendNal and added upgradeNal in DTSC lib, nal lib speedup --- lib/dtsc.h | 6 ++++-- lib/dtscmeta.cpp | 38 +++++++++++++++++++++++++------------- lib/nal.cpp | 4 ++-- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/lib/dtsc.h b/lib/dtsc.h index 534a3876..84517c28 100644 --- a/lib/dtsc.h +++ b/lib/dtsc.h @@ -118,7 +118,6 @@ 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; @@ -126,7 +125,8 @@ 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 appendNal(const char * appendData, uint32_t appendLen); + void upgradeNal(const char * appendData, uint32_t appendLen); void setKeyFrame(bool kf); long long unsigned int getTime() const; long int getTrackId() const; @@ -145,6 +145,8 @@ namespace DTSC { char * data; unsigned int bufferLen; unsigned int dataLen; + + uint64_t prevNalSize; }; /// A simple structure used for ordering byte seek positions. diff --git a/lib/dtscmeta.cpp b/lib/dtscmeta.cpp index c8ac3ef6..985fc732 100644 --- a/lib/dtscmeta.cpp +++ b/lib/dtscmeta.cpp @@ -291,30 +291,42 @@ namespace DTSC { } } - 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){ + void Packet::appendNal(const char * appendData, uint32_t appendLen){ + if(appendLen ==0){ return; } // INFO_MSG("totallen: %d, appendLen: %d",totalLen,appendLen); resize(dataLen + appendLen +4); - Bit::htobl(data+dataLen -3, totalLen); + Bit::htobl(data+dataLen -3, appendLen); 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); + + prevNalSize = appendLen; + } + + void Packet::upgradeNal(const char * appendData, uint32_t appendLen){ + if(appendLen ==0){ + return; + } + uint64_t sizeOffset = dataLen - 3 - 4 - prevNalSize; + if (Bit::btohl(data + sizeOffset) != prevNalSize){ + FAIL_MSG("PrevNalSize state not correct"); + return; + } + resize(dataLen + appendLen);//Not + 4 as size bytes have already been written here. + Bit::htobl(data+sizeOffset, prevNalSize + appendLen); + prevNalSize += 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); } uint32_t Packet::getDataStringLen(){ diff --git a/lib/nal.cpp b/lib/nal.cpp index 4a502005..379a03f5 100644 --- a/lib/nal.cpp +++ b/lib/nal.cpp @@ -82,8 +82,8 @@ namespace nalu { int offset = 0; while(offset+2 < dataSize){ const char * begin = data + offset; - int t = (int)((begin[0] << 8)|((begin[1]) << 8)|(begin[2])); - if(t != 1){ + bool t = (begin[2] == 1 && !begin[0] && !begin[1]); + if(!t){ if (begin[2]){//skip three bytes if the last one isn't zero offset +=3; }else if (begin[1]){//skip two bytes if the second one isn't zero