Fork VCMPacket for PacketBuffer into own struct
it is easier to reduce and eliminate it when it is not bound to legacy video code
Bug: webrtc:10979
Change-Id: I517e298501b3358a914a23ddce40fcb3075d672d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/159707
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@{#29821}
diff --git a/modules/video_coding/packet_buffer.cc b/modules/video_coding/packet_buffer.cc
index 53f289c..3e8b11f 100644
--- a/modules/video_coding/packet_buffer.cc
+++ b/modules/video_coding/packet_buffer.cc
@@ -20,8 +20,11 @@
#include "absl/types/variant.h"
#include "api/array_view.h"
+#include "api/rtp_packet_info.h"
#include "api/video/encoded_frame.h"
#include "common_video/h264/h264_common.h"
+#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "modules/rtp_rtcp/source/rtp_video_header.h"
#include "modules/video_coding/codecs/h264/include/h264_globals.h"
#include "modules/video_coding/frame_object.h"
@@ -34,6 +37,24 @@
namespace webrtc {
namespace video_coding {
+PacketBuffer::Packet::Packet(const RtpPacketReceived& rtp_packet,
+ const RTPVideoHeader& video_header,
+ int64_t ntp_time_ms,
+ int64_t receive_time_ms)
+ : marker_bit(rtp_packet.Marker()),
+ payload_type(rtp_packet.PayloadType()),
+ seq_num(rtp_packet.SequenceNumber()),
+ timestamp(rtp_packet.Timestamp()),
+ ntp_time_ms(ntp_time_ms),
+ times_nacked(-1),
+ video_header(video_header),
+ packet_info(rtp_packet.Ssrc(),
+ rtp_packet.Csrcs(),
+ rtp_packet.Timestamp(),
+ /*audio_level=*/absl::nullopt,
+ rtp_packet.GetExtension<AbsoluteCaptureTimeExtension>(),
+ receive_time_ms) {}
+
PacketBuffer::PacketBuffer(Clock* clock,
size_t start_buffer_size,
size_t max_buffer_size)
@@ -55,11 +76,12 @@
Clear();
}
-PacketBuffer::InsertResult PacketBuffer::InsertPacket(VCMPacket* packet) {
+PacketBuffer::InsertResult PacketBuffer::InsertPacket(
+ PacketBuffer::Packet* packet) {
PacketBuffer::InsertResult result;
rtc::CritScope lock(&crit_);
- uint16_t seq_num = packet->seqNum;
+ uint16_t seq_num = packet->seq_num;
size_t index = seq_num % buffer_.size();
if (!first_packet_received_) {
@@ -69,8 +91,8 @@
// 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;
+ delete[] packet->data;
+ packet->data = nullptr;
return result;
}
@@ -79,9 +101,9 @@
if (buffer_[index].used) {
// Duplicate packet, just delete the payload.
- if (buffer_[index].seq_num() == packet->seqNum) {
- delete[] packet->dataPtr;
- packet->dataPtr = nullptr;
+ if (buffer_[index].seq_num() == packet->seq_num) {
+ delete[] packet->data;
+ packet->data = nullptr;
return result;
}
@@ -96,26 +118,26 @@
// new keyframe is needed.
RTC_LOG(LS_WARNING) << "Clear PacketBuffer and request key frame.";
Clear();
- delete[] packet->dataPtr;
- packet->dataPtr = nullptr;
+ delete[] packet->data;
+ packet->data = 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;
+ StoredPacket& new_entry = buffer_[index];
+ new_entry.continuous = false;
+ new_entry.used = true;
+ new_entry.data = std::move(*packet);
+ packet->data = nullptr;
+
+ UpdateMissingPackets(seq_num);
+
result.frames = FindFrames(seq_num);
return result;
}
@@ -140,8 +162,8 @@
for (size_t i = 0; i < iterations; ++i) {
size_t index = first_seq_num_ % buffer_.size();
if (AheadOf<uint16_t>(seq_num, buffer_[index].seq_num())) {
- delete[] buffer_[index].data.dataPtr;
- buffer_[index].data.dataPtr = nullptr;
+ delete[] buffer_[index].data.data;
+ buffer_[index].data.data = nullptr;
buffer_[index].used = false;
}
++first_seq_num_;
@@ -167,8 +189,8 @@
for (size_t i = 0; i < iterations; ++i) {
size_t index = seq_num % buffer_.size();
RTC_DCHECK_EQ(buffer_[index].seq_num(), seq_num);
- delete[] buffer_[index].data.dataPtr;
- buffer_[index].data.dataPtr = nullptr;
+ delete[] buffer_[index].data.data;
+ buffer_[index].data.data = nullptr;
buffer_[index].used = false;
++seq_num;
@@ -178,8 +200,8 @@
void PacketBuffer::Clear() {
rtc::CritScope lock(&crit_);
for (StoredPacket& entry : buffer_) {
- delete[] entry.data.dataPtr;
- entry.data.dataPtr = nullptr;
+ delete[] entry.data.data;
+ entry.data.data = nullptr;
entry.used = false;
}
@@ -220,7 +242,7 @@
std::vector<StoredPacket> new_buffer(new_size);
for (StoredPacket& entry : buffer_) {
if (entry.used) {
- new_buffer[entry.seq_num() % new_size] = entry;
+ new_buffer[entry.seq_num() % new_size] = std::move(entry);
}
}
buffer_ = std::move(new_buffer);
@@ -403,15 +425,15 @@
packet_infos.reserve(num_packets);
for (uint16_t seq_num = first_seq_num; seq_num != end_seq_num; ++seq_num) {
- const VCMPacket& packet = GetPacket(seq_num);
+ const Packet& packet = GetPacket(seq_num);
- max_nack_count = std::max(max_nack_count, packet.timesNacked);
+ max_nack_count = std::max(max_nack_count, packet.times_nacked);
min_recv_time =
std::min(min_recv_time, packet.packet_info.receive_time_ms());
max_recv_time =
std::max(max_recv_time, packet.packet_info.receive_time_ms());
- frame_size += packet.sizeBytes;
- payloads.emplace_back(packet.dataPtr, packet.sizeBytes);
+ frame_size += packet.size_bytes;
+ payloads.emplace_back(packet.data, packet.size_bytes);
packet_infos.push_back(packet.packet_info);
}
@@ -424,19 +446,19 @@
}
RTC_DCHECK_EQ(write_at - bitstream->data(), bitstream->size());
- const VCMPacket& first_packet = GetPacket(first_seq_num);
- const VCMPacket& last_packet = GetPacket(last_seq_num);
+ const Packet& first_packet = GetPacket(first_seq_num);
+ const Packet& last_packet = GetPacket(last_seq_num);
return std::make_unique<RtpFrameObject>(
first_seq_num, //
last_seq_num, //
- last_packet.markerBit, //
+ last_packet.marker_bit, //
max_nack_count, //
min_recv_time, //
max_recv_time, //
first_packet.timestamp, //
- first_packet.ntp_time_ms_, //
+ first_packet.ntp_time_ms, //
last_packet.video_header.video_timing, //
- first_packet.payloadType, //
+ first_packet.payload_type, //
first_packet.codec(), //
last_packet.video_header.rotation, //
last_packet.video_header.content_type, //
@@ -447,7 +469,7 @@
std::move(bitstream));
}
-const VCMPacket& PacketBuffer::GetPacket(uint16_t seq_num) const {
+const PacketBuffer::Packet& PacketBuffer::GetPacket(uint16_t seq_num) const {
const StoredPacket& entry = buffer_[seq_num % buffer_.size()];
RTC_DCHECK(entry.used);
RTC_DCHECK_EQ(seq_num, entry.seq_num());