Chromium Code Reviews| 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) { |