Merge pull request #3339 from cudawarped:cudacodec_fix_memory_leak

Fix memory leak in cudacodec
pull/2198/merge
Alexander Smorkalov 3 years ago committed by GitHub
commit 94d15ee5c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      modules/cudacodec/src/frame_queue.cpp
  2. 9
      modules/cudacodec/src/frame_queue.hpp
  3. 5
      modules/cudacodec/src/video_reader.cpp

@ -45,10 +45,8 @@
#ifdef HAVE_NVCUVID
RawPacket::RawPacket(const unsigned char* _data, const size_t _size, const bool _containsKeyFrame) : size(_size), containsKeyFrame(_containsKeyFrame) {
data = cv::makePtr<unsigned char*>(new unsigned char[size]);
memcpy(*data, _data, size);
};
RawPacket::RawPacket(const unsigned char* data_, const size_t size, const bool containsKeyFrame_) :
data(data_,data_ + size), containsKeyFrame(containsKeyFrame_) {};
cv::cudacodec::detail::FrameQueue::~FrameQueue() {
if (isFrameInUse_)

@ -50,11 +50,12 @@
class RawPacket {
public:
RawPacket(const unsigned char* _data, const size_t _size = 0, const bool _containsKeyFrame = false);
unsigned char* Data() const { return *data; }
size_t size;
bool containsKeyFrame;
const unsigned char* Data() const noexcept { return data.data(); }
size_t Size() const noexcept { return data.size(); }
bool ContainsKeyFrame() const noexcept { return containsKeyFrame; }
private:
cv::Ptr<unsigned char*> data = 0;
std::vector<unsigned char> data;
bool containsKeyFrame = false;
};
namespace cv { namespace cudacodec { namespace detail {

@ -256,7 +256,8 @@ namespace
if (idx >= rawPacketsBaseIdx && idx < rawPacketsBaseIdx + rawPackets.size()) {
if (!frame.isMat())
CV_Error(Error::StsUnsupportedFormat, "Raw data is stored on the host and must be retrieved using a cv::Mat");
Mat tmp(1, rawPackets.at(idx - rawPacketsBaseIdx).size, CV_8UC1, rawPackets.at(idx - rawPacketsBaseIdx).Data(), rawPackets.at(idx - rawPacketsBaseIdx).size);
const size_t i = idx - rawPacketsBaseIdx;
Mat tmp(1, rawPackets.at(i).Size(), CV_8UC1, const_cast<unsigned char*>(rawPackets.at(i).Data()), rawPackets.at(i).Size());
frame.getMatRef() = tmp;
}
}
@ -301,7 +302,7 @@ namespace
case VideoReaderProps::PROP_LRF_HAS_KEY_FRAME: {
const int iPacket = propertyVal - rawPacketsBaseIdx;
if (videoSource_->RawModeEnabled() && iPacket >= 0 && iPacket < rawPackets.size()) {
propertyVal = rawPackets.at(iPacket).containsKeyFrame;
propertyVal = rawPackets.at(iPacket).ContainsKeyFrame();
return true;
}
else

Loading…
Cancel
Save