blob: 8d4a2bc175ba624bfc518adaf4fcebe9eea8d795 [file] [log] [blame]
kwiberg@webrtc.orge04a93b2014-12-09 10:12:53 +00001/*
2 * Copyright (c) 2012 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/audio_decoder.h"
12
13#include <assert.h>
14
kwibergac554ee2016-09-02 00:39:33 -070015#include "webrtc/base/array_view.h"
kwiberg@webrtc.orge04a93b2014-12-09 10:12:53 +000016#include "webrtc/base/checks.h"
kwibergac554ee2016-09-02 00:39:33 -070017#include "webrtc/base/sanitizer.h"
Peter Boströmd7b7ae82015-12-08 13:41:35 +010018#include "webrtc/base/trace_event.h"
kwiberg@webrtc.orge04a93b2014-12-09 10:12:53 +000019
20namespace webrtc {
21
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +000022int AudioDecoder::Decode(const uint8_t* encoded, size_t encoded_len,
23 int sample_rate_hz, size_t max_decoded_bytes,
24 int16_t* decoded, SpeechType* speech_type) {
Peter Boströmd7b7ae82015-12-08 13:41:35 +010025 TRACE_EVENT0("webrtc", "AudioDecoder::Decode");
kwibergac554ee2016-09-02 00:39:33 -070026 rtc::MsanCheckInitialized(rtc::MakeArrayView(encoded, encoded_len));
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +000027 int duration = PacketDuration(encoded, encoded_len);
Minyue323b1322015-05-25 13:49:37 +020028 if (duration >= 0 &&
29 duration * Channels() * sizeof(int16_t) > max_decoded_bytes) {
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +000030 return -1;
31 }
32 return DecodeInternal(encoded, encoded_len, sample_rate_hz, decoded,
33 speech_type);
34}
35
36int AudioDecoder::DecodeRedundant(const uint8_t* encoded, size_t encoded_len,
37 int sample_rate_hz, size_t max_decoded_bytes,
38 int16_t* decoded, SpeechType* speech_type) {
Peter Boströmd7b7ae82015-12-08 13:41:35 +010039 TRACE_EVENT0("webrtc", "AudioDecoder::DecodeRedundant");
kwibergac554ee2016-09-02 00:39:33 -070040 rtc::MsanCheckInitialized(rtc::MakeArrayView(encoded, encoded_len));
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +000041 int duration = PacketDurationRedundant(encoded, encoded_len);
Minyue323b1322015-05-25 13:49:37 +020042 if (duration >= 0 &&
43 duration * Channels() * sizeof(int16_t) > max_decoded_bytes) {
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +000044 return -1;
45 }
46 return DecodeRedundantInternal(encoded, encoded_len, sample_rate_hz, decoded,
47 speech_type);
48}
49
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +000050int AudioDecoder::DecodeRedundantInternal(const uint8_t* encoded,
51 size_t encoded_len,
52 int sample_rate_hz, int16_t* decoded,
53 SpeechType* speech_type) {
54 return DecodeInternal(encoded, encoded_len, sample_rate_hz, decoded,
55 speech_type);
kwiberg@webrtc.orge04a93b2014-12-09 10:12:53 +000056}
57
58bool AudioDecoder::HasDecodePlc() const { return false; }
59
Peter Kastingdce40cf2015-08-24 14:52:23 -070060size_t AudioDecoder::DecodePlc(size_t num_frames, int16_t* decoded) {
61 return 0;
62}
kwiberg@webrtc.orge04a93b2014-12-09 10:12:53 +000063
64int AudioDecoder::IncomingPacket(const uint8_t* payload,
65 size_t payload_len,
66 uint16_t rtp_sequence_number,
67 uint32_t rtp_timestamp,
68 uint32_t arrival_timestamp) {
69 return 0;
70}
71
72int AudioDecoder::ErrorCode() { return 0; }
73
minyue@webrtc.orga8cc3442015-02-13 14:01:54 +000074int AudioDecoder::PacketDuration(const uint8_t* encoded,
75 size_t encoded_len) const {
kwiberg@webrtc.orge04a93b2014-12-09 10:12:53 +000076 return kNotImplemented;
77}
78
79int AudioDecoder::PacketDurationRedundant(const uint8_t* encoded,
80 size_t encoded_len) const {
81 return kNotImplemented;
82}
83
84bool AudioDecoder::PacketHasFec(const uint8_t* encoded,
85 size_t encoded_len) const {
86 return false;
87}
88
kwiberg@webrtc.orge04a93b2014-12-09 10:12:53 +000089AudioDecoder::SpeechType AudioDecoder::ConvertSpeechType(int16_t type) {
90 switch (type) {
91 case 0: // TODO(hlundin): Both iSAC and Opus return 0 for speech.
92 case 1:
93 return kSpeech;
94 case 2:
95 return kComfortNoise;
96 default:
97 assert(false);
98 return kSpeech;
99 }
100}
101
102} // namespace webrtc