xref: /aosp_15_r20/external/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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 <utility>
15 #include <vector>
16 
17 #include "absl/types/optional.h"
18 #include "api/audio_codecs/audio_encoder.h"
19 #include "api/units/time_delta.h"
20 
21 namespace webrtc {
22 
23 class AudioEncoderPcm : public AudioEncoder {
24  public:
25   struct Config {
26    public:
27     bool IsOk() const;
28 
29     int frame_size_ms;
30     size_t num_channels;
31     int payload_type;
32 
33    protected:
ConfigConfig34     explicit Config(int pt)
35         : frame_size_ms(20), num_channels(1), payload_type(pt) {}
36   };
37 
38   ~AudioEncoderPcm() override;
39 
40   int SampleRateHz() const override;
41   size_t NumChannels() const override;
42   size_t Num10MsFramesInNextPacket() const override;
43   size_t Max10MsFramesInAPacket() const override;
44   int GetTargetBitrate() const override;
45   void Reset() override;
46   absl::optional<std::pair<TimeDelta, TimeDelta>> GetFrameLengthRange()
47       const override;
48 
49  protected:
50   AudioEncoderPcm(const Config& config, int sample_rate_hz);
51 
52   EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
53                          rtc::ArrayView<const int16_t> audio,
54                          rtc::Buffer* encoded) override;
55 
56   virtual size_t EncodeCall(const int16_t* audio,
57                             size_t input_len,
58                             uint8_t* encoded) = 0;
59 
60   virtual size_t BytesPerSample() const = 0;
61 
62   // Used to set EncodedInfoLeaf::encoder_type in
63   // AudioEncoderPcm::EncodeImpl
64   virtual AudioEncoder::CodecType GetCodecType() const = 0;
65 
66  private:
67   const int sample_rate_hz_;
68   const size_t num_channels_;
69   const int payload_type_;
70   const size_t num_10ms_frames_per_packet_;
71   const size_t full_frame_samples_;
72   std::vector<int16_t> speech_buffer_;
73   uint32_t first_timestamp_in_buffer_;
74 };
75 
76 class AudioEncoderPcmA final : public AudioEncoderPcm {
77  public:
78   struct Config : public AudioEncoderPcm::Config {
ConfigConfig79     Config() : AudioEncoderPcm::Config(8) {}
80   };
81 
AudioEncoderPcmA(const Config & config)82   explicit AudioEncoderPcmA(const Config& config)
83       : AudioEncoderPcm(config, kSampleRateHz) {}
84 
85   AudioEncoderPcmA(const AudioEncoderPcmA&) = delete;
86   AudioEncoderPcmA& operator=(const AudioEncoderPcmA&) = delete;
87 
88  protected:
89   size_t EncodeCall(const int16_t* audio,
90                     size_t input_len,
91                     uint8_t* encoded) override;
92 
93   size_t BytesPerSample() const override;
94 
95   AudioEncoder::CodecType GetCodecType() const override;
96 
97  private:
98   static const int kSampleRateHz = 8000;
99 };
100 
101 class AudioEncoderPcmU final : public AudioEncoderPcm {
102  public:
103   struct Config : public AudioEncoderPcm::Config {
ConfigConfig104     Config() : AudioEncoderPcm::Config(0) {}
105   };
106 
AudioEncoderPcmU(const Config & config)107   explicit AudioEncoderPcmU(const Config& config)
108       : AudioEncoderPcm(config, kSampleRateHz) {}
109 
110   AudioEncoderPcmU(const AudioEncoderPcmU&) = delete;
111   AudioEncoderPcmU& operator=(const AudioEncoderPcmU&) = delete;
112 
113  protected:
114   size_t EncodeCall(const int16_t* audio,
115                     size_t input_len,
116                     uint8_t* encoded) override;
117 
118   size_t BytesPerSample() const override;
119 
120   AudioEncoder::CodecType GetCodecType() const override;
121 
122  private:
123   static const int kSampleRateHz = 8000;
124 };
125 
126 }  // namespace webrtc
127 
128 #endif  // MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
129