diff options
| author | Brian Potchik <brian@vector35.com> | 2025-10-18 21:44:07 -0400 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2025-10-18 21:44:07 -0400 |
| commit | 419e7ef52e4d0374f19c2836b4eb358359713d57 (patch) | |
| tree | eacfaa2cf79546f103f63683a08d986f08ef9c4e /view/kernelcache | |
| parent | 7cb009413ced6607194ff76d43f4d22c687c1d2d (diff) | |
Add DecodeWithContext to LZFSETransform.
Diffstat (limited to 'view/kernelcache')
| -rw-r--r-- | view/kernelcache/core/transformers/KernelCacheTransforms.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/view/kernelcache/core/transformers/KernelCacheTransforms.cpp b/view/kernelcache/core/transformers/KernelCacheTransforms.cpp index 9e7f97ff..d15169c1 100644 --- a/view/kernelcache/core/transformers/KernelCacheTransforms.cpp +++ b/view/kernelcache/core/transformers/KernelCacheTransforms.cpp @@ -248,6 +248,40 @@ public: return false; } + + virtual bool DecodeWithContext(Ref<TransformContext> context, const std::map<std::string, DataBuffer>& params) override + { + if (!context || !context->GetInput()) + return false; + + const uint8_t* dataPtr = context->GetInput()->GetDataPointer(); + size_t dataLength = context->GetInput()->GetDataLength(); + if (!dataPtr || !dataLength) + return false; + + size_t outputBufferSize = dataLength * 6; + std::unique_ptr<uint8_t[]> scratchBuffer(new uint8_t[lzfse_decode_scratch_size()]); + while (true) + { + DataBuffer output(outputBufferSize); + size_t outSize = lzfse_decode_buffer((uint8_t *)output.GetData(), outputBufferSize, (uint8_t *)dataPtr, dataLength, scratchBuffer.get()); + if (!outSize) + return false; + if ((outSize > 0) && (outSize < outputBufferSize)) + { + output.SetSize(outSize); + context->SetChild(output, ""); + return true; + } + if (output.GetLength() > (size_t(1) << 33)) // 8GB max + return false; + outputBufferSize *= 2; + } + + return false; + } + + virtual bool Encode(const DataBuffer& input, DataBuffer& output, const std::map<std::string, DataBuffer>&) override { size_t outputBufferSize = input.GetLength() + (input.GetLength() / 16) + 64; |
