diff --git a/Detectors/TOF/compression/include/TOFCompression/CompressorTask.h b/Detectors/TOF/compression/include/TOFCompression/CompressorTask.h index 0bd9adb6b0e0b..8857a5ccc6358 100644 --- a/Detectors/TOF/compression/include/TOFCompression/CompressorTask.h +++ b/Detectors/TOF/compression/include/TOFCompression/CompressorTask.h @@ -32,16 +32,14 @@ template class CompressorTask : public Task { public: - CompressorTask() { mBufferOut = new char[mBufferOutSize]; }; - ~CompressorTask() override { delete[] mBufferOut; }; + CompressorTask() = default; + ~CompressorTask() override = default; void init(InitContext& ic) final; void run(ProcessingContext& pc) final; private: Compressor mCompressor; - - char* mBufferOut = nullptr; - const int mBufferOutSize = 33554432; + int mOutputBufferSize; }; } // namespace tof diff --git a/Detectors/TOF/compression/src/CompressorTask.cxx b/Detectors/TOF/compression/src/CompressorTask.cxx index 7e4d5854daec8..4ecfd2b68a0db 100644 --- a/Detectors/TOF/compression/src/CompressorTask.cxx +++ b/Detectors/TOF/compression/src/CompressorTask.cxx @@ -38,6 +38,7 @@ void CompressorTask::init(InitContext& ic) auto decoderVerbose = ic.options().get("tof-compressor-decoder-verbose"); auto encoderVerbose = ic.options().get("tof-compressor-encoder-verbose"); auto checkerVerbose = ic.options().get("tof-compressor-checker-verbose"); + mOutputBufferSize = ic.options().get("tof-compressor-output-buffer-size"); mCompressor.setDecoderCONET(decoderCONET); mCompressor.setDecoderVerbose(decoderVerbose); @@ -56,10 +57,6 @@ void CompressorTask::run(ProcessingContext& pc) { LOG(DEBUG) << "Compressor run"; - /** set encoder output buffer **/ - mCompressor.setEncoderBuffer(mBufferOut); - mCompressor.setEncoderBufferSize(mBufferOutSize); - auto device = pc.services().get().device(); auto outputRoutes = pc.services().get().spec().outputs; auto fairMQChannel = outputRoutes.at(0).channel; @@ -76,18 +73,24 @@ void CompressorTask::run(ProcessingContext& pc) /** loop over input parts **/ for (auto const& ref : iit) { + /** input **/ auto headerIn = DataRefUtils::getHeader(ref); auto dataProcessingHeaderIn = DataRefUtils::getHeader(ref); auto payloadIn = ref.payload; auto payloadInSize = headerIn->payloadSize; + + /** prepare **/ + auto bufferSize = mOutputBufferSize > 0 ? mOutputBufferSize : payloadInSize; + auto payloadMessage = device->NewMessage(bufferSize); mCompressor.setDecoderBuffer(payloadIn); mCompressor.setDecoderBufferSize(payloadInSize); + mCompressor.setEncoderBuffer((char*)payloadMessage->GetData()); + mCompressor.setEncoderBufferSize(bufferSize); /** run **/ mCompressor.run(); auto payloadOutSize = mCompressor.getEncoderByteCounter(); - auto payloadMessage = device->NewMessage(payloadOutSize); - std::memcpy(payloadMessage->GetData(), mBufferOut, payloadOutSize); + payloadMessage->SetUsedSize(payloadOutSize); /** output **/ auto headerOut = *headerIn; diff --git a/Detectors/TOF/compression/src/tof-compressor.cxx b/Detectors/TOF/compression/src/tof-compressor.cxx index 15ab4be396642..8483702c5843c 100644 --- a/Detectors/TOF/compression/src/tof-compressor.cxx +++ b/Detectors/TOF/compression/src/tof-compressor.cxx @@ -93,6 +93,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) outputs, algoSpec, Options{ + {"tof-compressor-output-buffer-size", VariantType::Int, 0, {"Encoder output buffer size (in bytes). Zero = automatic (careful)."}}, {"tof-compressor-conet-mode", VariantType::Bool, false, {"Decoder CONET flag"}}, {"tof-compressor-decoder-verbose", VariantType::Bool, false, {"Decoder verbose flag"}}, {"tof-compressor-encoder-verbose", VariantType::Bool, false, {"Encoder verbose flag"}},