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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
101 reset_decoder_(false), | 101 reset_decoder_(false), |
102 current_rtp_payload_type_(0xFF), // Invalid RTP payload type. | 102 current_rtp_payload_type_(0xFF), // Invalid RTP payload type. |
103 current_cng_rtp_payload_type_(0xFF), // Invalid RTP payload type. | 103 current_cng_rtp_payload_type_(0xFF), // Invalid RTP payload type. |
104 ssrc_(0), | 104 ssrc_(0), |
105 first_packet_(true), | 105 first_packet_(true), |
106 error_code_(0), | 106 error_code_(0), |
107 decoder_error_code_(0), | 107 decoder_error_code_(0), |
108 background_noise_mode_(config.background_noise_mode), | 108 background_noise_mode_(config.background_noise_mode), |
109 playout_mode_(config.playout_mode), | 109 playout_mode_(config.playout_mode), |
110 enable_fast_accelerate_(config.enable_fast_accelerate), | 110 enable_fast_accelerate_(config.enable_fast_accelerate), |
111 nack_enabled_(false) { | 111 nack_enabled_(false), |
112 enable_muted_state_(config.enable_muted_state) { | |
112 LOG(LS_INFO) << "NetEq config: " << config.ToString(); | 113 LOG(LS_INFO) << "NetEq config: " << config.ToString(); |
113 int fs = config.sample_rate_hz; | 114 int fs = config.sample_rate_hz; |
114 if (fs != 8000 && fs != 16000 && fs != 32000 && fs != 48000) { | 115 if (fs != 8000 && fs != 16000 && fs != 32000 && fs != 48000) { |
115 LOG(LS_ERROR) << "Sample rate " << fs << " Hz not supported. " << | 116 LOG(LS_ERROR) << "Sample rate " << fs << " Hz not supported. " << |
116 "Changing to 8000 Hz."; | 117 "Changing to 8000 Hz."; |
117 fs = 8000; | 118 fs = 8000; |
118 } | 119 } |
119 delay_manager_->SetMaximumDelay(config.max_delay_ms); | 120 delay_manager_->SetMaximumDelay(config.max_delay_ms); |
120 fs_hz_ = fs; | 121 fs_hz_ = fs; |
121 fs_mult_ = fs / 8000; | 122 fs_mult_ = fs / 8000; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
197 } | 198 } |
198 default: | 199 default: |
199 RTC_NOTREACHED(); | 200 RTC_NOTREACHED(); |
200 } | 201 } |
201 if (!vad_enabled) { | 202 if (!vad_enabled) { |
202 // Always set kVadUnknown when receive VAD is inactive. | 203 // Always set kVadUnknown when receive VAD is inactive. |
203 audio_frame->vad_activity_ = AudioFrame::kVadUnknown; | 204 audio_frame->vad_activity_ = AudioFrame::kVadUnknown; |
204 } | 205 } |
205 } | 206 } |
206 } // namespace | 207 } // namespace |
207 | 208 |
minyue-webrtc
2016/05/11 11:29:54
how about allowing the bool* to be nullptr. callin
hlundin-webrtc
2016/05/12 07:44:40
That is going to be a bit tricky, I think. What if
minyue-webrtc
2016/05/12 10:56:06
good point.
| |
208 int NetEqImpl::GetAudio(AudioFrame* audio_frame) { | 209 int NetEqImpl::GetAudio(AudioFrame* audio_frame, bool* muted_output) { |
209 TRACE_EVENT0("webrtc", "NetEqImpl::GetAudio"); | 210 TRACE_EVENT0("webrtc", "NetEqImpl::GetAudio"); |
210 rtc::CritScope lock(&crit_sect_); | 211 rtc::CritScope lock(&crit_sect_); |
211 int error = GetAudioInternal(audio_frame); | 212 int error = GetAudioInternal(audio_frame, muted_output); |
212 RTC_DCHECK_EQ( | 213 RTC_DCHECK_EQ( |
213 audio_frame->sample_rate_hz_, | 214 audio_frame->sample_rate_hz_, |
214 rtc::checked_cast<int>(audio_frame->samples_per_channel_ * 100)); | 215 rtc::checked_cast<int>(audio_frame->samples_per_channel_ * 100)); |
215 if (error != 0) { | 216 if (error != 0) { |
216 error_code_ = error; | 217 error_code_ = error; |
217 return kFail; | 218 return kFail; |
218 } | 219 } |
219 SetAudioFrameActivityAndType(vad_->enabled(), LastOutputType(), | 220 SetAudioFrameActivityAndType(vad_->enabled(), LastOutputType(), |
220 last_vad_activity_, audio_frame); | 221 last_vad_activity_, audio_frame); |
221 last_vad_activity_ = audio_frame->vad_activity_; | 222 last_vad_activity_ = audio_frame->vad_activity_; |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
802 } else if (delay_manager_->last_pack_cng_or_dtmf() == -1) { | 803 } else if (delay_manager_->last_pack_cng_or_dtmf() == -1) { |
803 // This is first "normal" packet after CNG or DTMF. | 804 // This is first "normal" packet after CNG or DTMF. |
804 // Reset packet time counter and measure time until next packet, | 805 // Reset packet time counter and measure time until next packet, |
805 // but don't update statistics. | 806 // but don't update statistics. |
806 delay_manager_->set_last_pack_cng_or_dtmf(0); | 807 delay_manager_->set_last_pack_cng_or_dtmf(0); |
807 delay_manager_->ResetPacketIatCount(); | 808 delay_manager_->ResetPacketIatCount(); |
808 } | 809 } |
809 return 0; | 810 return 0; |
810 } | 811 } |
811 | 812 |
812 int NetEqImpl::GetAudioInternal(AudioFrame* audio_frame) { | 813 int NetEqImpl::GetAudioInternal(AudioFrame* audio_frame, bool* muted_output) { |
813 PacketList packet_list; | 814 PacketList packet_list; |
814 DtmfEvent dtmf_event; | 815 DtmfEvent dtmf_event; |
815 Operations operation; | 816 Operations operation; |
816 bool play_dtmf; | 817 bool play_dtmf; |
818 *muted_output = false; | |
817 tick_timer_->Increment(); | 819 tick_timer_->Increment(); |
818 stats_.IncreaseCounter(output_size_samples_, fs_hz_); | 820 stats_.IncreaseCounter(output_size_samples_, fs_hz_); |
821 | |
822 // Check for muted state. | |
823 if (enable_muted_state_ && expand_->Muted() && packet_buffer_->Empty()) { | |
minyue-webrtc
2016/05/11 11:29:53
what if packet_buffer_ are not empty but all old p
hlundin-webrtc
2016/05/12 07:44:40
I think we want to exit muted state for this. It i
| |
824 RTC_DCHECK_EQ(last_mode_, kModeExpand); | |
minyue-webrtc
2016/05/11 11:29:53
why should this be a CHECK but not a if condition?
hlundin-webrtc
2016/05/12 07:44:40
The logic in NetEq should lead to this being alway
| |
825 playout_timestamp_ += static_cast<uint32_t>(output_size_samples_); | |
826 audio_frame->sample_rate_hz_ = fs_hz_; | |
827 audio_frame->samples_per_channel_ = output_size_samples_; | |
828 audio_frame->timestamp_ = | |
hlundin-webrtc
2016/05/10 12:28:15
The setting of timestamp is identical to line 1028
| |
829 first_packet_ | |
830 ? 0 | |
831 : timestamp_scaler_->ToExternal(playout_timestamp_) - | |
832 static_cast<uint32_t>(audio_frame->samples_per_channel_); | |
833 audio_frame->num_channels_ = sync_buffer_->Channels(); | |
834 *muted_output = true; | |
835 return 0; | |
836 } | |
837 | |
819 int return_value = GetDecision(&operation, &packet_list, &dtmf_event, | 838 int return_value = GetDecision(&operation, &packet_list, &dtmf_event, |
820 &play_dtmf); | 839 &play_dtmf); |
821 if (return_value != 0) { | 840 if (return_value != 0) { |
822 last_mode_ = kModeError; | 841 last_mode_ = kModeError; |
823 return return_value; | 842 return return_value; |
824 } | 843 } |
825 | 844 |
826 AudioDecoder::SpeechType speech_type; | 845 AudioDecoder::SpeechType speech_type; |
827 int length = 0; | 846 int length = 0; |
828 int decode_return_value = Decode(&packet_list, &operation, | 847 int decode_return_value = Decode(&packet_list, &operation, |
(...skipping 1315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2144 } | 2163 } |
2145 } | 2164 } |
2146 | 2165 |
2147 void NetEqImpl::CreateDecisionLogic() { | 2166 void NetEqImpl::CreateDecisionLogic() { |
2148 decision_logic_.reset(DecisionLogic::Create( | 2167 decision_logic_.reset(DecisionLogic::Create( |
2149 fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(), | 2168 fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(), |
2150 *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(), | 2169 *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(), |
2151 tick_timer_.get())); | 2170 tick_timer_.get())); |
2152 } | 2171 } |
2153 } // namespace webrtc | 2172 } // namespace webrtc |
OLD | NEW |