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 df173504ff79af6be8ee667269e84596a45f270e..0d36b9c3c97ea439c714cf7f8b37656bc563326d 100644 |
--- a/webrtc/modules/video_coding/packet_buffer.cc |
+++ b/webrtc/modules/video_coding/packet_buffer.cc |
@@ -12,7 +12,9 @@ |
#include <algorithm> |
#include <limits> |
+#include <utility> |
+#include "webrtc/base/atomicops.h" |
#include "webrtc/base/checks.h" |
#include "webrtc/base/logging.h" |
#include "webrtc/modules/video_coding/frame_object.h" |
@@ -21,10 +23,19 @@ |
namespace webrtc { |
namespace video_coding { |
+rtc::scoped_refptr<PacketBuffer> PacketBuffer::Create( |
+ Clock* clock, |
+ size_t start_buffer_size, |
+ size_t max_buffer_size, |
+ OnReceivedFrameCallback* received_frame_callback) { |
+ return rtc::scoped_refptr<PacketBuffer>(new PacketBuffer( |
+ clock, start_buffer_size, max_buffer_size, received_frame_callback)); |
+} |
+ |
PacketBuffer::PacketBuffer(Clock* clock, |
size_t start_buffer_size, |
size_t max_buffer_size, |
- OnCompleteFrameCallback* frame_callback) |
+ OnReceivedFrameCallback* received_frame_callback) |
: clock_(clock), |
size_(start_buffer_size), |
max_size_(max_buffer_size), |
@@ -33,13 +44,15 @@ PacketBuffer::PacketBuffer(Clock* clock, |
first_packet_received_(false), |
data_buffer_(start_buffer_size), |
sequence_buffer_(start_buffer_size), |
- reference_finder_(frame_callback) { |
+ received_frame_callback_(received_frame_callback) { |
RTC_DCHECK_LE(start_buffer_size, max_buffer_size); |
// Buffer size must always be a power of 2. |
RTC_DCHECK((start_buffer_size & (start_buffer_size - 1)) == 0); |
RTC_DCHECK((max_buffer_size & (max_buffer_size - 1)) == 0); |
} |
+PacketBuffer::~PacketBuffer() {} |
+ |
bool PacketBuffer::InsertPacket(const VCMPacket& packet) { |
rtc::CritScope lock(&crit_); |
uint16_t seq_num = packet.seqNum; |
@@ -69,12 +82,6 @@ bool PacketBuffer::InsertPacket(const VCMPacket& packet) { |
if (AheadOf(seq_num, last_seq_num_)) |
last_seq_num_ = seq_num; |
- // If this is a padding or FEC packet, don't insert it. |
- if (packet.sizeBytes == 0) { |
- reference_finder_.PaddingReceived(packet.seqNum); |
- return true; |
- } |
- |
sequence_buffer_[index].frame_begin = packet.isFirstPacket; |
sequence_buffer_[index].frame_end = packet.markerBit; |
sequence_buffer_[index].seq_num = packet.seqNum; |
@@ -169,7 +176,8 @@ void PacketBuffer::FindFrames(uint16_t seq_num) { |
std::unique_ptr<RtpFrameObject> frame( |
new RtpFrameObject(this, start_seq_num, seq_num, frame_size, |
max_nack_count, clock_->TimeInMilliseconds())); |
- reference_finder_.ManageFrame(std::move(frame)); |
+ |
+ received_frame_callback_->OnReceivedFrame(std::move(frame)); |
} |
index = (index + 1) % size_; |
@@ -239,5 +247,17 @@ void PacketBuffer::Clear() { |
first_packet_received_ = false; |
} |
+int PacketBuffer::AddRef() const { |
+ return rtc::AtomicOps::Increment(&ref_count_); |
+} |
+ |
+int PacketBuffer::Release() const { |
+ int count = rtc::AtomicOps::Decrement(&ref_count_); |
+ if (!count) { |
+ delete this; |
+ } |
+ return count; |
+} |
+ |
} // namespace video_coding |
} // namespace webrtc |