RtpPacket::payload() return rtc::ArrayView instead of raw pointer

BUG=webrtc:5261

Review-Url: https://codereview.webrtc.org/2506373004
Cr-Commit-Position: refs/heads/master@{#15162}
This commit is contained in:
danilchap
2016-11-21 01:35:29 -08:00
committed by Commit bot
parent fe09560ade
commit 96c1587551
7 changed files with 25 additions and 37 deletions

View File

@ -97,9 +97,9 @@ bool FlexfecReceiver::AddReceivedPacket(const uint8_t* packet,
// TODO(brandtr): Remove this memcpy when the FEC packet classes // TODO(brandtr): Remove this memcpy when the FEC packet classes
// are using COW buffers internally. // are using COW buffers internally.
received_packet->pkt = rtc::scoped_refptr<Packet>(new Packet()); received_packet->pkt = rtc::scoped_refptr<Packet>(new Packet());
memcpy(received_packet->pkt->data, parsed_packet.payload(), auto payload = parsed_packet.payload();
parsed_packet.payload_size()); memcpy(received_packet->pkt->data, payload.data(), payload.size());
received_packet->pkt->length = parsed_packet.payload_size(); received_packet->pkt->length = payload.size();
} else { } else {
// This is a media packet, or a FlexFEC packet belonging to some // This is a media packet, or a FlexFEC packet belonging to some
// other FlexFEC stream. // other FlexFEC stream.

View File

@ -172,8 +172,8 @@ size_t Packet::padding_size() const {
return padding_size_; return padding_size_;
} }
const uint8_t* Packet::payload() const { rtc::ArrayView<const uint8_t> Packet::payload() const {
return data() + payload_offset_; return rtc::MakeArrayView(data() + payload_offset_, payload_size_);
} }
rtc::CopyOnWriteBuffer Packet::Buffer() const { rtc::CopyOnWriteBuffer Packet::Buffer() const {

View File

@ -12,6 +12,7 @@
#include <vector> #include <vector>
#include "webrtc/base/array_view.h"
#include "webrtc/base/basictypes.h" #include "webrtc/base/basictypes.h"
#include "webrtc/base/copyonwritebuffer.h" #include "webrtc/base/copyonwritebuffer.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
@ -56,7 +57,7 @@ class Packet {
// Payload. // Payload.
size_t payload_size() const; size_t payload_size() const;
size_t padding_size() const; size_t padding_size() const;
const uint8_t* payload() const; rtc::ArrayView<const uint8_t> payload() const;
// Buffer. // Buffer.
rtc::CopyOnWriteBuffer Buffer() const; rtc::CopyOnWriteBuffer Buffer() const;

View File

@ -219,8 +219,7 @@ TEST(RtpPacketTest, ParseWithInvalidSizedExtension) {
EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset)); EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
// But shouldn't prevent reading payload. // But shouldn't prevent reading payload.
EXPECT_THAT(make_tuple(packet.payload(), packet.payload_size()), EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
ElementsAreArray(kPayload));
} }
TEST(RtpPacketTest, ParseWithOverSizedExtension) { TEST(RtpPacketTest, ParseWithOverSizedExtension) {
@ -274,8 +273,7 @@ TEST(RtpPacketTest, ParseWithAllFeatures) {
EXPECT_EQ(kTimestamp, packet.Timestamp()); EXPECT_EQ(kTimestamp, packet.Timestamp());
EXPECT_EQ(kSsrc, packet.Ssrc()); EXPECT_EQ(kSsrc, packet.Ssrc());
EXPECT_THAT(packet.Csrcs(), ElementsAreArray(kCsrcs)); EXPECT_THAT(packet.Csrcs(), ElementsAreArray(kCsrcs));
EXPECT_THAT(make_tuple(packet.payload(), packet.payload_size()), EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
ElementsAreArray(kPayload));
EXPECT_EQ(kPacketPaddingSize, packet.padding_size()); EXPECT_EQ(kPacketPaddingSize, packet.padding_size());
int32_t time_offset; int32_t time_offset;
EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset)); EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));

View File

