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

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

Issue 2480293002: New jitter buffer experiment. (Closed)
Patch Set: Nit 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 58ad31e50cefda7c959cdeffb08d22b61e795c94..1b6fecc3856883bb24c8bf14f21e29241e86cf27 100644
--- a/webrtc/modules/video_coding/packet_buffer.cc
+++ b/webrtc/modules/video_coding/packet_buffer.cc
@@ -57,50 +57,57 @@ PacketBuffer::~PacketBuffer() {
}
bool PacketBuffer::InsertPacket(const VCMPacket& packet) {
- rtc::CritScope lock(&crit_);
- uint16_t seq_num = packet.seqNum;
- size_t index = seq_num % size_;
+ std::vector<std::unique_ptr<RtpFrameObject>> found_frames;
+ {
+ rtc::CritScope lock(&crit_);
+ uint16_t seq_num = packet.seqNum;
+ size_t index = seq_num % size_;
- if (!first_packet_received_) {
- first_seq_num_ = seq_num;
- last_seq_num_ = seq_num;
- first_packet_received_ = true;
- } 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_)
- return false;
+ if (!first_packet_received_) {
+ first_seq_num_ = seq_num;
+ last_seq_num_ = seq_num;
+ first_packet_received_ = true;
+ } 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_)
+ return false;
+
+ first_seq_num_ = seq_num;
+ }
- first_seq_num_ = seq_num;
- }
+ if (sequence_buffer_[index].used) {
nisse-webrtc 2016/11/15 08:36:29 I suspect the sequence_buffer_ logic could be simp
stefan-webrtc 2016/11/15 08:55:48 Could you follow-up on this offline? It would be n
+ // Duplicate packet, do nothing.
+ if (data_buffer_[index].seqNum == packet.seqNum)
+ return true;
- if (sequence_buffer_[index].used) {
- // Duplicate packet, do nothing.
- if (data_buffer_[index].seqNum == packet.seqNum)
- return true;
+ // The packet buffer is full, try to expand the buffer.
+ while (ExpandBufferSize() && sequence_buffer_[seq_num % size_].used) {
+ }
+ index = seq_num % size_;
- // The packet buffer is full, try to expand the buffer.
- while (ExpandBufferSize() && sequence_buffer_[seq_num % size_].used) {
+ // Packet buffer is still full.
+ if (sequence_buffer_[index].used)
+ return false;
}
- index = seq_num % size_;
- // Packet buffer is still full.
- if (sequence_buffer_[index].used)
- return false;
- }
+ if (AheadOf(seq_num, last_seq_num_))
+ last_seq_num_ = seq_num;
- 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].continuous = false;
+ sequence_buffer_[index].frame_created = false;
+ sequence_buffer_[index].used = true;
+ data_buffer_[index] = packet;
+
+ found_frames = FindFrames(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].continuous = false;
- sequence_buffer_[index].frame_created = false;
- sequence_buffer_[index].used = true;
- data_buffer_[index] = packet;
+ for (std::unique_ptr<RtpFrameObject>& frame : found_frames)
+ received_frame_callback_->OnReceivedFrame(std::move(frame));
- FindFrames(seq_num);
return true;
}
@@ -187,7 +194,9 @@ bool PacketBuffer::PotentialNewFrame(uint16_t seq_num) const {
return false;
}
-void PacketBuffer::FindFrames(uint16_t seq_num) {
+std::vector<std::unique_ptr<RtpFrameObject>> PacketBuffer::FindFrames(
+ uint16_t seq_num) {
+ std::vector<std::unique_ptr<RtpFrameObject>> found_frames;
while (PotentialNewFrame(seq_num)) {
size_t index = seq_num % size_;
sequence_buffer_[index].continuous = true;
@@ -204,8 +213,8 @@ void PacketBuffer::FindFrames(uint16_t seq_num) {
int start_index = index;
while (true) {
frame_size += data_buffer_[start_index].sizeBytes;
- max_nack_count = std::max(
- max_nack_count, data_buffer_[start_index].timesNacked);
+ max_nack_count =
+ std::max(max_nack_count, data_buffer_[start_index].timesNacked);
sequence_buffer_[start_index].frame_created = true;
if (sequence_buffer_[start_index].frame_begin)
@@ -215,15 +224,13 @@ void PacketBuffer::FindFrames(uint16_t seq_num) {
start_seq_num--;
}
- std::unique_ptr<RtpFrameObject> frame(
+ found_frames.emplace_back(
new RtpFrameObject(this, start_seq_num, seq_num, frame_size,
max_nack_count, clock_->TimeInMilliseconds()));
-
- received_frame_callback_->OnReceivedFrame(std::move(frame));
}
-
++seq_num;
}
+ return found_frames;
}
void PacketBuffer::ReturnFrame(RtpFrameObject* frame) {
@@ -267,7 +274,6 @@ bool PacketBuffer::GetBitstream(const RtpFrameObject& frame,
}
VCMPacket* PacketBuffer::GetPacket(uint16_t seq_num) {
- rtc::CritScope lock(&crit_);
size_t index = seq_num % size_;
if (!sequence_buffer_[index].used ||
seq_num != sequence_buffer_[index].seq_num) {
« no previous file with comments | « webrtc/modules/video_coding/packet_buffer.h ('k') | webrtc/modules/video_coding/rtp_frame_reference_finder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698