OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 return 1; | 46 return 1; |
47 } | 47 } |
48 | 48 |
49 int AudioDecoderPcmU::DecodeInternal(const uint8_t* encoded, | 49 int AudioDecoderPcmU::DecodeInternal(const uint8_t* encoded, |
50 size_t encoded_len, | 50 size_t encoded_len, |
51 int sample_rate_hz, | 51 int sample_rate_hz, |
52 int16_t* decoded, | 52 int16_t* decoded, |
53 SpeechType* speech_type) { | 53 SpeechType* speech_type) { |
54 DCHECK_EQ(sample_rate_hz, 8000); | 54 DCHECK_EQ(sample_rate_hz, 8000); |
55 int16_t temp_type = 1; // Default is speech. | 55 int16_t temp_type = 1; // Default is speech. |
56 int16_t ret = WebRtcG711_DecodeU(encoded, static_cast<int16_t>(encoded_len), | 56 size_t ret = WebRtcG711_DecodeU(encoded, encoded_len, decoded, &temp_type); |
57 decoded, &temp_type); | |
58 *speech_type = ConvertSpeechType(temp_type); | 57 *speech_type = ConvertSpeechType(temp_type); |
59 return ret; | 58 return static_cast<int>(ret); |
60 } | 59 } |
61 | 60 |
62 int AudioDecoderPcmU::PacketDuration(const uint8_t* encoded, | 61 int AudioDecoderPcmU::PacketDuration(const uint8_t* encoded, |
63 size_t encoded_len) const { | 62 size_t encoded_len) const { |
64 // One encoded byte per sample per channel. | 63 // One encoded byte per sample per channel. |
65 return static_cast<int>(encoded_len / Channels()); | 64 return static_cast<int>(encoded_len / Channels()); |
66 } | 65 } |
67 | 66 |
68 size_t AudioDecoderPcmUMultiCh::Channels() const { | 67 size_t AudioDecoderPcmUMultiCh::Channels() const { |
69 return channels_; | 68 return channels_; |
70 } | 69 } |
71 | 70 |
72 // PCMa | 71 // PCMa |
73 | 72 |
74 int AudioDecoderPcmA::Init() { | 73 int AudioDecoderPcmA::Init() { |
75 return 0; | 74 return 0; |
76 } | 75 } |
77 size_t AudioDecoderPcmA::Channels() const { | 76 size_t AudioDecoderPcmA::Channels() const { |
78 return 1; | 77 return 1; |
79 } | 78 } |
80 | 79 |
81 int AudioDecoderPcmA::DecodeInternal(const uint8_t* encoded, | 80 int AudioDecoderPcmA::DecodeInternal(const uint8_t* encoded, |
82 size_t encoded_len, | 81 size_t encoded_len, |
83 int sample_rate_hz, | 82 int sample_rate_hz, |
84 int16_t* decoded, | 83 int16_t* decoded, |
85 SpeechType* speech_type) { | 84 SpeechType* speech_type) { |
86 DCHECK_EQ(sample_rate_hz, 8000); | 85 DCHECK_EQ(sample_rate_hz, 8000); |
87 int16_t temp_type = 1; // Default is speech. | 86 int16_t temp_type = 1; // Default is speech. |
88 int16_t ret = WebRtcG711_DecodeA(encoded, static_cast<int16_t>(encoded_len), | 87 size_t ret = WebRtcG711_DecodeA(encoded, encoded_len, decoded, &temp_type); |
89 decoded, &temp_type); | |
90 *speech_type = ConvertSpeechType(temp_type); | 88 *speech_type = ConvertSpeechType(temp_type); |
91 return ret; | 89 return static_cast<int>(ret); |
92 } | 90 } |
93 | 91 |
94 int AudioDecoderPcmA::PacketDuration(const uint8_t* encoded, | 92 int AudioDecoderPcmA::PacketDuration(const uint8_t* encoded, |
95 size_t encoded_len) const { | 93 size_t encoded_len) const { |
96 // One encoded byte per sample per channel. | 94 // One encoded byte per sample per channel. |
97 return static_cast<int>(encoded_len / Channels()); | 95 return static_cast<int>(encoded_len / Channels()); |
98 } | 96 } |
99 | 97 |
100 size_t AudioDecoderPcmAMultiCh::Channels() const { | 98 size_t AudioDecoderPcmAMultiCh::Channels() const { |
101 return channels_; | 99 return channels_; |
(...skipping 11 matching lines...) Expand all Loading... |
113 } | 111 } |
114 | 112 |
115 int AudioDecoderPcm16B::DecodeInternal(const uint8_t* encoded, | 113 int AudioDecoderPcm16B::DecodeInternal(const uint8_t* encoded, |
116 size_t encoded_len, | 114 size_t encoded_len, |
117 int sample_rate_hz, | 115 int sample_rate_hz, |
118 int16_t* decoded, | 116 int16_t* decoded, |
119 SpeechType* speech_type) { | 117 SpeechType* speech_type) { |
120 DCHECK(sample_rate_hz == 8000 || sample_rate_hz == 16000 || | 118 DCHECK(sample_rate_hz == 8000 || sample_rate_hz == 16000 || |
121 sample_rate_hz == 32000 || sample_rate_hz == 48000) | 119 sample_rate_hz == 32000 || sample_rate_hz == 48000) |
122 << "Unsupported sample rate " << sample_rate_hz; | 120 << "Unsupported sample rate " << sample_rate_hz; |
123 int16_t ret = | 121 size_t ret = WebRtcPcm16b_Decode(encoded, encoded_len, decoded); |
124 WebRtcPcm16b_Decode(encoded, static_cast<int16_t>(encoded_len), decoded); | |
125 *speech_type = ConvertSpeechType(1); | 122 *speech_type = ConvertSpeechType(1); |
126 return ret; | 123 return static_cast<int>(ret); |
127 } | 124 } |
128 | 125 |
129 int AudioDecoderPcm16B::PacketDuration(const uint8_t* encoded, | 126 int AudioDecoderPcm16B::PacketDuration(const uint8_t* encoded, |
130 size_t encoded_len) const { | 127 size_t encoded_len) const { |
131 // Two encoded byte per sample per channel. | 128 // Two encoded byte per sample per channel. |
132 return static_cast<int>(encoded_len / (2 * Channels())); | 129 return static_cast<int>(encoded_len / (2 * Channels())); |
133 } | 130 } |
134 | 131 |
135 AudioDecoderPcm16BMultiCh::AudioDecoderPcm16BMultiCh(int num_channels) | 132 AudioDecoderPcm16BMultiCh::AudioDecoderPcm16BMultiCh(size_t num_channels) |
136 : channels_(num_channels) { | 133 : channels_(num_channels) { |
137 DCHECK(num_channels > 0); | 134 DCHECK(num_channels > 0); |
138 } | 135 } |
139 | 136 |
140 size_t AudioDecoderPcm16BMultiCh::Channels() const { | 137 size_t AudioDecoderPcm16BMultiCh::Channels() const { |
141 return channels_; | 138 return channels_; |
142 } | 139 } |
143 #endif | 140 #endif |
144 | 141 |
145 // iLBC | 142 // iLBC |
(...skipping 10 matching lines...) Expand all Loading... |
156 return true; | 153 return true; |
157 } | 154 } |
158 | 155 |
159 int AudioDecoderIlbc::DecodeInternal(const uint8_t* encoded, | 156 int AudioDecoderIlbc::DecodeInternal(const uint8_t* encoded, |
160 size_t encoded_len, | 157 size_t encoded_len, |
161 int sample_rate_hz, | 158 int sample_rate_hz, |
162 int16_t* decoded, | 159 int16_t* decoded, |
163 SpeechType* speech_type) { | 160 SpeechType* speech_type) { |
164 DCHECK_EQ(sample_rate_hz, 8000); | 161 DCHECK_EQ(sample_rate_hz, 8000); |
165 int16_t temp_type = 1; // Default is speech. | 162 int16_t temp_type = 1; // Default is speech. |
166 int ret = WebRtcIlbcfix_Decode(dec_state_, encoded, | 163 int ret = WebRtcIlbcfix_Decode(dec_state_, encoded, encoded_len, decoded, |
167 static_cast<int16_t>(encoded_len), decoded, | |
168 &temp_type); | 164 &temp_type); |
169 *speech_type = ConvertSpeechType(temp_type); | 165 *speech_type = ConvertSpeechType(temp_type); |
170 return ret; | 166 return ret; |
171 } | 167 } |
172 | 168 |
173 int AudioDecoderIlbc::DecodePlc(int num_frames, int16_t* decoded) { | 169 size_t AudioDecoderIlbc::DecodePlc(size_t num_frames, int16_t* decoded) { |
174 return WebRtcIlbcfix_NetEqPlc(dec_state_, decoded, num_frames); | 170 return WebRtcIlbcfix_NetEqPlc(dec_state_, decoded, num_frames); |
175 } | 171 } |
176 | 172 |
177 int AudioDecoderIlbc::Init() { | 173 int AudioDecoderIlbc::Init() { |
178 return WebRtcIlbcfix_Decoderinit30Ms(dec_state_); | 174 return WebRtcIlbcfix_Decoderinit30Ms(dec_state_); |
179 } | 175 } |
180 | 176 |
181 size_t AudioDecoderIlbc::Channels() const { | 177 size_t AudioDecoderIlbc::Channels() const { |
182 return 1; | 178 return 1; |
183 } | 179 } |
(...skipping 13 matching lines...) Expand all Loading... |
197 return false; | 193 return false; |
198 } | 194 } |
199 | 195 |
200 int AudioDecoderG722::DecodeInternal(const uint8_t* encoded, | 196 int AudioDecoderG722::DecodeInternal(const uint8_t* encoded, |
201 size_t encoded_len, | 197 size_t encoded_len, |
202 int sample_rate_hz, | 198 int sample_rate_hz, |
203 int16_t* decoded, | 199 int16_t* decoded, |
204 SpeechType* speech_type) { | 200 SpeechType* speech_type) { |
205 DCHECK_EQ(sample_rate_hz, 16000); | 201 DCHECK_EQ(sample_rate_hz, 16000); |
206 int16_t temp_type = 1; // Default is speech. | 202 int16_t temp_type = 1; // Default is speech. |
207 int16_t ret = | 203 size_t ret = |
208 WebRtcG722_Decode(dec_state_, encoded, static_cast<int16_t>(encoded_len), | 204 WebRtcG722_Decode(dec_state_, encoded, encoded_len, decoded, &temp_type); |
209 decoded, &temp_type); | |
210 *speech_type = ConvertSpeechType(temp_type); | 205 *speech_type = ConvertSpeechType(temp_type); |
211 return ret; | 206 return static_cast<int>(ret); |
212 } | 207 } |
213 | 208 |
214 int AudioDecoderG722::Init() { | 209 int AudioDecoderG722::Init() { |
215 return WebRtcG722_DecoderInit(dec_state_); | 210 return WebRtcG722_DecoderInit(dec_state_); |
216 } | 211 } |
217 | 212 |
218 int AudioDecoderG722::PacketDuration(const uint8_t* encoded, | 213 int AudioDecoderG722::PacketDuration(const uint8_t* encoded, |
219 size_t encoded_len) const { | 214 size_t encoded_len) const { |
220 // 1/2 encoded byte per sample per channel. | 215 // 1/2 encoded byte per sample per channel. |
221 return static_cast<int>(2 * encoded_len / Channels()); | 216 return static_cast<int>(2 * encoded_len / Channels()); |
(...skipping 17 matching lines...) Expand all Loading... |
239 size_t encoded_len, | 234 size_t encoded_len, |
240 int sample_rate_hz, | 235 int sample_rate_hz, |
241 int16_t* decoded, | 236 int16_t* decoded, |
242 SpeechType* speech_type) { | 237 SpeechType* speech_type) { |
243 DCHECK_EQ(sample_rate_hz, 16000); | 238 DCHECK_EQ(sample_rate_hz, 16000); |
244 int16_t temp_type = 1; // Default is speech. | 239 int16_t temp_type = 1; // Default is speech. |
245 // De-interleave the bit-stream into two separate payloads. | 240 // De-interleave the bit-stream into two separate payloads. |
246 uint8_t* encoded_deinterleaved = new uint8_t[encoded_len]; | 241 uint8_t* encoded_deinterleaved = new uint8_t[encoded_len]; |
247 SplitStereoPacket(encoded, encoded_len, encoded_deinterleaved); | 242 SplitStereoPacket(encoded, encoded_len, encoded_deinterleaved); |
248 // Decode left and right. | 243 // Decode left and right. |
249 int16_t ret = WebRtcG722_Decode(dec_state_left_, encoded_deinterleaved, | 244 size_t decoded_len = WebRtcG722_Decode(dec_state_left_, encoded_deinterleaved, |
250 static_cast<int16_t>(encoded_len / 2), | 245 encoded_len / 2, decoded, &temp_type); |
251 decoded, &temp_type); | 246 size_t ret = WebRtcG722_Decode( |
252 if (ret >= 0) { | 247 dec_state_right_, &encoded_deinterleaved[encoded_len / 2], |
253 int decoded_len = ret; | 248 encoded_len / 2, &decoded[decoded_len], &temp_type); |
254 ret = WebRtcG722_Decode(dec_state_right_, | 249 if (ret == decoded_len) { |
255 &encoded_deinterleaved[encoded_len / 2], | 250 ret += decoded_len; // Return total number of samples. |
256 static_cast<int16_t>(encoded_len / 2), | 251 // Interleave output. |
257 &decoded[decoded_len], &temp_type); | 252 for (size_t k = ret / 2; k < ret; k++) { |
258 if (ret == decoded_len) { | 253 int16_t temp = decoded[k]; |
259 ret += decoded_len; // Return total number of samples. | 254 memmove(&decoded[2 * k - ret + 2], &decoded[2 * k - ret + 1], |
260 // Interleave output. | 255 (ret - k - 1) * sizeof(int16_t)); |
261 for (int k = ret / 2; k < ret; k++) { | 256 decoded[2 * k - ret + 1] = temp; |
262 int16_t temp = decoded[k]; | |
263 memmove(&decoded[2 * k - ret + 2], &decoded[2 * k - ret + 1], | |
264 (ret - k - 1) * sizeof(int16_t)); | |
265 decoded[2 * k - ret + 1] = temp; | |
266 } | |
267 } | 257 } |
268 } | 258 } |
269 *speech_type = ConvertSpeechType(temp_type); | 259 *speech_type = ConvertSpeechType(temp_type); |
270 delete [] encoded_deinterleaved; | 260 delete [] encoded_deinterleaved; |
271 return ret; | 261 return static_cast<int>(ret); |
272 } | 262 } |
273 | 263 |
274 size_t AudioDecoderG722Stereo::Channels() const { | 264 size_t AudioDecoderG722Stereo::Channels() const { |
275 return 2; | 265 return 2; |
276 } | 266 } |
277 | 267 |
278 int AudioDecoderG722Stereo::Init() { | 268 int AudioDecoderG722Stereo::Init() { |
279 int r = WebRtcG722_DecoderInit(dec_state_left_); | 269 int r = WebRtcG722_DecoderInit(dec_state_left_); |
280 if (r != 0) | 270 if (r != 0) |
281 return r; | 271 return r; |
(...skipping 23 matching lines...) Expand all Loading... |
305 uint8_t right_byte = encoded_deinterleaved[i + 1]; | 295 uint8_t right_byte = encoded_deinterleaved[i + 1]; |
306 memmove(&encoded_deinterleaved[i + 1], &encoded_deinterleaved[i + 2], | 296 memmove(&encoded_deinterleaved[i + 1], &encoded_deinterleaved[i + 2], |
307 encoded_len - i - 2); | 297 encoded_len - i - 2); |
308 encoded_deinterleaved[encoded_len - 1] = right_byte; | 298 encoded_deinterleaved[encoded_len - 1] = right_byte; |
309 } | 299 } |
310 } | 300 } |
311 #endif | 301 #endif |
312 | 302 |
313 // Opus | 303 // Opus |
314 #ifdef WEBRTC_CODEC_OPUS | 304 #ifdef WEBRTC_CODEC_OPUS |
315 AudioDecoderOpus::AudioDecoderOpus(int num_channels) : channels_(num_channels) { | 305 AudioDecoderOpus::AudioDecoderOpus(size_t num_channels) |
| 306 : channels_(num_channels) { |
316 DCHECK(num_channels == 1 || num_channels == 2); | 307 DCHECK(num_channels == 1 || num_channels == 2); |
317 WebRtcOpus_DecoderCreate(&dec_state_, static_cast<int>(channels_)); | 308 WebRtcOpus_DecoderCreate(&dec_state_, static_cast<int>(channels_)); |
318 } | 309 } |
319 | 310 |
320 AudioDecoderOpus::~AudioDecoderOpus() { | 311 AudioDecoderOpus::~AudioDecoderOpus() { |
321 WebRtcOpus_DecoderFree(dec_state_); | 312 WebRtcOpus_DecoderFree(dec_state_); |
322 } | 313 } |
323 | 314 |
324 int AudioDecoderOpus::DecodeInternal(const uint8_t* encoded, | 315 int AudioDecoderOpus::DecodeInternal(const uint8_t* encoded, |
325 size_t encoded_len, | 316 size_t encoded_len, |
326 int sample_rate_hz, | 317 int sample_rate_hz, |
327 int16_t* decoded, | 318 int16_t* decoded, |
328 SpeechType* speech_type) { | 319 SpeechType* speech_type) { |
329 DCHECK_EQ(sample_rate_hz, 48000); | 320 DCHECK_EQ(sample_rate_hz, 48000); |
330 int16_t temp_type = 1; // Default is speech. | 321 int16_t temp_type = 1; // Default is speech. |
331 int ret = WebRtcOpus_Decode(dec_state_, encoded, | 322 int ret = WebRtcOpus_Decode(dec_state_, encoded, encoded_len, decoded, |
332 static_cast<int16_t>(encoded_len), decoded, | |
333 &temp_type); | 323 &temp_type); |
334 if (ret > 0) | 324 if (ret > 0) |
335 ret *= static_cast<int>(channels_); // Return total number of samples. | 325 ret *= static_cast<int>(channels_); // Return total number of samples. |
336 *speech_type = ConvertSpeechType(temp_type); | 326 *speech_type = ConvertSpeechType(temp_type); |
337 return ret; | 327 return ret; |
338 } | 328 } |
339 | 329 |
340 int AudioDecoderOpus::DecodeRedundantInternal(const uint8_t* encoded, | 330 int AudioDecoderOpus::DecodeRedundantInternal(const uint8_t* encoded, |
341 size_t encoded_len, | 331 size_t encoded_len, |
342 int sample_rate_hz, | 332 int sample_rate_hz, |
343 int16_t* decoded, | 333 int16_t* decoded, |
344 SpeechType* speech_type) { | 334 SpeechType* speech_type) { |
345 if (!PacketHasFec(encoded, encoded_len)) { | 335 if (!PacketHasFec(encoded, encoded_len)) { |
346 // This packet is a RED packet. | 336 // This packet is a RED packet. |
347 return DecodeInternal(encoded, encoded_len, sample_rate_hz, decoded, | 337 return DecodeInternal(encoded, encoded_len, sample_rate_hz, decoded, |
348 speech_type); | 338 speech_type); |
349 } | 339 } |
350 | 340 |
351 DCHECK_EQ(sample_rate_hz, 48000); | 341 DCHECK_EQ(sample_rate_hz, 48000); |
352 int16_t temp_type = 1; // Default is speech. | 342 int16_t temp_type = 1; // Default is speech. |
353 int ret = WebRtcOpus_DecodeFec(dec_state_, encoded, | 343 int ret = WebRtcOpus_DecodeFec(dec_state_, encoded, encoded_len, decoded, |
354 static_cast<int16_t>(encoded_len), decoded, | |
355 &temp_type); | 344 &temp_type); |
356 if (ret > 0) | 345 if (ret > 0) |
357 ret *= static_cast<int>(channels_); // Return total number of samples. | 346 ret *= static_cast<int>(channels_); // Return total number of samples. |
358 *speech_type = ConvertSpeechType(temp_type); | 347 *speech_type = ConvertSpeechType(temp_type); |
359 return ret; | 348 return ret; |
360 } | 349 } |
361 | 350 |
362 int AudioDecoderOpus::Init() { | 351 int AudioDecoderOpus::Init() { |
363 return WebRtcOpus_DecoderInit(dec_state_); | 352 return WebRtcOpus_DecoderInit(dec_state_); |
364 } | 353 } |
365 | 354 |
366 int AudioDecoderOpus::PacketDuration(const uint8_t* encoded, | 355 int AudioDecoderOpus::PacketDuration(const uint8_t* encoded, |
367 size_t encoded_len) const { | 356 size_t encoded_len) const { |
368 return WebRtcOpus_DurationEst(dec_state_, | 357 return WebRtcOpus_DurationEst(dec_state_, encoded, encoded_len); |
369 encoded, static_cast<int>(encoded_len)); | |
370 } | 358 } |
371 | 359 |
372 int AudioDecoderOpus::PacketDurationRedundant(const uint8_t* encoded, | 360 int AudioDecoderOpus::PacketDurationRedundant(const uint8_t* encoded, |
373 size_t encoded_len) const { | 361 size_t encoded_len) const { |
374 if (!PacketHasFec(encoded, encoded_len)) { | 362 if (!PacketHasFec(encoded, encoded_len)) { |
375 // This packet is a RED packet. | 363 // This packet is a RED packet. |
376 return PacketDuration(encoded, encoded_len); | 364 return PacketDuration(encoded, encoded_len); |
377 } | 365 } |
378 | 366 |
379 return WebRtcOpus_FecDurationEst(encoded, static_cast<int>(encoded_len)); | 367 return WebRtcOpus_FecDurationEst(encoded, encoded_len); |
380 } | 368 } |
381 | 369 |
382 bool AudioDecoderOpus::PacketHasFec(const uint8_t* encoded, | 370 bool AudioDecoderOpus::PacketHasFec(const uint8_t* encoded, |
383 size_t encoded_len) const { | 371 size_t encoded_len) const { |
384 int fec; | 372 int fec; |
385 fec = WebRtcOpus_PacketHasFec(encoded, static_cast<int>(encoded_len)); | 373 fec = WebRtcOpus_PacketHasFec(encoded, encoded_len); |
386 return (fec == 1); | 374 return (fec == 1); |
387 } | 375 } |
388 | 376 |
389 size_t AudioDecoderOpus::Channels() const { | 377 size_t AudioDecoderOpus::Channels() const { |
390 return channels_; | 378 return channels_; |
391 } | 379 } |
392 #endif | 380 #endif |
393 | 381 |
394 AudioDecoderCng::AudioDecoderCng() { | 382 AudioDecoderCng::AudioDecoderCng() { |
395 CHECK_EQ(0, WebRtcCng_CreateDec(&dec_state_)); | 383 CHECK_EQ(0, WebRtcCng_CreateDec(&dec_state_)); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 case kDecoderRED: | 589 case kDecoderRED: |
602 case kDecoderAVT: | 590 case kDecoderAVT: |
603 case kDecoderArbitrary: | 591 case kDecoderArbitrary: |
604 default: { | 592 default: { |
605 return NULL; | 593 return NULL; |
606 } | 594 } |
607 } | 595 } |
608 } | 596 } |
609 | 597 |
610 } // namespace webrtc | 598 } // namespace webrtc |
OLD | NEW |