Line data Source code
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 : #include "webrtc/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h"
12 :
13 : #include "webrtc/base/checks.h"
14 : #include "webrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame.h"
15 : #include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
16 :
17 : namespace webrtc {
18 :
19 0 : AudioDecoderPcm16B::AudioDecoderPcm16B(int sample_rate_hz, size_t num_channels)
20 0 : : sample_rate_hz_(sample_rate_hz), num_channels_(num_channels) {
21 0 : RTC_DCHECK(sample_rate_hz == 8000 || sample_rate_hz == 16000 ||
22 : sample_rate_hz == 32000 || sample_rate_hz == 48000)
23 0 : << "Unsupported sample rate " << sample_rate_hz;
24 0 : RTC_DCHECK_GE(num_channels, 1);
25 0 : }
26 :
27 0 : void AudioDecoderPcm16B::Reset() {}
28 :
29 0 : int AudioDecoderPcm16B::SampleRateHz() const {
30 0 : return sample_rate_hz_;
31 : }
32 :
33 0 : size_t AudioDecoderPcm16B::Channels() const {
34 0 : return num_channels_;
35 : }
36 :
37 0 : int AudioDecoderPcm16B::DecodeInternal(const uint8_t* encoded,
38 : size_t encoded_len,
39 : int sample_rate_hz,
40 : int16_t* decoded,
41 : SpeechType* speech_type) {
42 0 : RTC_DCHECK_EQ(sample_rate_hz_, sample_rate_hz);
43 0 : size_t ret = WebRtcPcm16b_Decode(encoded, encoded_len, decoded);
44 0 : *speech_type = ConvertSpeechType(1);
45 0 : return static_cast<int>(ret);
46 : }
47 :
48 0 : std::vector<AudioDecoder::ParseResult> AudioDecoderPcm16B::ParsePayload(
49 : rtc::Buffer&& payload,
50 : uint32_t timestamp) {
51 0 : const int samples_per_ms = rtc::CheckedDivExact(sample_rate_hz_, 1000);
52 : return LegacyEncodedAudioFrame::SplitBySamples(
53 0 : this, std::move(payload), timestamp, samples_per_ms * 2 * num_channels_,
54 0 : samples_per_ms);
55 : }
56 :
57 0 : int AudioDecoderPcm16B::PacketDuration(const uint8_t* encoded,
58 : size_t encoded_len) const {
59 : // Two encoded byte per sample per channel.
60 0 : return static_cast<int>(encoded_len / (2 * Channels()));
61 : }
62 :
63 : } // namespace webrtc
|