OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 } | 83 } |
84 | 84 |
85 // Remove RED header of incoming packet and store as a virtual RTP packet. | 85 // Remove RED header of incoming packet and store as a virtual RTP packet. |
86 std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> received_packet( | 86 std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> received_packet( |
87 new ForwardErrorCorrection::ReceivedPacket()); | 87 new ForwardErrorCorrection::ReceivedPacket()); |
88 received_packet->pkt = new ForwardErrorCorrection::Packet(); | 88 received_packet->pkt = new ForwardErrorCorrection::Packet(); |
89 | 89 |
90 // Get payload type from RED header and sequence number from RTP header. | 90 // Get payload type from RED header and sequence number from RTP header. |
91 uint8_t payload_type = incoming_rtp_packet[header.headerLength] & 0x7f; | 91 uint8_t payload_type = incoming_rtp_packet[header.headerLength] & 0x7f; |
92 received_packet->is_fec = payload_type == ulpfec_payload_type; | 92 received_packet->is_fec = payload_type == ulpfec_payload_type; |
| 93 received_packet->ssrc = header.ssrc; |
93 received_packet->seq_num = header.sequenceNumber; | 94 received_packet->seq_num = header.sequenceNumber; |
94 | 95 |
95 uint16_t block_length = 0; | 96 uint16_t block_length = 0; |
96 if (incoming_rtp_packet[header.headerLength] & 0x80) { | 97 if (incoming_rtp_packet[header.headerLength] & 0x80) { |
97 // f bit set in RED header, i.e. there are more than one RED header blocks. | 98 // f bit set in RED header, i.e. there are more than one RED header blocks. |
98 red_header_length = 4; | 99 red_header_length = 4; |
99 if (payload_data_length < red_header_length + 1u) { | 100 if (payload_data_length < red_header_length + 1u) { |
100 LOG(LS_WARNING) << "Corrupt/truncated FEC packet."; | 101 LOG(LS_WARNING) << "Corrupt/truncated FEC packet."; |
101 return -1; | 102 return -1; |
102 } | 103 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 // Copy payload data. | 149 // Copy payload data. |
149 memcpy(received_packet->pkt->data + header.headerLength, | 150 memcpy(received_packet->pkt->data + header.headerLength, |
150 incoming_rtp_packet + header.headerLength + red_header_length, | 151 incoming_rtp_packet + header.headerLength + red_header_length, |
151 block_length); | 152 block_length); |
152 received_packet->pkt->length = block_length; | 153 received_packet->pkt->length = block_length; |
153 | 154 |
154 second_received_packet.reset(new ForwardErrorCorrection::ReceivedPacket); | 155 second_received_packet.reset(new ForwardErrorCorrection::ReceivedPacket); |
155 second_received_packet->pkt = new ForwardErrorCorrection::Packet; | 156 second_received_packet->pkt = new ForwardErrorCorrection::Packet; |
156 | 157 |
157 second_received_packet->is_fec = true; | 158 second_received_packet->is_fec = true; |
| 159 second_received_packet->ssrc = header.ssrc; |
158 second_received_packet->seq_num = header.sequenceNumber; | 160 second_received_packet->seq_num = header.sequenceNumber; |
159 ++packet_counter_.num_fec_packets; | 161 ++packet_counter_.num_fec_packets; |
160 | 162 |
161 // Copy FEC payload data. | 163 // Copy FEC payload data. |
162 memcpy(second_received_packet->pkt->data, | 164 memcpy(second_received_packet->pkt->data, |
163 incoming_rtp_packet + header.headerLength + red_header_length + | 165 incoming_rtp_packet + header.headerLength + red_header_length + |
164 block_length, | 166 block_length, |
165 payload_data_length - red_header_length - block_length); | 167 payload_data_length - red_header_length - block_length); |
166 | 168 |
167 second_received_packet->pkt->length = | 169 second_received_packet->pkt->length = |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 return -1; | 240 return -1; |
239 } | 241 } |
240 crit_sect_.Enter(); | 242 crit_sect_.Enter(); |
241 recovered_packet->returned = true; | 243 recovered_packet->returned = true; |
242 } | 244 } |
243 crit_sect_.Leave(); | 245 crit_sect_.Leave(); |
244 return 0; | 246 return 0; |
245 } | 247 } |
246 | 248 |
247 } // namespace webrtc | 249 } // namespace webrtc |
OLD | NEW |