| 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 0d36b9c3c97ea439c714cf7f8b37656bc563326d..bd0cf75548eeb2203de6f467762f30164aafa7a1 100644
|
| --- a/webrtc/modules/video_coding/packet_buffer.cc
|
| +++ b/webrtc/modules/video_coding/packet_buffer.cc
|
| @@ -90,6 +90,16 @@ bool PacketBuffer::InsertPacket(const VCMPacket& packet) {
|
| sequence_buffer_[index].used = true;
|
| data_buffer_[index] = packet;
|
|
|
| + // Since the data pointed to by |packet.dataPtr| is non-persistent the
|
| + // data has to be copied to its own buffer.
|
| + // TODO(philipel): Take ownership instead of copying payload when
|
| + // bitstream-fixing has been implemented.
|
| + if (packet.sizeBytes) {
|
| + uint8_t* payload = new uint8_t[packet.sizeBytes];
|
| + memcpy(payload, packet.dataPtr, packet.sizeBytes);
|
| + data_buffer_[index].dataPtr = payload;
|
| + }
|
| +
|
| FindFrames(seq_num);
|
| return true;
|
| }
|
| @@ -99,7 +109,9 @@ void PacketBuffer::ClearTo(uint16_t seq_num) {
|
| size_t index = first_seq_num_ % size_;
|
| while (AheadOf<uint16_t>(seq_num, first_seq_num_ + 1)) {
|
| index = (index + 1) % size_;
|
| - first_seq_num_ = Add<1 << 16>(first_seq_num_, 1);
|
| + ++first_seq_num_;
|
| + delete[] data_buffer_[index].dataPtr;
|
| + data_buffer_[index].dataPtr = nullptr;
|
| sequence_buffer_[index].used = false;
|
| }
|
| }
|
| @@ -191,8 +203,11 @@ void PacketBuffer::ReturnFrame(RtpFrameObject* frame) {
|
| size_t end = (frame->last_seq_num() + 1) % size_;
|
| uint16_t seq_num = frame->first_seq_num();
|
| while (index != end) {
|
| - if (sequence_buffer_[index].seq_num == seq_num)
|
| + if (sequence_buffer_[index].seq_num == seq_num) {
|
| + delete[] data_buffer_[index].dataPtr;
|
| + data_buffer_[index].dataPtr = nullptr;
|
| sequence_buffer_[index].used = false;
|
| + }
|
|
|
| index = (index + 1) % size_;
|
| ++seq_num;
|
|
|