Merge pull request #3070 from asmorkalov:as/hw_optflow_destructor

pull/3091/head
Alexander Alekhin 3 years ago
commit e6ca777196
  1. 35
      modules/cudaoptflow/src/nvidiaOpticalFlow.cpp
  2. 2
      modules/cudaoptflow/test/test_optflow.cpp

@ -314,15 +314,11 @@ private:
NV_OF_CUDA_API_FUNCTION_LIST* GetAPI()
{
std::lock_guard<std::mutex> lock(m_lock);
return m_ofAPI.get();
}
NvOFHandle GetHandle() { return m_hOF; }
protected:
std::mutex m_lock;
public:
NvidiaOpticalFlowImpl(cv::Size imageSize, NV_OF_PERF_LEVEL perfPreset, bool bEnableTemporalHints,
bool bEnableExternalHints, bool bEnableCostBuffer, int gpuId, Stream inputStream, Stream outputStream);
@ -338,6 +334,8 @@ public:
int gridSize, InputOutputArray upsampledFlow);
virtual int getGridSize() const { return m_gridSize; }
~NvidiaOpticalFlowImpl();
};
NvidiaOpticalFlowImpl::NvidiaOpticalFlowImpl(
@ -599,20 +597,24 @@ void NvidiaOpticalFlowImpl::collectGarbage()
if (m_hInputBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hInputBuffer));
m_hInputBuffer = nullptr;
}
if (m_hReferenceBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hReferenceBuffer));
m_hReferenceBuffer = nullptr;
}
if (m_hOutputBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hOutputBuffer));
m_hOutputBuffer = nullptr;
}
if (m_enableExternalHints)
{
if (m_hHintBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hHintBuffer));
m_hHintBuffer = nullptr;
}
}
if (m_enableCostBuffer)
@ -620,6 +622,7 @@ void NvidiaOpticalFlowImpl::collectGarbage()
if (m_hCostBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hCostBuffer));
m_hCostBuffer = nullptr;
}
}
if (m_inputStream)
@ -633,9 +636,15 @@ void NvidiaOpticalFlowImpl::collectGarbage()
if (m_hOF)
{
NVOF_API_CALL(GetAPI()->nvOFDestroy(m_hOF));
m_hOF = nullptr;
}
}
NvidiaOpticalFlowImpl::~NvidiaOpticalFlowImpl()
{
collectGarbage();
}
void NvidiaOpticalFlowImpl::upSampler(InputArray _flow, cv::Size imageSize,
int gridSize, InputOutputArray upsampledFlow)
{
@ -754,15 +763,11 @@ private:
NV_OF_CUDA_API_FUNCTION_LIST* GetAPI()
{
std::lock_guard<std::mutex> lock(m_lock);
return m_ofAPI.get();
}
NvOFHandle GetHandle() { return m_hOF; }
protected:
std::mutex m_lock;
public:
NvidiaOpticalFlowImpl_2(cv::Size imageSize, NV_OF_PERF_LEVEL perfPreset,
NV_OF_OUTPUT_VECTOR_GRID_SIZE outputGridSize, NV_OF_HINT_VECTOR_GRID_SIZE hintGridSize,
@ -778,6 +783,8 @@ public:
virtual void convertToFloat(InputArray flow, InputOutputArray floatFlow);
virtual int getGridSize() const { return m_gridSize; }
~NvidiaOpticalFlowImpl_2();
};
NvidiaOpticalFlowImpl_2::NvidiaOpticalFlowImpl_2(
@ -1149,24 +1156,29 @@ void NvidiaOpticalFlowImpl_2::collectGarbage()
if (m_hInputBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hInputBuffer));
m_hInputBuffer = nullptr;
}
if (m_hReferenceBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hReferenceBuffer));
m_hReferenceBuffer = nullptr;
}
if (m_hOutputBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hOutputBuffer));
m_hOutputBuffer = nullptr;
}
if (m_scaleFactor > 1 && m_hOutputUpScaledBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hOutputUpScaledBuffer));
m_hOutputUpScaledBuffer = nullptr;
}
if (m_enableExternalHints)
{
if (m_hHintBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hHintBuffer));
m_hHintBuffer = nullptr;
}
}
if (m_enableCostBuffer)
@ -1174,6 +1186,7 @@ void NvidiaOpticalFlowImpl_2::collectGarbage()
if (m_hCostBuffer)
{
NVOF_API_CALL(GetAPI()->nvOFDestroyGPUBufferCuda(m_hCostBuffer));
m_hCostBuffer = nullptr;
}
}
if (m_inputStream)
@ -1187,9 +1200,15 @@ void NvidiaOpticalFlowImpl_2::collectGarbage()
if (m_hOF)
{
NVOF_API_CALL(GetAPI()->nvOFDestroy(m_hOF));
m_hOF = nullptr;
}
}
NvidiaOpticalFlowImpl_2::~NvidiaOpticalFlowImpl_2()
{
collectGarbage();
}
void NvidiaOpticalFlowImpl_2::convertToFloat(InputArray _flow, InputOutputArray floatFlow)
{
Mat flow;

@ -605,7 +605,6 @@ CUDA_TEST_P(NvidiaOpticalFlow_2_0, Regression)
ASSERT_FALSE(golden.empty());
EXPECT_MAT_SIMILAR(golden, upsampledFlow, 1e-10);
d_nvof->collectGarbage();
}
CUDA_TEST_P(NvidiaOpticalFlow_2_0, OpticalFlowNan)
@ -640,7 +639,6 @@ CUDA_TEST_P(NvidiaOpticalFlow_2_0, OpticalFlowNan)
EXPECT_TRUE(cv::checkRange(flowx));
EXPECT_TRUE(cv::checkRange(flowy));
d_nvof->collectGarbage();
};
INSTANTIATE_TEST_CASE_P(CUDA_OptFlow, NvidiaOpticalFlow_2_0, ALL_DEVICES);

Loading…
Cancel
Save