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

Unified Diff: webrtc/voice_engine/channel.h

Issue 2665693002: Moves channel-dependent audio input processing to separate encoder task queue (Closed)
Patch Set: StopSend is now void Created 3 years, 9 months 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 side-by-side diff with in-line comments
Download patch
Index: webrtc/voice_engine/channel.h
diff --git a/webrtc/voice_engine/channel.h b/webrtc/voice_engine/channel.h
index 24a7d6bfa0dc91457758d1f1aaeb0dc464ac7521..498b29fe735871ad939ea8709af7a5ecf5bfa02f 100644
--- a/webrtc/voice_engine/channel.h
+++ b/webrtc/voice_engine/channel.h
@@ -16,6 +16,7 @@
#include "webrtc/api/audio/audio_mixer.h"
#include "webrtc/api/call/audio_sink.h"
#include "webrtc/base/criticalsection.h"
+#include "webrtc/base/event.h"
#include "webrtc/base/optional.h"
#include "webrtc/base/thread_checker.h"
#include "webrtc/common_audio/resampler/include/push_resampler.h"
@@ -143,11 +144,10 @@ class Channel
enum { KNumSocketThreads = 1 };
enum { KNumberOfSocketBuffers = 8 };
virtual ~Channel();
- static int32_t CreateChannel(
- Channel*& channel,
- int32_t channelId,
- uint32_t instanceId,
- const VoEBase::ChannelConfig& config);
+ static int32_t CreateChannel(Channel*& channel,
+ int32_t channelId,
+ uint32_t instanceId,
+ const VoEBase::ChannelConfig& config);
Channel(int32_t channelId,
uint32_t instanceId,
const VoEBase::ChannelConfig& config);
@@ -159,8 +159,8 @@ class Channel
ProcessThread& moduleProcessThread,
AudioDeviceModule& audioDeviceModule,
VoiceEngineObserver* voiceEngineObserver,
- rtc::CriticalSection* callbackCritSect);
- int32_t UpdateLocalTimeStamp();
+ rtc::CriticalSection* callbackCritSect,
+ rtc::TaskQueue* encoder_queue);
void SetSink(std::unique_ptr<AudioSinkInterface> sink);
@@ -178,7 +178,7 @@ class Channel
int32_t StartPlayout();
int32_t StopPlayout();
int32_t StartSend();
- int32_t StopSend();
+ void StopSend();
int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer);
int32_t DeRegisterVoiceEngineObserver();
@@ -354,16 +354,31 @@ class Channel
}
RtpRtcp* RtpRtcpModulePtr() const { return _rtpRtcpModule.get(); }
int8_t OutputEnergyLevel() const { return _outputAudioLevel.Level(); }
- uint32_t Demultiplex(const AudioFrame& audioFrame);
- // Demultiplex the data to the channel's |_audioFrame|. The difference
- // between this method and the overloaded method above is that |audio_data|
- // does not go through transmit_mixer and APM.
- void Demultiplex(const int16_t* audio_data,
- int sample_rate,
- size_t number_of_frames,
- size_t number_of_channels);
- uint32_t PrepareEncodeAndSend(int mixingFrequency);
- uint32_t EncodeAndSend();
+
+ // ProcessAndEncodeAudio() creates an audio frame copy and posts a task
+ // on the shared encoder task queue, wich in turn calls (on the queue)
+ // ProcessAndEncodeAudioOnTaskQueue() where the actual processing of the
+ // audio takes place. The processing mainly consists of encoding and preparing
+ // the result for sending by adding it to a send queue.
+ // The main reason for using a task queue here is to release the native,
+ // OS-specific, audio capture thread as soon as possible to ensure that it
+ // can go back to sleep and be prepared to deliver an new captured audio
+ // packet.
+ void ProcessAndEncodeAudio(const AudioFrame& audio_input);
+
+ // This version of ProcessAndEncodeAudio() is used by PushCaptureData() in
+ // VoEBase and the audio in |audio_data| has not been subject to any APM
+ // processing. Some extra steps are therfore needed when building up the
+ // audio frame copy before using the same task as in the default call to
+ // ProcessAndEncodeAudio(const AudioFrame& audio_input).
+ void ProcessAndEncodeAudio(const int16_t* audio_data,
+ int sample_rate,
+ size_t number_of_frames,
+ size_t number_of_channels);
+
+ // Called on the encoder task queue when a new input audio frame is ready
+ // for encoding.
+ void ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input);
the sun 2017/03/30 10:13:33 Move to private:
henrika_webrtc 2017/03/30 11:16:31 Done.
// Associate to a send channel.
// Used for obtaining RTT for a receive-only channel.
@@ -389,8 +404,9 @@ class Channel
void OnRecoverableUplinkPacketLossRate(float recoverable_packet_loss_rate);
private:
- void OnUplinkPacketLossRate(float packet_loss_rate);
+ class ProcessAndEncodeAudioTask;
+ void OnUplinkPacketLossRate(float packet_loss_rate);
bool InputMute() const;
bool OnRtpPacketWithHeader(const uint8_t* received_packet,
size_t length,
@@ -405,7 +421,7 @@ class Channel
bool IsPacketInOrder(const RTPHeader& header) const;
bool IsPacketRetransmitted(const RTPHeader& header, bool in_order) const;
int ResendPackets(const uint16_t* sequence_numbers, int length);
- int32_t MixOrReplaceAudioWithFile(int mixingFrequency);
+ int32_t MixOrReplaceAudioWithFile(AudioFrame* audio_frame);
int32_t MixAudioWithFile(AudioFrame& audioFrame, int mixingFrequency);
void UpdatePlayoutTimestamp(bool rtcp);
void RegisterReceiveCodecsToRTPModule();
@@ -420,11 +436,12 @@ class Channel
int GetRtpTimestampRateHz() const;
int64_t GetRTT(bool allow_associate_channel) const;
+ uint32_t _instanceId;
+ int32_t _channelId;
+
rtc::CriticalSection _fileCritSect;
rtc::CriticalSection _callbackCritSect;
rtc::CriticalSection volume_settings_critsect_;
- uint32_t _instanceId;
- int32_t _channelId;
ChannelState channel_state_;
@@ -443,7 +460,6 @@ class Channel
std::unique_ptr<AudioSinkInterface> audio_sink_;
AudioLevel _outputAudioLevel;
bool _externalTransport;
- AudioFrame _audioFrame;
// Downsamples to the codec rate if necessary.
PushResampler<int16_t> input_resampler_;
std::unique_ptr<FilePlayer> input_file_player_;
@@ -453,7 +469,7 @@ class Channel
int _outputFilePlayerId;
int _outputFileRecorderId;
bool _outputFileRecording;
- uint32_t _timeStamp;
+ uint32_t _timeStamp ACCESS_ON(encoder_queue_);
RemoteNtpTimeEstimator ntp_estimator_ GUARDED_BY(ts_stats_lock_);
@@ -483,15 +499,15 @@ class Channel
VoiceEngineObserver* _voiceEngineObserverPtr; // owned by base
rtc::CriticalSection* _callbackCritSectPtr; // owned by base
Transport* _transportPtr; // WebRtc socket or external transport
- RmsLevel rms_level_;
+ RmsLevel rms_level_ ACCESS_ON(encoder_queue_);
bool input_mute_ GUARDED_BY(volume_settings_critsect_);
- bool previous_frame_muted_; // Only accessed from PrepareEncodeAndSend().
+ bool previous_frame_muted_ ACCESS_ON(encoder_queue_);
float _outputGain GUARDED_BY(volume_settings_critsect_);
// VoEBase
bool _mixFileWithMicrophone;
// VoeRTP_RTCP
- uint32_t _lastLocalTimeStamp;
- int8_t _lastPayloadType;
+ // TODO(henrika): can today be accessed on the main thread and on the
+ // task queue; hence potential race.
bool _includeAudioLevelIndication;
size_t transport_overhead_per_packet_ GUARDED_BY(overhead_per_packet_lock_);
size_t rtp_overhead_per_packet_ GUARDED_BY(overhead_per_packet_lock_);
@@ -519,6 +535,8 @@ class Channel
rtc::ThreadChecker construction_thread_;
const bool use_twcc_plr_for_ana_;
+
+ rtc::TaskQueue* encoder_queue_ = nullptr;
};
} // namespace voe

Powered by Google App Engine
This is Rietveld 408576698