| Index: media/cast/transport/rtp_sender/rtp_sender.cc
|
| diff --git a/media/cast/transport/rtp_sender/rtp_sender.cc b/media/cast/transport/rtp_sender/rtp_sender.cc
|
| index 735d086694ca702e01728525b911c83c24596b8a..91b6298bac5d94e4b6e5d9f94255e4c20d402b36 100644
|
| --- a/media/cast/transport/rtp_sender/rtp_sender.cc
|
| +++ b/media/cast/transport/rtp_sender/rtp_sender.cc
|
| @@ -70,51 +70,32 @@ void RtpSender::ResendPackets(
|
| ++it) {
|
| SendPacketVector packets_to_resend;
|
| uint8 frame_id = it->first;
|
| - const PacketIdSet& packets_set = it->second;
|
| + // Set of packets that the receiver wants us to re-send.
|
| + // If empty, we need to re-send all packets for this frame.
|
| + const PacketIdSet& missing_packet_set = it->second;
|
| bool success = false;
|
|
|
| - if (packets_set.empty()) {
|
| - VLOG(3) << "Missing all packets in frame " << static_cast<int>(frame_id);
|
| + for (uint16 packet_id = 0; ; packet_id++) {
|
| + // Get packet from storage.
|
| + success = storage_->GetPacket(frame_id, packet_id, &packets_to_resend);
|
|
|
| - uint16 packet_id = 0;
|
| - do {
|
| - // Get packet from storage.
|
| - success = storage_->GetPacket(frame_id, packet_id, &packets_to_resend);
|
| + // Check that we got at least one packet.
|
| + DCHECK(packet_id != 0 || success)
|
| + << "Failed to resend frame " << static_cast<int>(frame_id);
|
|
|
| - // Check that we got at least one packet.
|
| - DCHECK(packet_id != 0 || success)
|
| - << "Failed to resend frame " << static_cast<int>(frame_id);
|
| + if (!success) break;
|
|
|
| + if (!missing_packet_set.empty() &&
|
| + missing_packet_set.find(packet_id) == missing_packet_set.end()) {
|
| + transport_->CancelSendingPacket(packets_to_resend.back().first);
|
| + packets_to_resend.pop_back();
|
| + } else {
|
| // Resend packet to the network.
|
| - if (success) {
|
| - VLOG(3) << "Resend " << static_cast<int>(frame_id) << ":"
|
| - << packet_id;
|
| - // Set a unique incremental sequence number for every packet.
|
| - PacketRef packet = packets_to_resend.back().second;
|
| - UpdateSequenceNumber(&packet->data);
|
| - // Set the size as correspond to each frame.
|
| - ++packet_id;
|
| - }
|
| - } while (success);
|
| - } else {
|
| - // Iterate over all of the packets in the frame.
|
| - for (PacketIdSet::const_iterator set_it = packets_set.begin();
|
| - set_it != packets_set.end();
|
| - ++set_it) {
|
| - uint16 packet_id = *set_it;
|
| - success = storage_->GetPacket(frame_id, packet_id, &packets_to_resend);
|
| -
|
| - // Check that we got at least one packet.
|
| - DCHECK(set_it != packets_set.begin() || success)
|
| - << "Failed to resend frame " << frame_id;
|
| -
|
| - // Resend packet to the network.
|
| - if (success) {
|
| - VLOG(3) << "Resend " << static_cast<int>(frame_id) << ":"
|
| - << packet_id;
|
| - PacketRef packet = packets_to_resend.back().second;
|
| - UpdateSequenceNumber(&packet->data);
|
| - }
|
| + VLOG(3) << "Resend " << static_cast<int>(frame_id) << ":"
|
| + << packet_id;
|
| + // Set a unique incremental sequence number for every packet.
|
| + PacketRef packet = packets_to_resend.back().second;
|
| + UpdateSequenceNumber(&packet->data);
|
| }
|
| }
|
| transport_->ResendPackets(packets_to_resend);
|
|
|