Chromium Code Reviews| 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 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 150 if (InitializeReceiverSafe() < 0) { | 150 if (InitializeReceiverSafe() < 0) { |
| 151 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_, | 151 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_, |
| 152 "Cannot initialize receiver"); | 152 "Cannot initialize receiver"); |
| 153 } | 153 } |
| 154 WEBRTC_TRACE(webrtc::kTraceMemory, webrtc::kTraceAudioCoding, id_, "Created"); | 154 WEBRTC_TRACE(webrtc::kTraceMemory, webrtc::kTraceAudioCoding, id_, "Created"); |
| 155 } | 155 } |
| 156 | 156 |
| 157 AudioCodingModuleImpl::~AudioCodingModuleImpl() = default; | 157 AudioCodingModuleImpl::~AudioCodingModuleImpl() = default; |
| 158 | 158 |
| 159 int32_t AudioCodingModuleImpl::Encode(const InputData& input_data) { | 159 int32_t AudioCodingModuleImpl::Encode(const InputData& input_data) { |
| 160 uint8_t stream[2 * MAX_PAYLOAD_SIZE_BYTE]; // Make room for 1 RED payload. | |
| 161 AudioEncoder::EncodedInfo encoded_info; | 160 AudioEncoder::EncodedInfo encoded_info; |
| 162 uint8_t previous_pltype; | 161 uint8_t previous_pltype; |
| 163 | 162 |
| 164 // Check if there is an encoder before. | 163 // Check if there is an encoder before. |
| 165 if (!HaveValidEncoder("Process")) | 164 if (!HaveValidEncoder("Process")) |
| 166 return -1; | 165 return -1; |
| 167 | 166 |
| 168 AudioEncoder* audio_encoder = codec_manager_.CurrentEncoder(); | 167 AudioEncoder* audio_encoder = codec_manager_.CurrentEncoder(); |
| 169 // Scale the timestamp to the codec's RTP timestamp rate. | 168 // Scale the timestamp to the codec's RTP timestamp rate. |
| 170 uint32_t rtp_timestamp = | 169 uint32_t rtp_timestamp = |
| 171 first_frame_ ? input_data.input_timestamp | 170 first_frame_ ? input_data.input_timestamp |
| 172 : last_rtp_timestamp_ + | 171 : last_rtp_timestamp_ + |
| 173 rtc::CheckedDivExact( | 172 rtc::CheckedDivExact( |
| 174 input_data.input_timestamp - last_timestamp_, | 173 input_data.input_timestamp - last_timestamp_, |
| 175 static_cast<uint32_t>(rtc::CheckedDivExact( | 174 static_cast<uint32_t>(rtc::CheckedDivExact( |
| 176 audio_encoder->SampleRateHz(), | 175 audio_encoder->SampleRateHz(), |
| 177 audio_encoder->RtpTimestampRateHz()))); | 176 audio_encoder->RtpTimestampRateHz()))); |
| 178 last_timestamp_ = input_data.input_timestamp; | 177 last_timestamp_ = input_data.input_timestamp; |
| 179 last_rtp_timestamp_ = rtp_timestamp; | 178 last_rtp_timestamp_ = rtp_timestamp; |
| 180 first_frame_ = false; | 179 first_frame_ = false; |
| 181 | 180 |
| 182 encoded_info = audio_encoder->Encode(rtp_timestamp, input_data.audio, | 181 encode_buffer_.SetSize(audio_encoder->MaxEncodedBytes()); |
| 183 input_data.length_per_channel, | 182 encoded_info = audio_encoder->Encode( |
| 184 sizeof(stream), stream); | 183 rtp_timestamp, input_data.audio, input_data.length_per_channel, |
| 184 encode_buffer_.size(), encode_buffer_.data()); | |
| 185 encode_buffer_.SetSize(encoded_info.encoded_bytes); | |
| 185 bitrate_logger_.MaybeLog(audio_encoder->GetTargetBitrate() / 1000); | 186 bitrate_logger_.MaybeLog(audio_encoder->GetTargetBitrate() / 1000); |
| 186 if (encoded_info.encoded_bytes == 0 && !encoded_info.send_even_if_empty) { | 187 if (encode_buffer_.size() == 0 && !encoded_info.send_even_if_empty) { |
|
hlundin-webrtc
2015/08/25 12:43:43
Why change this while still using encoded_info.enc
kwiberg-webrtc
2015/08/25 13:20:24
Indeed, that was dismeticulous of me. Fixed (by us
hlundin-webrtc
2015/08/26 13:10:17
Meticulosity is restored.
| |
| 187 // Not enough data. | 188 // Not enough data. |
| 188 return 0; | 189 return 0; |
| 189 } | 190 } |
| 190 previous_pltype = previous_pltype_; // Read it while we have the critsect. | 191 previous_pltype = previous_pltype_; // Read it while we have the critsect. |
| 191 | 192 |
| 192 RTPFragmentationHeader my_fragmentation; | 193 RTPFragmentationHeader my_fragmentation; |
| 193 ConvertEncodedInfoToFragmentationHeader(encoded_info, &my_fragmentation); | 194 ConvertEncodedInfoToFragmentationHeader(encoded_info, &my_fragmentation); |
| 194 FrameType frame_type; | 195 FrameType frame_type; |
| 195 if (encoded_info.encoded_bytes == 0 && encoded_info.send_even_if_empty) { | 196 if (encoded_info.encoded_bytes == 0 && encoded_info.send_even_if_empty) { |
| 196 frame_type = kFrameEmpty; | 197 frame_type = kFrameEmpty; |
| 197 encoded_info.payload_type = previous_pltype; | 198 encoded_info.payload_type = previous_pltype; |
| 198 } else { | 199 } else { |
| 199 DCHECK_GT(encoded_info.encoded_bytes, 0u); | 200 DCHECK_GT(encoded_info.encoded_bytes, 0u); |
| 200 frame_type = encoded_info.speech ? kAudioFrameSpeech : kAudioFrameCN; | 201 frame_type = encoded_info.speech ? kAudioFrameSpeech : kAudioFrameCN; |
| 201 } | 202 } |
| 202 | 203 |
| 203 { | 204 { |
| 204 CriticalSectionScoped lock(callback_crit_sect_.get()); | 205 CriticalSectionScoped lock(callback_crit_sect_.get()); |
| 205 if (packetization_callback_) { | 206 if (packetization_callback_) { |
| 206 packetization_callback_->SendData( | 207 packetization_callback_->SendData( |
| 207 frame_type, encoded_info.payload_type, encoded_info.encoded_timestamp, | 208 frame_type, encoded_info.payload_type, encoded_info.encoded_timestamp, |
| 208 stream, encoded_info.encoded_bytes, | 209 encode_buffer_.data(), encode_buffer_.size(), |
| 209 my_fragmentation.fragmentationVectorSize > 0 ? &my_fragmentation | 210 my_fragmentation.fragmentationVectorSize > 0 ? &my_fragmentation |
| 210 : nullptr); | 211 : nullptr); |
| 211 } | 212 } |
| 212 | 213 |
| 213 if (vad_callback_) { | 214 if (vad_callback_) { |
| 214 // Callback with VAD decision. | 215 // Callback with VAD decision. |
| 215 vad_callback_->InFrameType(frame_type); | 216 vad_callback_->InFrameType(frame_type); |
| 216 } | 217 } |
| 217 } | 218 } |
| 218 previous_pltype_ = encoded_info.payload_type; | 219 previous_pltype_ = encoded_info.payload_type; |
| (...skipping 930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1149 *channels = 1; | 1150 *channels = 1; |
| 1150 break; | 1151 break; |
| 1151 #endif | 1152 #endif |
| 1152 default: | 1153 default: |
| 1153 FATAL() << "Codec type " << codec_type << " not supported."; | 1154 FATAL() << "Codec type " << codec_type << " not supported."; |
| 1154 } | 1155 } |
| 1155 return true; | 1156 return true; |
| 1156 } | 1157 } |
| 1157 | 1158 |
| 1158 } // namespace webrtc | 1159 } // namespace webrtc |
| OLD | NEW |