1 /* 2 * Copyright (c) 2015 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_G722_AUDIO_DECODER_G722_H_ 12 #define MODULES_AUDIO_CODING_CODECS_G722_AUDIO_DECODER_G722_H_ 13 14 #include "api/audio_codecs/audio_decoder.h" 15 #include "rtc_base/constructor_magic.h" 16 17 typedef struct WebRtcG722DecInst G722DecInst; 18 19 namespace webrtc { 20 21 class AudioDecoderG722Impl final : public AudioDecoder { 22 public: 23 AudioDecoderG722Impl(); 24 ~AudioDecoderG722Impl() override; 25 bool HasDecodePlc() const override; 26 void Reset() override; 27 std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload, 28 uint32_t timestamp) override; 29 int PacketDuration(const uint8_t* encoded, size_t encoded_len) const override; 30 int SampleRateHz() const override; 31 size_t Channels() const override; 32 33 protected: 34 int DecodeInternal(const uint8_t* encoded, 35 size_t encoded_len, 36 int sample_rate_hz, 37 int16_t* decoded, 38 SpeechType* speech_type) override; 39 40 private: 41 G722DecInst* dec_state_; 42 RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderG722Impl); 43 }; 44 45 class AudioDecoderG722StereoImpl final : public AudioDecoder { 46 public: 47 AudioDecoderG722StereoImpl(); 48 ~AudioDecoderG722StereoImpl() override; 49 void Reset() override; 50 std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload, 51 uint32_t timestamp) override; 52 int SampleRateHz() const override; 53 size_t Channels() const override; 54 55 protected: 56 int DecodeInternal(const uint8_t* encoded, 57 size_t encoded_len, 58 int sample_rate_hz, 59 int16_t* decoded, 60 SpeechType* speech_type) override; 61 62 private: 63 // Splits the stereo-interleaved payload in |encoded| into separate payloads 64 // for left and right channels. The separated payloads are written to 65 // |encoded_deinterleaved|, which must hold at least |encoded_len| samples. 66 // The left channel starts at offset 0, while the right channel starts at 67 // offset encoded_len / 2 into |encoded_deinterleaved|. 68 void SplitStereoPacket(const uint8_t* encoded, 69 size_t encoded_len, 70 uint8_t* encoded_deinterleaved); 71 72 G722DecInst* dec_state_left_; 73 G722DecInst* dec_state_right_; 74 RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderG722StereoImpl); 75 }; 76 77 } // namespace webrtc 78 79 #endif // MODULES_AUDIO_CODING_CODECS_G722_AUDIO_DECODER_G722_H_ 80