Bypass sequence numbers for DMR data frames with the jitter buffer.
This commit is contained in:
parent
d3395278c6
commit
cae6bed370
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue