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