diff options
| author | Brian Potchik <brian@vector35.com> | 2025-10-03 18:48:17 -0400 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2025-10-03 18:48:17 -0400 |
| commit | 0fb07c24d8321bdec2d5d5a254acbb9ceaee807a (patch) | |
| tree | 181ed447398789d8f4d31614ee3edb8d81ebb0af /view/kernelcache | |
| parent | 183ef5e2f0ba6124efac98efba67757f1e8b2aa9 (diff) | |
Add zero-copy data pointer access for BinaryData objects for API-side container transforms.
Diffstat (limited to 'view/kernelcache')
| -rw-r--r-- | view/kernelcache/core/transformers/KernelCacheTransforms.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/view/kernelcache/core/transformers/KernelCacheTransforms.cpp b/view/kernelcache/core/transformers/KernelCacheTransforms.cpp index 6158e7ad..be06ad9e 100644 --- a/view/kernelcache/core/transformers/KernelCacheTransforms.cpp +++ b/view/kernelcache/core/transformers/KernelCacheTransforms.cpp @@ -41,11 +41,14 @@ public: if (!context || !context->GetInput()) return false; - // TODO: DataBuffers are not zero-copy, so this is inefficient. Investigate a better way. - auto input = context->GetInput()->ReadBuffer(0, context->GetInput()->GetLength()); + const uint8_t* dataPtr = context->GetInput()->GetDataPointer(); + size_t dataLength = context->GetInput()->GetDataLength(); + if (!dataPtr || !dataLength) + return false; + DERItem item = {}; - item.data = (DERByte *)input.GetData(); - item.length = static_cast<DERSize>(std::min(input.GetLength(), (size_t)std::numeric_limits<DERSize>::max())); + item.data = (DERByte *)dataPtr; + item.length = static_cast<DERSize>(std::min(dataLength, (size_t)std::numeric_limits<DERSize>::max())); Img4Payload payload = {}; if (auto result = DERImg4DecodePayload(&item, &payload); (result != DR_Success) && (result != DR_DecodeError)) return false; |
