Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(719)

Unified Diff: webrtc/modules/video_coding/packet_buffer.cc

Issue 2535203002: Fix memory leak in video_coding::PacketBuffer::InsertPacket. (Closed)
Patch Set: Feedback fix. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/video_coding/packet_buffer.cc
diff --git a/webrtc/modules/video_coding/packet_buffer.cc b/webrtc/modules/video_coding/packet_buffer.cc
index c9d787b6e66184b0f1c0690227d5743397d5c54b..03aeb5a4a9691e7fd867aada0b97628e272fd71c 100644
--- a/webrtc/modules/video_coding/packet_buffer.cc
+++ b/webrtc/modules/video_coding/packet_buffer.cc
@@ -56,11 +56,11 @@ PacketBuffer::~PacketBuffer() {
Clear();
}
-bool PacketBuffer::InsertPacket(const VCMPacket& packet) {
+bool PacketBuffer::InsertPacket(VCMPacket* packet) {
std::vector<std::unique_ptr<RtpFrameObject>> found_frames;
{
rtc::CritScope lock(&crit_);
- uint16_t seq_num = packet.seqNum;
+ uint16_t seq_num = packet->seqNum;
size_t index = seq_num % size_;
if (!first_packet_received_) {
@@ -70,16 +70,22 @@ bool PacketBuffer::InsertPacket(const VCMPacket& packet) {
} else if (AheadOf(first_seq_num_, seq_num)) {
// If we have explicitly cleared past this packet then it's old,
// don't insert it.
- if (is_cleared_to_first_seq_num_)
+ if (is_cleared_to_first_seq_num_) {
+ delete[] packet->dataPtr;
+ packet->dataPtr = nullptr;
return false;
+ }
first_seq_num_ = seq_num;
}
if (sequence_buffer_[index].used) {
- // Duplicate packet, do nothing.
- if (data_buffer_[index].seqNum == packet.seqNum)
+ // Duplicate packet, just delete the payload.
+ if (data_buffer_[index].seqNum == packet->seqNum) {
+ delete[] packet->dataPtr;
+ packet->dataPtr = nullptr;
return true;
+ }
// The packet buffer is full, try to expand the buffer.
while (ExpandBufferSize() && sequence_buffer_[seq_num % size_].used) {
@@ -87,20 +93,24 @@ bool PacketBuffer::InsertPacket(const VCMPacket& packet) {
index = seq_num % size_;
// Packet buffer is still full.
- if (sequence_buffer_[index].used)
+ if (sequence_buffer_[index].used) {
+ delete[] packet->dataPtr;
+ packet->dataPtr = nullptr;
return false;
+ }
}
if (AheadOf(seq_num, last_seq_num_))
last_seq_num_ = seq_num;
- sequence_buffer_[index].frame_begin = packet.isFirstPacket;
- sequence_buffer_[index].frame_end = packet.markerBit;
- sequence_buffer_[index].seq_num = packet.seqNum;
+ sequence_buffer_[index].frame_begin = packet->isFirstPacket;
+ sequence_buffer_[index].frame_end = packet->markerBit;
+ sequence_buffer_[index].seq_num = packet->seqNum;
sequence_buffer_[index].continuous = false;
sequence_buffer_[index].frame_created = false;
sequence_buffer_[index].used = true;
- data_buffer_[index] = packet;
+ data_buffer_[index] = *packet;
+ packet->dataPtr = nullptr;
found_frames = FindFrames(seq_num);
}
« no previous file with comments | « webrtc/modules/video_coding/packet_buffer.h ('k') | webrtc/modules/video_coding/rtp_frame_reference_finder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698