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}
This commit is contained in:

committed by
Commit Bot

parent
acdc22d784
commit
aa3f5da8dc
@ -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 @@ PacketBuffer::~PacketBuffer() {
|
||||
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 @@ PacketBuffer::InsertResult PacketBuffer::InsertPacket(VCMPacket* packet) {
|
||||
// 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 @@ PacketBuffer::InsertResult PacketBuffer::InsertPacket(VCMPacket* packet) {
|
||||
|
||||
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 @@ PacketBuffer::InsertResult PacketBuffer::InsertPacket(VCMPacket* packet) {
|
||||
// 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 @@ void PacketBuffer::ClearTo(uint16_t seq_num) {
|
||||
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 @@ void PacketBuffer::ClearInterval(uint16_t start_seq_num,
|
||||
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::ClearInterval(uint16_t start_seq_num,
|
||||
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 @@ bool PacketBuffer::ExpandBufferSize() {
|
||||
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 @@ std::unique_ptr<RtpFrameObject> PacketBuffer::AssembleFrame(
|
||||
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 @@ std::unique_ptr<RtpFrameObject> PacketBuffer::AssembleFrame(
|
||||
}
|
||||
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::unique_ptr<RtpFrameObject> PacketBuffer::AssembleFrame(
|
||||
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());
|
||||
|
Reference in New Issue
Block a user