From 650a61930ca45ef28ac2f2729da65a4b926371da Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Tue, 13 Feb 2024 18:39:11 +0100 Subject: [PATCH] fix SDR++ server crash at high samplerates #1326 --- core/src/dsp/compression/sample_stream_compressor.h | 4 ++++ core/src/server.cpp | 2 +- .../sdrpp_server_source/src/sdrpp_server_client.cpp | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/core/src/dsp/compression/sample_stream_compressor.h b/core/src/dsp/compression/sample_stream_compressor.h index 69b5cbbf..8e79b8bf 100644 --- a/core/src/dsp/compression/sample_stream_compressor.h +++ b/core/src/dsp/compression/sample_stream_compressor.h @@ -12,6 +12,10 @@ namespace dsp::compression { void init(stream* in, PCMType pcmType) { _pcmType = pcmType; + + // Set the output buffer size to the max size of a complex buffer + 8 bytes for the header + out.setBufferSize(STREAM_BUFFER_SIZE*sizeof(complex_t) + 8); + base_type::init(in); } diff --git a/core/src/server.cpp b/core/src/server.cpp index a780a384..501198c3 100644 --- a/core/src/server.cpp +++ b/core/src/server.cpp @@ -230,7 +230,7 @@ namespace server { // Compress data if needed and fill out header fields if (compression) { bb_pkt_hdr->type = PACKET_TYPE_BASEBAND_COMPRESSED; - bb_pkt_hdr->size = sizeof(PacketHeader) + (uint32_t)ZSTD_compressCCtx(cctx, &bbuf[sizeof(PacketHeader)], SERVER_MAX_PACKET_SIZE, data, count, 1); + bb_pkt_hdr->size = sizeof(PacketHeader) + (uint32_t)ZSTD_compressCCtx(cctx, &bbuf[sizeof(PacketHeader)], SERVER_MAX_PACKET_SIZE-sizeof(PacketHeader), data, count, 1); } else { bb_pkt_hdr->type = PACKET_TYPE_BASEBAND; diff --git a/source_modules/sdrpp_server_source/src/sdrpp_server_client.cpp b/source_modules/sdrpp_server_source/src/sdrpp_server_client.cpp index 0e25efe7..9b1e63d5 100644 --- a/source_modules/sdrpp_server_source/src/sdrpp_server_client.cpp +++ b/source_modules/sdrpp_server_source/src/sdrpp_server_client.cpp @@ -30,7 +30,7 @@ namespace server { dctx = ZSTD_createDCtx(); // Initialize DSP - decompIn.setBufferSize((sizeof(dsp::complex_t) * STREAM_BUFFER_SIZE) + 8); + decompIn.setBufferSize(STREAM_BUFFER_SIZE*sizeof(dsp::complex_t) + 8); decompIn.clearWriteStop(); decomp.init(&decompIn); link.init(&decomp.out, output); @@ -209,7 +209,7 @@ namespace server { if (!decompIn.swap(r_pkt_hdr->size - sizeof(PacketHeader))) { break; } } else if (r_pkt_hdr->type == PACKET_TYPE_BASEBAND_COMPRESSED) { - size_t outCount = ZSTD_decompressDCtx(dctx, decompIn.writeBuf, STREAM_BUFFER_SIZE, r_pkt_data, r_pkt_hdr->size - sizeof(PacketHeader)); + size_t outCount = ZSTD_decompressDCtx(dctx, decompIn.writeBuf, STREAM_BUFFER_SIZE*sizeof(dsp::complex_t)+8, r_pkt_data, r_pkt_hdr->size - sizeof(PacketHeader)); if (outCount) { if (!decompIn.swap(outCount)) { break; } };