• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
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 
11 #include "webrtc/modules/audio_coding/neteq/payload_splitter.h"
12 
13 #include <assert.h>
14 
15 #include "webrtc/modules/audio_coding/neteq/decoder_database.h"
16 
17 namespace webrtc {
18 
19 // The method loops through a list of packets {A, B, C, ...}. Each packet is
20 // split into its corresponding RED payloads, {A1, A2, ...}, which is
21 // temporarily held in the list |new_packets|.
22 // When the first packet in |packet_list| has been processed, the orignal packet
23 // is replaced by the new ones in |new_packets|, so that |packet_list| becomes:
24 // {A1, A2, ..., B, C, ...}. The method then continues with B, and C, until all
25 // the original packets have been replaced by their split payloads.
SplitRed(PacketList * packet_list)26 int PayloadSplitter::SplitRed(PacketList* packet_list) {
27   int ret = kOK;
28   PacketList::iterator it = packet_list->begin();
29   while (it != packet_list->end()) {
30     PacketList new_packets;  // An empty list to store the split packets in.
31     Packet* red_packet = (*it);
32     assert(red_packet->payload);
33     uint8_t* payload_ptr = red_packet->payload;
34 
35     // Read RED headers (according to RFC 2198):
36     //
37     //    0                   1                   2                   3
38     //    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
39     //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40     //   |F|   block PT  |  timestamp offset         |   block length    |
41     //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42     // Last RED header:
43     //    0 1 2 3 4 5 6 7
44     //   +-+-+-+-+-+-+-+-+
45     //   |0|   Block PT  |
46     //   +-+-+-+-+-+-+-+-+
47 
48     bool last_block = false;
49     int sum_length = 0;
50     while (!last_block) {
51       Packet* new_packet = new Packet;
52       new_packet->header = red_packet->header;
53       // Check the F bit. If F == 0, this was the last block.
54       last_block = ((*payload_ptr & 0x80) == 0);
55       // Bits 1 through 7 are payload type.
56       new_packet->header.payloadType = payload_ptr[0] & 0x7F;
57       if (last_block) {
58         // No more header data to read.
59         ++sum_length;  // Account for RED header size of 1 byte.
60         new_packet->payload_length = red_packet->payload_length - sum_length;
61         new_packet->primary = true;  // Last block is always primary.
62         payload_ptr += 1;  // Advance to first payload byte.
63       } else {
64         // Bits 8 through 21 are timestamp offset.
65         int timestamp_offset = (payload_ptr[1] << 6) +
66             ((payload_ptr[2] & 0xFC) >> 2);
67         new_packet->header.timestamp = red_packet->header.timestamp -
68             timestamp_offset;
69         // Bits 22 through 31 are payload length.
70         new_packet->payload_length = ((payload_ptr[2] & 0x03) << 8) +
71             payload_ptr[3];
72         new_packet->primary = false;
73         payload_ptr += 4;  // Advance to next RED header.
74       }
75       sum_length += new_packet->payload_length;
76       sum_length += 4;  // Account for RED header size of 4 bytes.
77       // Store in new list of packets.
78       new_packets.push_back(new_packet);
79     }
80 
81     // Populate the new packets with payload data.
82     // |payload_ptr| now points at the first payload byte.
83     PacketList::iterator new_it;
84     for (new_it = new_packets.begin(); new_it != new_packets.end(); ++new_it) {
85       int payload_length = (*new_it)->payload_length;
86       if (payload_ptr + payload_length >
87           red_packet->payload + red_packet->payload_length) {
88         // The block lengths in the RED headers do not match the overall packet
89         // length. Something is corrupt. Discard this and the remaining
90         // payloads from this packet.
91         while (new_it != new_packets.end()) {
92           // Payload should not have been allocated yet.
93           assert(!(*new_it)->payload);
94           delete (*new_it);
95           new_it = new_packets.erase(new_it);
96         }
97         ret = kRedLengthMismatch;
98         break;
99       }
100       (*new_it)->payload = new uint8_t[payload_length];
101       memcpy((*new_it)->payload, payload_ptr, payload_length);
102       payload_ptr += payload_length;
103     }
104     // Reverse the order of the new packets, so that the primary payload is
105     // always first.
106     new_packets.reverse();
107     // Insert new packets into original list, before the element pointed to by
108     // iterator |it|.
109     packet_list->splice(it, new_packets, new_packets.begin(),
110                         new_packets.end());
111     // Delete old packet payload.
112     delete [] (*it)->payload;
113     delete (*it);
114     // Remove |it| from the packet list. This operation effectively moves the
115     // iterator |it| to the next packet in the list. Thus, we do not have to
116     // increment it manually.
117     it = packet_list->erase(it);
118   }
119   return ret;
120 }
121 
SplitFec(PacketList * packet_list,DecoderDatabase * decoder_database)122 int PayloadSplitter::SplitFec(PacketList* packet_list,
123                               DecoderDatabase* decoder_database) {
124   PacketList::iterator it = packet_list->begin();
125   // Iterate through all packets in |packet_list|.
126   while (it != packet_list->end()) {
127     Packet* packet = (*it);  // Just to make the notation more intuitive.
128     // Get codec type for this payload.
129     uint8_t payload_type = packet->header.payloadType;
130     const DecoderDatabase::DecoderInfo* info =
131         decoder_database->GetDecoderInfo(payload_type);
132     if (!info) {
133       return kUnknownPayloadType;
134     }
135     // No splitting for a sync-packet.
136     if (packet->sync_packet) {
137       ++it;
138       continue;
139     }
140 
141     // Not an FEC packet.
142     AudioDecoder* decoder = decoder_database->GetDecoder(payload_type);
143     // decoder should not return NULL.
144     assert(decoder != NULL);
145     if (!decoder ||
146         !decoder->PacketHasFec(packet->payload, packet->payload_length)) {
147       ++it;
148       continue;
149     }
150 
151     switch (info->codec_type) {
152       case kDecoderOpus:
153       case kDecoderOpus_2ch: {
154         Packet* new_packet = new Packet;
155 
156         new_packet->header = packet->header;
157         int duration = decoder->
158             PacketDurationRedundant(packet->payload, packet->payload_length);
159         new_packet->header.timestamp -= duration;
160         new_packet->payload = new uint8_t[packet->payload_length];
161         memcpy(new_packet->payload, packet->payload, packet->payload_length);
162         new_packet->payload_length = packet->payload_length;
163         new_packet->primary = false;
164         new_packet->waiting_time = packet->waiting_time;
165         new_packet->sync_packet = packet->sync_packet;
166 
167         packet_list->insert(it, new_packet);
168         break;
169       }
170       default: {
171         return kFecSplitError;
172       }
173     }
174 
175     ++it;
176   }
177   return kOK;
178 }
179 
CheckRedPayloads(PacketList * packet_list,const DecoderDatabase & decoder_database)180 int PayloadSplitter::CheckRedPayloads(PacketList* packet_list,
181                                       const DecoderDatabase& decoder_database) {
182   PacketList::iterator it = packet_list->begin();
183   int main_payload_type = -1;
184   int num_deleted_packets = 0;
185   while (it != packet_list->end()) {
186     uint8_t this_payload_type = (*it)->header.payloadType;
187     if (!decoder_database.IsDtmf(this_payload_type) &&
188         !decoder_database.IsComfortNoise(this_payload_type)) {
189       if (main_payload_type == -1) {
190         // This is the first packet in the list which is non-DTMF non-CNG.
191         main_payload_type = this_payload_type;
192       } else {
193         if (this_payload_type != main_payload_type) {
194           // We do not allow redundant payloads of a different type.
195           // Discard this payload.
196           delete [] (*it)->payload;
197           delete (*it);
198           // Remove |it| from the packet list. This operation effectively
199           // moves the iterator |it| to the next packet in the list. Thus, we
200           // do not have to increment it manually.
201           it = packet_list->erase(it);
202           ++num_deleted_packets;
203           continue;
204         }
205       }
206     }
207     ++it;
208   }
209   return num_deleted_packets;
210 }
211 
SplitAudio(PacketList * packet_list,const DecoderDatabase & decoder_database)212 int PayloadSplitter::SplitAudio(PacketList* packet_list,
213                                 const DecoderDatabase& decoder_database) {
214   PacketList::iterator it = packet_list->begin();
215   // Iterate through all packets in |packet_list|.
216   while (it != packet_list->end()) {
217     Packet* packet = (*it);  // Just to make the notation more intuitive.
218     // Get codec type for this payload.
219     const DecoderDatabase::DecoderInfo* info =
220         decoder_database.GetDecoderInfo(packet->header.payloadType);
221     if (!info) {
222       return kUnknownPayloadType;
223     }
224     // No splitting for a sync-packet.
225     if (packet->sync_packet) {
226       ++it;
227       continue;
228     }
229     PacketList new_packets;
230     switch (info->codec_type) {
231       case kDecoderPCMu:
232       case kDecoderPCMa: {
233         // 8 bytes per ms; 8 timestamps per ms.
234         SplitBySamples(packet, 8, 8, &new_packets);
235         break;
236       }
237       case kDecoderPCMu_2ch:
238       case kDecoderPCMa_2ch: {
239         // 2 * 8 bytes per ms; 8 timestamps per ms.
240         SplitBySamples(packet, 2 * 8, 8, &new_packets);
241         break;
242       }
243       case kDecoderG722: {
244         // 8 bytes per ms; 16 timestamps per ms.
245         SplitBySamples(packet, 8, 16, &new_packets);
246         break;
247       }
248       case kDecoderPCM16B: {
249         // 16 bytes per ms; 8 timestamps per ms.
250         SplitBySamples(packet, 16, 8, &new_packets);
251         break;
252       }
253       case kDecoderPCM16Bwb: {
254         // 32 bytes per ms; 16 timestamps per ms.
255         SplitBySamples(packet, 32, 16, &new_packets);
256         break;
257       }
258       case kDecoderPCM16Bswb32kHz: {
259         // 64 bytes per ms; 32 timestamps per ms.
260         SplitBySamples(packet, 64, 32, &new_packets);
261         break;
262       }
263       case kDecoderPCM16Bswb48kHz: {
264         // 96 bytes per ms; 48 timestamps per ms.
265         SplitBySamples(packet, 96, 48, &new_packets);
266         break;
267       }
268       case kDecoderPCM16B_2ch: {
269         // 2 * 16 bytes per ms; 8 timestamps per ms.
270         SplitBySamples(packet, 2 * 16, 8, &new_packets);
271         break;
272       }
273       case kDecoderPCM16Bwb_2ch: {
274         // 2 * 32 bytes per ms; 16 timestamps per ms.
275         SplitBySamples(packet, 2 * 32, 16, &new_packets);
276         break;
277       }
278       case kDecoderPCM16Bswb32kHz_2ch: {
279         // 2 * 64 bytes per ms; 32 timestamps per ms.
280         SplitBySamples(packet, 2 * 64, 32, &new_packets);
281         break;
282       }
283       case kDecoderPCM16Bswb48kHz_2ch: {
284         // 2 * 96 bytes per ms; 48 timestamps per ms.
285         SplitBySamples(packet, 2 * 96, 48, &new_packets);
286         break;
287       }
288       case kDecoderPCM16B_5ch: {
289         // 5 * 16 bytes per ms; 8 timestamps per ms.
290         SplitBySamples(packet, 5 * 16, 8, &new_packets);
291         break;
292       }
293       case kDecoderILBC: {
294         int bytes_per_frame;
295         int timestamps_per_frame;
296         if (packet->payload_length >= 950) {
297           return kTooLargePayload;
298         } else if (packet->payload_length % 38 == 0) {
299           // 20 ms frames.
300           bytes_per_frame = 38;
301           timestamps_per_frame = 160;
302         } else if (packet->payload_length % 50 == 0) {
303           // 30 ms frames.
304           bytes_per_frame = 50;
305           timestamps_per_frame = 240;
306         } else {
307           return kFrameSplitError;
308         }
309         int ret = SplitByFrames(packet, bytes_per_frame, timestamps_per_frame,
310                                 &new_packets);
311         if (ret < 0) {
312           return ret;
313         } else if (ret == kNoSplit) {
314           // Do not split at all. Simply advance to the next packet in the list.
315           ++it;
316           // We do not have any new packets to insert, and should not delete the
317           // old one. Skip the code after the switch case, and jump straight to
318           // the next packet in the while loop.
319           continue;
320         }
321         break;
322       }
323       default: {
324         // Do not split at all. Simply advance to the next packet in the list.
325         ++it;
326         // We do not have any new packets to insert, and should not delete the
327         // old one. Skip the code after the switch case, and jump straight to
328         // the next packet in the while loop.
329         continue;
330       }
331     }
332     // Insert new packets into original list, before the element pointed to by
333     // iterator |it|.
334     packet_list->splice(it, new_packets, new_packets.begin(),
335                         new_packets.end());
336     // Delete old packet payload.
337     delete [] (*it)->payload;
338     delete (*it);
339     // Remove |it| from the packet list. This operation effectively moves the
340     // iterator |it| to the next packet in the list. Thus, we do not have to
341     // increment it manually.
342     it = packet_list->erase(it);
343   }
344   return kOK;
345 }
346 
SplitBySamples(const Packet * packet,int bytes_per_ms,int timestamps_per_ms,PacketList * new_packets)347 void PayloadSplitter::SplitBySamples(const Packet* packet,
348                                      int bytes_per_ms,
349                                      int timestamps_per_ms,
350                                      PacketList* new_packets) {
351   assert(packet);
352   assert(new_packets);
353 
354   int split_size_bytes = packet->payload_length;
355 
356   // Find a "chunk size" >= 20 ms and < 40 ms.
357   int min_chunk_size = bytes_per_ms * 20;
358   // Reduce the split size by half as long as |split_size_bytes| is at least
359   // twice the minimum chunk size (so that the resulting size is at least as
360   // large as the minimum chunk size).
361   while (split_size_bytes >= 2 * min_chunk_size) {
362     split_size_bytes >>= 1;
363   }
364   int timestamps_per_chunk =
365       split_size_bytes * timestamps_per_ms / bytes_per_ms;
366   uint32_t timestamp = packet->header.timestamp;
367 
368   uint8_t* payload_ptr = packet->payload;
369   int len = packet->payload_length;
370   while (len >= (2 * split_size_bytes)) {
371     Packet* new_packet = new Packet;
372     new_packet->payload_length = split_size_bytes;
373     new_packet->header = packet->header;
374     new_packet->header.timestamp = timestamp;
375     timestamp += timestamps_per_chunk;
376     new_packet->primary = packet->primary;
377     new_packet->payload = new uint8_t[split_size_bytes];
378     memcpy(new_packet->payload, payload_ptr, split_size_bytes);
379     payload_ptr += split_size_bytes;
380     new_packets->push_back(new_packet);
381     len -= split_size_bytes;
382   }
383 
384   if (len > 0) {
385     Packet* new_packet = new Packet;
386     new_packet->payload_length = len;
387     new_packet->header = packet->header;
388     new_packet->header.timestamp = timestamp;
389     new_packet->primary = packet->primary;
390     new_packet->payload = new uint8_t[len];
391     memcpy(new_packet->payload, payload_ptr, len);
392     new_packets->push_back(new_packet);
393   }
394 }
395 
SplitByFrames(const Packet * packet,int bytes_per_frame,int timestamps_per_frame,PacketList * new_packets)396 int PayloadSplitter::SplitByFrames(const Packet* packet,
397                                    int bytes_per_frame,
398                                    int timestamps_per_frame,
399                                    PacketList* new_packets) {
400   if (packet->payload_length % bytes_per_frame != 0) {
401     return kFrameSplitError;
402   }
403 
404   int num_frames = packet->payload_length / bytes_per_frame;
405   if (num_frames == 1) {
406     // Special case. Do not split the payload.
407     return kNoSplit;
408   }
409 
410   uint32_t timestamp = packet->header.timestamp;
411   uint8_t* payload_ptr = packet->payload;
412   int len = packet->payload_length;
413   while (len > 0) {
414     assert(len >= bytes_per_frame);
415     Packet* new_packet = new Packet;
416     new_packet->payload_length = bytes_per_frame;
417     new_packet->header = packet->header;
418     new_packet->header.timestamp = timestamp;
419     timestamp += timestamps_per_frame;
420     new_packet->primary = packet->primary;
421     new_packet->payload = new uint8_t[bytes_per_frame];
422     memcpy(new_packet->payload, payload_ptr, bytes_per_frame);
423     payload_ptr += bytes_per_frame;
424     new_packets->push_back(new_packet);
425     len -= bytes_per_frame;
426   }
427   return kOK;
428 }
429 
430 }  // namespace webrtc
431