change PacketBuffer to return it's result rather that use callback
Bug: None
Change-Id: I8cc05dd46e811d6db37af520d2106af21c671def
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/157893
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29589}
diff --git a/modules/video_coding/packet_buffer.cc b/modules/video_coding/packet_buffer.cc
index 92f39ed..9c74aaf 100644
--- a/modules/video_coding/packet_buffer.cc
+++ b/modules/video_coding/packet_buffer.cc
@@ -33,15 +33,13 @@
PacketBuffer::PacketBuffer(Clock* clock,
size_t start_buffer_size,
- size_t max_buffer_size,
- OnAssembledFrameCallback* assembled_frame_callback)
+ size_t max_buffer_size)
: clock_(clock),
max_size_(max_buffer_size),
first_seq_num_(0),
first_packet_received_(false),
is_cleared_to_first_seq_num_(false),
buffer_(start_buffer_size),
- assembled_frame_callback_(assembled_frame_callback),
unique_frames_seen_(0),
sps_pps_idr_is_h264_keyframe_(
field_trial::IsEnabled("WebRTC-SpsPpsIdrIsH264Keyframe")) {
@@ -55,76 +53,70 @@
Clear();
}
-bool PacketBuffer::InsertPacket(VCMPacket* packet) {
- std::vector<std::unique_ptr<RtpFrameObject>> found_frames;
- {
- rtc::CritScope lock(&crit_);
+PacketBuffer::InsertResult PacketBuffer::InsertPacket(VCMPacket* packet) {
+ PacketBuffer::InsertResult result;
+ rtc::CritScope lock(&crit_);
+ OnTimestampReceived(packet->timestamp);
- OnTimestampReceived(packet->timestamp);
+ uint16_t seq_num = packet->seqNum;
+ size_t index = seq_num % buffer_.size();
- uint16_t seq_num = packet->seqNum;
- size_t index = seq_num % buffer_.size();
-
- if (!first_packet_received_) {
- first_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, just silently ignore it.
- if (is_cleared_to_first_seq_num_) {
- delete[] packet->dataPtr;
- packet->dataPtr = nullptr;
- return true;
- }
-
- first_seq_num_ = seq_num;
+ if (!first_packet_received_) {
+ first_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, just silently ignore it.
+ if (is_cleared_to_first_seq_num_) {
+ delete[] packet->dataPtr;
+ packet->dataPtr = nullptr;
+ return result;
}
- if (buffer_[index].used) {
- // Duplicate packet, just delete the payload.
- if (buffer_[index].seq_num() == packet->seqNum) {
- delete[] packet->dataPtr;
- packet->dataPtr = nullptr;
- return true;
- }
-
- // The packet buffer is full, try to expand the buffer.
- while (ExpandBufferSize() && buffer_[seq_num % buffer_.size()].used) {
- }
- index = seq_num % buffer_.size();
-
- // Packet buffer is still full since we were unable to expand the buffer.
- if (buffer_[index].used) {
- // Clear the buffer, delete payload, and return false to signal that a
- // new keyframe is needed.
- RTC_LOG(LS_WARNING) << "Clear PacketBuffer and request key frame.";
- Clear();
- delete[] packet->dataPtr;
- packet->dataPtr = nullptr;
- return false;
- }
- }
-
- StoredPacket& new_entry = buffer_[index];
- new_entry.continuous = false;
- new_entry.used = true;
- new_entry.data = *packet;
- packet->dataPtr = nullptr;
-
- UpdateMissingPackets(packet->seqNum);
-
- int64_t now_ms = clock_->TimeInMilliseconds();
- last_received_packet_ms_ = now_ms;
- if (packet->video_header.frame_type == VideoFrameType::kVideoFrameKey)
- last_received_keyframe_packet_ms_ = now_ms;
-
- found_frames = FindFrames(seq_num);
+ first_seq_num_ = seq_num;
}
- for (std::unique_ptr<RtpFrameObject>& frame : found_frames)
- assembled_frame_callback_->OnAssembledFrame(std::move(frame));
+ if (buffer_[index].used) {
+ // Duplicate packet, just delete the payload.
+ if (buffer_[index].seq_num() == packet->seqNum) {
+ delete[] packet->dataPtr;
+ packet->dataPtr = nullptr;
+ return result;
+ }
- return true;
+ // The packet buffer is full, try to expand the buffer.
+ while (ExpandBufferSize() && buffer_[seq_num % buffer_.size()].used) {
+ }
+ index = seq_num % buffer_.size();
+
+ // Packet buffer is still full since we were unable to expand the buffer.
+ if (buffer_[index].used) {
+ // Clear the buffer, delete payload, and return false to signal that a
+ // new keyframe is needed.
+ RTC_LOG(LS_WARNING) << "Clear PacketBuffer and request key frame.";
+ Clear();
+ delete[] packet->dataPtr;
+ packet->dataPtr = nullptr;
+ result.buffer_cleared = true;
+ return result;
+ }
+ }
+
+ StoredPacket& new_entry = buffer_[index];
+ new_entry.continuous = false;
+ new_entry.used = true;
+ new_entry.data = *packet;
+ packet->dataPtr = nullptr;
+
+ UpdateMissingPackets(packet->seqNum);
+
+ int64_t now_ms = clock_->TimeInMilliseconds();
+ last_received_packet_ms_ = now_ms;
+ if (packet->video_header.frame_type == VideoFrameType::kVideoFrameKey)
+ last_received_keyframe_packet_ms_ = now_ms;
+
+ result.frames = FindFrames(seq_num);
+ return result;
}
void PacketBuffer::ClearTo(uint16_t seq_num) {
@@ -198,16 +190,12 @@
missing_packets_.clear();
}
-void PacketBuffer::PaddingReceived(uint16_t seq_num) {
- std::vector<std::unique_ptr<RtpFrameObject>> found_frames;
- {
- rtc::CritScope lock(&crit_);
- UpdateMissingPackets(seq_num);
- found_frames = FindFrames(static_cast<uint16_t>(seq_num + 1));
- }
-
- for (std::unique_ptr<RtpFrameObject>& frame : found_frames)
- assembled_frame_callback_->OnAssembledFrame(std::move(frame));
+PacketBuffer::InsertResult PacketBuffer::InsertPadding(uint16_t seq_num) {
+ PacketBuffer::InsertResult result;
+ rtc::CritScope lock(&crit_);
+ UpdateMissingPackets(seq_num);
+ result.frames = FindFrames(static_cast<uint16_t>(seq_num + 1));
+ return result;
}
absl::optional<int64_t> PacketBuffer::LastReceivedPacketMs() const {