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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 int error = | 141 int error = |
142 InsertPacketInternal(rtp_header, kSyncPayload, receive_timestamp, true); | 142 InsertPacketInternal(rtp_header, kSyncPayload, receive_timestamp, true); |
143 | 143 |
144 if (error != 0) { | 144 if (error != 0) { |
145 error_code_ = error; | 145 error_code_ = error; |
146 return kFail; | 146 return kFail; |
147 } | 147 } |
148 return kOK; | 148 return kOK; |
149 } | 149 } |
150 | 150 |
151 int NetEqImpl::GetAudio(size_t max_length, int16_t* output_audio, | 151 int NetEqImpl::GetAudio(AudioFrame* audio_frame, NetEqOutputType* type) { |
152 size_t* samples_per_channel, size_t* num_channels, | |
153 NetEqOutputType* type) { | |
154 TRACE_EVENT0("webrtc", "NetEqImpl::GetAudio"); | 152 TRACE_EVENT0("webrtc", "NetEqImpl::GetAudio"); |
155 rtc::CritScope lock(&crit_sect_); | 153 rtc::CritScope lock(&crit_sect_); |
156 int error = GetAudioInternal(max_length, output_audio, samples_per_channel, | 154 int error = GetAudioInternal(audio_frame); |
157 num_channels); | 155 RTC_DCHECK_EQ( |
| 156 audio_frame->sample_rate_hz_, |
| 157 rtc::checked_cast<int>(audio_frame->samples_per_channel_ * 100)); |
158 if (error != 0) { | 158 if (error != 0) { |
159 error_code_ = error; | 159 error_code_ = error; |
160 return kFail; | 160 return kFail; |
161 } | 161 } |
162 if (type) { | 162 if (type) { |
163 *type = LastOutputType(); | 163 *type = LastOutputType(); |
164 } | 164 } |
165 last_output_sample_rate_hz_ = | 165 last_output_sample_rate_hz_ = audio_frame->sample_rate_hz_; |
166 rtc::checked_cast<int>(*samples_per_channel * 100); | |
167 RTC_DCHECK(last_output_sample_rate_hz_ == 8000 || | 166 RTC_DCHECK(last_output_sample_rate_hz_ == 8000 || |
168 last_output_sample_rate_hz_ == 16000 || | 167 last_output_sample_rate_hz_ == 16000 || |
169 last_output_sample_rate_hz_ == 32000 || | 168 last_output_sample_rate_hz_ == 32000 || |
170 last_output_sample_rate_hz_ == 48000) | 169 last_output_sample_rate_hz_ == 48000) |
171 << "Unexpected sample rate " << last_output_sample_rate_hz_; | 170 << "Unexpected sample rate " << last_output_sample_rate_hz_; |
172 return kOK; | 171 return kOK; |
173 } | 172 } |
174 | 173 |
175 int NetEqImpl::RegisterPayloadType(NetEqDecoder codec, | 174 int NetEqImpl::RegisterPayloadType(NetEqDecoder codec, |
176 const std::string& name, | 175 const std::string& name, |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 } else if (delay_manager_->last_pack_cng_or_dtmf() == -1) { | 731 } else if (delay_manager_->last_pack_cng_or_dtmf() == -1) { |
733 // This is first "normal" packet after CNG or DTMF. | 732 // This is first "normal" packet after CNG or DTMF. |
734 // Reset packet time counter and measure time until next packet, | 733 // Reset packet time counter and measure time until next packet, |
735 // but don't update statistics. | 734 // but don't update statistics. |
736 delay_manager_->set_last_pack_cng_or_dtmf(0); | 735 delay_manager_->set_last_pack_cng_or_dtmf(0); |
737 delay_manager_->ResetPacketIatCount(); | 736 delay_manager_->ResetPacketIatCount(); |
738 } | 737 } |
739 return 0; | 738 return 0; |
740 } | 739 } |
741 | 740 |
742 int NetEqImpl::GetAudioInternal(size_t max_length, | 741 int NetEqImpl::GetAudioInternal(AudioFrame* audio_frame) { |
743 int16_t* output, | |
744 size_t* samples_per_channel, | |
745 size_t* num_channels) { | |
746 PacketList packet_list; | 742 PacketList packet_list; |
747 DtmfEvent dtmf_event; | 743 DtmfEvent dtmf_event; |
748 Operations operation; | 744 Operations operation; |
749 bool play_dtmf; | 745 bool play_dtmf; |
750 int return_value = GetDecision(&operation, &packet_list, &dtmf_event, | 746 int return_value = GetDecision(&operation, &packet_list, &dtmf_event, |
751 &play_dtmf); | 747 &play_dtmf); |
752 if (return_value != 0) { | 748 if (return_value != 0) { |
753 last_mode_ = kModeError; | 749 last_mode_ = kModeError; |
754 return return_value; | 750 return return_value; |
755 } | 751 } |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
850 if (last_mode_ != kModeRfc3389Cng) { | 846 if (last_mode_ != kModeRfc3389Cng) { |
851 comfort_noise_->Reset(); | 847 comfort_noise_->Reset(); |
852 } | 848 } |
853 | 849 |
854 // Copy from |algorithm_buffer| to |sync_buffer_|. | 850 // Copy from |algorithm_buffer| to |sync_buffer_|. |
855 sync_buffer_->PushBack(*algorithm_buffer_); | 851 sync_buffer_->PushBack(*algorithm_buffer_); |
856 | 852 |
857 // Extract data from |sync_buffer_| to |output|. | 853 // Extract data from |sync_buffer_| to |output|. |
858 size_t num_output_samples_per_channel = output_size_samples_; | 854 size_t num_output_samples_per_channel = output_size_samples_; |
859 size_t num_output_samples = output_size_samples_ * sync_buffer_->Channels(); | 855 size_t num_output_samples = output_size_samples_ * sync_buffer_->Channels(); |
860 if (num_output_samples > max_length) { | 856 if (num_output_samples > AudioFrame::kMaxDataSizeSamples) { |
861 LOG(LS_WARNING) << "Output array is too short. " << max_length << " < " << | 857 LOG(LS_WARNING) << "Output array is too short. " |
862 output_size_samples_ << " * " << sync_buffer_->Channels(); | 858 << AudioFrame::kMaxDataSizeSamples << " < " |
863 num_output_samples = max_length; | 859 << output_size_samples_ << " * " |
864 num_output_samples_per_channel = max_length / sync_buffer_->Channels(); | 860 << sync_buffer_->Channels(); |
| 861 num_output_samples = AudioFrame::kMaxDataSizeSamples; |
| 862 num_output_samples_per_channel = |
| 863 AudioFrame::kMaxDataSizeSamples / sync_buffer_->Channels(); |
865 } | 864 } |
866 const size_t samples_from_sync = | 865 sync_buffer_->GetNextAudioInterleaved(num_output_samples_per_channel, |
867 sync_buffer_->GetNextAudioInterleaved(num_output_samples_per_channel, | 866 audio_frame); |
868 output); | 867 audio_frame->sample_rate_hz_ = fs_hz_; |
869 *num_channels = sync_buffer_->Channels(); | |
870 if (sync_buffer_->FutureLength() < expand_->overlap_length()) { | 868 if (sync_buffer_->FutureLength() < expand_->overlap_length()) { |
871 // The sync buffer should always contain |overlap_length| samples, but now | 869 // The sync buffer should always contain |overlap_length| samples, but now |
872 // too many samples have been extracted. Reinstall the |overlap_length| | 870 // too many samples have been extracted. Reinstall the |overlap_length| |
873 // lookahead by moving the index. | 871 // lookahead by moving the index. |
874 const size_t missing_lookahead_samples = | 872 const size_t missing_lookahead_samples = |
875 expand_->overlap_length() - sync_buffer_->FutureLength(); | 873 expand_->overlap_length() - sync_buffer_->FutureLength(); |
876 RTC_DCHECK_GE(sync_buffer_->next_index(), missing_lookahead_samples); | 874 RTC_DCHECK_GE(sync_buffer_->next_index(), missing_lookahead_samples); |
877 sync_buffer_->set_next_index(sync_buffer_->next_index() - | 875 sync_buffer_->set_next_index(sync_buffer_->next_index() - |
878 missing_lookahead_samples); | 876 missing_lookahead_samples); |
879 } | 877 } |
880 if (samples_from_sync != output_size_samples_) { | 878 if (audio_frame->samples_per_channel_ != output_size_samples_) { |
881 LOG(LS_ERROR) << "samples_from_sync (" << samples_from_sync | 879 LOG(LS_ERROR) << "audio_frame->samples_per_channel_ (" |
| 880 << audio_frame->samples_per_channel_ |
882 << ") != output_size_samples_ (" << output_size_samples_ | 881 << ") != output_size_samples_ (" << output_size_samples_ |
883 << ")"; | 882 << ")"; |
884 // TODO(minyue): treatment of under-run, filling zeros | 883 // TODO(minyue): treatment of under-run, filling zeros |
885 memset(output, 0, num_output_samples * sizeof(int16_t)); | 884 memset(audio_frame->data_, 0, num_output_samples * sizeof(int16_t)); |
886 *samples_per_channel = output_size_samples_; | |
887 return kSampleUnderrun; | 885 return kSampleUnderrun; |
888 } | 886 } |
889 *samples_per_channel = output_size_samples_; | |
890 | 887 |
891 // Should always have overlap samples left in the |sync_buffer_|. | 888 // Should always have overlap samples left in the |sync_buffer_|. |
892 RTC_DCHECK_GE(sync_buffer_->FutureLength(), expand_->overlap_length()); | 889 RTC_DCHECK_GE(sync_buffer_->FutureLength(), expand_->overlap_length()); |
893 | 890 |
894 if (play_dtmf) { | 891 if (play_dtmf) { |
895 return_value = DtmfOverdub(dtmf_event, sync_buffer_->Channels(), output); | 892 return_value = |
| 893 DtmfOverdub(dtmf_event, sync_buffer_->Channels(), audio_frame->data_); |
896 } | 894 } |
897 | 895 |
898 // Update the background noise parameters if last operation wrote data | 896 // Update the background noise parameters if last operation wrote data |
899 // straight from the decoder to the |sync_buffer_|. That is, none of the | 897 // straight from the decoder to the |sync_buffer_|. That is, none of the |
900 // operations that modify the signal can be followed by a parameter update. | 898 // operations that modify the signal can be followed by a parameter update. |
901 if ((last_mode_ == kModeNormal) || | 899 if ((last_mode_ == kModeNormal) || |
902 (last_mode_ == kModeAccelerateFail) || | 900 (last_mode_ == kModeAccelerateFail) || |
903 (last_mode_ == kModePreemptiveExpandFail) || | 901 (last_mode_ == kModePreemptiveExpandFail) || |
904 (last_mode_ == kModeRfc3389Cng) || | 902 (last_mode_ == kModeRfc3389Cng) || |
905 (last_mode_ == kModeCodecInternalCng)) { | 903 (last_mode_ == kModeCodecInternalCng)) { |
(...skipping 1137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2043 | 2041 |
2044 void NetEqImpl::CreateDecisionLogic() { | 2042 void NetEqImpl::CreateDecisionLogic() { |
2045 decision_logic_.reset(DecisionLogic::Create(fs_hz_, output_size_samples_, | 2043 decision_logic_.reset(DecisionLogic::Create(fs_hz_, output_size_samples_, |
2046 playout_mode_, | 2044 playout_mode_, |
2047 decoder_database_.get(), | 2045 decoder_database_.get(), |
2048 *packet_buffer_.get(), | 2046 *packet_buffer_.get(), |
2049 delay_manager_.get(), | 2047 delay_manager_.get(), |
2050 buffer_level_filter_.get())); | 2048 buffer_level_filter_.get())); |
2051 } | 2049 } |
2052 } // namespace webrtc | 2050 } // namespace webrtc |
OLD | NEW |