mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-09-08 08:07:54 -04:00
SDRdaemonFEC plugin: optimization: store I/Q data blocks directly into final buffer
This commit is contained in:
parent
860bad12ca
commit
904577eae8
@ -80,7 +80,7 @@ void SDRdaemonFECBuffer::initDecodeAllSlots()
|
|||||||
m_decoderSlots[i].m_recoveryCount = 0;
|
m_decoderSlots[i].m_recoveryCount = 0;
|
||||||
m_decoderSlots[i].m_decoded = false;
|
m_decoderSlots[i].m_decoded = false;
|
||||||
m_decoderSlots[i].m_metaRetrieved = 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));
|
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_recoveryCount = 0;
|
||||||
m_decoderSlots[slotIndex].m_decoded = false;
|
m_decoderSlots[slotIndex].m_decoded = false;
|
||||||
m_decoderSlots[slotIndex].m_metaRetrieved = 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));
|
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
|
// 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)
|
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
|
if (blockIndex < m_nbOriginalBlocks) // original data
|
||||||
{
|
{
|
||||||
m_decoderSlots[decoderIndex].m_originalBlocks[blockIndex] = superBlock->protectedBlock;
|
m_decoderSlots[decoderIndex].m_cm256DescriptorBlocks[blockCount].Block = (void *) storeOriginalBlock(decoderIndex, blockIndex, superBlock->protectedBlock);
|
||||||
m_decoderSlots[decoderIndex].m_cm256DescriptorBlocks[blockCount].Block = (void *) &m_decoderSlots[decoderIndex].m_originalBlocks[blockIndex];
|
// 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++;
|
m_decoderSlots[decoderIndex].m_originalCount++;
|
||||||
}
|
}
|
||||||
else // recovery data
|
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;
|
qDebug() << "SDRdaemonFECBuffer::writeData: recovered block #" << blockIndex;
|
||||||
} // restore missing blocks
|
} // 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
|
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))
|
if (!(*metaData == m_currentMeta))
|
||||||
{
|
{
|
||||||
|
@ -173,6 +173,7 @@ private:
|
|||||||
|
|
||||||
struct DecoderSlot
|
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_originalBlocks[m_nbOriginalBlocks]; //!< Original blocks retrieved directly or by later FEC
|
||||||
ProtectedBlock m_recoveryBlocks[m_nbOriginalBlocks]; //!< Recovery blocks (FEC blocks) with max size
|
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)
|
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
|
CM256 m_cm256; //!< CM256 library
|
||||||
bool m_cm256_OK; //!< CM256 library initialized OK
|
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 initDecodeAllSlots();
|
||||||
void initReadIndex();
|
void initReadIndex();
|
||||||
void rwCorrectionEstimate(int slotIndex);
|
void rwCorrectionEstimate(int slotIndex);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user