Chromium Code Reviews| Index: media/cast/transport/pacing/paced_sender.cc |
| diff --git a/media/cast/transport/pacing/paced_sender.cc b/media/cast/transport/pacing/paced_sender.cc |
| index 976e68ad8d60c33e50ff84f806a3cfcd24d84d32..8c1281131f564ce7467958b7419ce7e6e75dba36 100644 |
| --- a/media/cast/transport/pacing/paced_sender.cc |
| +++ b/media/cast/transport/pacing/paced_sender.cc |
| @@ -4,6 +4,7 @@ |
| #include "media/cast/transport/pacing/paced_sender.h" |
| +#include "base/big_endian.h" |
| #include "base/bind.h" |
| #include "base/message_loop/message_loop.h" |
| @@ -17,15 +18,31 @@ static const int64 kPacingIntervalMs = 10; |
| // bursts of packets. |
| static const size_t kPacingMaxBurstsPerFrame = 3; |
| +using media::cast::CastLoggingEvent; |
| + |
| +CastLoggingEvent GetLoggingEvent(bool is_audio, bool retransmit) { |
| + if (retransmit) { |
| + return is_audio ? media::cast::kAudioPacketRetransmitted |
| + : media::cast::kVideoPacketRetransmitted; |
| + } else { |
| + return is_audio ? media::cast::kAudioPacketSentToNetwork |
| + : media::cast::kVideoPacketSentToNetwork; |
| + } |
| +} |
| + |
| } // namespace |
| PacedSender::PacedSender( |
| base::TickClock* clock, |
| + LoggingImpl* logging, |
| PacketSender* transport, |
| const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) |
| : clock_(clock), |
| + logging_(logging), |
| transport_(transport), |
| transport_task_runner_(transport_task_runner), |
| + audio_ssrc_(0), |
| + video_ssrc_(0), |
| burst_size_(1), |
| packets_sent_in_burst_(0), |
| weak_factory_(this) { |
| @@ -34,16 +51,25 @@ PacedSender::PacedSender( |
| PacedSender::~PacedSender() {} |
| +void PacedSender::RegisterAudioSsrc(uint32 audio_ssrc) { |
| + audio_ssrc_ = audio_ssrc; |
| +} |
| + |
| +void PacedSender::RegisterVideoSsrc(uint32 video_ssrc) { |
| + video_ssrc_ = video_ssrc; |
| +} |
| + |
| bool PacedSender::SendPackets(const PacketList& packets) { |
| - return SendPacketsToTransport(packets, &packet_list_); |
| + return SendPacketsToTransport(packets, &packet_list_, false); |
| } |
| bool PacedSender::ResendPackets(const PacketList& packets) { |
| - return SendPacketsToTransport(packets, &resend_packet_list_); |
| + return SendPacketsToTransport(packets, &resend_packet_list_, true); |
| } |
| bool PacedSender::SendPacketsToTransport(const PacketList& packets, |
| - PacketList* packets_not_sent) { |
| + PacketList* packets_not_sent, |
| + bool retransmit) { |
| UpdateBurstSize(packets.size()); |
| if (!packets_not_sent->empty()) { |
| @@ -71,6 +97,12 @@ bool PacedSender::SendPacketsToTransport(const PacketList& packets, |
| if (packets_to_send.empty()) |
| return true; |
| + for (PacketList::iterator it = packets_to_send.begin(); |
| + it != packets_to_send.end(); |
| + ++it) { |
| + LogPacketEvent(*it, retransmit); |
| + } |
| + |
| return TransmitPackets(packets_to_send); |
| } |
| @@ -111,6 +143,12 @@ void PacedSender::SendStoredPackets() { |
| size_t packets_to_send_now = |
| std::min(packets_to_send, resend_packet_list_.size()); |
| std::advance(it, packets_to_send_now); |
| + |
| + for (PacketList::iterator log_it = resend_packet_list_.begin(); |
| + log_it != it; |
| + ++log_it) { |
| + LogPacketEvent(*log_it, true); |
| + } |
| packets_to_resend.insert( |
| packets_to_resend.begin(), resend_packet_list_.begin(), it); |
| resend_packet_list_.erase(resend_packet_list_.begin(), it); |
| @@ -119,8 +157,13 @@ void PacedSender::SendStoredPackets() { |
| if (!packet_list_.empty() && packets_to_send > 0) { |
| PacketList::iterator it = packet_list_.begin(); |
| size_t packets_to_send_now = std::min(packets_to_send, packet_list_.size()); |
| - |
| std::advance(it, packets_to_send_now); |
| + |
| + for (PacketList::iterator log_it = packet_list_.begin(); log_it != it; |
| + ++log_it) { |
| + LogPacketEvent(*log_it, false); |
| + } |
| + |
| packets_to_resend.insert(packets_to_resend.end(), packet_list_.begin(), it); |
| packet_list_.erase(packet_list_.begin(), it); |
| @@ -151,6 +194,29 @@ void PacedSender::UpdateBurstSize(size_t packets_to_send) { |
| std::max(packets_to_send / kPacingMaxBurstsPerFrame, burst_size_); |
| } |
| +void PacedSender::LogPacketEvent(const Packet& packet, bool retransmit) { |
| + // Get SSRC from packet and compare with the audio_ssrc / video_ssrc to see |
| + // if the packet is audio or video. |
| + DCHECK_GE(packet.size(), 12u); |
| + base::BigEndianReader reader(reinterpret_cast<const char*>(&packet[8]), 4); |
| + uint32 ssrc; |
| + bool success = reader.ReadU32(&ssrc); |
| + DCHECK(success); |
| + bool is_audio; |
|
Alpha Left Google
2014/03/13 19:56:14
This can be simplified as:
DCHECK(ssrc == audio_s
imcheng
2014/03/13 21:48:58
This changes the behavior though. If we get a pack
|
| + if (ssrc == audio_ssrc_) { |
| + is_audio = true; |
| + } else if (ssrc == video_ssrc_) { |
| + is_audio = false; |
| + } else { |
| + DVLOG(3) << "Got unknown ssrc " << ssrc << " when logging packet event"; |
| + return; |
| + } |
| + |
| + CastLoggingEvent event = GetLoggingEvent(is_audio, retransmit); |
| + |
| + logging_->InsertSinglePacketEvent(clock_->NowTicks(), event, packet); |
| +} |
| + |
| } // namespace transport |
| } // namespace cast |
| } // namespace media |