Skip to content

Commit 94d15ee

Browse files
authored
Merge pull request #3339 from cudawarped:cudacodec_fix_memory_leak
Fix memory leak in cudacodec
2 parents 74fce7f + 6573353 commit 94d15ee

File tree

3 files changed

+10
-10
lines changed

3 files changed

+10
-10
lines changed

modules/cudacodec/src/frame_queue.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,8 @@
4545

4646
#ifdef HAVE_NVCUVID
4747

48-
RawPacket::RawPacket(const unsigned char* _data, const size_t _size, const bool _containsKeyFrame) : size(_size), containsKeyFrame(_containsKeyFrame) {
49-
data = cv::makePtr<unsigned char*>(new unsigned char[size]);
50-
memcpy(*data, _data, size);
51-
};
48+
RawPacket::RawPacket(const unsigned char* data_, const size_t size, const bool containsKeyFrame_) :
49+
data(data_,data_ + size), containsKeyFrame(containsKeyFrame_) {};
5250

5351
cv::cudacodec::detail::FrameQueue::~FrameQueue() {
5452
if (isFrameInUse_)

modules/cudacodec/src/frame_queue.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,12 @@
5050
class RawPacket {
5151
public:
5252
RawPacket(const unsigned char* _data, const size_t _size = 0, const bool _containsKeyFrame = false);
53-
unsigned char* Data() const { return *data; }
54-
size_t size;
55-
bool containsKeyFrame;
53+
const unsigned char* Data() const noexcept { return data.data(); }
54+
size_t Size() const noexcept { return data.size(); }
55+
bool ContainsKeyFrame() const noexcept { return containsKeyFrame; }
5656
private:
57-
cv::Ptr<unsigned char*> data = 0;
57+
std::vector<unsigned char> data;
58+
bool containsKeyFrame = false;
5859
};
5960

6061
namespace cv { namespace cudacodec { namespace detail {

modules/cudacodec/src/video_reader.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,8 @@ namespace
256256
if (idx >= rawPacketsBaseIdx && idx < rawPacketsBaseIdx + rawPackets.size()) {
257257
if (!frame.isMat())
258258
CV_Error(Error::StsUnsupportedFormat, "Raw data is stored on the host and must be retrieved using a cv::Mat");
259-
Mat tmp(1, rawPackets.at(idx - rawPacketsBaseIdx).size, CV_8UC1, rawPackets.at(idx - rawPacketsBaseIdx).Data(), rawPackets.at(idx - rawPacketsBaseIdx).size);
259+
const size_t i = idx - rawPacketsBaseIdx;
260+
Mat tmp(1, rawPackets.at(i).Size(), CV_8UC1, const_cast<unsigned char*>(rawPackets.at(i).Data()), rawPackets.at(i).Size());
260261
frame.getMatRef() = tmp;
261262
}
262263
}
@@ -301,7 +302,7 @@ namespace
301302
case VideoReaderProps::PROP_LRF_HAS_KEY_FRAME: {
302303
const int iPacket = propertyVal - rawPacketsBaseIdx;
303304
if (videoSource_->RawModeEnabled() && iPacket >= 0 && iPacket < rawPackets.size()) {
304-
propertyVal = rawPackets.at(iPacket).containsKeyFrame;
305+
propertyVal = rawPackets.at(iPacket).ContainsKeyFrame();
305306
return true;
306307
}
307308
else

0 commit comments

Comments
 (0)