niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 1 | /* |
pwestin@webrtc.org | 5dad00b | 2012-01-30 13:05:29 +0000 | [diff] [blame] | 2 | * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license |
| 5 | * that can be found in the LICENSE file in the root of the source |
| 6 | * tree. An additional intellectual property rights grant can be found |
| 7 | * in the file PATENTS. All contributing project authors may |
| 8 | * be found in the AUTHORS file in the root of the source tree. |
| 9 | */ |
| 10 | |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 11 | #include "modules/rtp_rtcp/source/ulpfec_receiver_impl.h" |
andrew@webrtc.org | 7fe219f | 2012-02-01 02:40:37 +0000 | [diff] [blame] | 12 | |
kwiberg | 84be511 | 2016-04-27 01:19:58 -0700 | [diff] [blame] | 13 | #include <memory> |
brandtr | 35c480c | 2016-08-09 01:23:23 -0700 | [diff] [blame] | 14 | #include <utility> |
kwiberg | 84be511 | 2016-04-27 01:19:58 -0700 | [diff] [blame] | 15 | |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 16 | #include "modules/rtp_rtcp/source/byte_io.h" |
| 17 | #include "modules/rtp_rtcp/source/rtp_receiver_video.h" |
| 18 | #include "rtc_base/checks.h" |
| 19 | #include "rtc_base/logging.h" |
| 20 | #include "system_wrappers/include/clock.h" |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 21 | |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 22 | namespace webrtc { |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 23 | |
brandtr | d726a3f | 2017-06-29 02:45:35 -0700 | [diff] [blame] | 24 | UlpfecReceiver* UlpfecReceiver::Create(uint32_t ssrc, |
| 25 | RecoveredPacketReceiver* callback) { |
| 26 | return new UlpfecReceiverImpl(ssrc, callback); |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 27 | } |
| 28 | |
brandtr | d726a3f | 2017-06-29 02:45:35 -0700 | [diff] [blame] | 29 | UlpfecReceiverImpl::UlpfecReceiverImpl(uint32_t ssrc, |
| 30 | RecoveredPacketReceiver* callback) |
| 31 | : ssrc_(ssrc), |
| 32 | recovered_packet_callback_(callback), |
| 33 | fec_(ForwardErrorCorrection::CreateUlpfec(ssrc_)) {} |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 34 | |
brandtr | d55c3f6 | 2016-10-31 04:51:33 -0700 | [diff] [blame] | 35 | UlpfecReceiverImpl::~UlpfecReceiverImpl() { |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 36 | received_packets_.clear(); |
Rasmus Brandt | 78db158 | 2016-09-21 09:19:34 +0200 | [diff] [blame] | 37 | fec_->ResetState(&recovered_packets_); |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 38 | } |
| 39 | |
brandtr | d55c3f6 | 2016-10-31 04:51:33 -0700 | [diff] [blame] | 40 | FecPacketCounter UlpfecReceiverImpl::GetPacketCounter() const { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 41 | rtc::CritScope cs(&crit_sect_); |
asapersson@webrtc.org | 0800db7 | 2015-01-15 07:40:20 +0000 | [diff] [blame] | 42 | return packet_counter_; |
| 43 | } |
| 44 | |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 45 | // 0 1 2 3 |
| 46 | // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
| 47 | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 48 | // |F| block PT | timestamp offset | block length | |
| 49 | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 50 | // |
| 51 | // |
| 52 | // RFC 2198 RTP Payload for Redundant Audio Data September 1997 |
| 53 | // |
| 54 | // The bits in the header are specified as follows: |
| 55 | // |
| 56 | // F: 1 bit First bit in header indicates whether another header block |
| 57 | // follows. If 1 further header blocks follow, if 0 this is the |
| 58 | // last header block. |
| 59 | // If 0 there is only 1 byte RED header |
| 60 | // |
| 61 | // block PT: 7 bits RTP payload type for this block. |
| 62 | // |
| 63 | // timestamp offset: 14 bits Unsigned offset of timestamp of this block |
| 64 | // relative to timestamp given in RTP header. The use of an unsigned |
| 65 | // offset implies that redundant data must be sent after the primary |
| 66 | // data, and is hence a time to be subtracted from the current |
| 67 | // timestamp to determine the timestamp of the data for which this |
| 68 | // block is the redundancy. |
| 69 | // |
| 70 | // block length: 10 bits Length in bytes of the corresponding data |
| 71 | // block excluding header. |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 72 | |
brandtr | d55c3f6 | 2016-10-31 04:51:33 -0700 | [diff] [blame] | 73 | int32_t UlpfecReceiverImpl::AddReceivedRedPacket( |
| 74 | const RTPHeader& header, |
| 75 | const uint8_t* incoming_rtp_packet, |
| 76 | size_t packet_length, |
| 77 | uint8_t ulpfec_payload_type) { |
brandtr | d726a3f | 2017-06-29 02:45:35 -0700 | [diff] [blame] | 78 | if (header.ssrc != ssrc_) { |
brandtr | 5f8b04d | 2017-06-30 01:52:24 -0700 | [diff] [blame] | 79 | LOG(LS_WARNING) |
brandtr | d726a3f | 2017-06-29 02:45:35 -0700 | [diff] [blame] | 80 | << "Received RED packet with different SSRC than expected; dropping."; |
| 81 | return -1; |
| 82 | } |
| 83 | |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 84 | rtc::CritScope cs(&crit_sect_); |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 85 | |
| 86 | uint8_t red_header_length = 1; |
pkasting@chromium.org | 4591fbd | 2014-11-20 22:28:14 +0000 | [diff] [blame] | 87 | size_t payload_data_length = packet_length - header.headerLength; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 88 | |
pbos | 70d5c47 | 2015-06-29 07:22:04 -0700 | [diff] [blame] | 89 | if (payload_data_length == 0) { |
| 90 | LOG(LS_WARNING) << "Corrupt/truncated FEC packet."; |
| 91 | return -1; |
| 92 | } |
| 93 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 94 | // Remove RED header of incoming packet and store as a virtual RTP packet. |
kwiberg | 84be511 | 2016-04-27 01:19:58 -0700 | [diff] [blame] | 95 | std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> received_packet( |
Rasmus Brandt | ae4f767 | 2016-07-07 09:40:51 +0200 | [diff] [blame] | 96 | new ForwardErrorCorrection::ReceivedPacket()); |
| 97 | received_packet->pkt = new ForwardErrorCorrection::Packet(); |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 98 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 99 | // Get payload type from RED header and sequence number from RTP header. |
| 100 | uint8_t payload_type = incoming_rtp_packet[header.headerLength] & 0x7f; |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 101 | received_packet->is_fec = payload_type == ulpfec_payload_type; |
brandtr | d726a3f | 2017-06-29 02:45:35 -0700 | [diff] [blame] | 102 | received_packet->ssrc = header.ssrc; |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 103 | received_packet->seq_num = header.sequenceNumber; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 104 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 105 | uint16_t block_length = 0; |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 106 | if (incoming_rtp_packet[header.headerLength] & 0x80) { |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 107 | // f bit set in RED header, i.e. there are more than one RED header blocks. |
| 108 | red_header_length = 4; |
| 109 | if (payload_data_length < red_header_length + 1u) { |
pbos | 70d5c47 | 2015-06-29 07:22:04 -0700 | [diff] [blame] | 110 | LOG(LS_WARNING) << "Corrupt/truncated FEC packet."; |
| 111 | return -1; |
| 112 | } |
| 113 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 114 | uint16_t timestamp_offset = incoming_rtp_packet[header.headerLength + 1] |
| 115 | << 8; |
brandtr | d55c3f6 | 2016-10-31 04:51:33 -0700 | [diff] [blame] | 116 | timestamp_offset += incoming_rtp_packet[header.headerLength + 2]; |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 117 | timestamp_offset = timestamp_offset >> 2; |
| 118 | if (timestamp_offset != 0) { |
andresp@webrtc.org | dc80bae | 2014-04-08 11:06:12 +0000 | [diff] [blame] | 119 | LOG(LS_WARNING) << "Corrupt payload found."; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 120 | return -1; |
| 121 | } |
punyabrata@webrtc.org | 6da8eeb | 2012-01-24 00:48:36 +0000 | [diff] [blame] | 122 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 123 | block_length = (0x3 & incoming_rtp_packet[header.headerLength + 2]) << 8; |
| 124 | block_length += incoming_rtp_packet[header.headerLength + 3]; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 125 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 126 | // Check next RED header block. |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 127 | if (incoming_rtp_packet[header.headerLength + 4] & 0x80) { |
pbos | 70d5c47 | 2015-06-29 07:22:04 -0700 | [diff] [blame] | 128 | LOG(LS_WARNING) << "More than 2 blocks in packet not supported."; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 129 | return -1; |
| 130 | } |
pbos | 2e43b26 | 2015-06-30 01:32:40 -0700 | [diff] [blame] | 131 | // Check that the packet is long enough to contain data in the following |
| 132 | // block. |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 133 | if (block_length > payload_data_length - (red_header_length + 1)) { |
pbos | 70d5c47 | 2015-06-29 07:22:04 -0700 | [diff] [blame] | 134 | LOG(LS_WARNING) << "Block length longer than packet."; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 135 | return -1; |
| 136 | } |
| 137 | } |
asapersson@webrtc.org | 0800db7 | 2015-01-15 07:40:20 +0000 | [diff] [blame] | 138 | ++packet_counter_.num_packets; |
asapersson | 0c43f77 | 2016-11-30 01:42:26 -0800 | [diff] [blame] | 139 | if (packet_counter_.first_packet_time_ms == -1) { |
| 140 | packet_counter_.first_packet_time_ms = |
| 141 | Clock::GetRealTimeClock()->TimeInMilliseconds(); |
| 142 | } |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 143 | |
kwiberg | 84be511 | 2016-04-27 01:19:58 -0700 | [diff] [blame] | 144 | std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> |
pbos | 70d5c47 | 2015-06-29 07:22:04 -0700 | [diff] [blame] | 145 | second_received_packet; |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 146 | if (block_length > 0) { |
| 147 | // Handle block length, split into two packets. |
| 148 | red_header_length = 5; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 149 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 150 | // Copy RTP header. |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 151 | memcpy(received_packet->pkt->data, incoming_rtp_packet, |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 152 | header.headerLength); |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 153 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 154 | // Set payload type. |
| 155 | received_packet->pkt->data[1] &= 0x80; // Reset RED payload type. |
| 156 | received_packet->pkt->data[1] += payload_type; // Set media payload type. |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 157 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 158 | // Copy payload data. |
| 159 | memcpy(received_packet->pkt->data + header.headerLength, |
| 160 | incoming_rtp_packet + header.headerLength + red_header_length, |
| 161 | block_length); |
| 162 | received_packet->pkt->length = block_length; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 163 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 164 | second_received_packet.reset(new ForwardErrorCorrection::ReceivedPacket); |
| 165 | second_received_packet->pkt = new ForwardErrorCorrection::Packet; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 166 | |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 167 | second_received_packet->is_fec = true; |
brandtr | d726a3f | 2017-06-29 02:45:35 -0700 | [diff] [blame] | 168 | second_received_packet->ssrc = header.ssrc; |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 169 | second_received_packet->seq_num = header.sequenceNumber; |
asapersson@webrtc.org | 0800db7 | 2015-01-15 07:40:20 +0000 | [diff] [blame] | 170 | ++packet_counter_.num_fec_packets; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 171 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 172 | // Copy FEC payload data. |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 173 | memcpy(second_received_packet->pkt->data, |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 174 | incoming_rtp_packet + header.headerLength + red_header_length + |
| 175 | block_length, |
| 176 | payload_data_length - red_header_length - block_length); |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 177 | |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 178 | second_received_packet->pkt->length = |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 179 | payload_data_length - red_header_length - block_length; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 180 | |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 181 | } else if (received_packet->is_fec) { |
asapersson@webrtc.org | 0800db7 | 2015-01-15 07:40:20 +0000 | [diff] [blame] | 182 | ++packet_counter_.num_fec_packets; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 183 | // everything behind the RED header |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 184 | memcpy(received_packet->pkt->data, |
| 185 | incoming_rtp_packet + header.headerLength + red_header_length, |
| 186 | payload_data_length - red_header_length); |
| 187 | received_packet->pkt->length = payload_data_length - red_header_length; |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 188 | received_packet->ssrc = |
sprang@webrtc.org | 779c3d1 | 2015-03-17 16:42:49 +0000 | [diff] [blame] | 189 | ByteReader<uint32_t>::ReadBigEndian(&incoming_rtp_packet[8]); |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 190 | |
| 191 | } else { |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 192 | // Copy RTP header. |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 193 | memcpy(received_packet->pkt->data, incoming_rtp_packet, |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 194 | header.headerLength); |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 195 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 196 | // Set payload type. |
| 197 | received_packet->pkt->data[1] &= 0x80; // Reset RED payload type. |
| 198 | received_packet->pkt->data[1] += payload_type; // Set media payload type. |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 199 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 200 | // Copy payload data. |
| 201 | memcpy(received_packet->pkt->data + header.headerLength, |
| 202 | incoming_rtp_packet + header.headerLength + red_header_length, |
| 203 | payload_data_length - red_header_length); |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 204 | received_packet->pkt->length = |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 205 | header.headerLength + payload_data_length - red_header_length; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 206 | } |
| 207 | |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 208 | if (received_packet->pkt->length == 0) { |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 209 | return 0; |
| 210 | } |
| 211 | |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 212 | received_packets_.push_back(std::move(received_packet)); |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 213 | if (second_received_packet) { |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 214 | received_packets_.push_back(std::move(second_received_packet)); |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 215 | } |
| 216 | return 0; |
| 217 | } |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 218 | |
nisse | a5f043f | 2017-09-18 07:58:59 -0700 | [diff] [blame^] | 219 | // TODO(nisse): Drop always-zero return value. |
brandtr | d55c3f6 | 2016-10-31 04:51:33 -0700 | [diff] [blame] | 220 | int32_t UlpfecReceiverImpl::ProcessReceivedFec() { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 221 | crit_sect_.Enter(); |
nisse | a5f043f | 2017-09-18 07:58:59 -0700 | [diff] [blame^] | 222 | for (const auto& received_packet : received_packets_) { |
marpan@webrtc.org | 3a6080d | 2012-03-30 16:16:21 +0000 | [diff] [blame] | 223 | // Send received media packet to VCM. |
nisse | a5f043f | 2017-09-18 07:58:59 -0700 | [diff] [blame^] | 224 | if (!received_packet->is_fec) { |
| 225 | ForwardErrorCorrection::Packet* packet = received_packet->pkt; |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 226 | crit_sect_.Leave(); |
nisse | 30e8931 | 2017-05-29 08:16:37 -0700 | [diff] [blame] | 227 | recovered_packet_callback_->OnRecoveredPacket(packet->data, |
| 228 | packet->length); |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 229 | crit_sect_.Enter(); |
marpan@webrtc.org | 3a6080d | 2012-03-30 16:16:21 +0000 | [diff] [blame] | 230 | } |
nisse | a5f043f | 2017-09-18 07:58:59 -0700 | [diff] [blame^] | 231 | fec_->DecodeFec(*received_packet, &recovered_packets_); |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 232 | } |
nisse | a5f043f | 2017-09-18 07:58:59 -0700 | [diff] [blame^] | 233 | received_packets_.clear(); |
| 234 | |
marpan@webrtc.org | 3a6080d | 2012-03-30 16:16:21 +0000 | [diff] [blame] | 235 | // Send any recovered media packets to VCM. |
brandtr | 74811e5 | 2016-08-10 00:51:50 -0700 | [diff] [blame] | 236 | for (const auto& recovered_packet : recovered_packets_) { |
Rasmus Brandt | ae4f767 | 2016-07-07 09:40:51 +0200 | [diff] [blame] | 237 | if (recovered_packet->returned) { |
| 238 | // Already sent to the VCM and the jitter buffer. |
stefan@webrtc.org | 7adab09 | 2012-02-09 12:34:52 +0000 | [diff] [blame] | 239 | continue; |
Rasmus Brandt | ae4f767 | 2016-07-07 09:40:51 +0200 | [diff] [blame] | 240 | } |
| 241 | ForwardErrorCorrection::Packet* packet = recovered_packet->pkt; |
asapersson@webrtc.org | 0800db7 | 2015-01-15 07:40:20 +0000 | [diff] [blame] | 242 | ++packet_counter_.num_recovered_packets; |
nisse | 41476e0 | 2017-08-25 09:08:44 -0700 | [diff] [blame] | 243 | // Set this flag first; in case the recovered packet carries a RED |
| 244 | // header, OnRecoveredPacket will recurse back here. |
| 245 | recovered_packet->returned = true; |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 246 | crit_sect_.Leave(); |
nisse | 30e8931 | 2017-05-29 08:16:37 -0700 | [diff] [blame] | 247 | recovered_packet_callback_->OnRecoveredPacket(packet->data, |
| 248 | packet->length); |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 249 | crit_sect_.Enter(); |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 250 | } |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 251 | crit_sect_.Leave(); |
marpan@webrtc.org | 57353a3 | 2011-12-16 17:21:09 +0000 | [diff] [blame] | 252 | return 0; |
| 253 | } |
stefan@webrtc.org | 7adab09 | 2012-02-09 12:34:52 +0000 | [diff] [blame] | 254 | |
phoglund@webrtc.org | 9919ad5 | 2013-05-16 15:06:28 +0000 | [diff] [blame] | 255 | } // namespace webrtc |