1/*
2 *  Copyright (c) 2014 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#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_
12#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_
13
14#include "webrtc/base/scoped_ptr.h"
15#include "webrtc/modules/audio_coding/codecs/audio_encoder.h"
16#include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h"
17
18namespace webrtc {
19
20struct CodecInst;
21
22class AudioEncoderIlbc final : public AudioEncoder {
23 public:
24  struct Config {
25    bool IsOk() const;
26
27    int payload_type = 102;
28    int frame_size_ms = 30;  // Valid values are 20, 30, 40, and 60 ms.
29    // Note that frame size 40 ms produces encodings with two 20 ms frames in
30    // them, and frame size 60 ms consists of two 30 ms frames.
31  };
32
33  explicit AudioEncoderIlbc(const Config& config);
34  explicit AudioEncoderIlbc(const CodecInst& codec_inst);
35  ~AudioEncoderIlbc() override;
36
37  size_t MaxEncodedBytes() const override;
38  int SampleRateHz() const override;
39  size_t NumChannels() const override;
40  size_t Num10MsFramesInNextPacket() const override;
41  size_t Max10MsFramesInAPacket() const override;
42  int GetTargetBitrate() const override;
43  EncodedInfo EncodeInternal(uint32_t rtp_timestamp,
44                             rtc::ArrayView<const int16_t> audio,
45                             size_t max_encoded_bytes,
46                             uint8_t* encoded) override;
47  void Reset() override;
48
49 private:
50  size_t RequiredOutputSizeBytes() const;
51
52  static const size_t kMaxSamplesPerPacket = 480;
53  const Config config_;
54  const size_t num_10ms_frames_per_packet_;
55  size_t num_10ms_frames_buffered_;
56  uint32_t first_timestamp_in_buffer_;
57  int16_t input_buffer_[kMaxSamplesPerPacket];
58  IlbcEncoderInstance* encoder_;
59  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderIlbc);
60};
61
62}  // namespace webrtc
63#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_
64