@ -1216,7 +1216,8 @@ std::unique_ptr<RtpPacketToSend> RTPSender::BuildRtxPacket(
ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber()); ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber());
// Add original payload data. // Add original payload data.
memcpy(rtx_payload + kRtxHeaderSize, packet.payload(), packet.payload_size()); auto payload = packet.payload();
memcpy(rtx_payload + kRtxHeaderSize, payload.data(), payload.size());
return rtx_packet; return rtx_packet;
} }

View File

@ -878,16 +878,11 @@ TEST_F(RtpSenderTestWithoutPacer, SendGenericVideo) {
4321, payload, sizeof(payload), 4321, payload, sizeof(payload),
nullptr, nullptr, nullptr)); nullptr, nullptr, nullptr));
const uint8_t* payload_data = transport_.last_sent_packet().payload(); auto sent_payload = transport_.last_sent_packet().payload();
uint8_t generic_header = *payload_data++; uint8_t generic_header = sent_payload[0];
ASSERT_EQ(sizeof(payload) + sizeof(generic_header),
transport_.last_sent_packet().payload_size());
EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit); EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit); EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
// Send delta frame // Send delta frame
payload[0] = 13; payload[0] = 13;
@ -898,16 +893,11 @@ TEST_F(RtpSenderTestWithoutPacer, SendGenericVideo) {
kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload), kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload),
nullptr, nullptr, nullptr)); nullptr, nullptr, nullptr));
payload_data = transport_.last_sent_packet().payload(); sent_payload = transport_.last_sent_packet().payload();
generic_header = *payload_data++; generic_header = sent_payload[0];
EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit); EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit); EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
ASSERT_EQ(sizeof(payload) + sizeof(generic_header),
transport_.last_sent_packet().payload_size());
EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
} }
TEST_F(RtpSenderTest, SendFlexfecPackets) { TEST_F(RtpSenderTest, SendFlexfecPackets) {
@ -1258,10 +1248,8 @@ TEST_F(RtpSenderAudioTest, SendAudio) {
kAudioFrameCN, payload_type, 1234, 4321, payload, kAudioFrameCN, payload_type, 1234, 4321, payload,
sizeof(payload), nullptr, nullptr, nullptr)); sizeof(payload), nullptr, nullptr, nullptr));
const uint8_t* payload_data = transport_.last_sent_packet().payload(); auto sent_payload = transport_.last_sent_packet().payload();
EXPECT_THAT(sent_payload, ElementsAreArray(payload));
ASSERT_EQ(sizeof(payload), transport_.last_sent_packet().payload_size());
EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
} }
TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) { TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) {
@ -1279,10 +1267,8 @@ TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) {
kAudioFrameCN, payload_type, 1234, 4321, payload, kAudioFrameCN, payload_type, 1234, 4321, payload,
sizeof(payload), nullptr, nullptr, nullptr)); sizeof(payload), nullptr, nullptr, nullptr));
const uint8_t* payload_data = transport_.last_sent_packet().payload(); auto sent_payload = transport_.last_sent_packet().payload();
EXPECT_THAT(sent_payload, ElementsAreArray(payload));
ASSERT_EQ(sizeof(payload), transport_.last_sent_packet().payload_size());
EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
// Verify AudioLevel extension. // Verify AudioLevel extension.
bool voice_activity; bool voice_activity;
uint8_t audio_level; uint8_t audio_level;

View File

@ -39,8 +39,10 @@ void BuildRedPayload(const RtpPacketToSend& media_packet,
kRedForFecHeaderLength + media_packet.payload_size()); kRedForFecHeaderLength + media_packet.payload_size());
RTC_DCHECK(red_payload); RTC_DCHECK(red_payload);
red_payload[0] = media_packet.PayloadType(); red_payload[0] = media_packet.PayloadType();
memcpy(&red_payload[kRedForFecHeaderLength], media_packet.payload(),
media_packet.payload_size()); auto media_payload = media_packet.payload();
memcpy(&red_payload[kRedForFecHeaderLength], media_payload.data(),
media_payload.size());
} }
} // namespace } // namespace