PyNvVideoCodec: Memory Leak

There is a slow but consistent memory leak in PyNvVideoCodec, present in at least v2.0.2 and v2.0.3, where shape and stride arrays are created but never freed in src/PyNvVideoCodec/src/ExternalBuffer.cpp::ExternalBuffer::LoadDLPack. The following patch fixes the issue. We’re building our own wheel for now, but it would be great to see this resolved in a future version!

```
diff --git a/src/PyNvVideoCodec/inc/DLPackUtils.hpp b/src/PyNvVideoCodec/inc/DLPackUtils.hpp
index 4ef4d98..7008be4 100644
— a/src/PyNvVideoCodec/inc/DLPackUtils.hpp
+++ b/src/PyNvVideoCodec/inc/DLPackUtils.hpp
@@ -52,6 +52,8 @@ public:
const DLTensor &operator*() const;
DLTensor &operator*();

  • void SetDeleter(void (*deleter)(DLManagedTensor*));

private:
DLManagedTensor m_tensor;
};
diff --git a/src/PyNvVideoCodec/src/DLPackUtils.cpp b/src/PyNvVideoCodec/src/DLPackUtils.cpp
index d7f3259..deef16c 100644
— a/src/PyNvVideoCodec/src/DLPackUtils.cpp
+++ b/src/PyNvVideoCodec/src/DLPackUtils.cpp
@@ -186,6 +186,11 @@ const DLTensor &DLPackTensor::operator*() const
return m_tensor.dl_tensor;
}

+void DLPackTensor::SetDeleter(void (*deleter)(DLManagedTensor*))
+{

  • m_tensor.deleter = deleter;
    +}

DLTensor &DLPackTensor::operator*()
{
return m_tensor.dl_tensor;
diff --git a/src/PyNvVideoCodec/src/ExternalBuffer.cpp b/src/PyNvVideoCodec/src/ExternalBuffer.cpp
index 36e7c6d..1a9b01a 100644
— a/src/PyNvVideoCodec/src/ExternalBuffer.cpp
+++ b/src/PyNvVideoCodec/src/ExternalBuffer.cpp
@@ -34,6 +34,17 @@

using namespace py::literals;

+namespace
+{
+void DeleteTensorMetadata(DLManagedTensor* tensor)
+{

  • delete tensor->dl_tensor.shape;
  • tensor->dl_tensor.shape = nullptr;
  • delete tensor->dl_tensor.strides;
  • tensor->dl_tensor.strides = nullptr;
    +}
    +}

ExternalBuffer::ExternalBuffer(DLPackTensor &&dlTensor)
{
if (!IsCudaAccessible(dlTensor->device.device_type))
@@ -245,5 +256,6 @@ int ExternalBuffer::LoadDLPack(std::vector<size_t> _shape, std::vector<size_t> _
m_dlTensor->strides[i] = _stride[i];
}

  • m_dlTensor.SetDeleter(&DeleteTensorMetadata);
    return 0;
    }
    ```

See also pynvvideocodec-builder/patch at master · commaai/pynvvideocodec-builder · GitHub , since the code block above didn’t quite format correctly

Hi @mitchell17
thanks for reporting this, we are actively debugging this problem

Hi @mitchell17 ,
We have addressed this issue in the latest release (v2.1.0).
Kindly use the latest wheels from Pypi