| Index: webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.cc
 | 
| diff --git a/webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.cc b/webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.cc
 | 
| index dab5805f98afcc41eaa714d49e4cd8baec5ebe59..b4bd59911f6439337c647093f0b358af52e3af98 100644
 | 
| --- a/webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.cc
 | 
| +++ b/webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.cc
 | 
| @@ -11,7 +11,9 @@
 | 
|  #include "webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h"
 | 
|  
 | 
|  #include "webrtc/base/checks.h"
 | 
| +#include "webrtc/base/logging.h"
 | 
|  #include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h"
 | 
| +#include "webrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame.h"
 | 
|  
 | 
|  namespace webrtc {
 | 
|  
 | 
| @@ -49,6 +51,53 @@ void AudioDecoderIlbc::Reset() {
 | 
|    WebRtcIlbcfix_Decoderinit30Ms(dec_state_);
 | 
|  }
 | 
|  
 | 
| +std::vector<AudioDecoder::ParseResult> AudioDecoderIlbc::ParsePayload(
 | 
| +    rtc::Buffer&& payload,
 | 
| +    uint32_t timestamp,
 | 
| +    bool is_primary) {
 | 
| +  std::vector<ParseResult> results;
 | 
| +  size_t bytes_per_frame;
 | 
| +  int timestamps_per_frame;
 | 
| +  if (payload.size() >= 950) {
 | 
| +    LOG(LS_WARNING) << "AudioDecoderIlbc::ParsePayload: Payload too large";
 | 
| +    return results;
 | 
| +  }
 | 
| +  if (payload.size() % 38 == 0) {
 | 
| +    // 20 ms frames.
 | 
| +    bytes_per_frame = 38;
 | 
| +    timestamps_per_frame = 160;
 | 
| +  } else if (payload.size() % 50 == 0) {
 | 
| +    // 30 ms frames.
 | 
| +    bytes_per_frame = 50;
 | 
| +    timestamps_per_frame = 240;
 | 
| +  } else {
 | 
| +    LOG(LS_WARNING) << "AudioDecoderIlbc::ParsePayload: Invalid payload";
 | 
| +    return results;
 | 
| +  }
 | 
| +
 | 
| +  RTC_DCHECK_EQ(0u, payload.size() % bytes_per_frame);
 | 
| +  if (payload.size() == bytes_per_frame) {
 | 
| +    std::unique_ptr<EncodedAudioFrame> frame(
 | 
| +        new LegacyEncodedAudioFrame(this, std::move(payload), is_primary));
 | 
| +    results.emplace_back(timestamp, is_primary, std::move(frame));
 | 
| +  } else {
 | 
| +    size_t byte_offset;
 | 
| +    uint32_t timestamp_offset;
 | 
| +    for (byte_offset = 0, timestamp_offset = 0;
 | 
| +         byte_offset < payload.size();
 | 
| +         byte_offset += bytes_per_frame,
 | 
| +             timestamp_offset += timestamps_per_frame) {
 | 
| +      rtc::Buffer new_payload(payload.data() + byte_offset, bytes_per_frame);
 | 
| +      std::unique_ptr<EncodedAudioFrame> frame(new LegacyEncodedAudioFrame(
 | 
| +          this, std::move(new_payload), is_primary));
 | 
| +      results.emplace_back(timestamp + timestamp_offset, is_primary,
 | 
| +                           std::move(frame));
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  return results;
 | 
| +}
 | 
| +
 | 
|  int AudioDecoderIlbc::SampleRateHz() const {
 | 
|    return 8000;
 | 
|  }
 | 
| 
 |