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_G711_AUDIO_ENCODER_PCM_H_
12#define WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
13
14#include <vector>
15
16#include "webrtc/base/scoped_ptr.h"
17#include "webrtc/modules/audio_coding/codecs/audio_encoder.h"
18
19namespace webrtc {
20
21class AudioEncoderPcm : public AudioEncoder {
22 public:
23  struct Config {
24   public:
25    bool IsOk() const;
26
27    int frame_size_ms;
28    size_t num_channels;
29    int payload_type;
30
31   protected:
32    explicit Config(int pt)
33        : frame_size_ms(20), num_channels(1), payload_type(pt) {}
34  };
35
36  ~AudioEncoderPcm() override;
37
38  size_t MaxEncodedBytes() const override;
39  int SampleRateHz() const override;
40  size_t NumChannels() const override;
41  size_t Num10MsFramesInNextPacket() const override;
42  size_t Max10MsFramesInAPacket() const override;
43  int GetTargetBitrate() const override;
44  EncodedInfo EncodeInternal(uint32_t rtp_timestamp,
45                             rtc::ArrayView<const int16_t> audio,
46                             size_t max_encoded_bytes,
47                             uint8_t* encoded) override;
48  void Reset() override;
49
50 protected:
51  AudioEncoderPcm(const Config& config, int sample_rate_hz);
52
53  virtual size_t EncodeCall(const int16_t* audio,
54                            size_t input_len,
55                            uint8_t* encoded) = 0;
56
57  virtual size_t BytesPerSample() const = 0;
58
59 private:
60  const int sample_rate_hz_;
61  const size_t num_channels_;
62  const int payload_type_;
63  const size_t num_10ms_frames_per_packet_;
64  const size_t full_frame_samples_;
65  std::vector<int16_t> speech_buffer_;
66  uint32_t first_timestamp_in_buffer_;
67};
68
69struct CodecInst;
70
71class AudioEncoderPcmA final : public AudioEncoderPcm {
72 public:
73  struct Config : public AudioEncoderPcm::Config {
74    Config() : AudioEncoderPcm::Config(8) {}
75  };
76
77  explicit AudioEncoderPcmA(const Config& config)
78      : AudioEncoderPcm(config, kSampleRateHz) {}
79  explicit AudioEncoderPcmA(const CodecInst& codec_inst);
80
81 protected:
82  size_t EncodeCall(const int16_t* audio,
83                    size_t input_len,
84                    uint8_t* encoded) override;
85
86  size_t BytesPerSample() const override;
87
88 private:
89  static const int kSampleRateHz = 8000;
90  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmA);
91};
92
93class AudioEncoderPcmU final : public AudioEncoderPcm {
94 public:
95  struct Config : public AudioEncoderPcm::Config {
96    Config() : AudioEncoderPcm::Config(0) {}
97  };
98
99  explicit AudioEncoderPcmU(const Config& config)
100      : AudioEncoderPcm(config, kSampleRateHz) {}
101  explicit AudioEncoderPcmU(const CodecInst& codec_inst);
102
103 protected:
104  size_t EncodeCall(const int16_t* audio,
105                    size_t input_len,
106                    uint8_t* encoded) override;
107
108  size_t BytesPerSample() const override;
109
110 private:
111  static const int kSampleRateHz = 8000;
112  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmU);
113};
114
115}  // namespace webrtc
116
117#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
118