1def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org/*
2def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org *
4def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org *  Use of this source code is governed by a BSD-style license
5def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org *  that can be found in the LICENSE file in the root of the source
6def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org *  tree. An additional intellectual property rights grant can be found
7def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org *  in the file PATENTS.  All contributing project authors may
8def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org */
10def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
113c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
123c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#define WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
13def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
14def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org#include <vector>
15def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
16dcccab3ebb623df74fbb1425da2cb9d9a42439faKarl Wiberg#include "webrtc/base/scoped_ptr.h"
17def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/codecs/audio_encoder.h"
18def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
19def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.orgnamespace webrtc {
20def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
21def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.orgclass AudioEncoderPcm : public AudioEncoder {
22def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org public:
23def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org  struct Config {
247f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org   public:
25dcccab3ebb623df74fbb1425da2cb9d9a42439faKarl Wiberg    bool IsOk() const;
26dcccab3ebb623df74fbb1425da2cb9d9a42439faKarl Wiberg
27def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org    int frame_size_ms;
286955870806624479723addfae6dcf5d13968796cPeter Kasting    size_t num_channels;
297f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org    int payload_type;
307f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org
317f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org   protected:
327f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org    explicit Config(int pt)
337f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org        : frame_size_ms(20), num_channels(1), payload_type(pt) {}
34def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org  };
35def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
3614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  ~AudioEncoderPcm() override;
37def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
3812cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  size_t MaxEncodedBytes() const override;
3914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  int SampleRateHz() const override;
406955870806624479723addfae6dcf5d13968796cPeter Kasting  size_t NumChannels() const override;
41dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t Num10MsFramesInNextPacket() const override;
42dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t Max10MsFramesInAPacket() const override;
433e89dbf45835896c8fd89f235f396d03bc2e6065Henrik Lundin  int GetTargetBitrate() const override;
449afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org  EncodedInfo EncodeInternal(uint32_t rtp_timestamp,
45288886b2ec9a2dac730f115e9c3079d8439efe60kwiberg                             rtc::ArrayView<const int16_t> audio,
469afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org                             size_t max_encoded_bytes,
479afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org                             uint8_t* encoded) override;
4812cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  void Reset() override;
49def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
50dcccab3ebb623df74fbb1425da2cb9d9a42439faKarl Wiberg protected:
51dcccab3ebb623df74fbb1425da2cb9d9a42439faKarl Wiberg  AudioEncoderPcm(const Config& config, int sample_rate_hz);
52dcccab3ebb623df74fbb1425da2cb9d9a42439faKarl Wiberg
53dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  virtual size_t EncodeCall(const int16_t* audio,
54dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                            size_t input_len,
55dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                            uint8_t* encoded) = 0;
56def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
5725702cb1628941427fa55e528f53483f239ae011pkasting  virtual size_t BytesPerSample() const = 0;
583e89dbf45835896c8fd89f235f396d03bc2e6065Henrik Lundin
59def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org private:
60817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org  const int sample_rate_hz_;
616955870806624479723addfae6dcf5d13968796cPeter Kasting  const size_t num_channels_;
627f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org  const int payload_type_;
63dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  const size_t num_10ms_frames_per_packet_;
6451ccf376387266225cd8c78e63238b725860f0afjmarusic@webrtc.org  const size_t full_frame_samples_;
65def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org  std::vector<int16_t> speech_buffer_;
66def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org  uint32_t first_timestamp_in_buffer_;
67def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org};
68def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
6912cfc9b4dacd6942377df1f29a64bdbec591920ekwibergstruct CodecInst;
7012cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg
713e89dbf45835896c8fd89f235f396d03bc2e6065Henrik Lundinclass AudioEncoderPcmA final : public AudioEncoderPcm {
72def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org public:
737f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org  struct Config : public AudioEncoderPcm::Config {
747f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org    Config() : AudioEncoderPcm::Config(8) {}
757f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org  };
767f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org
77817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org  explicit AudioEncoderPcmA(const Config& config)
78817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org      : AudioEncoderPcm(config, kSampleRateHz) {}
7912cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  explicit AudioEncoderPcmA(const CodecInst& codec_inst);
80def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
81def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org protected:
82dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t EncodeCall(const int16_t* audio,
83dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                    size_t input_len,
84dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                    uint8_t* encoded) override;
85817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org
8625702cb1628941427fa55e528f53483f239ae011pkasting  size_t BytesPerSample() const override;
873e89dbf45835896c8fd89f235f396d03bc2e6065Henrik Lundin
88817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org private:
89817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org  static const int kSampleRateHz = 8000;
908967183bf79322c5cb3cbd99e9b7aa298228d0a2kwiberg  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmA);
91def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org};
92def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
933e89dbf45835896c8fd89f235f396d03bc2e6065Henrik Lundinclass AudioEncoderPcmU final : public AudioEncoderPcm {
94def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org public:
957f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org  struct Config : public AudioEncoderPcm::Config {
967f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org    Config() : AudioEncoderPcm::Config(0) {}
977f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org  };
987f1dfa5b61f526badbccf1e0a250acee033dd3dbhenrik.lundin@webrtc.org
99817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org  explicit AudioEncoderPcmU(const Config& config)
100817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org      : AudioEncoderPcm(config, kSampleRateHz) {}
10112cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  explicit AudioEncoderPcmU(const CodecInst& codec_inst);
102def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
103def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org protected:
104dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t EncodeCall(const int16_t* audio,
105dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                    size_t input_len,
106dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                    uint8_t* encoded) override;
107817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org
10825702cb1628941427fa55e528f53483f239ae011pkasting  size_t BytesPerSample() const override;
1093e89dbf45835896c8fd89f235f396d03bc2e6065Henrik Lundin
110817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org private:
111817e50dd7d0a703fe537c63ea324d2d6c8f4cd0ehenrik.lundin@webrtc.org  static const int kSampleRateHz = 8000;
1128967183bf79322c5cb3cbd99e9b7aa298228d0a2kwiberg  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmU);
113def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org};
114def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org
115def1e97ed2925427ad4ff6f4c54dd78727b033eehenrik.lundin@webrtc.org}  // namespace webrtc
1168967183bf79322c5cb3cbd99e9b7aa298228d0a2kwiberg
1173c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
118