Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Side by Side Diff: webrtc/modules/audio_processing/audio_processing_impl.cc

Issue 2444283002: Moved the AGC render sample queue into the audio processing module (Closed)
Patch Set: Rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 690 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 float* const* dest) { 701 float* const* dest) {
702 TRACE_EVENT0("webrtc", "AudioProcessing::ProcessStream_StreamConfig"); 702 TRACE_EVENT0("webrtc", "AudioProcessing::ProcessStream_StreamConfig");
703 ProcessingConfig processing_config; 703 ProcessingConfig processing_config;
704 bool reinitialization_required = false; 704 bool reinitialization_required = false;
705 { 705 {
706 // Acquire the capture lock in order to safely call the function 706 // Acquire the capture lock in order to safely call the function
707 // that retrieves the render side data. This function accesses apm 707 // that retrieves the render side data. This function accesses apm
708 // getters that need the capture lock held when being called. 708 // getters that need the capture lock held when being called.
709 rtc::CritScope cs_capture(&crit_capture_); 709 rtc::CritScope cs_capture(&crit_capture_);
710 EmptyQueuedRenderAudio(); 710 EmptyQueuedRenderAudio();
711 public_submodules_->gain_control->ReadQueuedRenderData();
712 711
713 if (!src || !dest) { 712 if (!src || !dest) {
714 return kNullPointerError; 713 return kNullPointerError;
715 } 714 }
716 715
717 processing_config = formats_.api_format; 716 processing_config = formats_.api_format;
718 reinitialization_required = UpdateActiveSubmoduleStates(); 717 reinitialization_required = UpdateActiveSubmoduleStates();
719 } 718 }
720 719
721 processing_config.input_stream() = input_config; 720 processing_config.input_stream() = input_config;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 msg->add_output_channel(dest[i], channel_size); 758 msg->add_output_channel(dest[i], channel_size);
760 RETURN_ON_ERR(WriteMessageToDebugFile(debug_dump_.debug_file.get(), 759 RETURN_ON_ERR(WriteMessageToDebugFile(debug_dump_.debug_file.get(),
761 &debug_dump_.num_bytes_left_for_log_, 760 &debug_dump_.num_bytes_left_for_log_,
762 &crit_debug_, &debug_dump_.capture)); 761 &crit_debug_, &debug_dump_.capture));
763 } 762 }
764 #endif 763 #endif
765 764
766 return kNoError; 765 return kNoError;
767 } 766 }
768 767
769 void AudioProcessingImpl::QueueRenderAudio(const AudioBuffer* audio) { 768 void AudioProcessingImpl::QueueRenderAudio(AudioBuffer* audio) {
770 EchoCancellationImpl::PackRenderAudioBuffer(audio, num_output_channels(), 769 EchoCancellationImpl::PackRenderAudioBuffer(audio, num_output_channels(),
771 num_reverse_channels(), 770 num_reverse_channels(),
772 &float_render_queue_buffer_); 771 &aec_render_queue_buffer_);
773 772
774 RTC_DCHECK_GE(160u, audio->num_frames_per_band()); 773 RTC_DCHECK_GE(160u, audio->num_frames_per_band());
775 774
776 // Insert the samples into the queue. 775 // Insert the samples into the queue.
777 if (!float_render_signal_queue_->Insert(&float_render_queue_buffer_)) { 776 if (!aec_render_signal_queue_->Insert(&aec_render_queue_buffer_)) {
778 // The data queue is full and needs to be emptied. 777 // The data queue is full and needs to be emptied.
779 EmptyQueuedRenderAudio(); 778 EmptyQueuedRenderAudio();
780 779
781 // Retry the insert (should always work). 780 // Retry the insert (should always work).
782 bool result = 781 bool result = aec_render_signal_queue_->Insert(&aec_render_queue_buffer_);
783 float_render_signal_queue_->Insert(&float_render_queue_buffer_);
784 RTC_DCHECK(result); 782 RTC_DCHECK(result);
785 } 783 }
786 784
787 EchoControlMobileImpl::PackRenderAudioBuffer(audio, num_output_channels(), 785 EchoControlMobileImpl::PackRenderAudioBuffer(audio, num_output_channels(),
788 num_reverse_channels(), 786 num_reverse_channels(),
789 &int16_render_queue_buffer_); 787 &aecm_render_queue_buffer_);
790 788
791 // Insert the samples into the queue. 789 // Insert the samples into the queue.
792 if (!int16_render_signal_queue_->Insert(&int16_render_queue_buffer_)) { 790 if (!aecm_render_signal_queue_->Insert(&aecm_render_queue_buffer_)) {
793 // The data queue is full and needs to be emptied. 791 // The data queue is full and needs to be emptied.
794 EmptyQueuedRenderAudio(); 792 EmptyQueuedRenderAudio();
795 793
796 // Retry the insert (should always work). 794 // Retry the insert (should always work).
797 bool result = 795 bool result = aecm_render_signal_queue_->Insert(&aecm_render_queue_buffer_);
798 int16_render_signal_queue_->Insert(&int16_render_queue_buffer_);
799 RTC_DCHECK(result); 796 RTC_DCHECK(result);
800 } 797 }
798
799 if (!constants_.use_experimental_agc) {
800 GainControlImpl::PackRenderAudioBuffer(audio, &agc_render_queue_buffer_);
801 // Insert the samples into the queue.
802 if (!agc_render_signal_queue_->Insert(&agc_render_queue_buffer_)) {
803 // The data queue is full and needs to be emptied.
804 EmptyQueuedRenderAudio();
805
806 // Retry the insert (should always work).
807 bool result = agc_render_signal_queue_->Insert(&agc_render_queue_buffer_);
808 RTC_DCHECK(result);
809 }
810 }
801 } 811 }
802 812
803 void AudioProcessingImpl::AllocateRenderQueue() { 813 void AudioProcessingImpl::AllocateRenderQueue() {
804 const size_t new_float_render_queue_element_max_size = 814 const size_t new_aec_render_queue_element_max_size =
805 std::max(static_cast<size_t>(1), 815 std::max(static_cast<size_t>(1),
806 kMaxAllowedValuesOfSamplesPerFrame * 816 kMaxAllowedValuesOfSamplesPerFrame *
807 EchoCancellationImpl::NumCancellersRequired( 817 EchoCancellationImpl::NumCancellersRequired(
808 num_output_channels(), num_reverse_channels())); 818 num_output_channels(), num_reverse_channels()));
809 819
810 const size_t new_int16_render_queue_element_max_size = 820 const size_t new_aecm_render_queue_element_max_size =
811 std::max(static_cast<size_t>(1), 821 std::max(static_cast<size_t>(1),
812 kMaxAllowedValuesOfSamplesPerFrame * 822 kMaxAllowedValuesOfSamplesPerFrame *
813 EchoControlMobileImpl::NumCancellersRequired( 823 EchoControlMobileImpl::NumCancellersRequired(
814 num_output_channels(), num_reverse_channels())); 824 num_output_channels(), num_reverse_channels()));
815 825
826 const size_t new_agc_render_queue_element_max_size =
827 std::max(static_cast<size_t>(1), kMaxAllowedValuesOfSamplesPerFrame);
828
816 // Reallocate the queues if the queue item sizes are too small to fit the 829 // Reallocate the queues if the queue item sizes are too small to fit the
817 // data to put in the queues. 830 // data to put in the queues.
818 if (float_render_queue_element_max_size_ < 831 if (aec_render_queue_element_max_size_ <
819 new_float_render_queue_element_max_size) { 832 new_aec_render_queue_element_max_size) {
820 float_render_queue_element_max_size_ = 833 aec_render_queue_element_max_size_ = new_aec_render_queue_element_max_size;
821 new_float_render_queue_element_max_size;
822 834
823 std::vector<float> template_queue_element( 835 std::vector<float> template_queue_element(
824 float_render_queue_element_max_size_); 836 aec_render_queue_element_max_size_);
825 837
826 float_render_signal_queue_.reset( 838 aec_render_signal_queue_.reset(
827 new SwapQueue<std::vector<float>, RenderQueueItemVerifier<float>>( 839 new SwapQueue<std::vector<float>, RenderQueueItemVerifier<float>>(
828 kMaxNumFramesToBuffer, template_queue_element, 840 kMaxNumFramesToBuffer, template_queue_element,
829 RenderQueueItemVerifier<float>( 841 RenderQueueItemVerifier<float>(
830 float_render_queue_element_max_size_))); 842 aec_render_queue_element_max_size_)));
831 843
832 float_render_queue_buffer_.resize(float_render_queue_element_max_size_); 844 aec_render_queue_buffer_.resize(aec_render_queue_element_max_size_);
833 float_capture_queue_buffer_.resize(float_render_queue_element_max_size_); 845 aec_capture_queue_buffer_.resize(aec_render_queue_element_max_size_);
834 } else { 846 } else {
835 float_render_signal_queue_->Clear(); 847 aec_render_signal_queue_->Clear();
836 } 848 }
837 849
838 if (int16_render_queue_element_max_size_ < 850 if (aecm_render_queue_element_max_size_ <
839 new_int16_render_queue_element_max_size) { 851 new_aecm_render_queue_element_max_size) {
840 int16_render_queue_element_max_size_ = 852 aecm_render_queue_element_max_size_ =
841 new_int16_render_queue_element_max_size; 853 new_aecm_render_queue_element_max_size;
842 854
843 std::vector<int16_t> template_queue_element( 855 std::vector<int16_t> template_queue_element(
844 int16_render_queue_element_max_size_); 856 aecm_render_queue_element_max_size_);
845 857
846 int16_render_signal_queue_.reset( 858 aecm_render_signal_queue_.reset(
847 new SwapQueue<std::vector<int16_t>, RenderQueueItemVerifier<int16_t>>( 859 new SwapQueue<std::vector<int16_t>, RenderQueueItemVerifier<int16_t>>(
848 kMaxNumFramesToBuffer, template_queue_element, 860 kMaxNumFramesToBuffer, template_queue_element,
849 RenderQueueItemVerifier<int16_t>( 861 RenderQueueItemVerifier<int16_t>(
850 int16_render_queue_element_max_size_))); 862 aecm_render_queue_element_max_size_)));
851 863
852 int16_render_queue_buffer_.resize(int16_render_queue_element_max_size_); 864 aecm_render_queue_buffer_.resize(aecm_render_queue_element_max_size_);
853 int16_capture_queue_buffer_.resize(int16_render_queue_element_max_size_); 865 aecm_capture_queue_buffer_.resize(aecm_render_queue_element_max_size_);
854 } else { 866 } else {
855 int16_render_signal_queue_->Clear(); 867 aecm_render_signal_queue_->Clear();
868 }
869
870 if (agc_render_queue_element_max_size_ <
871 new_agc_render_queue_element_max_size) {
872 agc_render_queue_element_max_size_ = new_agc_render_queue_element_max_size;
873
874 std::vector<int16_t> template_queue_element(
875 agc_render_queue_element_max_size_);
876
877 agc_render_signal_queue_.reset(
878 new SwapQueue<std::vector<int16_t>, RenderQueueItemVerifier<int16_t>>(
879 kMaxNumFramesToBuffer, template_queue_element,
880 RenderQueueItemVerifier<int16_t>(
881 agc_render_queue_element_max_size_)));
882
883 agc_render_queue_buffer_.resize(agc_render_queue_element_max_size_);
884 agc_capture_queue_buffer_.resize(agc_render_queue_element_max_size_);
885 } else {
886 agc_render_signal_queue_->Clear();
856 } 887 }
857 } 888 }
858 889
859 void AudioProcessingImpl::EmptyQueuedRenderAudio() { 890 void AudioProcessingImpl::EmptyQueuedRenderAudio() {
860 rtc::CritScope cs_capture(&crit_capture_); 891 rtc::CritScope cs_capture(&crit_capture_);
861 while (float_render_signal_queue_->Remove(&float_capture_queue_buffer_)) { 892 while (aec_render_signal_queue_->Remove(&aec_capture_queue_buffer_)) {
862 public_submodules_->echo_cancellation->ProcessRenderAudio( 893 public_submodules_->echo_cancellation->ProcessRenderAudio(
863 float_capture_queue_buffer_); 894 aec_capture_queue_buffer_);
864 } 895 }
865 896
866 while (int16_render_signal_queue_->Remove(&int16_capture_queue_buffer_)) { 897 while (aecm_render_signal_queue_->Remove(&aecm_capture_queue_buffer_)) {
867 public_submodules_->echo_control_mobile->ProcessRenderAudio( 898 public_submodules_->echo_control_mobile->ProcessRenderAudio(
868 int16_capture_queue_buffer_); 899 aecm_capture_queue_buffer_);
900 }
901
902 while (agc_render_signal_queue_->Remove(&agc_capture_queue_buffer_)) {
903 public_submodules_->gain_control->ProcessRenderAudio(
904 agc_capture_queue_buffer_);
869 } 905 }
870 } 906 }
871 907
872 int AudioProcessingImpl::ProcessStream(AudioFrame* frame) { 908 int AudioProcessingImpl::ProcessStream(AudioFrame* frame) {
873 TRACE_EVENT0("webrtc", "AudioProcessing::ProcessStream_AudioFrame"); 909 TRACE_EVENT0("webrtc", "AudioProcessing::ProcessStream_AudioFrame");
874 { 910 {
875 // Acquire the capture lock in order to safely call the function 911 // Acquire the capture lock in order to safely call the function
876 // that retrieves the render side data. This function accesses apm 912 // that retrieves the render side data. This function accesses apm
877 // getters that need the capture lock held when being called. 913 // getters that need the capture lock held when being called.
878 // The lock needs to be released as 914 // The lock needs to be released as
879 // public_submodules_->echo_control_mobile->is_enabled() aquires this lock 915 // public_submodules_->echo_control_mobile->is_enabled() aquires this lock
880 // as well. 916 // as well.
881 rtc::CritScope cs_capture(&crit_capture_); 917 rtc::CritScope cs_capture(&crit_capture_);
882 EmptyQueuedRenderAudio(); 918 EmptyQueuedRenderAudio();
883 public_submodules_->gain_control->ReadQueuedRenderData();
884 } 919 }
885 920
886 if (!frame) { 921 if (!frame) {
887 return kNullPointerError; 922 return kNullPointerError;
888 } 923 }
889 // Must be a native rate. 924 // Must be a native rate.
890 if (frame->sample_rate_hz_ != kSampleRate8kHz && 925 if (frame->sample_rate_hz_ != kSampleRate8kHz &&
891 frame->sample_rate_hz_ != kSampleRate16kHz && 926 frame->sample_rate_hz_ != kSampleRate16kHz &&
892 frame->sample_rate_hz_ != kSampleRate32kHz && 927 frame->sample_rate_hz_ != kSampleRate32kHz &&
893 frame->sample_rate_hz_ != kSampleRate48kHz) { 928 frame->sample_rate_hz_ != kSampleRate48kHz) {
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 } 1270 }
1236 1271
1237 #if WEBRTC_INTELLIGIBILITY_ENHANCER 1272 #if WEBRTC_INTELLIGIBILITY_ENHANCER
1238 if (capture_nonlocked_.intelligibility_enabled) { 1273 if (capture_nonlocked_.intelligibility_enabled) {
1239 public_submodules_->intelligibility_enhancer->ProcessRenderAudio( 1274 public_submodules_->intelligibility_enhancer->ProcessRenderAudio(
1240 render_buffer); 1275 render_buffer);
1241 } 1276 }
1242 #endif 1277 #endif
1243 1278
1244 QueueRenderAudio(render_buffer); 1279 QueueRenderAudio(render_buffer);
1245 if (!constants_.use_experimental_agc) {
1246 RETURN_ON_ERR(
1247 public_submodules_->gain_control->ProcessRenderAudio(render_buffer));
1248 }
1249 1280
1250 if (submodule_states_.RenderMultiBandProcessingActive() && 1281 if (submodule_states_.RenderMultiBandProcessingActive() &&
1251 SampleRateSupportsMultiBand( 1282 SampleRateSupportsMultiBand(
1252 formats_.render_processing_format.sample_rate_hz())) { 1283 formats_.render_processing_format.sample_rate_hz())) {
1253 render_buffer->MergeFrequencyBands(); 1284 render_buffer->MergeFrequencyBands();
1254 } 1285 }
1255 1286
1256 return kNoError; 1287 return kNoError;
1257 } 1288 }
1258 1289
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
1702 capture_processing_format(kSampleRate16kHz), 1733 capture_processing_format(kSampleRate16kHz),
1703 split_rate(kSampleRate16kHz) {} 1734 split_rate(kSampleRate16kHz) {}
1704 1735
1705 AudioProcessingImpl::ApmCaptureState::~ApmCaptureState() = default; 1736 AudioProcessingImpl::ApmCaptureState::~ApmCaptureState() = default;
1706 1737
1707 AudioProcessingImpl::ApmRenderState::ApmRenderState() = default; 1738 AudioProcessingImpl::ApmRenderState::ApmRenderState() = default;
1708 1739
1709 AudioProcessingImpl::ApmRenderState::~ApmRenderState() = default; 1740 AudioProcessingImpl::ApmRenderState::~ApmRenderState() = default;
1710 1741
1711 } // namespace webrtc 1742 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_processing/audio_processing_impl.h ('k') | webrtc/modules/audio_processing/gain_control_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698