From 904577eae8521f924ead7020f3df28e11c2ed893 Mon Sep 17 00:00:00 2001 From: Edouard Griffiths Date: Thu, 28 Jul 2016 17:09:15 +0200 Subject: [PATCH] SDRdaemonFEC plugin: optimization: store I/Q data blocks directly into final buffer --- .../sdrdaemonfec/sdrdaemonfecbuffer.cpp | 18 +++++--- .../sdrdaemonfec/sdrdaemonfecbuffer.h | 45 +++++++++++++++++++ 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.cpp b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.cpp index 143cc74e4..a08e2abb0 100644 --- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.cpp +++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.cpp @@ -80,7 +80,7 @@ void SDRdaemonFECBuffer::initDecodeAllSlots() m_decoderSlots[i].m_recoveryCount = 0; m_decoderSlots[i].m_decoded = false; m_decoderSlots[i].m_metaRetrieved = false; - memset((void *) m_decoderSlots[i].m_originalBlocks, 0, m_nbOriginalBlocks * sizeof(ProtectedBlock)); + resetOriginalBlocks(i); memset((void *) m_decoderSlots[i].m_recoveryBlocks, 0, m_nbOriginalBlocks * sizeof(ProtectedBlock)); } } @@ -116,7 +116,8 @@ void SDRdaemonFECBuffer::initDecodeSlot(int slotIndex) m_decoderSlots[slotIndex].m_recoveryCount = 0; m_decoderSlots[slotIndex].m_decoded = false; m_decoderSlots[slotIndex].m_metaRetrieved = false; - memset((void *) m_decoderSlots[slotIndex].m_originalBlocks, 0, m_nbOriginalBlocks * sizeof(ProtectedBlock)); + + resetOriginalBlocks(slotIndex); memset((void *) m_decoderSlots[slotIndex].m_recoveryBlocks, 0, m_nbOriginalBlocks * sizeof(ProtectedBlock)); } @@ -188,7 +189,7 @@ void SDRdaemonFECBuffer::checkSlotData(int slotIndex) } // copy retrieved data to main buffer - memcpy((void *) &m_frames[slotIndex].m_blocks[0], (const void *) &m_decoderSlots[slotIndex].m_originalBlocks[1], (m_nbOriginalBlocks - 1)*sizeof(ProtectedBlock)); + copyOriginalBlocks(slotIndex); } void SDRdaemonFECBuffer::writeData(char *array, uint32_t length) @@ -231,8 +232,9 @@ void SDRdaemonFECBuffer::writeData(char *array, uint32_t length) if (blockIndex < m_nbOriginalBlocks) // original data { - m_decoderSlots[decoderIndex].m_originalBlocks[blockIndex] = superBlock->protectedBlock; - m_decoderSlots[decoderIndex].m_cm256DescriptorBlocks[blockCount].Block = (void *) &m_decoderSlots[decoderIndex].m_originalBlocks[blockIndex]; + m_decoderSlots[decoderIndex].m_cm256DescriptorBlocks[blockCount].Block = (void *) storeOriginalBlock(decoderIndex, blockIndex, superBlock->protectedBlock); + // m_decoderSlots[decoderIndex].m_originalBlocks[blockIndex] = superBlock->protectedBlock; + // m_decoderSlots[decoderIndex].m_cm256DescriptorBlocks[blockCount].Block = (void *) &m_decoderSlots[decoderIndex].m_originalBlocks[blockIndex]; m_decoderSlots[decoderIndex].m_originalCount++; } else // recovery data @@ -296,7 +298,8 @@ void SDRdaemonFECBuffer::writeData(char *array, uint32_t length) } } - m_decoderSlots[decoderIndex].m_originalBlocks[blockIndex] = *recoveredBlock; + storeOriginalBlock(decoderIndex, blockIndex, *recoveredBlock); + // m_decoderSlots[decoderIndex].m_originalBlocks[blockIndex] = *recoveredBlock; qDebug() << "SDRdaemonFECBuffer::writeData: recovered block #" << blockIndex; } // restore missing blocks @@ -305,7 +308,8 @@ void SDRdaemonFECBuffer::writeData(char *array, uint32_t length) if (m_decoderSlots[decoderIndex].m_metaRetrieved) // block zero with its meta data has been received { - MetaDataFEC *metaData = (MetaDataFEC *) &m_decoderSlots[decoderIndex].m_originalBlocks[0]; + // MetaDataFEC *metaData = (MetaDataFEC *) &m_decoderSlots[decoderIndex].m_originalBlocks[0]; + MetaDataFEC *metaData = getMetaData(decoderIndex); if (!(*metaData == m_currentMeta)) { diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.h b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.h index 5b0353b21..84613d3ec 100644 --- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.h +++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.h @@ -173,6 +173,7 @@ private: struct DecoderSlot { + ProtectedBlock m_blockZero; //!< First block of a frame. Has meta data. ProtectedBlock m_originalBlocks[m_nbOriginalBlocks]; //!< Original blocks retrieved directly or by later FEC ProtectedBlock m_recoveryBlocks[m_nbOriginalBlocks]; //!< Recovery blocks (FEC blocks) with max size CM256::cm256_block m_cm256DescriptorBlocks[m_nbOriginalBlocks]; //!< CM256 decoder descriptors (block addresses and block indexes) @@ -219,6 +220,50 @@ private: CM256 m_cm256; //!< CM256 library bool m_cm256_OK; //!< CM256 library initialized OK + inline ProtectedBlock* storeOriginalBlock(int slotIndex, int blockIndex, const ProtectedBlock& protectedBlock) + { + if (blockIndex == 0) { + // m_decoderSlots[slotIndex].m_originalBlocks[0] = protectedBlock; + // return &m_decoderSlots[slotIndex].m_originalBlocks[0]; + m_decoderSlots[slotIndex].m_blockZero = protectedBlock; + return &m_decoderSlots[slotIndex].m_blockZero; + } else { + // m_decoderSlots[slotIndex].m_originalBlocks[blockIndex] = protectedBlock; + // return &m_decoderSlots[slotIndex].m_originalBlocks[blockIndex]; + m_frames[slotIndex].m_blocks[blockIndex - 1] = protectedBlock; + return &m_frames[slotIndex].m_blocks[blockIndex - 1]; + } + } + + inline ProtectedBlock& getOriginalBlock(int slotIndex, int blockIndex) + { + if (blockIndex == 0) { + // return m_decoderSlots[slotIndex].m_originalBlocks[0]; + return m_decoderSlots[slotIndex].m_blockZero; + } else { + // return m_decoderSlots[slotIndex].m_originalBlocks[blockIndex]; + return m_frames[slotIndex].m_blocks[blockIndex - 1]; + } + } + + inline MetaDataFEC *getMetaData(int slotIndex) + { + // return (MetaDataFEC *) &m_decoderSlots[slotIndex].m_originalBlocks[0]; + return (MetaDataFEC *) &m_decoderSlots[slotIndex].m_blockZero; + } + + inline void resetOriginalBlocks(int slotIndex) + { + // memset((void *) m_decoderSlots[slotIndex].m_originalBlocks, 0, m_nbOriginalBlocks * sizeof(ProtectedBlock)); + memset((void *) &m_decoderSlots[slotIndex].m_blockZero, 0, sizeof(ProtectedBlock)); + memset((void *) m_frames[slotIndex].m_blocks, 0, (m_nbOriginalBlocks - 1) * sizeof(ProtectedBlock)); + } + + inline void copyOriginalBlocks(int slotIndex) + { + // memcpy((void *) &m_frames[slotIndex].m_blocks[0], (const void *) &m_decoderSlots[slotIndex].m_originalBlocks[1], (m_nbOriginalBlocks - 1)*sizeof(ProtectedBlock)); + } + void initDecodeAllSlots(); void initReadIndex(); void rwCorrectionEstimate(int slotIndex);