Home | History | Annotate | Download | only in opus
      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/codecs/opus/interface/opus_interface.h"
     12 
     13 #include <stdlib.h>
     14 #include <string.h>
     15 
     16 #include "opus.h"
     17 
     18 #include "webrtc/common_audio/signal_processing/resample_by_2_internal.h"
     19 #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
     20 
     21 enum {
     22   /* Maximum supported frame size in WebRTC is 60 ms. */
     23   kWebRtcOpusMaxEncodeFrameSizeMs = 60,
     24 
     25   /* The format allows up to 120 ms frames. Since we don't control the other
     26    * side, we must allow for packets of that size. NetEq is currently limited
     27    * to 60 ms on the receive side. */
     28   kWebRtcOpusMaxDecodeFrameSizeMs = 120,
     29 
     30   /* Maximum sample count per channel is 48 kHz * maximum frame size in
     31    * milliseconds. */
     32   kWebRtcOpusMaxFrameSizePerChannel = 48 * kWebRtcOpusMaxDecodeFrameSizeMs,
     33 
     34   /* Maximum sample count per frame is 48 kHz * maximum frame size in
     35    * milliseconds * maximum number of channels. */
     36   kWebRtcOpusMaxFrameSize = kWebRtcOpusMaxFrameSizePerChannel * 2,
     37 
     38   /* Maximum sample count per channel for output resampled to 32 kHz,
     39    * 32 kHz * maximum frame size in milliseconds. */
     40   kWebRtcOpusMaxFrameSizePerChannel32kHz = 32 * kWebRtcOpusMaxDecodeFrameSizeMs,
     41 
     42   /* Number of samples in resampler state. */
     43   kWebRtcOpusStateSize = 7,
     44 
     45   /* Default frame size, 20 ms @ 48 kHz, in samples (for one channel). */
     46   kWebRtcOpusDefaultFrameSize = 960,
     47 };
     48 
     49 struct WebRtcOpusEncInst {
     50   OpusEncoder* encoder;
     51 };
     52 
     53 int16_t WebRtcOpus_EncoderCreate(OpusEncInst** inst, int32_t channels) {
     54   OpusEncInst* state;
     55   if (inst != NULL) {
     56     state = (OpusEncInst*) calloc(1, sizeof(OpusEncInst));
     57     if (state) {
     58       int error;
     59       /* Default to VoIP application for mono, and AUDIO for stereo. */
     60       int application = (channels == 1) ? OPUS_APPLICATION_VOIP :
     61           OPUS_APPLICATION_AUDIO;
     62 
     63       state->encoder = opus_encoder_create(48000, channels, application,
     64                                            &error);
     65       if (error == OPUS_OK && state->encoder != NULL) {
     66         *inst = state;
     67         return 0;
     68       }
     69       free(state);
     70     }
     71   }
     72   return -1;
     73 }
     74 
     75 int16_t WebRtcOpus_EncoderFree(OpusEncInst* inst) {
     76   if (inst) {
     77     opus_encoder_destroy(inst->encoder);
     78     free(inst);
     79     return 0;
     80   } else {
     81     return -1;
     82   }
     83 }
     84 
     85 int16_t WebRtcOpus_Encode(OpusEncInst* inst, int16_t* audio_in, int16_t samples,
     86                           int16_t length_encoded_buffer, uint8_t* encoded) {
     87   opus_int16* audio = (opus_int16*) audio_in;
     88   unsigned char* coded = encoded;
     89   int res;
     90 
     91   if (samples > 48 * kWebRtcOpusMaxEncodeFrameSizeMs) {
     92     return -1;
     93   }
     94 
     95   res = opus_encode(inst->encoder, audio, samples, coded,
     96                     length_encoded_buffer);
     97 
     98   if (res > 0) {
     99     return res;
    100   }
    101   return -1;
    102 }
    103 
    104 int16_t WebRtcOpus_SetBitRate(OpusEncInst* inst, int32_t rate) {
    105   if (inst) {
    106     return opus_encoder_ctl(inst->encoder, OPUS_SET_BITRATE(rate));
    107   } else {
    108     return -1;
    109   }
    110 }
    111 
    112 int16_t WebRtcOpus_SetPacketLossRate(OpusEncInst* inst, int32_t loss_rate) {
    113   if (inst) {
    114     return opus_encoder_ctl(inst->encoder,
    115                             OPUS_SET_PACKET_LOSS_PERC(loss_rate));
    116   } else {
    117     return -1;
    118   }
    119 }
    120 
    121 int16_t WebRtcOpus_EnableFec(OpusEncInst* inst) {
    122   if (inst) {
    123     return opus_encoder_ctl(inst->encoder, OPUS_SET_INBAND_FEC(1));
    124   } else {
    125     return -1;
    126   }
    127 }
    128 
    129 int16_t WebRtcOpus_DisableFec(OpusEncInst* inst) {
    130   if (inst) {
    131     return opus_encoder_ctl(inst->encoder, OPUS_SET_INBAND_FEC(0));
    132   } else {
    133     return -1;
    134   }
    135 }
    136 
    137 int16_t WebRtcOpus_SetComplexity(OpusEncInst* inst, int32_t complexity) {
    138   if (inst) {
    139     return opus_encoder_ctl(inst->encoder, OPUS_SET_COMPLEXITY(complexity));
    140   } else {
    141     return -1;
    142   }
    143 }
    144 
    145 struct WebRtcOpusDecInst {
    146   int16_t state_48_32_left[8];
    147   int16_t state_48_32_right[8];
    148   OpusDecoder* decoder_left;
    149   OpusDecoder* decoder_right;
    150   int prev_decoded_samples;
    151   int channels;
    152 };
    153 
    154 int16_t WebRtcOpus_DecoderCreate(OpusDecInst** inst, int channels) {
    155   int error_l;
    156   int error_r;
    157   OpusDecInst* state;
    158 
    159   if (inst != NULL) {
    160     /* Create Opus decoder state. */
    161     state = (OpusDecInst*) calloc(1, sizeof(OpusDecInst));
    162     if (state == NULL) {
    163       return -1;
    164     }
    165 
    166     /* Create new memory for left and right channel, always at 48000 Hz. */
    167     state->decoder_left = opus_decoder_create(48000, channels, &error_l);
    168     state->decoder_right = opus_decoder_create(48000, channels, &error_r);
    169     if (error_l == OPUS_OK && error_r == OPUS_OK && state->decoder_left != NULL
    170         && state->decoder_right != NULL) {
    171       /* Creation of memory all ok. */
    172       state->channels = channels;
    173       state->prev_decoded_samples = kWebRtcOpusDefaultFrameSize;
    174       *inst = state;
    175       return 0;
    176     }
    177 
    178     /* If memory allocation was unsuccessful, free the entire state. */
    179     if (state->decoder_left) {
    180       opus_decoder_destroy(state->decoder_left);
    181     }
    182     if (state->decoder_right) {
    183       opus_decoder_destroy(state->decoder_right);
    184     }
    185     free(state);
    186   }
    187   return -1;
    188 }
    189 
    190 int16_t WebRtcOpus_DecoderFree(OpusDecInst* inst) {
    191   if (inst) {
    192     opus_decoder_destroy(inst->decoder_left);
    193     opus_decoder_destroy(inst->decoder_right);
    194     free(inst);
    195     return 0;
    196   } else {
    197     return -1;
    198   }
    199 }
    200 
    201 int WebRtcOpus_DecoderChannels(OpusDecInst* inst) {
    202   return inst->channels;
    203 }
    204 
    205 int16_t WebRtcOpus_DecoderInitNew(OpusDecInst* inst) {
    206   int error = opus_decoder_ctl(inst->decoder_left, OPUS_RESET_STATE);
    207   if (error == OPUS_OK) {
    208     memset(inst->state_48_32_left, 0, sizeof(inst->state_48_32_left));
    209     memset(inst->state_48_32_right, 0, sizeof(inst->state_48_32_right));
    210     return 0;
    211   }
    212   return -1;
    213 }
    214 
    215 int16_t WebRtcOpus_DecoderInit(OpusDecInst* inst) {
    216   int error = opus_decoder_ctl(inst->decoder_left, OPUS_RESET_STATE);
    217   if (error == OPUS_OK) {
    218     memset(inst->state_48_32_left, 0, sizeof(inst->state_48_32_left));
    219     return 0;
    220   }
    221   return -1;
    222 }
    223 
    224 int16_t WebRtcOpus_DecoderInitSlave(OpusDecInst* inst) {
    225   int error = opus_decoder_ctl(inst->decoder_right, OPUS_RESET_STATE);
    226   if (error == OPUS_OK) {
    227     memset(inst->state_48_32_right, 0, sizeof(inst->state_48_32_right));
    228     return 0;
    229   }
    230   return -1;
    231 }
    232 
    233 /* |frame_size| is set to maximum Opus frame size in the normal case, and
    234  * is set to the number of samples needed for PLC in case of losses.
    235  * It is up to the caller to make sure the value is correct. */
    236 static int DecodeNative(OpusDecoder* inst, const int16_t* encoded,
    237                         int16_t encoded_bytes, int frame_size,
    238                         int16_t* decoded, int16_t* audio_type) {
    239   unsigned char* coded = (unsigned char*) encoded;
    240   opus_int16* audio = (opus_int16*) decoded;
    241 
    242   int res = opus_decode(inst, coded, encoded_bytes, audio, frame_size, 0);
    243 
    244   /* TODO(tlegrand): set to DTX for zero-length packets? */
    245   *audio_type = 0;
    246 
    247   if (res > 0) {
    248     return res;
    249   }
    250   return -1;
    251 }
    252 
    253 static int DecodeFec(OpusDecoder* inst, const int16_t* encoded,
    254                      int16_t encoded_bytes, int frame_size,
    255                      int16_t* decoded, int16_t* audio_type) {
    256   unsigned char* coded = (unsigned char*) encoded;
    257   opus_int16* audio = (opus_int16*) decoded;
    258 
    259   int res = opus_decode(inst, coded, encoded_bytes, audio, frame_size, 1);
    260 
    261   /* TODO(tlegrand): set to DTX for zero-length packets? */
    262   *audio_type = 0;
    263 
    264   if (res > 0) {
    265     return res;
    266   }
    267   return -1;
    268 }
    269 
    270 /* Resample from 48 to 32 kHz. Length of state is assumed to be
    271  * kWebRtcOpusStateSize (7).
    272  */
    273 static int WebRtcOpus_Resample48to32(const int16_t* samples_in, int length,
    274                                      int16_t* state, int16_t* samples_out) {
    275   int i;
    276   int blocks;
    277   int16_t output_samples;
    278   int32_t buffer32[kWebRtcOpusMaxFrameSizePerChannel + kWebRtcOpusStateSize];
    279 
    280   /* Resample from 48 kHz to 32 kHz. */
    281   for (i = 0; i < kWebRtcOpusStateSize; i++) {
    282     buffer32[i] = state[i];
    283     state[i] = samples_in[length - kWebRtcOpusStateSize + i];
    284   }
    285   for (i = 0; i < length; i++) {
    286     buffer32[kWebRtcOpusStateSize + i] = samples_in[i];
    287   }
    288   /* Resampling 3 samples to 2. Function divides the input in |blocks| number
    289    * of 3-sample groups, and output is |blocks| number of 2-sample groups.
    290    * When this is removed, the compensation in WebRtcOpus_DurationEst should be
    291    * removed too. */
    292   blocks = length / 3;
    293   WebRtcSpl_Resample48khzTo32khz(buffer32, buffer32, blocks);
    294   output_samples = (int16_t) (blocks * 2);
    295   WebRtcSpl_VectorBitShiftW32ToW16(samples_out, output_samples, buffer32, 15);
    296 
    297   return output_samples;
    298 }
    299 
    300 static int WebRtcOpus_DeInterleaveResample(OpusDecInst* inst, int16_t* input,
    301                                            int sample_pairs, int16_t* output) {
    302   int i;
    303   int16_t buffer_left[kWebRtcOpusMaxFrameSizePerChannel];
    304   int16_t buffer_right[kWebRtcOpusMaxFrameSizePerChannel];
    305   int16_t buffer_out[kWebRtcOpusMaxFrameSizePerChannel32kHz];
    306   int resampled_samples;
    307 
    308   /* De-interleave the signal in left and right channel. */
    309   for (i = 0; i < sample_pairs; i++) {
    310     /* Take every second sample, starting at the first sample. */
    311     buffer_left[i] = input[i * 2];
    312     buffer_right[i] = input[i * 2 + 1];
    313   }
    314 
    315   /* Resample from 48 kHz to 32 kHz for left channel. */
    316   resampled_samples = WebRtcOpus_Resample48to32(
    317       buffer_left, sample_pairs, inst->state_48_32_left, buffer_out);
    318 
    319   /* Add samples interleaved to output vector. */
    320   for (i = 0; i < resampled_samples; i++) {
    321     output[i * 2] = buffer_out[i];
    322   }
    323 
    324   /* Resample from 48 kHz to 32 kHz for right channel. */
    325   resampled_samples = WebRtcOpus_Resample48to32(
    326       buffer_right, sample_pairs, inst->state_48_32_right, buffer_out);
    327 
    328   /* Add samples interleaved to output vector. */
    329   for (i = 0; i < resampled_samples; i++) {
    330     output[i * 2 + 1] = buffer_out[i];
    331   }
    332 
    333   return resampled_samples;
    334 }
    335 
    336 int16_t WebRtcOpus_DecodeNew(OpusDecInst* inst, const uint8_t* encoded,
    337                              int16_t encoded_bytes, int16_t* decoded,
    338                              int16_t* audio_type) {
    339   /* |buffer| is big enough for 120 ms (the largest Opus packet size) of stereo
    340    * audio at 48 kHz. */
    341   int16_t buffer[kWebRtcOpusMaxFrameSize];
    342   int16_t* coded = (int16_t*)encoded;
    343   int decoded_samples;
    344   int resampled_samples;
    345 
    346   /* If mono case, just do a regular call to the decoder.
    347    * If stereo, we need to de-interleave the stereo output into blocks with
    348    * left and right channel. Each block is resampled to 32 kHz, and then
    349    * interleaved again. */
    350 
    351   /* Decode to a temporary buffer. */
    352   decoded_samples = DecodeNative(inst->decoder_left, coded, encoded_bytes,
    353                                  kWebRtcOpusMaxFrameSizePerChannel,
    354                                  buffer, audio_type);
    355   if (decoded_samples < 0) {
    356     return -1;
    357   }
    358 
    359   if (inst->channels == 2) {
    360     /* De-interleave and resample. */
    361     resampled_samples = WebRtcOpus_DeInterleaveResample(inst,
    362                                                         buffer,
    363                                                         decoded_samples,
    364                                                         decoded);
    365   } else {
    366     /* Resample from 48 kHz to 32 kHz. Filter state memory for left channel is
    367      * used for mono signals. */
    368     resampled_samples = WebRtcOpus_Resample48to32(buffer,
    369                                                   decoded_samples,
    370                                                   inst->state_48_32_left,
    371                                                   decoded);
    372   }
    373 
    374   /* Update decoded sample memory, to be used by the PLC in case of losses. */
    375   inst->prev_decoded_samples = decoded_samples;
    376 
    377   return resampled_samples;
    378 }
    379 
    380 int16_t WebRtcOpus_Decode(OpusDecInst* inst, const int16_t* encoded,
    381                           int16_t encoded_bytes, int16_t* decoded,
    382                           int16_t* audio_type) {
    383   /* |buffer16| is big enough for 120 ms (the largestOpus packet size) of
    384    * stereo audio at 48 kHz. */
    385   int16_t buffer16[kWebRtcOpusMaxFrameSize];
    386   int decoded_samples;
    387   int16_t output_samples;
    388   int i;
    389 
    390   /* If mono case, just do a regular call to the decoder.
    391    * If stereo, call to WebRtcOpus_Decode() gives left channel as output, and
    392    * calls to WebRtcOpus_Decode_slave() give right channel as output.
    393    * This is to make stereo work with the current setup of NetEQ, which
    394    * requires two calls to the decoder to produce stereo. */
    395 
    396   /* Decode to a temporary buffer. */
    397   decoded_samples = DecodeNative(inst->decoder_left, encoded, encoded_bytes,
    398                                  kWebRtcOpusMaxFrameSizePerChannel, buffer16,
    399                                  audio_type);
    400   if (decoded_samples < 0) {
    401     return -1;
    402   }
    403   if (inst->channels == 2) {
    404     /* The parameter |decoded_samples| holds the number of samples pairs, in
    405      * case of stereo. Number of samples in |buffer16| equals |decoded_samples|
    406      * times 2. */
    407     for (i = 0; i < decoded_samples; i++) {
    408       /* Take every second sample, starting at the first sample. This gives
    409        * the left channel. */
    410       buffer16[i] = buffer16[i * 2];
    411     }
    412   }
    413 
    414   /* Resample from 48 kHz to 32 kHz. */
    415   output_samples = WebRtcOpus_Resample48to32(buffer16, decoded_samples,
    416                                              inst->state_48_32_left, decoded);
    417 
    418   /* Update decoded sample memory, to be used by the PLC in case of losses. */
    419   inst->prev_decoded_samples = decoded_samples;
    420 
    421   return output_samples;
    422 }
    423 
    424 int16_t WebRtcOpus_DecodeSlave(OpusDecInst* inst, const int16_t* encoded,
    425                                int16_t encoded_bytes, int16_t* decoded,
    426                                int16_t* audio_type) {
    427   /* |buffer16| is big enough for 120 ms (the largestOpus packet size) of
    428    * stereo audio at 48 kHz. */
    429   int16_t buffer16[kWebRtcOpusMaxFrameSize];
    430   int decoded_samples;
    431   int16_t output_samples;
    432   int i;
    433 
    434   /* Decode to a temporary buffer. */
    435   decoded_samples = DecodeNative(inst->decoder_right, encoded, encoded_bytes,
    436                                  kWebRtcOpusMaxFrameSizePerChannel, buffer16,
    437                                  audio_type);
    438   if (decoded_samples < 0) {
    439     return -1;
    440   }
    441   if (inst->channels == 2) {
    442     /* The parameter |decoded_samples| holds the number of samples pairs, in
    443      * case of stereo. Number of samples in |buffer16| equals |decoded_samples|
    444      * times 2. */
    445     for (i = 0; i < decoded_samples; i++) {
    446       /* Take every second sample, starting at the second sample. This gives
    447        * the right channel. */
    448       buffer16[i] = buffer16[i * 2 + 1];
    449     }
    450   } else {
    451     /* Decode slave should never be called for mono packets. */
    452     return -1;
    453   }
    454   /* Resample from 48 kHz to 32 kHz. */
    455   output_samples = WebRtcOpus_Resample48to32(buffer16, decoded_samples,
    456                                              inst->state_48_32_right, decoded);
    457 
    458   return output_samples;
    459 }
    460 
    461 int16_t WebRtcOpus_DecodePlc(OpusDecInst* inst, int16_t* decoded,
    462                              int16_t number_of_lost_frames) {
    463   int16_t buffer[kWebRtcOpusMaxFrameSize];
    464   int16_t audio_type = 0;
    465   int decoded_samples;
    466   int resampled_samples;
    467   int plc_samples;
    468 
    469   /* If mono case, just do a regular call to the plc function, before
    470    * resampling.
    471    * If stereo, we need to de-interleave the stereo output into blocks with
    472    * left and right channel. Each block is resampled to 32 kHz, and then
    473    * interleaved again. */
    474 
    475   /* Decode to a temporary buffer. The number of samples we ask for is
    476    * |number_of_lost_frames| times |prev_decoded_samples_|. Limit the number
    477    * of samples to maximum |kWebRtcOpusMaxFrameSizePerChannel|. */
    478   plc_samples = number_of_lost_frames * inst->prev_decoded_samples;
    479   plc_samples = (plc_samples <= kWebRtcOpusMaxFrameSizePerChannel) ?
    480       plc_samples : kWebRtcOpusMaxFrameSizePerChannel;
    481   decoded_samples = DecodeNative(inst->decoder_left, NULL, 0, plc_samples,
    482                                  buffer, &audio_type);
    483   if (decoded_samples < 0) {
    484     return -1;
    485   }
    486 
    487   if (inst->channels == 2) {
    488      /* De-interleave and resample. */
    489      resampled_samples = WebRtcOpus_DeInterleaveResample(inst,
    490                                                          buffer,
    491                                                          decoded_samples,
    492                                                          decoded);
    493    } else {
    494      /* Resample from 48 kHz to 32 kHz. Filter state memory for left channel is
    495       * used for mono signals. */
    496      resampled_samples = WebRtcOpus_Resample48to32(buffer,
    497                                                    decoded_samples,
    498                                                    inst->state_48_32_left,
    499                                                    decoded);
    500    }
    501 
    502   return resampled_samples;
    503 }
    504 
    505 int16_t WebRtcOpus_DecodePlcMaster(OpusDecInst* inst, int16_t* decoded,
    506                                    int16_t number_of_lost_frames) {
    507   int16_t buffer[kWebRtcOpusMaxFrameSize];
    508   int decoded_samples;
    509   int resampled_samples;
    510   int16_t audio_type = 0;
    511   int plc_samples;
    512   int i;
    513 
    514   /* If mono case, just do a regular call to the decoder.
    515    * If stereo, call to WebRtcOpus_DecodePlcMaster() gives left channel as
    516    * output, and calls to WebRtcOpus_DecodePlcSlave() give right channel as
    517    * output. This is to make stereo work with the current setup of NetEQ, which
    518    * requires two calls to the decoder to produce stereo. */
    519 
    520   /* Decode to a temporary buffer. The number of samples we ask for is
    521    * |number_of_lost_frames| times |prev_decoded_samples_|. Limit the number
    522    * of samples to maximum |kWebRtcOpusMaxFrameSizePerChannel|. */
    523   plc_samples = number_of_lost_frames * inst->prev_decoded_samples;
    524   plc_samples = (plc_samples <= kWebRtcOpusMaxFrameSizePerChannel) ?
    525       plc_samples : kWebRtcOpusMaxFrameSizePerChannel;
    526   decoded_samples = DecodeNative(inst->decoder_left, NULL, 0, plc_samples,
    527                                  buffer, &audio_type);
    528   if (decoded_samples < 0) {
    529     return -1;
    530   }
    531 
    532   if (inst->channels == 2) {
    533     /* The parameter |decoded_samples| holds the number of sample pairs, in
    534      * case of stereo. The original number of samples in |buffer| equals
    535      * |decoded_samples| times 2. */
    536     for (i = 0; i < decoded_samples; i++) {
    537       /* Take every second sample, starting at the first sample. This gives
    538        * the left channel. */
    539       buffer[i] = buffer[i * 2];
    540     }
    541   }
    542 
    543   /* Resample from 48 kHz to 32 kHz for left channel. */
    544   resampled_samples = WebRtcOpus_Resample48to32(buffer,
    545                                                 decoded_samples,
    546                                                 inst->state_48_32_left,
    547                                                 decoded);
    548   return resampled_samples;
    549 }
    550 
    551 int16_t WebRtcOpus_DecodePlcSlave(OpusDecInst* inst, int16_t* decoded,
    552                                   int16_t number_of_lost_frames) {
    553   int16_t buffer[kWebRtcOpusMaxFrameSize];
    554   int decoded_samples;
    555   int resampled_samples;
    556   int16_t audio_type = 0;
    557   int plc_samples;
    558   int i;
    559 
    560   /* Calls to WebRtcOpus_DecodePlcSlave() give right channel as output.
    561    * The function should never be called in the mono case. */
    562   if (inst->channels != 2) {
    563     return -1;
    564   }
    565 
    566   /* Decode to a temporary buffer. The number of samples we ask for is
    567    * |number_of_lost_frames| times |prev_decoded_samples_|. Limit the number
    568    * of samples to maximum |kWebRtcOpusMaxFrameSizePerChannel|. */
    569   plc_samples = number_of_lost_frames * inst->prev_decoded_samples;
    570   plc_samples = (plc_samples <= kWebRtcOpusMaxFrameSizePerChannel)
    571       ? plc_samples : kWebRtcOpusMaxFrameSizePerChannel;
    572   decoded_samples = DecodeNative(inst->decoder_right, NULL, 0, plc_samples,
    573                                  buffer, &audio_type);
    574   if (decoded_samples < 0) {
    575     return -1;
    576   }
    577 
    578   /* The parameter |decoded_samples| holds the number of sample pairs,
    579    * The original number of samples in |buffer| equals |decoded_samples|
    580    * times 2. */
    581   for (i = 0; i < decoded_samples; i++) {
    582     /* Take every second sample, starting at the second sample. This gives
    583      * the right channel. */
    584     buffer[i] = buffer[i * 2 + 1];
    585   }
    586 
    587   /* Resample from 48 kHz to 32 kHz for left channel. */
    588   resampled_samples = WebRtcOpus_Resample48to32(buffer,
    589                                                 decoded_samples,
    590                                                 inst->state_48_32_right,
    591                                                 decoded);
    592   return resampled_samples;
    593 }
    594 
    595 int16_t WebRtcOpus_DecodeFec(OpusDecInst* inst, const uint8_t* encoded,
    596                              int16_t encoded_bytes, int16_t* decoded,
    597                              int16_t* audio_type) {
    598   /* |buffer| is big enough for 120 ms (the largest Opus packet size) of stereo
    599    * audio at 48 kHz. */
    600   int16_t buffer[kWebRtcOpusMaxFrameSize];
    601   int16_t* coded = (int16_t*)encoded;
    602   int decoded_samples;
    603   int resampled_samples;
    604   int fec_samples;
    605 
    606   if (WebRtcOpus_PacketHasFec(encoded, encoded_bytes) != 1) {
    607     return 0;
    608   }
    609 
    610   fec_samples = opus_packet_get_samples_per_frame(encoded, 48000);
    611 
    612   /* Decode to a temporary buffer. */
    613   decoded_samples = DecodeFec(inst->decoder_left, coded, encoded_bytes,
    614                               fec_samples, buffer, audio_type);
    615   if (decoded_samples < 0) {
    616     return -1;
    617   }
    618 
    619   /* If mono case, just do a regular call to the decoder.
    620    * If stereo, we need to de-interleave the stereo output into blocks with
    621    * left and right channel. Each block is resampled to 32 kHz, and then
    622    * interleaved again. */
    623   if (inst->channels == 2) {
    624     /* De-interleave and resample. */
    625     resampled_samples = WebRtcOpus_DeInterleaveResample(inst,
    626                                                         buffer,
    627                                                         decoded_samples,
    628                                                         decoded);
    629   } else {
    630     /* Resample from 48 kHz to 32 kHz. Filter state memory for left channel is
    631      * used for mono signals. */
    632     resampled_samples = WebRtcOpus_Resample48to32(buffer,
    633                                                   decoded_samples,
    634                                                   inst->state_48_32_left,
    635                                                   decoded);
    636   }
    637 
    638   return resampled_samples;
    639 }
    640 
    641 int WebRtcOpus_DurationEst(OpusDecInst* inst,
    642                            const uint8_t* payload,
    643                            int payload_length_bytes) {
    644   int frames, samples;
    645   frames = opus_packet_get_nb_frames(payload, payload_length_bytes);
    646   if (frames < 0) {
    647     /* Invalid payload data. */
    648     return 0;
    649   }
    650   samples = frames * opus_packet_get_samples_per_frame(payload, 48000);
    651   if (samples < 120 || samples > 5760) {
    652     /* Invalid payload duration. */
    653     return 0;
    654   }
    655   /* Compensate for the down-sampling from 48 kHz to 32 kHz.
    656    * This should be removed when the resampling in WebRtcOpus_Decode is
    657    * removed. */
    658   samples = samples * 2 / 3;
    659   return samples;
    660 }
    661 
    662 int WebRtcOpus_FecDurationEst(const uint8_t* payload,
    663                               int payload_length_bytes) {
    664   int samples;
    665   if (WebRtcOpus_PacketHasFec(payload, payload_length_bytes) != 1) {
    666     return 0;
    667   }
    668 
    669   samples = opus_packet_get_samples_per_frame(payload, 48000);
    670   if (samples < 480 || samples > 5760) {
    671     /* Invalid payload duration. */
    672     return 0;
    673   }
    674   /* Compensate for the down-sampling from 48 kHz to 32 kHz.
    675    * This should be removed when the resampling in WebRtcOpus_Decode is
    676    * removed. */
    677   samples = samples * 2 / 3;
    678   return samples;
    679 }
    680 
    681 int WebRtcOpus_PacketHasFec(const uint8_t* payload,
    682                             int payload_length_bytes) {
    683   int frames, channels, payload_length_ms;
    684   int n;
    685   opus_int16 frame_sizes[48];
    686   const unsigned char *frame_data[48];
    687 
    688   if (payload == NULL || payload_length_bytes <= 0)
    689     return 0;
    690 
    691   /* In CELT_ONLY mode, packets should not have FEC. */
    692   if (payload[0] & 0x80)
    693     return 0;
    694 
    695   payload_length_ms = opus_packet_get_samples_per_frame(payload, 48000) / 48;
    696   if (10 > payload_length_ms)
    697     payload_length_ms = 10;
    698 
    699   channels = opus_packet_get_nb_channels(payload);
    700 
    701   switch (payload_length_ms) {
    702     case 10:
    703     case 20: {
    704       frames = 1;
    705       break;
    706     }
    707     case 40: {
    708       frames = 2;
    709       break;
    710     }
    711     case 60: {
    712       frames = 3;
    713       break;
    714     }
    715     default: {
    716       return 0; // It is actually even an invalid packet.
    717     }
    718   }
    719 
    720   /* The following is to parse the LBRR flags. */
    721   if (opus_packet_parse(payload, payload_length_bytes, NULL, frame_data,
    722                         frame_sizes, NULL) < 0) {
    723     return 0;
    724   }
    725 
    726   if (frame_sizes[0] <= 1) {
    727     return 0;
    728   }
    729 
    730   for (n = 0; n < channels; n++) {
    731     if (frame_data[0][0] & (0x80 >> ((n + 1) * (frames + 1) - 1)))
    732       return 1;
    733   }
    734 
    735   return 0;
    736 }
    737