1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-24 03:02:29 -04:00

FileRecord improvement: fixed header packing and CRC32 computation

This commit is contained in:
f4exb 2018-10-09 16:40:57 +02:00
parent cc49d5c266
commit 38aa1a8e77
3 changed files with 57 additions and 42 deletions

View File

@ -86,24 +86,25 @@ void FileSourceInput::openFileStream()
if (fileSize > sizeof(FileRecord::Header)) if (fileSize > sizeof(FileRecord::Header))
{ {
// TODO: add CRC // TODO: add CRC
m_ifstream.seekg(0,std::ios_base::beg);
FileRecord::Header header; FileRecord::Header header;
m_ifstream.seekg(0,std::ios_base::beg);
if (FileRecord::readHeader(m_ifstream, header)) // CRC OK bool crcOK = FileRecord::readHeader(m_ifstream, header);
{
m_sampleRate = header.sampleRate; m_sampleRate = header.sampleRate;
m_centerFrequency = header.centerFrequency; m_centerFrequency = header.centerFrequency;
m_startingTimeStamp = header.startTimeStamp; m_startingTimeStamp = header.startTimeStamp;
m_sampleSize = header.sampleSize; m_sampleSize = header.sampleSize;
QString crcHex = QString("%1").arg(header.crc32 , 0, 16);
if (crcOK)
{
qDebug("FileSourceInput::openFileStream: CRC32 OK for header: %s", qPrintable(crcHex));
m_recordLength = (fileSize - sizeof(FileRecord::Header)) / ((m_sampleSize == 24 ? 8 : 4) * m_sampleRate); m_recordLength = (fileSize - sizeof(FileRecord::Header)) / ((m_sampleSize == 24 ? 8 : 4) * m_sampleRate);
} }
else else
{ {
qCritical("FileSourceInput::openFileStream: bad CRC header"); qCritical("FileSourceInput::openFileStream: bad CRC32 for header: %s", qPrintable(crcHex));
m_recordLength = 0; m_recordLength = 0;
} }
} }
else else
{ {
@ -112,7 +113,10 @@ void FileSourceInput::openFileStream()
qDebug() << "FileSourceInput::openFileStream: " << m_fileName.toStdString().c_str() qDebug() << "FileSourceInput::openFileStream: " << m_fileName.toStdString().c_str()
<< " fileSize: " << fileSize << " bytes" << " fileSize: " << fileSize << " bytes"
<< " length: " << m_recordLength << " seconds"; << " length: " << m_recordLength << " seconds"
<< " sample rate: " << m_sampleRate << " S/s"
<< " center frequency: " << m_centerFrequency << " Hz"
<< " sample size: " << m_sampleSize << " bits";
if (getMessageQueueToGUI()) { if (getMessageQueueToGUI()) {
MsgReportFileSourceStreamData *report = MsgReportFileSourceStreamData::create(m_sampleRate, MsgReportFileSourceStreamData *report = MsgReportFileSourceStreamData::create(m_sampleRate,

View File

@ -55,19 +55,28 @@ func writeHeader(writer *bufio.Writer, header *HeaderStd) {
fmt.Printf("Wrote %d bytes header\n", noh) fmt.Printf("Wrote %d bytes header\n", noh)
} }
func setCRC(header *HeaderStd) {
var bin_buf bytes.Buffer
header.Filler = 0
binary.Write(&bin_buf, binary.LittleEndian, header)
header.CRC32 = crc32.ChecksumIEEE(bin_buf.Bytes()[0:28])
}
func getCRC(header *HeaderStd) uint32 {
var bin_buf bytes.Buffer
header.Filler = 0
binary.Write(&bin_buf, binary.LittleEndian, header)
return crc32.ChecksumIEEE(bin_buf.Bytes()[0:28])
}
func printHeader(header *HeaderStd) { func printHeader(header *HeaderStd) {
fmt.Println("Sample rate:", header.SampleRate) fmt.Println("Sample rate:", header.SampleRate)
fmt.Println("Frequency :", header.CenterFrequency) fmt.Println("Frequency :", header.CenterFrequency)
fmt.Println("Sample Size:", header.SampleSize) fmt.Println("Sample Size:", header.SampleSize)
tm := time.Unix(header.StartTimestamp, 0) tm := time.Unix(header.StartTimestamp, 0)
fmt.Println("Start :", tm) fmt.Println("Start :", tm)
} fmt.Println("CRC32 :", header.CRC32)
fmt.Println("CRC32 OK :", getCRC(header))
func setCRC(header *HeaderStd) {
var bin_buf bytes.Buffer
header.Filler = 0
binary.Write(&bin_buf, binary.LittleEndian, header)
header.CRC32 = crc32.ChecksumIEEE(bin_buf.Bytes()[0:28])
} }
func copyContent(reader *bufio.Reader, writer *bufio.Writer, blockSize uint) { func copyContent(reader *bufio.Reader, writer *bufio.Writer, blockSize uint) {

View File

@ -30,6 +30,7 @@ class Message;
class SDRBASE_API FileRecord : public BasebandSampleSink { class SDRBASE_API FileRecord : public BasebandSampleSink {
public: public:
#pragma pack(push, 1)
struct Header struct Header
{ {
quint32 sampleRate; quint32 sampleRate;
@ -39,6 +40,7 @@ public:
quint32 filler; quint32 filler;
quint32 crc32; quint32 crc32;
}; };
#pragma pack(pop)
FileRecord(); FileRecord();
FileRecord(const QString& filename); FileRecord(const QString& filename);