TRACE_EVENT0("webrtc", "Call::DeliverRtp");
RTC_DCHECK_NE(media_type, MediaType::ANY);
- RtpPacketReceived parsed_packet;
+ RtpPacketReceived parsed_packet(nullptr, 0 /* capacity */,
+ webrtc::Timestamp::MinusInfinity());
if (!parsed_packet.Parse(std::move(packet)))
return DELIVERY_PACKET_ERROR;
sequence_number_ = 0;
timestamp_ = 0;
ssrc_ = 0;
- payload_offset_ = kFixedHeaderSize;
payload_size_ = 0;
padding_size_ = 0;
extensions_size_ = 0;
extension_entries_.clear();
- memset(WriteAt(0), 0, kFixedHeaderSize);
- buffer_.SetSize(kFixedHeaderSize);
- WriteAt(0, kRtpVersion << 6);
+ if (buffer_.size() > 0) {
+ payload_offset_ = kFixedHeaderSize;
+ memset(WriteAt(0), 0, kFixedHeaderSize);
+ buffer_.SetSize(kFixedHeaderSize);
+ WriteAt(0, kRtpVersion << 6);
+ } else {
+ payload_offset_ = 0;
+ }
}
bool RtpPacket::ParseBuffer(const uint8_t* buffer, size_t size) {
const ExtensionManager* extensions,
webrtc::Timestamp arrival_time /*= webrtc::Timestamp::MinusInfinity()*/)
: RtpPacket(extensions), arrival_time_(arrival_time) {}
+RtpPacketReceived::RtpPacketReceived(const ExtensionManager* extensions,
+ size_t capacity,
+ webrtc::Timestamp arrival_time)
+ : RtpPacket(extensions, capacity), arrival_time_(arrival_time) {}
RtpPacketReceived::RtpPacketReceived(const RtpPacketReceived& packet) = default;
RtpPacketReceived::RtpPacketReceived(RtpPacketReceived&& packet) = default;
explicit RtpPacketReceived(
const ExtensionManager* extensions,
webrtc::Timestamp arrival_time = webrtc::Timestamp::MinusInfinity());
+ explicit RtpPacketReceived(const ExtensionManager* extensions,
+ size_t capacity,
+ webrtc::Timestamp arrival_time);
RtpPacketReceived(const RtpPacketReceived& packet);
RtpPacketReceived(RtpPacketReceived&& packet);
#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
+#include "rtc_base/copy_on_write_buffer.h"
#include "rtc_base/random.h"
#include "test/gmock.h"
#include "test/gtest.h"
EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
}
+// Passing 0 as the capacity in ctor MUST not create COW buffer,
+// this is usefull when packet data is going to be provided via
+// RtpPacket::Parse() method.
+TEST(RtpPacketTest, EmptyCOWBuffer) {
+ RtpPacket pkt(nullptr, 0u);
+
+ rtc::CopyOnWriteBuffer buf = pkt.PayloadBuffer();
+ EXPECT_EQ(buf.capacity(), 0u);
+ EXPECT_EQ(buf.cdata(), nullptr);
+}
+
+TEST(RtpPacketTest, EmptyCOWBufferInPacketReceived) {
+ RtpPacketReceived pkt(nullptr, 0u, Timestamp::MinusInfinity());
+
+ rtc::CopyOnWriteBuffer buf = pkt.PayloadBuffer();
+ EXPECT_EQ(buf.capacity(), 0u);
+ EXPECT_EQ(buf.cdata(), nullptr);
+}
+
} // namespace
} // namespace webrtc
void RtpTransport::DemuxPacket(rtc::CopyOnWriteBuffer packet,
int64_t packet_time_us) {
webrtc::RtpPacketReceived parsed_packet(
- &header_extension_map_, packet_time_us == -1
- ? Timestamp::MinusInfinity()
- : Timestamp::Micros(packet_time_us));
+ &header_extension_map_, 0 /* capacity */,
+ packet_time_us == -1 ? Timestamp::MinusInfinity()
+ : Timestamp::Micros(packet_time_us));
if (!parsed_packet.Parse(std::move(packet))) {
RTC_LOG(LS_ERROR)
<< "Failed to parse the incoming RTP packet before demuxing. Drop it.";