mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-29 20:10:22 -04: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(uint32_t frameSize) | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void SDRdaemonBuffer::updateBufferSize() |  | ||||||
| { | { | ||||||
|  | 	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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user