diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/cast/BUILD.gn | 6 | ||||
-rw-r--r-- | media/cast/cast.gyp | 4 | ||||
-rw-r--r-- | media/cast/cast_testing.gypi | 2 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp.cc | 24 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp.h | 6 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_builder.cc (renamed from media/cast/net/rtcp/rtcp_sender.cc) | 395 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_builder.h (renamed from media/cast/net/rtcp/rtcp_sender.h) | 75 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_builder_unittest.cc (renamed from media/cast/net/rtcp/rtcp_sender_unittest.cc) | 256 |
8 files changed, 306 insertions, 462 deletions
diff --git a/media/cast/BUILD.gn b/media/cast/BUILD.gn index 1345cb0..c3a6244 100644 --- a/media/cast/BUILD.gn +++ b/media/cast/BUILD.gn @@ -72,8 +72,8 @@ source_set("net") { "net/rtcp/rtcp_defines.h", "net/rtcp/rtcp.h", "net/rtcp/rtcp.cc", - "net/rtcp/rtcp_sender.cc", - "net/rtcp/rtcp_sender.h", + "net/rtcp/rtcp_builder.cc", + "net/rtcp/rtcp_builder.h", "net/rtcp/rtcp_utility.cc", "net/rtcp/rtcp_utility.h", "net/rtp/packet_storage.cc", @@ -229,7 +229,7 @@ test("cast_unittests") { "net/pacing/mock_paced_packet_sender.cc", "net/pacing/mock_paced_packet_sender.h", "net/pacing/paced_sender_unittest.cc", - "net/rtcp/rtcp_sender_unittest.cc", + "net/rtcp/rtcp_builder_unittest.cc", "net/rtcp/rtcp_unittest.cc", "net/rtcp/rtcp_utility_unittest.cc", "net/rtcp/receiver_rtcp_event_subscriber_unittest.cc", diff --git a/media/cast/cast.gyp b/media/cast/cast.gyp index 29456b2..b646455 100644 --- a/media/cast/cast.gyp +++ b/media/cast/cast.gyp @@ -184,12 +184,12 @@ 'net/pacing/paced_sender.cc', 'net/pacing/paced_sender.h', 'net/rtcp/receiver_rtcp_event_subscriber.cc', + 'net/rtcp/rtcp_builder.cc', + 'net/rtcp/rtcp_builder.h', 'net/rtcp/rtcp_defines.cc', 'net/rtcp/rtcp_defines.h', 'net/rtcp/rtcp.h', 'net/rtcp/rtcp.cc', - 'net/rtcp/rtcp_sender.cc', - 'net/rtcp/rtcp_sender.h', 'net/rtcp/rtcp_utility.cc', 'net/rtcp/rtcp_utility.h', 'net/rtp/packet_storage.cc', diff --git a/media/cast/cast_testing.gypi b/media/cast/cast_testing.gypi index ef12af7..a2af257 100644 --- a/media/cast/cast_testing.gypi +++ b/media/cast/cast_testing.gypi @@ -86,7 +86,7 @@ 'net/pacing/mock_paced_packet_sender.cc', 'net/pacing/mock_paced_packet_sender.h', 'net/pacing/paced_sender_unittest.cc', - 'net/rtcp/rtcp_sender_unittest.cc', + 'net/rtcp/rtcp_builder_unittest.cc', 'net/rtcp/rtcp_unittest.cc', 'net/rtcp/rtcp_utility_unittest.cc', 'net/rtcp/receiver_rtcp_event_subscriber_unittest.cc', diff --git a/media/cast/net/rtcp/rtcp.cc b/media/cast/net/rtcp/rtcp.cc index 6b7718d..c59d729 100644 --- a/media/cast/net/rtcp/rtcp.cc +++ b/media/cast/net/rtcp/rtcp.cc @@ -8,8 +8,9 @@ #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" #include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/pacing/paced_sender.h" +#include "media/cast/net/rtcp/rtcp_builder.h" #include "media/cast/net/rtcp/rtcp_defines.h" -#include "media/cast/net/rtcp/rtcp_sender.h" #include "media/cast/net/rtcp/rtcp_utility.h" using base::TimeDelta; @@ -64,7 +65,8 @@ Rtcp::Rtcp(const RtcpCastMessageCallback& cast_callback, rtt_callback_(rtt_callback), log_callback_(log_callback), clock_(clock), - rtcp_sender_(new RtcpSender(packet_sender, local_ssrc)), + rtcp_builder_(local_ssrc), + packet_sender_(packet_sender), local_ssrc_(local_ssrc), remote_ssrc_(remote_ssrc), last_report_truncated_ntp_(0), @@ -228,12 +230,14 @@ void Rtcp::SendRtcpFromRtpReceiver( report_block.delay_since_last_sr = 0; } } - rtcp_sender_->SendRtcpFromRtpReceiver( - rtp_receiver_statistics ? &report_block : NULL, - &rrtr, - cast_message, - rtcp_events, - target_delay); + packet_sender_->SendRtcpPacket( + local_ssrc_, + rtcp_builder_.BuildRtcpFromReceiver( + rtp_receiver_statistics ? &report_block : NULL, + &rrtr, + cast_message, + rtcp_events, + target_delay)); } void Rtcp::SendRtcpFromRtpSender(base::TimeTicks current_time, @@ -254,7 +258,9 @@ void Rtcp::SendRtcpFromRtpSender(base::TimeTicks current_time, sender_info.send_packet_count = send_packet_count; sender_info.send_octet_count = send_octet_count; - rtcp_sender_->SendRtcpFromRtpSender(sender_info); + packet_sender_->SendRtcpPacket( + local_ssrc_, + rtcp_builder_.BuildRtcpFromSender(sender_info)); } void Rtcp::OnReceivedNtp(uint32 ntp_seconds, uint32 ntp_fraction) { diff --git a/media/cast/net/rtcp/rtcp.h b/media/cast/net/rtcp/rtcp.h index a1fdc9e..3c1d9b2 100644 --- a/media/cast/net/rtcp/rtcp.h +++ b/media/cast/net/rtcp/rtcp.h @@ -23,6 +23,7 @@ #include "media/cast/net/cast_transport_defines.h" #include "media/cast/net/cast_transport_sender.h" #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" +#include "media/cast/net/rtcp/rtcp_builder.h" #include "media/cast/net/rtcp/rtcp_defines.h" namespace media { @@ -31,7 +32,7 @@ namespace cast { class LocalRtcpReceiverFeedback; class PacedPacketSender; class RtcpReceiver; -class RtcpSender; +class RtcpBuilder; typedef std::pair<uint32, base::TimeTicks> RtcpSendTimePair; typedef std::map<uint32, base::TimeTicks> RtcpSendTimeMap; @@ -138,7 +139,8 @@ class Rtcp { const RtcpRttCallback rtt_callback_; const RtcpLogMessageCallback log_callback_; base::TickClock* const clock_; // Not owned by this class. - const scoped_ptr<RtcpSender> rtcp_sender_; + RtcpBuilder rtcp_builder_; + PacedPacketSender* packet_sender_; // Not owned. const uint32 local_ssrc_; const uint32 remote_ssrc_; diff --git a/media/cast/net/rtcp/rtcp_sender.cc b/media/cast/net/rtcp/rtcp_builder.cc index 4ca6eb5..b4e58c3 100644 --- a/media/cast/net/rtcp/rtcp_sender.cc +++ b/media/cast/net/rtcp/rtcp_builder.cc @@ -2,17 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/net/rtcp/rtcp_sender.h" +#include "media/cast/net/rtcp/rtcp_builder.h" #include <stdint.h> #include <algorithm> #include <vector> -#include "base/big_endian.h" #include "base/logging.h" #include "media/cast/net/cast_transport_defines.h" -#include "media/cast/net/pacing/paced_sender.h" #include "media/cast/net/rtcp/rtcp_defines.h" #include "media/cast/net/rtcp/rtcp_utility.h" @@ -46,7 +44,7 @@ bool EventTimestampLessThan(const RtcpReceiverEventLogMessage& lhs, return lhs.event_timestamp < rhs.event_timestamp; } -void AddReceiverLog( +void AddReceiverLogEntries( const RtcpReceiverLogMessage& redundancy_receiver_log_message, RtcpReceiverLogMessage* receiver_log_message, size_t* remaining_space, @@ -67,7 +65,7 @@ void AddReceiverLog( *remaining_space -= kRtcpReceiverFrameLogSize + event_log_messages.size() * kRtcpReceiverEventLogSize; - ++*number_of_frames; + ++number_of_frames; *total_number_of_messages_to_send += event_log_messages.size(); ++it; } @@ -145,161 +143,139 @@ class NackStringBuilder { }; } // namespace -RtcpSender::RtcpSender(PacedPacketSender* outgoing_transport, - uint32 sending_ssrc) - : ssrc_(sending_ssrc), - transport_(outgoing_transport) { +RtcpBuilder::RtcpBuilder(uint32 sending_ssrc) + : writer_(NULL, 0), + ssrc_(sending_ssrc), + ptr_of_length_(NULL) { } -RtcpSender::~RtcpSender() {} +RtcpBuilder::~RtcpBuilder() {} + +void RtcpBuilder::PatchLengthField() { + if (ptr_of_length_) { + // Back-patch the packet length. The client must have taken + // care of proper padding to 32-bit words. + int this_packet_length = (writer_.ptr() - ptr_of_length_ - 2); + DCHECK_EQ(0, this_packet_length % 4) + << "Packets must be a multiple of 32 bits long"; + *ptr_of_length_ = this_packet_length >> 10; + *(ptr_of_length_ + 1) = (this_packet_length >> 2) & 0xFF; + ptr_of_length_ = NULL; + } +} + +// Set the 5-bit value in the 1st byte of the header +// and the payload type. Set aside room for the length field, +// and make provision for back-patching it. +void RtcpBuilder::AddRtcpHeader(RtcpPacketFields payload, int format_or_count) { + PatchLengthField(); + writer_.WriteU8(0x80 | (format_or_count & 0x1F)); + writer_.WriteU8(payload); + ptr_of_length_ = writer_.ptr(); + + // Initialize length to "clearly illegal". + writer_.WriteU16(0xDEAD); +} + +void RtcpBuilder::Start() { + packet_ = new base::RefCountedData<Packet>; + packet_->data.resize(kMaxIpPacketSize); + writer_ = base::BigEndianWriter( + reinterpret_cast<char*>(&(packet_->data[0])), kMaxIpPacketSize); +} -void RtcpSender::SendRtcpFromRtpReceiver( +PacketRef RtcpBuilder::Finish() { + PatchLengthField(); + packet_->data.resize(kMaxIpPacketSize - writer_.remaining()); + writer_ = base::BigEndianWriter(NULL, 0); + PacketRef ret = packet_; + packet_ = NULL; + return ret; +} + +PacketRef RtcpBuilder::BuildRtcpFromReceiver( const RtcpReportBlock* report_block, const RtcpReceiverReferenceTimeReport* rrtr, const RtcpCastMessage* cast_message, const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events, base::TimeDelta target_delay) { - PacketRef packet(new base::RefCountedData<Packet>); - packet->data.reserve(kMaxIpPacketSize); + Start(); + if (report_block) - BuildRR(report_block, &packet->data); + AddRR(report_block); if (rrtr) - BuildRrtr(rrtr, &packet->data); + AddRrtr(rrtr); if (cast_message) - BuildCast(cast_message, target_delay, &packet->data); + AddCast(cast_message, target_delay); if (rtcp_events) - BuildReceiverLog(*rtcp_events, &packet->data); - - if (packet->data.empty()) { - NOTREACHED() << "Empty packet."; - return; // Sanity don't send empty packets. - } + AddReceiverLog(*rtcp_events); - transport_->SendRtcpPacket(ssrc_, packet); + return Finish(); } -void RtcpSender::SendRtcpFromRtpSender( - const RtcpSenderInfo& sender_info) { - PacketRef packet(new base::RefCountedData<Packet>); - packet->data.reserve(kMaxIpPacketSize); - BuildSR(sender_info, &packet->data); - - if (packet->data.empty()) { - NOTREACHED() << "Empty packet."; - return; // Sanity - don't send empty packets. - } - - transport_->SendRtcpPacket(ssrc_, packet); +PacketRef RtcpBuilder::BuildRtcpFromSender(const RtcpSenderInfo& sender_info) { + Start(); + AddSR(sender_info); + return Finish(); } -void RtcpSender::BuildRR(const RtcpReportBlock* report_block, - Packet* packet) const { - size_t start_size = packet->size(); - DCHECK_LT(start_size + 32, kMaxIpPacketSize) << "Not enough buffer space"; - if (start_size + 32 > kMaxIpPacketSize) - return; - - uint16 number_of_rows = (report_block) ? 7 : 1; - packet->resize(start_size + 8); - - base::BigEndianWriter big_endian_writer( - reinterpret_cast<char*>(&((*packet)[start_size])), 8); - big_endian_writer.WriteU8(0x80 + (report_block ? 1 : 0)); - big_endian_writer.WriteU8(kPacketTypeReceiverReport); - big_endian_writer.WriteU16(number_of_rows); - big_endian_writer.WriteU32(ssrc_); - +void RtcpBuilder::AddRR(const RtcpReportBlock* report_block) { + AddRtcpHeader(kPacketTypeReceiverReport, report_block ? 1 : 0); + writer_.WriteU32(ssrc_); if (report_block) { - AddReportBlocks(*report_block, packet); // Adds 24 bytes. + AddReportBlocks(*report_block); // Adds 24 bytes. } } -void RtcpSender::AddReportBlocks(const RtcpReportBlock& report_block, - Packet* packet) const { - size_t start_size = packet->size(); - DCHECK_LT(start_size + 24, kMaxIpPacketSize) << "Not enough buffer space"; - if (start_size + 24 > kMaxIpPacketSize) - return; - - packet->resize(start_size + 24); - - base::BigEndianWriter big_endian_writer( - reinterpret_cast<char*>(&((*packet)[start_size])), 24); - big_endian_writer.WriteU32(report_block.media_ssrc); - big_endian_writer.WriteU8(report_block.fraction_lost); - big_endian_writer.WriteU8(report_block.cumulative_lost >> 16); - big_endian_writer.WriteU8(report_block.cumulative_lost >> 8); - big_endian_writer.WriteU8(report_block.cumulative_lost); +void RtcpBuilder::AddReportBlocks(const RtcpReportBlock& report_block) { + writer_.WriteU32(report_block.media_ssrc); + writer_.WriteU8(report_block.fraction_lost); + writer_.WriteU8(report_block.cumulative_lost >> 16); + writer_.WriteU8(report_block.cumulative_lost >> 8); + writer_.WriteU8(report_block.cumulative_lost); // Extended highest seq_no, contain the highest sequence number received. - big_endian_writer.WriteU32(report_block.extended_high_sequence_number); - big_endian_writer.WriteU32(report_block.jitter); + writer_.WriteU32(report_block.extended_high_sequence_number); + writer_.WriteU32(report_block.jitter); // Last SR timestamp; our NTP time when we received the last report. // This is the value that we read from the send report packet not when we // received it. - big_endian_writer.WriteU32(report_block.last_sr); + writer_.WriteU32(report_block.last_sr); // Delay since last received report, time since we received the report. - big_endian_writer.WriteU32(report_block.delay_since_last_sr); + writer_.WriteU32(report_block.delay_since_last_sr); } -void RtcpSender::BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr, - Packet* packet) const { - size_t start_size = packet->size(); - DCHECK_LT(start_size + 20, kMaxIpPacketSize) << "Not enough buffer space"; - if (start_size + 20 > kMaxIpPacketSize) - return; - - packet->resize(start_size + 20); - - base::BigEndianWriter big_endian_writer( - reinterpret_cast<char*>(&((*packet)[start_size])), 20); - - big_endian_writer.WriteU8(0x80); - big_endian_writer.WriteU8(kPacketTypeXr); - big_endian_writer.WriteU16(4); // Length. - big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. - big_endian_writer.WriteU8(4); // Add block type. - big_endian_writer.WriteU8(0); // Add reserved. - big_endian_writer.WriteU16(2); // Block length. +void RtcpBuilder::AddRrtr(const RtcpReceiverReferenceTimeReport* rrtr) { + AddRtcpHeader(kPacketTypeXr, 0); + writer_.WriteU32(ssrc_); // Add our own SSRC. + writer_.WriteU8(4); // Add block type. + writer_.WriteU8(0); // Add reserved. + writer_.WriteU16(2); // Block length. // Add the media (received RTP) SSRC. - big_endian_writer.WriteU32(rrtr->ntp_seconds); - big_endian_writer.WriteU32(rrtr->ntp_fraction); + writer_.WriteU32(rrtr->ntp_seconds); + writer_.WriteU32(rrtr->ntp_fraction); } -void RtcpSender::BuildCast(const RtcpCastMessage* cast, - base::TimeDelta target_delay, - Packet* packet) const { - size_t start_size = packet->size(); - DCHECK_LT(start_size + 20, kMaxIpPacketSize) << "Not enough buffer space"; - if (start_size + 20 > kMaxIpPacketSize) - return; - - packet->resize(start_size + 20); - - base::BigEndianWriter big_endian_writer( - reinterpret_cast<char*>(&((*packet)[start_size])), 20); - uint8 FMT = 15; // Application layer feedback. - big_endian_writer.WriteU8(0x80 + FMT); - big_endian_writer.WriteU8(kPacketTypePayloadSpecific); - big_endian_writer.WriteU8(0); - size_t cast_size_pos = start_size + 3; // Save length position. - big_endian_writer.WriteU8(4); - big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. - big_endian_writer.WriteU32(cast->media_ssrc); // Remote SSRC. - big_endian_writer.WriteU32(kCast); - big_endian_writer.WriteU8(static_cast<uint8>(cast->ack_frame_id)); - size_t cast_loss_field_pos = start_size + 17; // Save loss field position. - big_endian_writer.WriteU8(0); // Overwritten with number_of_loss_fields. +void RtcpBuilder::AddCast(const RtcpCastMessage* cast, + base::TimeDelta target_delay) { + // See RTC 4585 Section 6.4 for application specific feedback messages. + AddRtcpHeader(kPacketTypePayloadSpecific, 15); + writer_.WriteU32(ssrc_); // Add our own SSRC. + writer_.WriteU32(cast->media_ssrc); // Remote SSRC. + writer_.WriteU32(kCast); + writer_.WriteU8(static_cast<uint8>(cast->ack_frame_id)); + uint8* cast_loss_field_pos = reinterpret_cast<uint8*>(writer_.ptr()); + writer_.WriteU8(0); // Overwritten with number_of_loss_fields. DCHECK_LE(target_delay.InMilliseconds(), std::numeric_limits<uint16_t>::max()); - big_endian_writer.WriteU16(target_delay.InMilliseconds()); + writer_.WriteU16(target_delay.InMilliseconds()); size_t number_of_loss_fields = 0; size_t max_number_of_loss_fields = std::min<size_t>( - kRtcpMaxCastLossFields, (kMaxIpPacketSize - packet->size()) / 4); + kRtcpMaxCastLossFields, writer_.remaining() / 4); MissingFramesAndPacketsMap::const_iterator frame_it = cast->missing_frames_and_packets.begin(); @@ -312,28 +288,18 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast, // Iterate through all frames with missing packets. if (frame_it->second.empty()) { // Special case all packets in a frame is missing. - start_size = packet->size(); - packet->resize(start_size + 4); - base::BigEndianWriter big_endian_nack_writer( - reinterpret_cast<char*>(&((*packet)[start_size])), 4); - big_endian_nack_writer.WriteU8(static_cast<uint8>(frame_it->first)); - big_endian_nack_writer.WriteU16(kRtcpCastAllPacketsLost); - big_endian_nack_writer.WriteU8(0); + writer_.WriteU8(static_cast<uint8>(frame_it->first)); + writer_.WriteU16(kRtcpCastAllPacketsLost); + writer_.WriteU8(0); nack_string_builder.PushPacket(kRtcpCastAllPacketsLost); ++number_of_loss_fields; } else { PacketIdSet::const_iterator packet_it = frame_it->second.begin(); while (packet_it != frame_it->second.end()) { uint16 packet_id = *packet_it; - - start_size = packet->size(); - packet->resize(start_size + 4); - base::BigEndianWriter big_endian_nack_writer( - reinterpret_cast<char*>(&((*packet)[start_size])), 4); - // Write frame and packet id to buffer before calculating bitmask. - big_endian_nack_writer.WriteU8(static_cast<uint8>(frame_it->first)); - big_endian_nack_writer.WriteU16(packet_id); + writer_.WriteU8(static_cast<uint8>(frame_it->first)); + writer_.WriteU16(packet_id); nack_string_builder.PushPacket(packet_id); uint8 bitmask = 0; @@ -348,7 +314,7 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast, break; } } - big_endian_nack_writer.WriteU8(bitmask); + writer_.WriteU8(bitmask); ++number_of_loss_fields; } } @@ -358,34 +324,17 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast, << ", ACK: " << cast->ack_frame_id << ", NACK: " << nack_string_builder.GetString(); DCHECK_LE(number_of_loss_fields, kRtcpMaxCastLossFields); - (*packet)[cast_size_pos] = static_cast<uint8>(4 + number_of_loss_fields); - (*packet)[cast_loss_field_pos] = static_cast<uint8>(number_of_loss_fields); + *cast_loss_field_pos = static_cast<uint8>(number_of_loss_fields); } -void RtcpSender::BuildSR(const RtcpSenderInfo& sender_info, - Packet* packet) const { - // Sender report. - size_t start_size = packet->size(); - if (start_size + 52 > kMaxIpPacketSize) { - DLOG(FATAL) << "Not enough buffer space"; - return; - } - - uint16 number_of_rows = 6; - packet->resize(start_size + 28); - - base::BigEndianWriter big_endian_writer( - reinterpret_cast<char*>(&((*packet)[start_size])), 28); - big_endian_writer.WriteU8(0x80); - big_endian_writer.WriteU8(kPacketTypeSenderReport); - big_endian_writer.WriteU16(number_of_rows); - big_endian_writer.WriteU32(ssrc_); - big_endian_writer.WriteU32(sender_info.ntp_seconds); - big_endian_writer.WriteU32(sender_info.ntp_fraction); - big_endian_writer.WriteU32(sender_info.rtp_timestamp); - big_endian_writer.WriteU32(sender_info.send_packet_count); - big_endian_writer.WriteU32(static_cast<uint32>(sender_info.send_octet_count)); - return; +void RtcpBuilder::AddSR(const RtcpSenderInfo& sender_info) { + AddRtcpHeader(kPacketTypeSenderReport, 0); + writer_.WriteU32(ssrc_); + writer_.WriteU32(sender_info.ntp_seconds); + writer_.WriteU32(sender_info.ntp_fraction); + writer_.WriteU32(sender_info.rtp_timestamp); + writer_.WriteU32(sender_info.send_packet_count); + writer_.WriteU32(static_cast<uint32>(sender_info.send_octet_count)); } /* @@ -405,58 +354,31 @@ void RtcpSender::BuildSR(const RtcpSenderInfo& sender_info, | delay since last RR (DLRR) | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ */ -void RtcpSender::BuildDlrrRb(const RtcpDlrrReportBlock& dlrr, - Packet* packet) const { - size_t start_size = packet->size(); - if (start_size + 24 > kMaxIpPacketSize) { - DLOG(FATAL) << "Not enough buffer space"; - return; - } - - packet->resize(start_size + 24); - - base::BigEndianWriter big_endian_writer( - reinterpret_cast<char*>(&((*packet)[start_size])), 24); - big_endian_writer.WriteU8(0x80); - big_endian_writer.WriteU8(kPacketTypeXr); - big_endian_writer.WriteU16(5); // Length. - big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. - big_endian_writer.WriteU8(5); // Add block type. - big_endian_writer.WriteU8(0); // Add reserved. - big_endian_writer.WriteU16(3); // Block length. - big_endian_writer.WriteU32(ssrc_); // Add the media (received RTP) SSRC. - big_endian_writer.WriteU32(dlrr.last_rr); - big_endian_writer.WriteU32(dlrr.delay_since_last_rr); - return; +void RtcpBuilder::AddDlrrRb(const RtcpDlrrReportBlock& dlrr) { + AddRtcpHeader(kPacketTypeXr, 0); + writer_.WriteU32(ssrc_); // Add our own SSRC. + writer_.WriteU8(5); // Add block type. + writer_.WriteU8(0); // Add reserved. + writer_.WriteU16(3); // Block length. + writer_.WriteU32(ssrc_); // Add the media (received RTP) SSRC. + writer_.WriteU32(dlrr.last_rr); + writer_.WriteU32(dlrr.delay_since_last_rr); } -void RtcpSender::BuildReceiverLog( - const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, - Packet* packet) { - const size_t packet_start_size = packet->size(); - size_t number_of_frames = 0; +void RtcpBuilder::AddReceiverLog( + const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events) { size_t total_number_of_messages_to_send = 0; - size_t rtcp_log_size = 0; RtcpReceiverLogMessage receiver_log_message; - if (!BuildRtcpReceiverLogMessage(rtcp_events, - packet_start_size, - &receiver_log_message, - &number_of_frames, - &total_number_of_messages_to_send, - &rtcp_log_size)) { + if (!GetRtcpReceiverLogMessage(rtcp_events, + &receiver_log_message, + &total_number_of_messages_to_send)) { return; } - packet->resize(packet_start_size + rtcp_log_size); - base::BigEndianWriter big_endian_writer( - reinterpret_cast<char*>(&((*packet)[packet_start_size])), rtcp_log_size); - big_endian_writer.WriteU8(0x80 + kReceiverLogSubtype); - big_endian_writer.WriteU8(kPacketTypeApplicationDefined); - big_endian_writer.WriteU16(static_cast<uint16>( - 2 + 2 * number_of_frames + total_number_of_messages_to_send)); - big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. - big_endian_writer.WriteU32(kCast); + AddRtcpHeader(kPacketTypeApplicationDefined, kReceiverLogSubtype); + writer_.WriteU32(ssrc_); // Add our own SSRC. + writer_.WriteU32(kCast); while (!receiver_log_message.empty() && total_number_of_messages_to_send > 0) { @@ -464,7 +386,7 @@ void RtcpSender::BuildReceiverLog( receiver_log_message.front()); // Add our frame header. - big_endian_writer.WriteU32(frame_log_messages.rtp_timestamp_); + writer_.WriteU32(frame_log_messages.rtp_timestamp_); size_t messages_in_frame = frame_log_messages.event_log_messages_.size(); if (messages_in_frame > total_number_of_messages_to_send) { // We are running out of space. @@ -474,15 +396,15 @@ void RtcpSender::BuildReceiverLog( total_number_of_messages_to_send -= messages_in_frame; // On the wire format is number of messages - 1. - big_endian_writer.WriteU8(static_cast<uint8>(messages_in_frame - 1)); + writer_.WriteU8(static_cast<uint8>(messages_in_frame - 1)); base::TimeTicks event_timestamp_base = frame_log_messages.event_log_messages_.front().event_timestamp; uint32 base_timestamp_ms = (event_timestamp_base - base::TimeTicks()).InMilliseconds(); - big_endian_writer.WriteU8(static_cast<uint8>(base_timestamp_ms >> 16)); - big_endian_writer.WriteU8(static_cast<uint8>(base_timestamp_ms >> 8)); - big_endian_writer.WriteU8(static_cast<uint8>(base_timestamp_ms)); + writer_.WriteU8(static_cast<uint8>(base_timestamp_ms >> 16)); + writer_.WriteU8(static_cast<uint8>(base_timestamp_ms >> 8)); + writer_.WriteU8(static_cast<uint8>(base_timestamp_ms)); while (!frame_log_messages.event_log_messages_.empty() && messages_in_frame > 0) { @@ -496,13 +418,13 @@ void RtcpSender::BuildReceiverLog( case FRAME_ACK_SENT: case FRAME_PLAYOUT: case FRAME_DECODED: - big_endian_writer.WriteU16( + writer_.WriteU16( static_cast<uint16>(event_message.delay_delta.InMilliseconds())); - big_endian_writer.WriteU16(event_type_and_timestamp_delta); + writer_.WriteU16(event_type_and_timestamp_delta); break; case PACKET_RECEIVED: - big_endian_writer.WriteU16(event_message.packet_id); - big_endian_writer.WriteU16(event_type_and_timestamp_delta); + writer_.WriteU16(event_message.packet_id); + writer_.WriteU16(event_type_and_timestamp_delta); break; default: NOTREACHED(); @@ -518,15 +440,13 @@ void RtcpSender::BuildReceiverLog( DCHECK_EQ(total_number_of_messages_to_send, 0u); } -bool RtcpSender::BuildRtcpReceiverLogMessage( +bool RtcpBuilder::GetRtcpReceiverLogMessage( const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, - size_t start_size, RtcpReceiverLogMessage* receiver_log_message, - size_t* number_of_frames, - size_t* total_number_of_messages_to_send, - size_t* rtcp_log_size) { + size_t* total_number_of_messages_to_send) { + size_t number_of_frames = 0; size_t remaining_space = - std::min(kMaxReceiverLogBytes, kMaxIpPacketSize - start_size); + std::min<size_t>(kMaxReceiverLogBytes, writer_.remaining()); if (remaining_space < kRtcpCastLogHeaderSize + kRtcpReceiverFrameLogSize + kRtcpReceiverEventLogSize) { return false; @@ -548,7 +468,7 @@ bool RtcpSender::BuildRtcpReceiverLogMessage( const RtpTimestamp rtp_timestamp = rit->first; RtcpReceiverFrameLogMessage frame_log(rtp_timestamp); remaining_space -= kRtcpReceiverFrameLogSize; - ++*number_of_frames; + ++number_of_frames; // Get all events of a single frame. sorted_log_messages.clear(); @@ -598,20 +518,20 @@ bool RtcpSender::BuildRtcpReceiverLogMessage( // unlikely there will be a match anyway. if (rtcp_events_history_.size() > kFirstRedundancyOffset) { // Add first redundnacy messages, if enough space remaining - AddReceiverLog(rtcp_events_history_[kFirstRedundancyOffset], - receiver_log_message, - &remaining_space, - number_of_frames, - total_number_of_messages_to_send); + AddReceiverLogEntries(rtcp_events_history_[kFirstRedundancyOffset], + receiver_log_message, + &remaining_space, + &number_of_frames, + total_number_of_messages_to_send); } if (rtcp_events_history_.size() > kSecondRedundancyOffset) { // Add second redundancy messages, if enough space remaining - AddReceiverLog(rtcp_events_history_[kSecondRedundancyOffset], - receiver_log_message, - &remaining_space, - number_of_frames, - total_number_of_messages_to_send); + AddReceiverLogEntries(rtcp_events_history_[kSecondRedundancyOffset], + receiver_log_message, + &remaining_space, + &number_of_frames, + total_number_of_messages_to_send); } if (rtcp_events_history_.size() > kReceiveLogMessageHistorySize) { @@ -620,16 +540,9 @@ bool RtcpSender::BuildRtcpReceiverLogMessage( DCHECK_LE(rtcp_events_history_.size(), kReceiveLogMessageHistorySize); - *rtcp_log_size = - kRtcpCastLogHeaderSize + *number_of_frames * kRtcpReceiverFrameLogSize + - *total_number_of_messages_to_send * kRtcpReceiverEventLogSize; - DCHECK_GE(kMaxIpPacketSize, start_size + *rtcp_log_size) - << "Not enough buffer space."; - - VLOG(3) << "number of frames: " << *number_of_frames; + VLOG(3) << "number of frames: " << number_of_frames; VLOG(3) << "total messages to send: " << *total_number_of_messages_to_send; - VLOG(3) << "rtcp log size: " << *rtcp_log_size; - return *number_of_frames > 0; + return number_of_frames > 0; } } // namespace cast diff --git a/media/cast/net/rtcp/rtcp_sender.h b/media/cast/net/rtcp/rtcp_builder.h index 06b11d4..b530648 100644 --- a/media/cast/net/rtcp/rtcp_sender.h +++ b/media/cast/net/rtcp/rtcp_builder.h @@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_NET_RTCP_RTCP_SENDER_H_ -#define MEDIA_CAST_NET_RTCP_RTCP_SENDER_H_ +#ifndef MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_ +#define MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_ #include <deque> #include <list> #include <string> +#include "base/big_endian.h" #include "media/cast/cast_config.h" #include "media/cast/cast_defines.h" #include "media/cast/net/cast_transport_defines.h" @@ -38,67 +39,49 @@ COMPILE_ASSERT(kSecondRedundancyOffset > kReceiveLogMessageHistorySize, redundancy_offset_out_of_range); -class PacedPacketSender; -// TODO(hclam): This should be renamed to RtcpPacketBuilder. The function -// of this class is to only to build a RTCP packet but not to send it. -class RtcpSender { +class RtcpBuilder { public: - RtcpSender(PacedPacketSender* outgoing_transport, - uint32 sending_ssrc); - ~RtcpSender(); + explicit RtcpBuilder(uint32 sending_ssrc); + ~RtcpBuilder(); - // TODO(hclam): This method should be to build a packet instead of - // sending it. - void SendRtcpFromRtpReceiver( + PacketRef BuildRtcpFromReceiver( const RtcpReportBlock* report_block, const RtcpReceiverReferenceTimeReport* rrtr, const RtcpCastMessage* cast_message, const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events, base::TimeDelta target_delay); - // TODO(hclam): This method should be to build a packet instead of - // sending it. - void SendRtcpFromRtpSender(const RtcpSenderInfo& sender_info); + PacketRef BuildRtcpFromSender(const RtcpSenderInfo& sender_info); private: - void BuildRR(const RtcpReportBlock* report_block, - Packet* packet) const; - - void AddReportBlocks(const RtcpReportBlock& report_block, - Packet* packet) const; - - void BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr, - Packet* packet) const; - - void BuildCast(const RtcpCastMessage* cast_message, - base::TimeDelta target_delay, - Packet* packet) const; - - void BuildSR(const RtcpSenderInfo& sender_info, Packet* packet) const; - - void BuildDlrrRb(const RtcpDlrrReportBlock& dlrr, Packet* packet) const; - - void BuildReceiverLog( + void AddRtcpHeader(RtcpPacketFields payload, int format_or_count); + void PatchLengthField(); + void AddRR(const RtcpReportBlock* report_block); + void AddReportBlocks(const RtcpReportBlock& report_block); + void AddRrtr(const RtcpReceiverReferenceTimeReport* rrtr); + void AddCast(const RtcpCastMessage* cast_message, + base::TimeDelta target_delay); + void AddSR(const RtcpSenderInfo& sender_info); + void AddDlrrRb(const RtcpDlrrReportBlock& dlrr); + void AddReceiverLog( + const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events); + + bool GetRtcpReceiverLogMessage( const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, - Packet* packet); - - bool BuildRtcpReceiverLogMessage( - const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, - size_t start_size, RtcpReceiverLogMessage* receiver_log_message, - size_t* number_of_frames, - size_t* total_number_of_messages_to_send, - size_t* rtcp_log_size); + size_t* total_number_of_messages_to_send); - const uint32 ssrc_; - - // Not owned by this class. - PacedPacketSender* const transport_; + void Start(); + PacketRef Finish(); + base::BigEndianWriter writer_; + const uint32 ssrc_; + char* ptr_of_length_; + PacketRef packet_; std::deque<RtcpReceiverLogMessage> rtcp_events_history_; - DISALLOW_COPY_AND_ASSIGN(RtcpSender); + DISALLOW_COPY_AND_ASSIGN(RtcpBuilder); }; } // namespace cast diff --git a/media/cast/net/rtcp/rtcp_sender_unittest.cc b/media/cast/net/rtcp/rtcp_builder_unittest.cc index 6dbea4d..cc0139f 100644 --- a/media/cast/net/rtcp/rtcp_sender_unittest.cc +++ b/media/cast/net/rtcp/rtcp_builder_unittest.cc @@ -9,10 +9,9 @@ #include "media/cast/net/cast_transport_defines.h" #include "media/cast/net/pacing/paced_sender.h" #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" -#include "media/cast/net/rtcp/rtcp_sender.h" +#include "media/cast/net/rtcp/rtcp_builder.h" #include "media/cast/net/rtcp/rtcp_utility.h" #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" -#include "media/cast/test/fake_single_thread_task_runner.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { @@ -40,93 +39,52 @@ RtcpReportBlock GetReportBlock() { } // namespace -class TestRtcpTransport : public PacedPacketSender { - public: - TestRtcpTransport() : packet_count_(0) {} - - virtual bool SendRtcpPacket(uint32 ssrc, - PacketRef packet) OVERRIDE { - EXPECT_EQ(expected_packet_.size(), packet->data.size()); - if (expected_packet_.size() != packet->data.size()) - return false; - EXPECT_EQ(0, memcmp(&expected_packet_[0], - &packet->data[0], - packet->data.size())); - packet_count_++; - return true; - } - - virtual bool SendPackets( - const SendPacketVector& packets) OVERRIDE { - return false; - } - virtual bool ResendPackets( - const SendPacketVector& packets, - const DedupInfo& dedup_info) OVERRIDE { - return false; - } - virtual void CancelSendingPacket( - const PacketKey& packet_key) OVERRIDE { - } - - void SetExpectedRtcpPacket(scoped_ptr<Packet> packet) { - expected_packet_.swap(*packet); - } - - int packet_count() const { return packet_count_; } - - private: - Packet expected_packet_; - int packet_count_; - - DISALLOW_COPY_AND_ASSIGN(TestRtcpTransport); -}; - -class RtcpSenderTest : public ::testing::Test { +class RtcpBuilderTest : public ::testing::Test { protected: - RtcpSenderTest() + RtcpBuilderTest() : testing_clock_(new base::SimpleTestTickClock()), - task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), - cast_environment_(new CastEnvironment( - scoped_ptr<base::TickClock>(testing_clock_).Pass(), - task_runner_, - task_runner_, - task_runner_)), - rtcp_sender_(new RtcpSender(&test_transport_, kSendingSsrc)) {} + rtcp_builder_(new RtcpBuilder(kSendingSsrc)) {} + + void ExpectPacketEQ(scoped_ptr<Packet> golden_packet, + PacketRef packet) { + EXPECT_EQ(golden_packet->size(), packet->data.size()); + if (golden_packet->size() == packet->data.size()) { + for (size_t x = 0; x < golden_packet->size(); x++) { + EXPECT_EQ((*golden_packet)[x], packet->data[x]); + if ((*golden_packet)[x] != packet->data[x]) + break; + } + } + } base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. - TestRtcpTransport test_transport_; - scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; - scoped_refptr<CastEnvironment> cast_environment_; - scoped_ptr<RtcpSender> rtcp_sender_; + scoped_ptr<RtcpBuilder> rtcp_builder_; - DISALLOW_COPY_AND_ASSIGN(RtcpSenderTest); + DISALLOW_COPY_AND_ASSIGN(RtcpBuilderTest); }; -TEST_F(RtcpSenderTest, RtcpReceiverReport) { +TEST_F(RtcpBuilderTest, RtcpReceiverReport) { // Receiver report with report block. TestRtcpPacketBuilder p2; p2.AddRr(kSendingSsrc, 1); p2.AddRb(kMediaSsrc); - test_transport_.SetExpectedRtcpPacket(p2.GetPacket().Pass()); RtcpReportBlock report_block = GetReportBlock(); - rtcp_sender_->SendRtcpFromRtpReceiver( - &report_block, NULL, NULL, NULL, kDefaultDelay); - - EXPECT_EQ(1, test_transport_.packet_count()); + ExpectPacketEQ( + p2.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromReceiver( + &report_block, NULL, NULL, NULL, kDefaultDelay)); } -TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtr) { +TEST_F(RtcpBuilderTest, RtcpReceiverReportWithRrtr) { // Receiver report with report block. TestRtcpPacketBuilder p; p.AddRr(kSendingSsrc, 1); p.AddRb(kMediaSsrc); p.AddXrHeader(kSendingSsrc); p.AddXrRrtrBlock(); - test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); RtcpReportBlock report_block = GetReportBlock(); @@ -134,23 +92,21 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtr) { rrtr.ntp_seconds = kNtpHigh; rrtr.ntp_fraction = kNtpLow; - rtcp_sender_->SendRtcpFromRtpReceiver( - &report_block, - &rrtr, - NULL, - NULL, - kDefaultDelay); - - EXPECT_EQ(1, test_transport_.packet_count()); + ExpectPacketEQ(p.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromReceiver( + &report_block, + &rrtr, + NULL, + NULL, + kDefaultDelay)); } -TEST_F(RtcpSenderTest, RtcpReceiverReportWithCast) { +TEST_F(RtcpBuilderTest, RtcpReceiverReportWithCast) { // Receiver report with report block. TestRtcpPacketBuilder p; p.AddRr(kSendingSsrc, 1); p.AddRb(kMediaSsrc); p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); - test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); RtcpReportBlock report_block = GetReportBlock(); @@ -165,24 +121,22 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithCast) { cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = missing_packets; - rtcp_sender_->SendRtcpFromRtpReceiver( - &report_block, - NULL, - &cast_message, - NULL, - kDefaultDelay); - - EXPECT_EQ(1, test_transport_.packet_count()); + ExpectPacketEQ(p.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromReceiver( + &report_block, + NULL, + &cast_message, + NULL, + kDefaultDelay)); } -TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtraAndCastMessage) { +TEST_F(RtcpBuilderTest, RtcpReceiverReportWithRrtraAndCastMessage) { TestRtcpPacketBuilder p; p.AddRr(kSendingSsrc, 1); p.AddRb(kMediaSsrc); p.AddXrHeader(kSendingSsrc); p.AddXrRrtrBlock(); p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); - test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); RtcpReportBlock report_block = GetReportBlock(); @@ -201,17 +155,16 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtraAndCastMessage) { cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = missing_packets; - rtcp_sender_->SendRtcpFromRtpReceiver( - &report_block, - &rrtr, - &cast_message, - NULL, - kDefaultDelay); - - EXPECT_EQ(1, test_transport_.packet_count()); + ExpectPacketEQ(p.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromReceiver( + &report_block, + &rrtr, + &cast_message, + NULL, + kDefaultDelay)); } -TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { +TEST_F(RtcpBuilderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { static const uint32 kTimeBaseMs = 12345678; static const uint32 kTimeDelayMs = 10; @@ -221,7 +174,6 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { p.AddXrHeader(kSendingSsrc); p.AddXrRrtrBlock(); p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); - test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); RtcpReportBlock report_block = GetReportBlock(); @@ -243,12 +195,13 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; - rtcp_sender_->SendRtcpFromRtpReceiver( - &report_block, - &rrtr, - &cast_message, - &rtcp_events, - kDefaultDelay); + ExpectPacketEQ(p.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromReceiver( + &report_block, + &rrtr, + &cast_message, + &rtcp_events, + kDefaultDelay)); base::SimpleTestTickClock testing_clock; testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); @@ -258,8 +211,6 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs); - test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); - FrameEvent frame_event; frame_event.rtp_timestamp = kRtpTimestamp; frame_event.type = FRAME_ACK_SENT; @@ -278,17 +229,17 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { event_subscriber.GetRtcpEventsAndReset(&rtcp_events); EXPECT_EQ(2u, rtcp_events.size()); - rtcp_sender_->SendRtcpFromRtpReceiver( - &report_block, - &rrtr, - &cast_message, - &rtcp_events, - kDefaultDelay); - - EXPECT_EQ(2, test_transport_.packet_count()); + ExpectPacketEQ( + p.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromReceiver( + &report_block, + &rrtr, + &cast_message, + &rtcp_events, + kDefaultDelay)); } -TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { +TEST_F(RtcpBuilderTest, RtcpReceiverReportWithOversizedFrameLog) { static const uint32 kTimeBaseMs = 12345678; static const uint32 kTimeDelayMs = 10; @@ -320,7 +271,6 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { static_cast<uint16>(kTimeDelayMs * i)); } - test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); FrameEvent frame_event; @@ -344,17 +294,16 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; event_subscriber.GetRtcpEventsAndReset(&rtcp_events); - rtcp_sender_->SendRtcpFromRtpReceiver( - &report_block, - NULL, - NULL, - &rtcp_events, - kDefaultDelay); - - EXPECT_EQ(1, test_transport_.packet_count()); + ExpectPacketEQ(p.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromReceiver( + &report_block, + NULL, + NULL, + &rtcp_events, + kDefaultDelay)); } -TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { +TEST_F(RtcpBuilderTest, RtcpReceiverReportWithTooManyLogFrames) { static const uint32 kTimeBaseMs = 12345678; static const uint32 kTimeDelayMs = 10; @@ -382,7 +331,6 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { p.AddReceiverFrameLog(kRtpTimestamp + i, 1, kTimeBaseMs + i * kTimeDelayMs); p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); } - test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); @@ -399,17 +347,16 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; event_subscriber.GetRtcpEventsAndReset(&rtcp_events); - rtcp_sender_->SendRtcpFromRtpReceiver( - &report_block, - NULL, - NULL, - &rtcp_events, - kDefaultDelay); - - EXPECT_EQ(1, test_transport_.packet_count()); + ExpectPacketEQ(p.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromReceiver( + &report_block, + NULL, + NULL, + &rtcp_events, + kDefaultDelay)); } -TEST_F(RtcpSenderTest, RtcpReceiverReportWithOldLogFrames) { +TEST_F(RtcpBuilderTest, RtcpReceiverReportWithOldLogFrames) { static const uint32 kTimeBaseMs = 12345678; TestRtcpPacketBuilder p; @@ -431,7 +378,6 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithOldLogFrames) { for (int i = 0; i < 10; ++i) { p.AddReceiverEventLog(0, FRAME_ACK_SENT, i * kTimeBetweenEventsMs); } - test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); for (int i = 0; i < 11; ++i) { @@ -448,17 +394,16 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithOldLogFrames) { ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; event_subscriber.GetRtcpEventsAndReset(&rtcp_events); - rtcp_sender_->SendRtcpFromRtpReceiver( - &report_block, - NULL, - NULL, - &rtcp_events, - kDefaultDelay); - - EXPECT_EQ(1, test_transport_.packet_count()); + ExpectPacketEQ(p.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromReceiver( + &report_block, + NULL, + NULL, + &rtcp_events, + kDefaultDelay)); } -TEST_F(RtcpSenderTest, RtcpReceiverReportRedundancy) { +TEST_F(RtcpBuilderTest, RtcpReceiverReportRedundancy) { uint32 time_base_ms = 12345678; int kTimeBetweenEventsMs = 10; @@ -493,8 +438,6 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportRedundancy) { p.AddReceiverFrameLog(kRtpTimestamp, 1, time_base_ms); p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); - test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); - FrameEvent frame_event; frame_event.rtp_timestamp = kRtpTimestamp; frame_event.type = FRAME_ACK_SENT; @@ -505,22 +448,21 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportRedundancy) { ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; event_subscriber.GetRtcpEventsAndReset(&rtcp_events); - rtcp_sender_->SendRtcpFromRtpReceiver( - &report_block, - NULL, - NULL, - &rtcp_events, - kDefaultDelay); + ExpectPacketEQ(p.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromReceiver( + &report_block, + NULL, + NULL, + &rtcp_events, + kDefaultDelay)); testing_clock.Advance( base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs)); time_base_ms += kTimeBetweenEventsMs; } - - EXPECT_EQ(static_cast<int>(packet_count), test_transport_.packet_count()); } -TEST_F(RtcpSenderTest, RtcpSenderReport) { +TEST_F(RtcpBuilderTest, RtcpSenderReport) { RtcpSenderInfo sender_info; sender_info.ntp_seconds = kNtpHigh; sender_info.ntp_fraction = kNtpLow; @@ -531,11 +473,9 @@ TEST_F(RtcpSenderTest, RtcpSenderReport) { // Sender report. TestRtcpPacketBuilder p; p.AddSr(kSendingSsrc, 0); - test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); - - rtcp_sender_->SendRtcpFromRtpSender(sender_info); - EXPECT_EQ(1, test_transport_.packet_count()); + ExpectPacketEQ(p.GetPacket().Pass(), + rtcp_builder_->BuildRtcpFromSender(sender_info)); } } // namespace cast |