OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 } | 62 } |
63 | 63 |
64 int AudioDecoderG722Impl::SampleRateHz() const { | 64 int AudioDecoderG722Impl::SampleRateHz() const { |
65 return 16000; | 65 return 16000; |
66 } | 66 } |
67 | 67 |
68 size_t AudioDecoderG722Impl::Channels() const { | 68 size_t AudioDecoderG722Impl::Channels() const { |
69 return 1; | 69 return 1; |
70 } | 70 } |
71 | 71 |
72 AudioDecoderG722Stereo::AudioDecoderG722Stereo() { | 72 AudioDecoderG722StereoImpl::AudioDecoderG722StereoImpl() { |
73 WebRtcG722_CreateDecoder(&dec_state_left_); | 73 WebRtcG722_CreateDecoder(&dec_state_left_); |
74 WebRtcG722_CreateDecoder(&dec_state_right_); | 74 WebRtcG722_CreateDecoder(&dec_state_right_); |
75 WebRtcG722_DecoderInit(dec_state_left_); | 75 WebRtcG722_DecoderInit(dec_state_left_); |
76 WebRtcG722_DecoderInit(dec_state_right_); | 76 WebRtcG722_DecoderInit(dec_state_right_); |
77 } | 77 } |
78 | 78 |
79 AudioDecoderG722Stereo::~AudioDecoderG722Stereo() { | 79 AudioDecoderG722StereoImpl::~AudioDecoderG722StereoImpl() { |
80 WebRtcG722_FreeDecoder(dec_state_left_); | 80 WebRtcG722_FreeDecoder(dec_state_left_); |
81 WebRtcG722_FreeDecoder(dec_state_right_); | 81 WebRtcG722_FreeDecoder(dec_state_right_); |
82 } | 82 } |
83 | 83 |
84 int AudioDecoderG722Stereo::DecodeInternal(const uint8_t* encoded, | 84 int AudioDecoderG722StereoImpl::DecodeInternal(const uint8_t* encoded, |
85 size_t encoded_len, | 85 size_t encoded_len, |
86 int sample_rate_hz, | 86 int sample_rate_hz, |
87 int16_t* decoded, | 87 int16_t* decoded, |
88 SpeechType* speech_type) { | 88 SpeechType* speech_type) { |
89 RTC_DCHECK_EQ(SampleRateHz(), sample_rate_hz); | 89 RTC_DCHECK_EQ(SampleRateHz(), sample_rate_hz); |
90 int16_t temp_type = 1; // Default is speech. | 90 int16_t temp_type = 1; // Default is speech. |
91 // De-interleave the bit-stream into two separate payloads. | 91 // De-interleave the bit-stream into two separate payloads. |
92 uint8_t* encoded_deinterleaved = new uint8_t[encoded_len]; | 92 uint8_t* encoded_deinterleaved = new uint8_t[encoded_len]; |
93 SplitStereoPacket(encoded, encoded_len, encoded_deinterleaved); | 93 SplitStereoPacket(encoded, encoded_len, encoded_deinterleaved); |
94 // Decode left and right. | 94 // Decode left and right. |
95 size_t decoded_len = WebRtcG722_Decode(dec_state_left_, encoded_deinterleaved, | 95 size_t decoded_len = WebRtcG722_Decode(dec_state_left_, encoded_deinterleaved, |
96 encoded_len / 2, decoded, &temp_type); | 96 encoded_len / 2, decoded, &temp_type); |
97 size_t ret = WebRtcG722_Decode( | 97 size_t ret = WebRtcG722_Decode( |
98 dec_state_right_, &encoded_deinterleaved[encoded_len / 2], | 98 dec_state_right_, &encoded_deinterleaved[encoded_len / 2], |
99 encoded_len / 2, &decoded[decoded_len], &temp_type); | 99 encoded_len / 2, &decoded[decoded_len], &temp_type); |
100 if (ret == decoded_len) { | 100 if (ret == decoded_len) { |
101 ret += decoded_len; // Return total number of samples. | 101 ret += decoded_len; // Return total number of samples. |
102 // Interleave output. | 102 // Interleave output. |
103 for (size_t k = ret / 2; k < ret; k++) { | 103 for (size_t k = ret / 2; k < ret; k++) { |
104 int16_t temp = decoded[k]; | 104 int16_t temp = decoded[k]; |
105 memmove(&decoded[2 * k - ret + 2], &decoded[2 * k - ret + 1], | 105 memmove(&decoded[2 * k - ret + 2], &decoded[2 * k - ret + 1], |
106 (ret - k - 1) * sizeof(int16_t)); | 106 (ret - k - 1) * sizeof(int16_t)); |
107 decoded[2 * k - ret + 1] = temp; | 107 decoded[2 * k - ret + 1] = temp; |
108 } | 108 } |
109 } | 109 } |
110 *speech_type = ConvertSpeechType(temp_type); | 110 *speech_type = ConvertSpeechType(temp_type); |
111 delete[] encoded_deinterleaved; | 111 delete[] encoded_deinterleaved; |
112 return static_cast<int>(ret); | 112 return static_cast<int>(ret); |
113 } | 113 } |
114 | 114 |
115 int AudioDecoderG722Stereo::SampleRateHz() const { | 115 int AudioDecoderG722StereoImpl::SampleRateHz() const { |
116 return 16000; | 116 return 16000; |
117 } | 117 } |
118 | 118 |
119 size_t AudioDecoderG722Stereo::Channels() const { | 119 size_t AudioDecoderG722StereoImpl::Channels() const { |
120 return 2; | 120 return 2; |
121 } | 121 } |
122 | 122 |
123 void AudioDecoderG722Stereo::Reset() { | 123 void AudioDecoderG722StereoImpl::Reset() { |
124 WebRtcG722_DecoderInit(dec_state_left_); | 124 WebRtcG722_DecoderInit(dec_state_left_); |
125 WebRtcG722_DecoderInit(dec_state_right_); | 125 WebRtcG722_DecoderInit(dec_state_right_); |
126 } | 126 } |
127 | 127 |
128 std::vector<AudioDecoder::ParseResult> AudioDecoderG722Stereo::ParsePayload( | 128 std::vector<AudioDecoder::ParseResult> AudioDecoderG722StereoImpl::ParsePayload( |
129 rtc::Buffer&& payload, | 129 rtc::Buffer&& payload, |
130 uint32_t timestamp) { | 130 uint32_t timestamp) { |
131 return LegacyEncodedAudioFrame::SplitBySamples(this, std::move(payload), | 131 return LegacyEncodedAudioFrame::SplitBySamples(this, std::move(payload), |
132 timestamp, 2 * 8, 16); | 132 timestamp, 2 * 8, 16); |
133 } | 133 } |
134 | 134 |
135 // Split the stereo packet and place left and right channel after each other | 135 // Split the stereo packet and place left and right channel after each other |
136 // in the output array. | 136 // in the output array. |
137 void AudioDecoderG722Stereo::SplitStereoPacket(const uint8_t* encoded, | 137 void AudioDecoderG722StereoImpl::SplitStereoPacket( |
138 size_t encoded_len, | 138 const uint8_t* encoded, |
139 uint8_t* encoded_deinterleaved) { | 139 size_t encoded_len, |
| 140 uint8_t* encoded_deinterleaved) { |
140 // Regroup the 4 bits/sample so |l1 l2| |r1 r2| |l3 l4| |r3 r4| ..., | 141 // Regroup the 4 bits/sample so |l1 l2| |r1 r2| |l3 l4| |r3 r4| ..., |
141 // where "lx" is 4 bits representing left sample number x, and "rx" right | 142 // where "lx" is 4 bits representing left sample number x, and "rx" right |
142 // sample. Two samples fit in one byte, represented with |...|. | 143 // sample. Two samples fit in one byte, represented with |...|. |
143 for (size_t i = 0; i + 1 < encoded_len; i += 2) { | 144 for (size_t i = 0; i + 1 < encoded_len; i += 2) { |
144 uint8_t right_byte = ((encoded[i] & 0x0F) << 4) + (encoded[i + 1] & 0x0F); | 145 uint8_t right_byte = ((encoded[i] & 0x0F) << 4) + (encoded[i + 1] & 0x0F); |
145 encoded_deinterleaved[i] = (encoded[i] & 0xF0) + (encoded[i + 1] >> 4); | 146 encoded_deinterleaved[i] = (encoded[i] & 0xF0) + (encoded[i + 1] >> 4); |
146 encoded_deinterleaved[i + 1] = right_byte; | 147 encoded_deinterleaved[i + 1] = right_byte; |
147 } | 148 } |
148 | 149 |
149 // Move one byte representing right channel each loop, and place it at the | 150 // Move one byte representing right channel each loop, and place it at the |
150 // end of the bytestream vector. After looping the data is reordered to: | 151 // end of the bytestream vector. After looping the data is reordered to: |
151 // |l1 l2| |l3 l4| ... |l(N-1) lN| |r1 r2| |r3 r4| ... |r(N-1) r(N)|, | 152 // |l1 l2| |l3 l4| ... |l(N-1) lN| |r1 r2| |r3 r4| ... |r(N-1) r(N)|, |
152 // where N is the total number of samples. | 153 // where N is the total number of samples. |
153 for (size_t i = 0; i < encoded_len / 2; i++) { | 154 for (size_t i = 0; i < encoded_len / 2; i++) { |
154 uint8_t right_byte = encoded_deinterleaved[i + 1]; | 155 uint8_t right_byte = encoded_deinterleaved[i + 1]; |
155 memmove(&encoded_deinterleaved[i + 1], &encoded_deinterleaved[i + 2], | 156 memmove(&encoded_deinterleaved[i + 1], &encoded_deinterleaved[i + 2], |
156 encoded_len - i - 2); | 157 encoded_len - i - 2); |
157 encoded_deinterleaved[encoded_len - 1] = right_byte; | 158 encoded_deinterleaved[encoded_len - 1] = right_byte; |
158 } | 159 } |
159 } | 160 } |
160 | 161 |
161 } // namespace webrtc | 162 } // namespace webrtc |
OLD | NEW |