OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/cast/transport/rtp_sender/rtp_sender.h" | 5 #include "media/cast/transport/rtp_sender/rtp_sender.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/rand_util.h" | 8 #include "base/rand_util.h" |
9 #include "media/cast/transport/cast_transport_defines.h" | 9 #include "media/cast/transport/cast_transport_defines.h" |
10 #include "media/cast/transport/pacing/paced_sender.h" | 10 #include "media/cast/transport/pacing/paced_sender.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 } | 71 } |
72 | 72 |
73 void RtpSender::ResendPackets( | 73 void RtpSender::ResendPackets( |
74 const MissingFramesAndPacketsMap& missing_frames_and_packets) { | 74 const MissingFramesAndPacketsMap& missing_frames_and_packets) { |
75 DCHECK(storage_); | 75 DCHECK(storage_); |
76 // Iterate over all frames in the list. | 76 // Iterate over all frames in the list. |
77 for (MissingFramesAndPacketsMap::const_iterator it = | 77 for (MissingFramesAndPacketsMap::const_iterator it = |
78 missing_frames_and_packets.begin(); | 78 missing_frames_and_packets.begin(); |
79 it != missing_frames_and_packets.end(); | 79 it != missing_frames_and_packets.end(); |
80 ++it) { | 80 ++it) { |
81 PacketList packets_to_resend; | 81 SendPacketVector packets_to_resend; |
82 uint8 frame_id = it->first; | 82 uint8 frame_id = it->first; |
83 const PacketIdSet& packets_set = it->second; | 83 const PacketIdSet& packets_set = it->second; |
84 bool success = false; | 84 bool success = false; |
85 | 85 |
86 if (packets_set.empty()) { | 86 if (packets_set.empty()) { |
87 VLOG(3) << "Missing all packets in frame " << static_cast<int>(frame_id); | 87 VLOG(3) << "Missing all packets in frame " << static_cast<int>(frame_id); |
88 | 88 |
89 uint16 packet_id = 0; | 89 uint16 packet_id = 0; |
90 do { | 90 do { |
91 // Get packet from storage. | 91 // Get packet from storage. |
92 success = storage_->GetPacket(frame_id, packet_id, &packets_to_resend); | 92 success = storage_->GetPacket(frame_id, packet_id, &packets_to_resend); |
93 | 93 |
94 // Resend packet to the network. | 94 // Resend packet to the network. |
95 if (success) { | 95 if (success) { |
96 VLOG(3) << "Resend " << static_cast<int>(frame_id) << ":" | 96 VLOG(3) << "Resend " << static_cast<int>(frame_id) << ":" |
97 << packet_id; | 97 << packet_id; |
98 // Set a unique incremental sequence number for every packet. | 98 // Set a unique incremental sequence number for every packet. |
99 PacketRef packet = packets_to_resend.back(); | 99 PacketRef packet = packets_to_resend.back().second; |
100 UpdateSequenceNumber(&packet->data); | 100 UpdateSequenceNumber(&packet->data); |
101 // Set the size as correspond to each frame. | 101 // Set the size as correspond to each frame. |
102 ++packet_id; | 102 ++packet_id; |
103 } | 103 } |
104 } while (success); | 104 } while (success); |
105 } else { | 105 } else { |
106 // Iterate over all of the packets in the frame. | 106 // Iterate over all of the packets in the frame. |
107 for (PacketIdSet::const_iterator set_it = packets_set.begin(); | 107 for (PacketIdSet::const_iterator set_it = packets_set.begin(); |
108 set_it != packets_set.end(); | 108 set_it != packets_set.end(); |
109 ++set_it) { | 109 ++set_it) { |
110 uint16 packet_id = *set_it; | 110 uint16 packet_id = *set_it; |
111 success = storage_->GetPacket(frame_id, packet_id, &packets_to_resend); | 111 success = storage_->GetPacket(frame_id, packet_id, &packets_to_resend); |
112 | 112 |
113 // Resend packet to the network. | 113 // Resend packet to the network. |
114 if (success) { | 114 if (success) { |
115 VLOG(3) << "Resend " << static_cast<int>(frame_id) << ":" | 115 VLOG(3) << "Resend " << static_cast<int>(frame_id) << ":" |
116 << packet_id; | 116 << packet_id; |
117 PacketRef packet = packets_to_resend.back(); | 117 PacketRef packet = packets_to_resend.back().second; |
118 UpdateSequenceNumber(&packet->data); | 118 UpdateSequenceNumber(&packet->data); |
119 } | 119 } |
120 } | 120 } |
121 } | 121 } |
122 transport_->ResendPackets(packets_to_resend); | 122 transport_->ResendPackets(packets_to_resend); |
123 } | 123 } |
124 } | 124 } |
125 | 125 |
126 void RtpSender::UpdateSequenceNumber(Packet* packet) { | 126 void RtpSender::UpdateSequenceNumber(Packet* packet) { |
127 uint16 new_sequence_number = packetizer_->NextSequenceNumber(); | 127 uint16 new_sequence_number = packetizer_->NextSequenceNumber(); |
(...skipping 22 matching lines...) Expand all Loading... |
150 packetizer_->LastSentTimestamp(&time_sent, &rtp_timestamp); | 150 packetizer_->LastSentTimestamp(&time_sent, &rtp_timestamp); |
151 sender_info.send_packet_count = packetizer_->send_packets_count(); | 151 sender_info.send_packet_count = packetizer_->send_packets_count(); |
152 sender_info.send_octet_count = packetizer_->send_octet_count(); | 152 sender_info.send_octet_count = packetizer_->send_octet_count(); |
153 stats_callback_.Run(sender_info, time_sent, rtp_timestamp); | 153 stats_callback_.Run(sender_info, time_sent, rtp_timestamp); |
154 ScheduleNextStatsReport(); | 154 ScheduleNextStatsReport(); |
155 } | 155 } |
156 | 156 |
157 } // namespace transport | 157 } // namespace transport |
158 } // namespace cast | 158 } // namespace cast |
159 } // namespace media | 159 } // namespace media |
OLD | NEW |