mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-23 00:18:37 -05:00
SDRdaemon: revised buffers allocation
This commit is contained in:
parent
34138dc1c4
commit
2fe57dabae
@ -27,7 +27,7 @@ SDRdaemonBuffer::SDRdaemonBuffer(std::size_t blockSize) :
|
|||||||
m_lz4InCount(0),
|
m_lz4InCount(0),
|
||||||
m_lz4InSize(0),
|
m_lz4InSize(0),
|
||||||
m_lz4OutBuffer(0),
|
m_lz4OutBuffer(0),
|
||||||
m_lz4OutSize(0),
|
m_frameSize(0),
|
||||||
m_nbDecodes(0),
|
m_nbDecodes(0),
|
||||||
m_nbSuccessfulDecodes(0),
|
m_nbSuccessfulDecodes(0),
|
||||||
m_nbCRCOK(0),
|
m_nbCRCOK(0),
|
||||||
@ -37,8 +37,6 @@ SDRdaemonBuffer::SDRdaemonBuffer(std::size_t blockSize) :
|
|||||||
m_sampleBits(12),
|
m_sampleBits(12),
|
||||||
m_rawBuffer(0)
|
m_rawBuffer(0)
|
||||||
{
|
{
|
||||||
m_buf = new uint8_t[blockSize];
|
|
||||||
updateBufferSize();
|
|
||||||
m_currentMeta.init();
|
m_currentMeta.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,7 +46,9 @@ SDRdaemonBuffer::~SDRdaemonBuffer()
|
|||||||
delete[] m_rawBuffer;
|
delete[] m_rawBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] m_buf;
|
if (m_lz4InBuffer) {
|
||||||
|
delete[] m_lz4InBuffer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SDRdaemonBuffer::readMeta(char *array, std::size_t length)
|
bool SDRdaemonBuffer::readMeta(char *array, std::size_t length)
|
||||||
@ -71,16 +71,31 @@ bool SDRdaemonBuffer::readMeta(char *array, std::size_t length)
|
|||||||
// sanity checks
|
// sanity checks
|
||||||
if (metaData->m_blockSize == m_blockSize) // sent blocksize matches given blocksize
|
if (metaData->m_blockSize == m_blockSize) // sent blocksize matches given blocksize
|
||||||
{
|
{
|
||||||
|
uint32_t sampleBytes = metaData->m_sampleBytes & 0x0F;
|
||||||
|
uint32_t frameSize = sampleBytes * 2 * metaData->m_nbSamples * metaData->m_nbBlocks;
|
||||||
|
|
||||||
if (metaData->m_sampleBytes & 0x10)
|
if (metaData->m_sampleBytes & 0x10)
|
||||||
{
|
{
|
||||||
m_lz4 = true;
|
m_lz4 = true;
|
||||||
updateLZ4Sizes(metaData);
|
m_lz4InSize = metaData->m_nbBytes; // compressed input size
|
||||||
|
m_lz4InCount = 0;
|
||||||
|
|
||||||
|
if (frameSize != m_frameSize)
|
||||||
|
{
|
||||||
|
updateLZ4Sizes(frameSize);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_lz4 = false;
|
m_lz4 = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (frameSize != m_frameSize)
|
||||||
|
{
|
||||||
|
updateBufferSize(frameSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_frameSize = frameSize;
|
||||||
m_sync = true;
|
m_sync = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -142,7 +157,7 @@ void SDRdaemonBuffer::writeDataLZ4(char *array, std::size_t length)
|
|||||||
m_nbCRCOK++;
|
m_nbCRCOK++;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compressedSize = LZ4_decompress_fast((const char*) m_lz4InBuffer, (char*) m_lz4OutBuffer, m_lz4OutSize);
|
int compressedSize = LZ4_decompress_fast((const char*) m_lz4InBuffer, (char*) m_lz4OutBuffer, m_frameSize);
|
||||||
m_nbDecodes++;
|
m_nbDecodes++;
|
||||||
|
|
||||||
if (compressedSize == m_lz4InSize)
|
if (compressedSize == m_lz4InSize)
|
||||||
@ -177,15 +192,9 @@ void SDRdaemonBuffer::writeDataLZ4(char *array, std::size_t length)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRdaemonBuffer::updateLZ4Sizes(MetaData *metaData)
|
void SDRdaemonBuffer::updateLZ4Sizes(uint32_t frameSize)
|
||||||
{
|
{
|
||||||
m_lz4InSize = metaData->m_nbBytes; // compressed input size
|
uint32_t masInputSize = LZ4_compressBound(frameSize);
|
||||||
uint32_t sampleBytes = metaData->m_sampleBytes & 0x0F;
|
|
||||||
uint32_t originalSize = sampleBytes * 2 * metaData->m_nbSamples * metaData->m_nbBlocks;
|
|
||||||
|
|
||||||
if (originalSize != m_lz4OutSize)
|
|
||||||
{
|
|
||||||
uint32_t masInputSize = LZ4_compressBound(originalSize);
|
|
||||||
|
|
||||||
if (m_lz4InBuffer) {
|
if (m_lz4InBuffer) {
|
||||||
delete[] m_lz4InBuffer;
|
delete[] m_lz4InBuffer;
|
||||||
@ -197,20 +206,23 @@ void SDRdaemonBuffer::updateLZ4Sizes(MetaData *metaData)
|
|||||||
delete[] m_lz4OutBuffer;
|
delete[] m_lz4OutBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_lz4OutBuffer = new uint8_t[originalSize];
|
m_lz4OutBuffer = new uint8_t[frameSize];
|
||||||
m_lz4OutSize = originalSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_lz4InCount = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRdaemonBuffer::updateBufferSize()
|
void SDRdaemonBuffer::updateBufferSize(uint32_t frameSize)
|
||||||
{
|
{
|
||||||
|
uint32_t nbFrames = ((m_sampleRate * 2 * m_sampleBytes) / frameSize) + 1; // store at least 1 second of samples
|
||||||
|
|
||||||
|
std::cerr << "SDRdaemonBuffer::updateBufferSize:"
|
||||||
|
<< " frameSize: " << frameSize
|
||||||
|
<< " nbFrames: " << nbFrames
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
if (m_rawBuffer) {
|
if (m_rawBuffer) {
|
||||||
delete[] m_rawBuffer;
|
delete[] m_rawBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_rawBuffer = new uint8_t[m_sampleRate * 2 * m_sampleBytes]; // store 1 second of samples
|
m_rawBuffer = new uint8_t[nbFrames * frameSize];
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRdaemonBuffer::printMeta(MetaData *metaData)
|
void SDRdaemonBuffer::printMeta(MetaData *metaData)
|
||||||
|
@ -69,9 +69,9 @@ public:
|
|||||||
bool isSync() const { return m_sync; }
|
bool isSync() const { return m_sync; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateLZ4Sizes(MetaData *metaData);
|
void updateLZ4Sizes(uint32_t frameSize);
|
||||||
void writeDataLZ4(char *array, std::size_t length);
|
void writeDataLZ4(char *array, std::size_t length);
|
||||||
void updateBufferSize();
|
void updateBufferSize(uint32_t frameSize);
|
||||||
void printMeta(MetaData *metaData);
|
void printMeta(MetaData *metaData);
|
||||||
|
|
||||||
std::size_t m_blockSize; //!< UDP block (payload) size
|
std::size_t m_blockSize; //!< UDP block (payload) size
|
||||||
@ -79,13 +79,12 @@ private:
|
|||||||
bool m_lz4; //!< Stream is compressed with LZ4
|
bool m_lz4; //!< Stream is compressed with LZ4
|
||||||
MetaData m_currentMeta; //!< Stored current meta data
|
MetaData m_currentMeta; //!< Stored current meta data
|
||||||
CRC64 m_crc64; //!< CRC64 calculator
|
CRC64 m_crc64; //!< CRC64 calculator
|
||||||
uint8_t *m_buf; //!< UDP block buffer
|
|
||||||
|
|
||||||
uint8_t *m_lz4InBuffer; //!< Buffer for LZ4 compressed input
|
uint8_t *m_lz4InBuffer; //!< Buffer for LZ4 compressed input
|
||||||
uint32_t m_lz4InCount; //!< Current position in LZ4 input buffer
|
uint32_t m_lz4InCount; //!< Current position in LZ4 input buffer
|
||||||
uint32_t m_lz4InSize; //!< Size in bytes of the LZ4 input data
|
uint32_t m_lz4InSize; //!< Size in bytes of the LZ4 input data
|
||||||
uint8_t *m_lz4OutBuffer; //!< Buffer for LZ4 uncompressed output
|
uint8_t *m_lz4OutBuffer; //!< Buffer for LZ4 uncompressed output
|
||||||
uint32_t m_lz4OutSize; //!< Size in bytes of the LZ4 output data (original uncomressed data)
|
uint32_t m_frameSize; //!< Size in bytes of one uncompressed frame
|
||||||
uint32_t m_nbDecodes;
|
uint32_t m_nbDecodes;
|
||||||
uint32_t m_nbSuccessfulDecodes;
|
uint32_t m_nbSuccessfulDecodes;
|
||||||
uint32_t m_nbCRCOK;
|
uint32_t m_nbCRCOK;
|
||||||
|
Loading…
Reference in New Issue
Block a user