summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorpbos@webrtc.org <pbos@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2014-07-10 16:24:54 +0000
committerpbos@webrtc.org <pbos@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2014-07-10 16:24:54 +0000
commit9aa3497dc77180f83e28f6092253e2785f10d900 (patch)
tree7d0da852c432cdac7bd98806c7bc5cd22659d984 /modules
parent579d63c9b10e749c6553d966158900ab9830bb8b (diff)
downloadwebrtc-9aa3497dc77180f83e28f6092253e2785f10d900.tar.gz
Count total bytes sent in RTPSender::Bytes().
Previously only media bytes were included, this adds header bytes and padding bytes to the calculation. BUG= R=stefan@webrtc.org, tommi@webrtc.org Review URL: https://webrtc-codereview.appspot.com/19939004 git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@6654 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'modules')
-rw-r--r--modules/rtp_rtcp/source/rtp_sender.cc55
-rw-r--r--modules/rtp_rtcp/source/rtp_sender.h9
-rw-r--r--modules/rtp_rtcp/source/rtp_sender_unittest.cc37
3 files changed, 77 insertions, 24 deletions
diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc
index c98d4981..e638074c 100644
--- a/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/modules/rtp_rtcp/source/rtp_sender.cc
@@ -509,7 +509,7 @@ bool RTPSender::SendPaddingAccordingToBitrate(
last_timestamp_time_ms_ = clock_->TimeInMilliseconds();
}
int bytes_sent = SendPadData(payload_type, timestamp, capture_time_ms,
- bytes, kDontRetransmit, false, false);
+ bytes, false, false);
// We did not manage to send all bytes. Comparing with 31 due to modulus 32.
return bytes - bytes_sent < 31;
}
@@ -533,10 +533,12 @@ int RTPSender::BuildPaddingPacket(uint8_t* packet, int header_length,
return padding_bytes_in_packet;
}
-int RTPSender::SendPadData(int payload_type, uint32_t timestamp,
- int64_t capture_time_ms, int32_t bytes,
- StorageType store, bool force_full_size_packets,
- bool only_pad_after_markerbit) {
+int RTPSender::SendPadData(int payload_type,
+ uint32_t timestamp,
+ int64_t capture_time_ms,
+ int32_t bytes,
+ bool force_full_size_packets,
+ bool over_rtx) {
// Drop this packet if we're not sending media packets.
if (!SendingMedia()) {
return bytes;
@@ -565,7 +567,7 @@ int RTPSender::SendPadData(int payload_type, uint32_t timestamp,
CriticalSectionScoped cs(send_critsect_);
// Only send padding packets following the last packet of a frame,
// indicated by the marker bit.
- if (only_pad_after_markerbit && !last_packet_marker_bit_)
+ if (!over_rtx && !last_packet_marker_bit_)
return bytes_sent;
if (rtx_ == kRtxOff) {
ssrc = ssrc_;
@@ -579,19 +581,35 @@ int RTPSender::SendPadData(int payload_type, uint32_t timestamp,
}
uint8_t padding_packet[IP_PACKET_SIZE];
- int header_length = CreateRTPHeader(padding_packet, payload_type, ssrc,
- false, timestamp, sequence_number, NULL,
+ int header_length = CreateRTPHeader(padding_packet,
+ payload_type,
+ ssrc,
+ false,
+ timestamp,
+ sequence_number,
+ NULL,
0);
- padding_bytes_in_packet = BuildPaddingPacket(padding_packet, header_length,
- bytes);
- if (0 > SendToNetwork(padding_packet, padding_bytes_in_packet,
- header_length, capture_time_ms, store,
- PacedSender::kLowPriority)) {
- // Error sending the packet.
- break;
+ padding_bytes_in_packet =
+ BuildPaddingPacket(padding_packet, header_length, bytes);
+ int length = padding_bytes_in_packet + header_length;
+ int64_t now_ms = clock_->TimeInMilliseconds();
+
+ RtpUtility::RtpHeaderParser rtp_parser(padding_packet, length);
+ RTPHeader rtp_header;
+ rtp_parser.Parse(rtp_header);
+
+ if (capture_time_ms > 0) {
+ UpdateTransmissionTimeOffset(
+ padding_packet, length, rtp_header, now_ms - capture_time_ms);
}
+
+ UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms);
+ if (!SendPacketToNetwork(padding_packet, length))
+ break;
bytes_sent += padding_bytes_in_packet;
+ UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false);
}
+
return bytes_sent;
}
@@ -919,9 +937,8 @@ int RTPSender::TimeToSendPadding(int bytes) {
timestamp,
capture_time_ms,
bytes,
- kDontStore,
true,
- rtx == kRtxOff);
+ rtx != kRtxOff);
bytes_sent += padding_sent;
}
return bytes_sent;
@@ -1036,7 +1053,9 @@ uint32_t RTPSender::Packets() const {
// Number of sent RTP bytes.
uint32_t RTPSender::Bytes() const {
CriticalSectionScoped lock(statistics_crit_.get());
- return rtp_stats_.bytes + rtx_rtp_stats_.bytes;
+ return rtp_stats_.bytes + rtp_stats_.header_bytes + rtp_stats_.padding_bytes +
+ rtx_rtp_stats_.bytes + rtx_rtp_stats_.header_bytes +
+ rtx_rtp_stats_.padding_bytes;
}
int RTPSender::CreateRTPHeader(
diff --git a/modules/rtp_rtcp/source/rtp_sender.h b/modules/rtp_rtcp/source/rtp_sender.h
index 265e69c3..f65c8c27 100644
--- a/modules/rtp_rtcp/source/rtp_sender.h
+++ b/modules/rtp_rtcp/source/rtp_sender.h
@@ -266,9 +266,12 @@ class RTPSender : public RTPSenderInterface, public Bitrate::Observer {
int32_t SetFecParameters(const FecProtectionParams *delta_params,
const FecProtectionParams *key_params);
- int SendPadData(int payload_type, uint32_t timestamp, int64_t capture_time_ms,
- int32_t bytes, StorageType store,
- bool force_full_size_packets, bool only_pad_after_markerbit);
+ int SendPadData(int payload_type,
+ uint32_t timestamp,
+ int64_t capture_time_ms,
+ int32_t bytes,
+ bool force_full_size_packets,
+ bool only_pad_after_markerbit);
// Called on update of RTP statistics.
void RegisterRtpStatisticsCallback(StreamDataCountersCallback* callback);
diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
index 42ee023e..57f1460f 100644
--- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
@@ -62,13 +62,12 @@ uint64_t ConvertMsToAbsSendTime(int64_t time_ms) {
class LoopbackTransportTest : public webrtc::Transport {
public:
LoopbackTransportTest()
- : packets_sent_(0),
- last_sent_packet_len_(0) {
- }
+ : packets_sent_(0), last_sent_packet_len_(0), total_bytes_sent_(0) {}
virtual int SendPacket(int channel, const void *data, int len) {
packets_sent_++;
memcpy(last_sent_packet_, data, len);
last_sent_packet_len_ = len;
+ total_bytes_sent_ += static_cast<size_t>(len);
return len;
}
virtual int SendRTCPPacket(int channel, const void *data, int len) {
@@ -76,6 +75,7 @@ class LoopbackTransportTest : public webrtc::Transport {
}
int packets_sent_;
int last_sent_packet_len_;
+ size_t total_bytes_sent_;
uint8_t last_sent_packet_[kMaxPacketLength];
};
@@ -1071,4 +1071,35 @@ TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) {
sizeof(extension)));
}
+TEST_F(RtpSenderTest, BytesReportedCorrectly) {
+ const char* kPayloadName = "GENERIC";
+ const uint8_t kPayloadType = 127;
+ rtp_sender_->SetSSRC(1234);
+ rtp_sender_->SetRtxSsrc(4321);
+ rtp_sender_->SetRtxPayloadType(kPayloadType - 1);
+ rtp_sender_->SetRTXStatus(kRtxRetransmitted | kRtxRedundantPayloads);
+
+ ASSERT_EQ(
+ 0,
+ rtp_sender_->RegisterPayload(kPayloadName, kPayloadType, 90000, 0, 1500));
+ uint8_t payload[] = {47, 11, 32, 93, 89};
+
+ ASSERT_EQ(0,
+ rtp_sender_->SendOutgoingData(kVideoFrameKey,
+ kPayloadType,
+ 1234,
+ 4321,
+ payload,
+ sizeof(payload),
+ 0));
+
+ EXPECT_GT(transport_.total_bytes_sent_, 0u);
+ EXPECT_EQ(transport_.total_bytes_sent_, rtp_sender_->Bytes());
+ size_t last_bytes_sent = transport_.total_bytes_sent_;
+
+ rtp_sender_->TimeToSendPadding(42);
+
+ EXPECT_GT(transport_.total_bytes_sent_, last_bytes_sent);
+ EXPECT_EQ(transport_.total_bytes_sent_, rtp_sender_->Bytes());
+}
} // namespace webrtc