Bypass sequence numbers for DMR data frames with the jitter buffer.

This commit is contained in:
Jonathan Naylor 2018-01-15 19:58:13 +00:00
parent d3395278c6
commit cae6bed370
3 changed files with 64 additions and 2 deletions

View file

@ -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()

View file

@ -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;

View file

@ -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;
};