Home | History | Annotate | Download | only in neteq
      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.
     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 
    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 
    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 
    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 
    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 
    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