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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 // packets belonging to the same SSRC. | 68 // packets belonging to the same SSRC. |
69 struct LessThan { | 69 struct LessThan { |
70 template <typename S, typename T> | 70 template <typename S, typename T> |
71 bool operator() (const S& first, const T& second); | 71 bool operator() (const S& first, const T& second); |
72 }; | 72 }; |
73 | 73 |
74 uint32_t ssrc; | 74 uint32_t ssrc; |
75 uint16_t seq_num; | 75 uint16_t seq_num; |
76 }; | 76 }; |
77 | 77 |
78 // The received list parameter of DecodeFec() references structs of this type. | 78 // Used for the input to DecodeFec(). |
79 // | 79 // |
80 // TODO(holmer): Refactor into a proper class. | 80 // TODO(nisse): Delete class, instead passing |is_fec| and |pkt| as separate |
| 81 // arguments. |
81 class ReceivedPacket : public SortablePacket { | 82 class ReceivedPacket : public SortablePacket { |
82 public: | 83 public: |
83 ReceivedPacket(); | 84 ReceivedPacket(); |
84 ~ReceivedPacket(); | 85 ~ReceivedPacket(); |
85 | 86 |
86 bool is_fec; // Set to true if this is an FEC packet and false | 87 bool is_fec; // Set to true if this is an FEC packet and false |
87 // otherwise. | 88 // otherwise. |
88 rtc::scoped_refptr<Packet> pkt; // Pointer to the packet storage. | 89 rtc::scoped_refptr<Packet> pkt; // Pointer to the packet storage. |
89 }; | 90 }; |
90 | 91 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 uint32_t protected_ssrc; | 135 uint32_t protected_ssrc; |
135 uint16_t seq_num_base; | 136 uint16_t seq_num_base; |
136 size_t packet_mask_offset; // Relative start of FEC header. | 137 size_t packet_mask_offset; // Relative start of FEC header. |
137 size_t packet_mask_size; | 138 size_t packet_mask_size; |
138 size_t protection_length; | 139 size_t protection_length; |
139 // Raw data. | 140 // Raw data. |
140 rtc::scoped_refptr<ForwardErrorCorrection::Packet> pkt; | 141 rtc::scoped_refptr<ForwardErrorCorrection::Packet> pkt; |
141 }; | 142 }; |
142 | 143 |
143 using PacketList = std::list<std::unique_ptr<Packet>>; | 144 using PacketList = std::list<std::unique_ptr<Packet>>; |
144 using ReceivedPacketList = std::list<std::unique_ptr<ReceivedPacket>>; | |
145 using RecoveredPacketList = std::list<std::unique_ptr<RecoveredPacket>>; | 145 using RecoveredPacketList = std::list<std::unique_ptr<RecoveredPacket>>; |
146 using ReceivedFecPacketList = std::list<std::unique_ptr<ReceivedFecPacket>>; | 146 using ReceivedFecPacketList = std::list<std::unique_ptr<ReceivedFecPacket>>; |
147 | 147 |
148 ~ForwardErrorCorrection(); | 148 ~ForwardErrorCorrection(); |
149 | 149 |
150 // Creates a ForwardErrorCorrection tailored for a specific FEC scheme. | 150 // Creates a ForwardErrorCorrection tailored for a specific FEC scheme. |
151 static std::unique_ptr<ForwardErrorCorrection> CreateUlpfec(uint32_t ssrc); | 151 static std::unique_ptr<ForwardErrorCorrection> CreateUlpfec(uint32_t ssrc); |
152 static std::unique_ptr<ForwardErrorCorrection> CreateFlexfec( | 152 static std::unique_ptr<ForwardErrorCorrection> CreateFlexfec( |
153 uint32_t ssrc, | 153 uint32_t ssrc, |
154 uint32_t protected_media_ssrc); | 154 uint32_t protected_media_ssrc); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 // ReceivedPacket, belonging to a single | 211 // ReceivedPacket, belonging to a single |
212 // frame. At output the list will be empty, | 212 // frame. At output the list will be empty, |
213 // with packets either stored internally, | 213 // with packets either stored internally, |
214 // or accessible through the recovered list. | 214 // or accessible through the recovered list. |
215 // Output: recovered_packets List of recovered media packets, of type | 215 // Output: recovered_packets List of recovered media packets, of type |
216 // RecoveredPacket, belonging to a single | 216 // RecoveredPacket, belonging to a single |
217 // frame. The memory available through the | 217 // frame. The memory available through the |
218 // list will be valid until the next call to | 218 // list will be valid until the next call to |
219 // DecodeFec(). | 219 // DecodeFec(). |
220 // | 220 // |
221 // Returns 0 on success, -1 on failure. | 221 void DecodeFec(const ReceivedPacket& received_packet, |
222 // | 222 RecoveredPacketList* recovered_packets); |
223 int DecodeFec(ReceivedPacketList* received_packets, | |
224 RecoveredPacketList* recovered_packets); | |
225 | 223 |
226 // Get the number of generated FEC packets, given the number of media packets | 224 // Get the number of generated FEC packets, given the number of media packets |
227 // and the protection factor. | 225 // and the protection factor. |
228 static int NumFecPackets(int num_media_packets, int protection_factor); | 226 static int NumFecPackets(int num_media_packets, int protection_factor); |
229 | 227 |
230 // Gets the maximum size of the FEC headers in bytes, which must be | 228 // Gets the maximum size of the FEC headers in bytes, which must be |
231 // accounted for as packet overhead. | 229 // accounted for as packet overhead. |
232 size_t MaxPacketOverhead() const; | 230 size_t MaxPacketOverhead() const; |
233 | 231 |
234 // Reset internal states from last frame and clear |recovered_packets|. | 232 // Reset internal states from last frame and clear |recovered_packets|. |
(...skipping 24 matching lines...) Expand all Loading... |
259 // Writes FEC payloads and some recovery fields in the FEC headers. | 257 // Writes FEC payloads and some recovery fields in the FEC headers. |
260 void GenerateFecPayloads(const PacketList& media_packets, | 258 void GenerateFecPayloads(const PacketList& media_packets, |
261 size_t num_fec_packets); | 259 size_t num_fec_packets); |
262 | 260 |
263 // Writes the FEC header fields that are not written by GenerateFecPayloads. | 261 // Writes the FEC header fields that are not written by GenerateFecPayloads. |
264 // This includes writing the packet masks. | 262 // This includes writing the packet masks. |
265 void FinalizeFecHeaders(size_t num_fec_packets, | 263 void FinalizeFecHeaders(size_t num_fec_packets, |
266 uint32_t media_ssrc, | 264 uint32_t media_ssrc, |
267 uint16_t seq_num_base); | 265 uint16_t seq_num_base); |
268 | 266 |
269 // Inserts the |received_packets| into the internal received FEC packet list | 267 // Inserts the |received_packet| into the internal received FEC packet list |
270 // or into |recovered_packets|. | 268 // or into |recovered_packets|. |
271 void InsertPackets(ReceivedPacketList* received_packets, | 269 void InsertPacket(const ReceivedPacket& received_packet, |
272 RecoveredPacketList* recovered_packets); | 270 RecoveredPacketList* recovered_packets); |
273 | 271 |
274 // Inserts the |received_packet| into |recovered_packets|. Deletes duplicates. | 272 // Inserts the |received_packet| into |recovered_packets|. Deletes duplicates. |
275 void InsertMediaPacket(RecoveredPacketList* recovered_packets, | 273 void InsertMediaPacket(RecoveredPacketList* recovered_packets, |
276 ReceivedPacket* received_packet); | 274 const ReceivedPacket& received_packet); |
277 | 275 |
278 // Assigns pointers to the recovered packet from all FEC packets which cover | 276 // Assigns pointers to the recovered packet from all FEC packets which cover |
279 // it. | 277 // it. |
280 // Note: This reduces the complexity when we want to try to recover a packet | 278 // Note: This reduces the complexity when we want to try to recover a packet |
281 // since we don't have to find the intersection between recovered packets and | 279 // since we don't have to find the intersection between recovered packets and |
282 // packets covered by the FEC packet. | 280 // packets covered by the FEC packet. |
283 void UpdateCoveringFecPackets(const RecoveredPacket& packet); | 281 void UpdateCoveringFecPackets(const RecoveredPacket& packet); |
284 | 282 |
285 // Insert |received_packet| into internal FEC list. Deletes duplicates. | 283 // Insert |received_packet| into internal FEC list. Deletes duplicates. |
286 void InsertFecPacket(const RecoveredPacketList& recovered_packets, | 284 void InsertFecPacket(const RecoveredPacketList& recovered_packets, |
287 ReceivedPacket* received_packet); | 285 const ReceivedPacket& received_packet); |
288 | 286 |
289 // Assigns pointers to already recovered packets covered by |fec_packet|. | 287 // Assigns pointers to already recovered packets covered by |fec_packet|. |
290 static void AssignRecoveredPackets( | 288 static void AssignRecoveredPackets( |
291 const RecoveredPacketList& recovered_packets, | 289 const RecoveredPacketList& recovered_packets, |
292 ReceivedFecPacket* fec_packet); | 290 ReceivedFecPacket* fec_packet); |
293 | 291 |
294 // Attempt to recover missing packets, using the internally stored | 292 // Attempt to recover missing packets, using the internally stored |
295 // received FEC packets. | 293 // received FEC packets. |
296 void AttemptRecovery(RecoveredPacketList* recovered_packets); | 294 void AttemptRecovery(RecoveredPacketList* recovered_packets); |
297 | 295 |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 size_t max_packet_overhead); | 410 size_t max_packet_overhead); |
413 | 411 |
414 const size_t max_media_packets_; | 412 const size_t max_media_packets_; |
415 const size_t max_fec_packets_; | 413 const size_t max_fec_packets_; |
416 const size_t max_packet_overhead_; | 414 const size_t max_packet_overhead_; |
417 }; | 415 }; |
418 | 416 |
419 } // namespace webrtc | 417 } // namespace webrtc |
420 | 418 |
421 #endif // MODULES_RTP_RTCP_SOURCE_FORWARD_ERROR_CORRECTION_H_ | 419 #endif // MODULES_RTP_RTCP_SOURCE_FORWARD_ERROR_CORRECTION_H_ |
OLD | NEW |