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 MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
12 #define MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
13 
14 #include <vector>
15 
16 #include "api/audio_codecs/audio_encoder.h"
17 #include "rtc_base/constructormagic.h"
18 
19 namespace webrtc {
20 
21 class 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:
ConfigConfig32     explicit Config(int pt)
33         : frame_size_ms(20), num_channels(1), payload_type(pt) {}
34   };
35 
36   ~AudioEncoderPcm() override;
37 
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   void Reset() override;
44 
45  protected:
46   AudioEncoderPcm(const Config& config, int sample_rate_hz);
47 
48   EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
49                          rtc::ArrayView<const int16_t> audio,
50                          rtc::Buffer* encoded) override;
51 
52   virtual size_t EncodeCall(const int16_t* audio,
53                             size_t input_len,
54                             uint8_t* encoded) = 0;
55 
56   virtual size_t BytesPerSample() const = 0;
57 
58   // Used to set EncodedInfoLeaf::encoder_type in
59   // AudioEncoderPcm::EncodeImpl
60   virtual AudioEncoder::CodecType GetCodecType() const = 0;
61 
62  private:
63   const int sample_rate_hz_;
64   const size_t num_channels_;
65   const int payload_type_;
66   const size_t num_10ms_frames_per_packet_;
67   const size_t full_frame_samples_;
68   std::vector<int16_t> speech_buffer_;
69   uint32_t first_timestamp_in_buffer_;
70 };
71 
72 struct CodecInst;
73 
74 class AudioEncoderPcmA final : public AudioEncoderPcm {
75  public:
76   struct Config : public AudioEncoderPcm::Config {
ConfigConfig77     Config() : AudioEncoderPcm::Config(8) {}
78   };
79 
AudioEncoderPcmA(const Config & config)80   explicit AudioEncoderPcmA(const Config& config)
81       : AudioEncoderPcm(config, kSampleRateHz) {}
82   explicit AudioEncoderPcmA(const CodecInst& codec_inst);
83 
84  protected:
85   size_t EncodeCall(const int16_t* audio,
86                     size_t input_len,
87                     uint8_t* encoded) override;
88 
89   size_t BytesPerSample() const override;
90 
91   AudioEncoder::CodecType GetCodecType() const override;
92 
93  private:
94   static const int kSampleRateHz = 8000;
95   RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmA);
96 };
97 
98 class AudioEncoderPcmU final : public AudioEncoderPcm {
99  public:
100   struct Config : public AudioEncoderPcm::Config {
ConfigConfig101     Config() : AudioEncoderPcm::Config(0) {}
102   };
103 
AudioEncoderPcmU(const Config & config)104   explicit AudioEncoderPcmU(const Config& config)
105       : AudioEncoderPcm(config, kSampleRateHz) {}
106   explicit AudioEncoderPcmU(const CodecInst& codec_inst);
107 
108  protected:
109   size_t EncodeCall(const int16_t* audio,
110                     size_t input_len,
111                     uint8_t* encoded) override;
112 
113   size_t BytesPerSample() const override;
114 
115   AudioEncoder::CodecType GetCodecType() const override;
116 
117  private:
118   static const int kSampleRateHz = 8000;
119   RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmU);
120 };
121 
122 }  // namespace webrtc
123 
124 #endif  // MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
125