From cae6bed370c3b0b0e5d984acff61d7722f102486 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Mon, 15 Jan 2018 19:58:13 +0000 Subject: [PATCH] Bypass sequence numbers for DMR data frames with the jitter buffer. --- DMRNetwork.cpp | 15 +++++++++++++-- JitterBuffer.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ JitterBuffer.h | 3 +++ 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index ae9be97..d296b57 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -498,8 +498,19 @@ void CDMRNetwork::receiveData(const unsigned char* data, unsigned int length) if (slotNo == 2U && !m_slot2) return; - unsigned char seqNo = data[4U]; - m_jitterBuffers[slotNo]->addData(data, length, seqNo); + unsigned char dataType = data[15U] & 0x3FU; + if (dataType == (0x20U | DT_CSBK) || + dataType == (0x20U | DT_DATA_HEADER) || + dataType == (0x20U | DT_RATE_1_DATA) || + dataType == (0x20U | DT_RATE_34_DATA) || + dataType == (0x20U | DT_RATE_12_DATA)) { + // Data & CSBK frames + m_jitterBuffers[slotNo]->appendData(data, length); + } else { + // Voice frames + unsigned char seqNo = data[4U]; + m_jitterBuffers[slotNo]->addData(data, length, seqNo); + } } bool CDMRNetwork::writeLogin() diff --git a/JitterBuffer.cpp b/JitterBuffer.cpp index c77068f..25522ec 100644 --- a/JitterBuffer.cpp +++ b/JitterBuffer.cpp @@ -36,6 +36,7 @@ m_stopWatch(), m_running(false), m_buffer(NULL), m_headSequenceNumber(0U), +m_appendSequenceNumber(0U), m_lastData(NULL), m_lastDataLength(0U) { @@ -115,6 +116,52 @@ bool CJitterBuffer::addData(const unsigned char* data, unsigned int length, unsi return true; } +bool CJitterBuffer::appendData(const unsigned char* data, unsigned int length) +{ + assert(data != NULL); + assert(length > 0U); + assert(length <= m_blockSize); + + unsigned int headSequenceNumber = m_headSequenceNumber % m_topSequenceNumber; + unsigned int tailSequenceNumber = (m_headSequenceNumber + m_blockCount) % m_topSequenceNumber; + + // Is the data out of sequence? + if (headSequenceNumber < tailSequenceNumber) { + if (m_appendSequenceNumber < headSequenceNumber || m_appendSequenceNumber >= tailSequenceNumber) { + LogDebug("%s, JitterBuffer: rejecting append frame with seqNo=%u, raw=%u, head=%u, tail=%u", m_name.c_str(), m_appendSequenceNumber, m_headSequenceNumber, headSequenceNumber, tailSequenceNumber); + return false; + } + } else { + if (m_appendSequenceNumber >= tailSequenceNumber && m_appendSequenceNumber < headSequenceNumber) { + LogDebug("%s, JitterBuffer: rejecting append frame with seqNo=%u, raw=%u, head=%u, tail=%u", m_name.c_str(), m_appendSequenceNumber, m_headSequenceNumber, headSequenceNumber, tailSequenceNumber); + return false; + } + } + + unsigned int number; + if (m_appendSequenceNumber >= headSequenceNumber) + number = m_appendSequenceNumber - headSequenceNumber; + else + number = (m_appendSequenceNumber + m_blockCount) - headSequenceNumber;; + + unsigned int index = (m_headSequenceNumber + number) % m_blockCount; + + if (m_debug) + LogDebug("%s, JitterBuffer: appending frame with seqNo=%u, pos=%u, raw=%u, head=%u, tail=%u", m_name.c_str(), m_appendSequenceNumber, index, m_headSequenceNumber, headSequenceNumber, tailSequenceNumber); + + ::memcpy(m_buffer[index].m_data, data, length); + m_buffer[index].m_length = length; + + if (!m_timer.isRunning()) { + LogDebug("%s, JitterBuffer: starting the timer from append", m_name.c_str()); + m_timer.start(); + } + + m_appendSequenceNumber++; + + return true; +} + JB_STATUS CJitterBuffer::getData(unsigned char* data, unsigned int& length) { assert(data != NULL); @@ -168,6 +215,7 @@ void CJitterBuffer::reset() m_buffer[i].m_length = 0U; m_headSequenceNumber = 0U; + m_appendSequenceNumber = 0U; m_lastDataLength = 0U; diff --git a/JitterBuffer.h b/JitterBuffer.h index 7bf664f..46575ee 100644 --- a/JitterBuffer.h +++ b/JitterBuffer.h @@ -36,6 +36,7 @@ public: ~CJitterBuffer(); bool addData(const unsigned char* data, unsigned int length, unsigned int sequenceNumber); + bool appendData(const unsigned char* data, unsigned int length); JB_STATUS getData(unsigned char* data, unsigned int& length); @@ -63,6 +64,8 @@ private: JitterEntry* m_buffer; unsigned int m_headSequenceNumber; + unsigned int m_appendSequenceNumber; + unsigned char* m_lastData; unsigned int m_lastDataLength; };