| Index: media/cast/net/pacing/paced_sender.cc
|
| diff --git a/media/cast/net/pacing/paced_sender.cc b/media/cast/net/pacing/paced_sender.cc
|
| index 878e1d93f57bad6fac54cfa6d286ede658df11b3..4193cc3336e06f4f937b3add6c1bea4f76dfd737 100644
|
| --- a/media/cast/net/pacing/paced_sender.cc
|
| +++ b/media/cast/net/pacing/paced_sender.cc
|
| @@ -46,8 +46,29 @@ PacketKey::PacketKey(const PacketKey& other) = default;
|
|
|
| PacketKey::~PacketKey() {}
|
|
|
| -PacedSender::PacketSendRecord::PacketSendRecord()
|
| - : last_byte_sent(0), last_byte_sent_for_audio(0), cancel_count(0) {}
|
| +struct PacedSender::PacketSendRecord {
|
| + PacketSendRecord()
|
| + : last_byte_sent(0), last_byte_sent_for_audio(0), cancel_count(0) {}
|
| +
|
| + base::TimeTicks time; // Time when the packet was sent.
|
| + int64_t last_byte_sent; // Number of bytes sent to network just after this
|
| + // packet was sent.
|
| + int64_t last_byte_sent_for_audio; // Number of bytes sent to network from
|
| + // audio stream just before this packet.
|
| + int cancel_count; // Number of times the packet was canceled (debugging).
|
| +};
|
| +
|
| +struct PacedSender::RtpSession {
|
| + explicit RtpSession(bool is_audio_stream)
|
| + : last_byte_sent(0), is_audio(is_audio_stream) {}
|
| + RtpSession() {}
|
| +
|
| + // Tracks recently-logged RTP timestamps so that it can expand the truncated
|
| + // values found in packets.
|
| + RtpTimeTicks last_logged_rtp_timestamp_;
|
| + int64_t last_byte_sent;
|
| + bool is_audio;
|
| +};
|
|
|
| PacedSender::PacedSender(
|
| size_t target_burst_size,
|
| @@ -60,8 +81,7 @@ PacedSender::PacedSender(
|
| recent_packet_events_(recent_packet_events),
|
| transport_(transport),
|
| transport_task_runner_(transport_task_runner),
|
| - audio_ssrc_(0),
|
| - video_ssrc_(0),
|
| + last_byte_sent_for_audio_(0),
|
| target_burst_size_(target_burst_size),
|
| max_burst_size_(max_burst_size),
|
| current_max_burst_size_(target_burst_size_),
|
| @@ -74,12 +94,11 @@ PacedSender::PacedSender(
|
|
|
| PacedSender::~PacedSender() {}
|
|
|
| -void PacedSender::RegisterAudioSsrc(uint32_t audio_ssrc) {
|
| - audio_ssrc_ = audio_ssrc;
|
| -}
|
| +void PacedSender::RegisterSsrc(uint32_t ssrc, bool is_audio) {
|
| + if (sessions_.find(ssrc) != sessions_.end())
|
| + DVLOG(1) << "Re-register ssrc: " << ssrc;
|
|
|
| -void PacedSender::RegisterVideoSsrc(uint32_t video_ssrc) {
|
| - video_ssrc_ = video_ssrc;
|
| + sessions_[ssrc] = RtpSession(is_audio);
|
| }
|
|
|
| void PacedSender::RegisterPrioritySsrc(uint32_t ssrc) {
|
| @@ -94,10 +113,11 @@ int64_t PacedSender::GetLastByteSentForPacket(const PacketKey& packet_key) {
|
| }
|
|
|
| int64_t PacedSender::GetLastByteSentForSsrc(uint32_t ssrc) {
|
| - std::map<uint32_t, int64_t>::const_iterator it = last_byte_sent_.find(ssrc);
|
| - if (it == last_byte_sent_.end())
|
| + auto it = sessions_.find(ssrc);
|
| + // Return 0 for unknown session.
|
| + if (it == sessions_.end())
|
| return 0;
|
| - return it->second;
|
| + return it->second.last_byte_sent;
|
| }
|
|
|
| bool PacedSender::SendPackets(const SendPacketVector& packets) {
|
| @@ -150,7 +170,10 @@ bool PacedSender::ShouldResend(const PacketKey& packet_key,
|
| //
|
| // TODO(miu): This sounds wrong. Audio packets are always transmitted first
|
| // (because they are put in |priority_packet_list_|, see PopNextPacket()).
|
| - if (packet_key.ssrc == video_ssrc_) {
|
| + auto session_it = sessions_.find(packet_key.ssrc);
|
| + // The session should always have been registered in |sessions_|.
|
| + DCHECK(session_it != sessions_.end());
|
| + if (!session_it->second.is_audio) {
|
| if (dedup_info.last_byte_acked_for_audio &&
|
| it->second.last_byte_sent_for_audio &&
|
| dedup_info.last_byte_acked_for_audio <
|
| @@ -389,9 +412,15 @@ void PacedSender::SendStoredPackets() {
|
|
|
| // Save the send record.
|
| send_record->last_byte_sent = transport_->GetBytesSent();
|
| - send_record->last_byte_sent_for_audio = GetLastByteSentForSsrc(audio_ssrc_);
|
| + send_record->last_byte_sent_for_audio = last_byte_sent_for_audio_;
|
| send_history_buffer_[packet_key] = *send_record;
|
| - last_byte_sent_[packet_key.ssrc] = send_record->last_byte_sent;
|
| +
|
| + auto it = sessions_.find(packet_key.ssrc);
|
| + // The session should always have been registered in |sessions_|.
|
| + DCHECK(it != sessions_.end());
|
| + it->second.last_byte_sent = send_record->last_byte_sent;
|
| + if (it->second.is_audio)
|
| + last_byte_sent_for_audio_ = send_record->last_byte_sent;
|
|
|
| if (socket_blocked) {
|
| state_ = State_TransportBlocked;
|
| @@ -433,18 +462,13 @@ void PacedSender::LogPacketEvent(const Packet& packet, CastLoggingEvent type) {
|
| success &= reader.ReadU32(&truncated_rtp_timestamp);
|
| uint32_t ssrc;
|
| success &= reader.ReadU32(&ssrc);
|
| - if (ssrc == audio_ssrc_) {
|
| - event.rtp_timestamp = last_logged_audio_rtp_timestamp_ =
|
| - last_logged_audio_rtp_timestamp_.Expand(truncated_rtp_timestamp);
|
| - event.media_type = AUDIO_EVENT;
|
| - } else if (ssrc == video_ssrc_) {
|
| - event.rtp_timestamp = last_logged_video_rtp_timestamp_ =
|
| - last_logged_video_rtp_timestamp_.Expand(truncated_rtp_timestamp);
|
| - event.media_type = VIDEO_EVENT;
|
| - } else {
|
| - DVLOG(3) << "Got unknown ssrc " << ssrc << " when logging packet event";
|
| - return;
|
| - }
|
| +
|
| + auto it = sessions_.find(ssrc);
|
| + // The session should always have been registered in |sessions_|.
|
| + DCHECK(it != sessions_.end());
|
| + event.rtp_timestamp = it->second.last_logged_rtp_timestamp_ =
|
| + it->second.last_logged_rtp_timestamp_.Expand(truncated_rtp_timestamp);
|
| + event.media_type = it->second.is_audio ? AUDIO_EVENT : VIDEO_EVENT;
|
| success &= reader.Skip(2);
|
| success &= reader.ReadU16(&event.packet_id);
|
| success &= reader.ReadU16(&event.max_packet_id);
|
|
|