From 7790e35d2497ca6ff631413ba943f9bf8ea63b3d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 8 Jul 2015 18:19:12 -0700 Subject: [PATCH] added bytes consumed result to decode, and exit early after bytes consumed --- interface/src/Application.cpp | 2 +- interface/src/Util.cpp | 8 +++++--- libraries/shared/src/ByteCountCoding.h | 16 +++++++++++----- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cd15f2f4c7..a834ce1288 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1014,7 +1014,7 @@ void Application::paintGL() { void Application::runTests() { runTimingTests(); - //runUnitTests(); + runUnitTests(); } void Application::audioMuteToggled() { diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 5f04010b47..82f7d55b5d 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -232,7 +232,7 @@ void runTimingTests() { (double)(elapsedUsecs / numTests), (double)result); - quint64 BYTE_CODE_MAX_VALUE = 99999999; + quint64 BYTE_CODE_MAX_TEST_VALUE = 99999999; quint64 BYTE_CODE_TESTS_SKIP = 999; QByteArray extraJunk; @@ -246,7 +246,7 @@ void runTimingTests() { startTime.start(); quint64 tests = 0; quint64 failed = 0; - for (quint64 value = 0; value < BYTE_CODE_MAX_VALUE; value += BYTE_CODE_TESTS_SKIP) { + for (quint64 value = 0; value < BYTE_CODE_MAX_TEST_VALUE; value += BYTE_CODE_TESTS_SKIP) { quint64 valueA = value; // usecTimestampNow(); ByteCountCoded codedValueA = valueA; QByteArray codedValueABuffer = codedValueA; @@ -328,9 +328,11 @@ void runUnitTests() { qDebug() << "codedValueBuffer:"; outputBufferBits((const unsigned char*)codedValueBuffer.constData(), codedValueBuffer.size()); - ByteCountCoded valueDecoder = codedValueBuffer; + ByteCountCoded valueDecoder; + size_t bytesConsumed = valueDecoder.decode(codedValueBuffer); quint64 valueDecoded = valueDecoder; qDebug() << "valueDecoded:" << valueDecoded; + qDebug() << "bytesConsumed:" << bytesConsumed; if (value == valueDecoded) { diff --git a/libraries/shared/src/ByteCountCoding.h b/libraries/shared/src/ByteCountCoding.h index 735c51a783..ce6f121ddb 100644 --- a/libraries/shared/src/ByteCountCoding.h +++ b/libraries/shared/src/ByteCountCoding.h @@ -41,8 +41,8 @@ public: ByteCountCoded(const QByteArray& fromEncoded) : data(0) { decode(fromEncoded); } QByteArray encode() const; - void decode(const QByteArray& fromEncoded); - void decode(const char* encodedBuffer, int encodedSize); + size_t decode(const QByteArray& fromEncoded); + size_t decode(const char* encodedBuffer, int encodedSize); bool operator==(const ByteCountCoded& other) const { return data == other.data; } bool operator!=(const ByteCountCoded& other) const { return data != other.data; } @@ -115,12 +115,13 @@ template inline QByteArray ByteCountCoded::encode() const { return output; } -template inline void ByteCountCoded::decode(const QByteArray& fromEncodedBytes) { - decode(fromEncodedBytes.constData(), fromEncodedBytes.size()); +template inline size_t ByteCountCoded::decode(const QByteArray& fromEncodedBytes) { + return decode(fromEncodedBytes.constData(), fromEncodedBytes.size()); } -template inline void ByteCountCoded::decode(const char* encodedBuffer, int encodedSize) { +template inline size_t ByteCountCoded::decode(const char* encodedBuffer, int encodedSize) { data = 0; // reset data + size_t bytesConsumed = 0; int bitCount = BITS_IN_BYTE * encodedSize; int encodedByteCount = 1; // there is at least 1 byte (after the leadBits) @@ -133,6 +134,7 @@ template inline void ByteCountCoded::decode(const char* encodedBu for(int byte = 0; byte < encodedSize; byte++) { char originalByte = encodedBuffer[byte]; + bytesConsumed++; unsigned char maskBit = 128; // LEFT MOST BIT set for(int bit = 0; bit < BITS_IN_BYTE; bit++) { bool bitIsSet = originalByte & maskBit; @@ -165,7 +167,11 @@ template inline void ByteCountCoded::decode(const char* encodedBu bitAt++; maskBit = maskBit >> 1; } + if (!inLeadBits && bitAt > lastValueBit) { + break; + } } + return bytesConsumed; } #endif // hifi_ByteCountCoding_h