channel.h revision 167b6dfc73fc2f4c47713bcbd89b58c52612983b
1/*
2 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
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
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_VOICE_ENGINE_CHANNEL_H
12#define WEBRTC_VOICE_ENGINE_CHANNEL_H
13
14#include "webrtc/common_audio/resampler/include/push_resampler.h"
15#include "webrtc/common_types.h"
16#include "webrtc/modules/audio_coding/main/interface/audio_coding_module.h"
17#include "webrtc/modules/audio_conference_mixer/interface/audio_conference_mixer_defines.h"
18#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
19#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
20#include "webrtc/modules/utility/interface/file_player.h"
21#include "webrtc/modules/utility/interface/file_recorder.h"
22#include "webrtc/system_wrappers/interface/scoped_ptr.h"
23#include "webrtc/voice_engine/dtmf_inband.h"
24#include "webrtc/voice_engine/dtmf_inband_queue.h"
25#include "webrtc/voice_engine/include/voe_audio_processing.h"
26#include "webrtc/voice_engine/include/voe_network.h"
27#include "webrtc/voice_engine/level_indicator.h"
28#include "webrtc/voice_engine/shared_data.h"
29#include "webrtc/voice_engine/voice_engine_defines.h"
30
31#ifdef WEBRTC_DTMF_DETECTION
32// TelephoneEventDetectionMethods, TelephoneEventObserver
33#include "webrtc/voice_engine/include/voe_dtmf.h"
34#endif
35
36namespace webrtc {
37
38class AudioDeviceModule;
39class Config;
40class CriticalSectionWrapper;
41class FileWrapper;
42class ProcessThread;
43class ReceiveStatistics;
44class RtpDump;
45class RTPPayloadRegistry;
46class RtpReceiver;
47class RTPReceiverAudio;
48class RtpRtcp;
49class TelephoneEventHandler;
50class VoEMediaProcess;
51class VoERTCPObserver;
52class VoERTPObserver;
53class VoiceEngineObserver;
54
55struct CallStatistics;
56struct ReportBlock;
57struct SenderInfo;
58
59namespace voe {
60
61class Statistics;
62class TransmitMixer;
63class OutputMixer;
64
65
66class Channel:
67    public RtpData,
68    public RtpFeedback,
69    public RtcpFeedback,
70    public FileCallback, // receiving notification from file player & recorder
71    public Transport,
72    public RtpAudioFeedback,
73    public AudioPacketizationCallback, // receive encoded packets from the ACM
74    public ACMVADCallback, // receive voice activity from the ACM
75    public MixerParticipant // supplies output mixer with audio frames
76{
77public:
78    enum {KNumSocketThreads = 1};
79    enum {KNumberOfSocketBuffers = 8};
80    virtual ~Channel();
81    static int32_t CreateChannel(Channel*& channel,
82                                 int32_t channelId,
83                                 uint32_t instanceId,
84                                 const Config& config);
85    Channel(int32_t channelId, uint32_t instanceId, const Config& config);
86    int32_t Init();
87    int32_t SetEngineInformation(
88        Statistics& engineStatistics,
89        OutputMixer& outputMixer,
90        TransmitMixer& transmitMixer,
91        ProcessThread& moduleProcessThread,
92        AudioDeviceModule& audioDeviceModule,
93        VoiceEngineObserver* voiceEngineObserver,
94        CriticalSectionWrapper* callbackCritSect);
95    int32_t UpdateLocalTimeStamp();
96
97    // API methods
98
99    // VoEBase
100    int32_t StartPlayout();
101    int32_t StopPlayout();
102    int32_t StartSend();
103    int32_t StopSend();
104    int32_t StartReceiving();
105    int32_t StopReceiving();
106
107    int32_t SetNetEQPlayoutMode(NetEqModes mode);
108    int32_t GetNetEQPlayoutMode(NetEqModes& mode);
109    int32_t SetOnHoldStatus(bool enable, OnHoldModes mode);
110    int32_t GetOnHoldStatus(bool& enabled, OnHoldModes& mode);
111    int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer);
112    int32_t DeRegisterVoiceEngineObserver();
113
114    // VoECodec
115    int32_t GetSendCodec(CodecInst& codec);
116    int32_t GetRecCodec(CodecInst& codec);
117    int32_t SetSendCodec(const CodecInst& codec);
118    int32_t SetVADStatus(bool enableVAD, ACMVADMode mode, bool disableDTX);
119    int32_t GetVADStatus(bool& enabledVAD, ACMVADMode& mode, bool& disabledDTX);
120    int32_t SetRecPayloadType(const CodecInst& codec);
121    int32_t GetRecPayloadType(CodecInst& codec);
122    int32_t SetAMREncFormat(AmrMode mode);
123    int32_t SetAMRDecFormat(AmrMode mode);
124    int32_t SetAMRWbEncFormat(AmrMode mode);
125    int32_t SetAMRWbDecFormat(AmrMode mode);
126    int32_t SetSendCNPayloadType(int type, PayloadFrequencies frequency);
127    int32_t SetISACInitTargetRate(int rateBps, bool useFixedFrameSize);
128    int32_t SetISACMaxRate(int rateBps);
129    int32_t SetISACMaxPayloadSize(int sizeBytes);
130
131    // VoE dual-streaming.
132    int SetSecondarySendCodec(const CodecInst& codec, int red_payload_type);
133    void RemoveSecondarySendCodec();
134    int GetSecondarySendCodec(CodecInst* codec);
135
136    // VoENetwork
137    int32_t RegisterExternalTransport(Transport& transport);
138    int32_t DeRegisterExternalTransport();
139    int32_t ReceivedRTPPacket(const int8_t* data, int32_t length);
140    int32_t ReceivedRTCPPacket(const int8_t* data, int32_t length);
141
142    // VoEFile
143    int StartPlayingFileLocally(const char* fileName, bool loop,
144                                FileFormats format,
145                                int startPosition,
146                                float volumeScaling,
147                                int stopPosition,
148                                const CodecInst* codecInst);
149    int StartPlayingFileLocally(InStream* stream, FileFormats format,
150                                int startPosition,
151                                float volumeScaling,
152                                int stopPosition,
153                                const CodecInst* codecInst);
154    int StopPlayingFileLocally();
155    int IsPlayingFileLocally() const;
156    int RegisterFilePlayingToMixer();
157    int ScaleLocalFilePlayout(float scale);
158    int GetLocalPlayoutPosition(int& positionMs);
159    int StartPlayingFileAsMicrophone(const char* fileName, bool loop,
160                                     FileFormats format,
161                                     int startPosition,
162                                     float volumeScaling,
163                                     int stopPosition,
164                                     const CodecInst* codecInst);
165    int StartPlayingFileAsMicrophone(InStream* stream,
166                                     FileFormats format,
167                                     int startPosition,
168                                     float volumeScaling,
169                                     int stopPosition,
170                                     const CodecInst* codecInst);
171    int StopPlayingFileAsMicrophone();
172    int IsPlayingFileAsMicrophone() const;
173    int ScaleFileAsMicrophonePlayout(float scale);
174    int StartRecordingPlayout(const char* fileName, const CodecInst* codecInst);
175    int StartRecordingPlayout(OutStream* stream, const CodecInst* codecInst);
176    int StopRecordingPlayout();
177
178    void SetMixWithMicStatus(bool mix);
179
180    // VoEExternalMediaProcessing
181    int RegisterExternalMediaProcessing(ProcessingTypes type,
182                                        VoEMediaProcess& processObject);
183    int DeRegisterExternalMediaProcessing(ProcessingTypes type);
184    int SetExternalMixing(bool enabled);
185
186    // VoEVolumeControl
187    int GetSpeechOutputLevel(uint32_t& level) const;
188    int GetSpeechOutputLevelFullRange(uint32_t& level) const;
189    int SetMute(bool enable);
190    bool Mute() const;
191    int SetOutputVolumePan(float left, float right);
192    int GetOutputVolumePan(float& left, float& right) const;
193    int SetChannelOutputVolumeScaling(float scaling);
194    int GetChannelOutputVolumeScaling(float& scaling) const;
195
196    // VoECallReport
197    void ResetDeadOrAliveCounters();
198    int ResetRTCPStatistics();
199    int GetRoundTripTimeSummary(StatVal& delaysMs) const;
200    int GetDeadOrAliveCounters(int& countDead, int& countAlive) const;
201
202    // VoENetEqStats
203    int GetNetworkStatistics(NetworkStatistics& stats);
204    void GetDecodingCallStatistics(AudioDecodingCallStats* stats) const;
205
206    // VoEVideoSync
207    bool GetDelayEstimate(int* jitter_buffer_delay_ms,
208                          int* playout_buffer_delay_ms) const;
209    int least_required_delay_ms() const { return least_required_delay_ms_; }
210    int SetInitialPlayoutDelay(int delay_ms);
211    int SetMinimumPlayoutDelay(int delayMs);
212    int GetPlayoutTimestamp(unsigned int& timestamp);
213    void UpdatePlayoutTimestamp(bool rtcp);
214    int SetInitTimestamp(unsigned int timestamp);
215    int SetInitSequenceNumber(short sequenceNumber);
216
217    // VoEVideoSyncExtended
218    int GetRtpRtcp(RtpRtcp** rtpRtcpModule, RtpReceiver** rtp_receiver) const;
219
220    // VoEEncryption
221    int RegisterExternalEncryption(Encryption& encryption);
222    int DeRegisterExternalEncryption();
223
224    // VoEDtmf
225    int SendTelephoneEventOutband(unsigned char eventCode, int lengthMs,
226                                  int attenuationDb, bool playDtmfEvent);
227    int SendTelephoneEventInband(unsigned char eventCode, int lengthMs,
228                                 int attenuationDb, bool playDtmfEvent);
229    int SetDtmfPlayoutStatus(bool enable);
230    bool DtmfPlayoutStatus() const;
231    int SetSendTelephoneEventPayloadType(unsigned char type);
232    int GetSendTelephoneEventPayloadType(unsigned char& type);
233
234    // VoEAudioProcessingImpl
235    int UpdateRxVadDetection(AudioFrame& audioFrame);
236    int RegisterRxVadObserver(VoERxVadCallback &observer);
237    int DeRegisterRxVadObserver();
238    int VoiceActivityIndicator(int &activity);
239#ifdef WEBRTC_VOICE_ENGINE_AGC
240    int SetRxAgcStatus(bool enable, AgcModes mode);
241    int GetRxAgcStatus(bool& enabled, AgcModes& mode);
242    int SetRxAgcConfig(AgcConfig config);
243    int GetRxAgcConfig(AgcConfig& config);
244#endif
245#ifdef WEBRTC_VOICE_ENGINE_NR
246    int SetRxNsStatus(bool enable, NsModes mode);
247    int GetRxNsStatus(bool& enabled, NsModes& mode);
248#endif
249
250    // VoERTP_RTCP
251    int RegisterRTPObserver(VoERTPObserver& observer);
252    int DeRegisterRTPObserver();
253    int RegisterRTCPObserver(VoERTCPObserver& observer);
254    int DeRegisterRTCPObserver();
255    int SetLocalSSRC(unsigned int ssrc);
256    int GetLocalSSRC(unsigned int& ssrc);
257    int GetRemoteSSRC(unsigned int& ssrc);
258    int GetRemoteCSRCs(unsigned int arrCSRC[15]);
259    int SetRTPAudioLevelIndicationStatus(bool enable, unsigned char ID);
260    int GetRTPAudioLevelIndicationStatus(bool& enable, unsigned char& ID);
261    int SetRTCPStatus(bool enable);
262    int GetRTCPStatus(bool& enabled);
263    int SetRTCP_CNAME(const char cName[256]);
264    int GetRTCP_CNAME(char cName[256]);
265    int GetRemoteRTCP_CNAME(char cName[256]);
266    int GetRemoteRTCPData(unsigned int& NTPHigh, unsigned int& NTPLow,
267                          unsigned int& timestamp,
268                          unsigned int& playoutTimestamp, unsigned int* jitter,
269                          unsigned short* fractionLost);
270    int SendApplicationDefinedRTCPPacket(unsigned char subType,
271                                         unsigned int name, const char* data,
272                                         unsigned short dataLengthInBytes);
273    int GetRTPStatistics(unsigned int& averageJitterMs,
274                         unsigned int& maxJitterMs,
275                         unsigned int& discardedPackets);
276    int GetRemoteRTCPSenderInfo(SenderInfo* sender_info);
277    int GetRemoteRTCPReportBlocks(std::vector<ReportBlock>* report_blocks);
278    int GetRTPStatistics(CallStatistics& stats);
279    int SetFECStatus(bool enable, int redPayloadtype);
280    int GetFECStatus(bool& enabled, int& redPayloadtype);
281    void SetNACKStatus(bool enable, int maxNumberOfPackets);
282    int StartRTPDump(const char fileNameUTF8[1024], RTPDirections direction);
283    int StopRTPDump(RTPDirections direction);
284    bool RTPDumpIsActive(RTPDirections direction);
285    int InsertExtraRTPPacket(unsigned char payloadType, bool markerBit,
286                             const char* payloadData,
287                             unsigned short payloadSize);
288    uint32_t LastRemoteTimeStamp() { return _lastRemoteTimeStamp; }
289
290    // From AudioPacketizationCallback in the ACM
291    int32_t SendData(FrameType frameType,
292                     uint8_t payloadType,
293                     uint32_t timeStamp,
294                     const uint8_t* payloadData,
295                     uint16_t payloadSize,
296                     const RTPFragmentationHeader* fragmentation);
297    // From ACMVADCallback in the ACM
298    int32_t InFrameType(int16_t frameType);
299
300    int32_t OnRxVadDetected(int vadDecision);
301
302    // From RtpData in the RTP/RTCP module
303    int32_t OnReceivedPayloadData(const uint8_t* payloadData,
304                                  uint16_t payloadSize,
305                                  const WebRtcRTPHeader* rtpHeader);
306
307    bool OnRecoveredPacket(const uint8_t* packet, int packet_length);
308
309    // From RtpFeedback in the RTP/RTCP module
310    int32_t OnInitializeDecoder(
311            int32_t id,
312            int8_t payloadType,
313            const char payloadName[RTP_PAYLOAD_NAME_SIZE],
314            int frequency,
315            uint8_t channels,
316            uint32_t rate);
317
318    void OnPacketTimeout(int32_t id);
319
320    void OnReceivedPacket(int32_t id, RtpRtcpPacketType packetType);
321
322    void OnPeriodicDeadOrAlive(int32_t id,
323                               RTPAliveType alive);
324
325    void OnIncomingSSRCChanged(int32_t id,
326                               uint32_t ssrc);
327
328    void OnIncomingCSRCChanged(int32_t id,
329                               uint32_t CSRC, bool added);
330
331    void ResetStatistics(uint32_t ssrc);
332
333    // From RtcpFeedback in the RTP/RTCP module
334    void OnApplicationDataReceived(int32_t id,
335                                   uint8_t subType,
336                                   uint32_t name,
337                                   uint16_t length,
338                                   const uint8_t* data);
339
340    // From RtpAudioFeedback in the RTP/RTCP module
341    void OnReceivedTelephoneEvent(int32_t id,
342                                  uint8_t event,
343                                  bool endOfEvent);
344
345    void OnPlayTelephoneEvent(int32_t id,
346                              uint8_t event,
347                              uint16_t lengthMs,
348                              uint8_t volume);
349
350    // From Transport (called by the RTP/RTCP module)
351    int SendPacket(int /*channel*/, const void *data, int len);
352    int SendRTCPPacket(int /*channel*/, const void *data, int len);
353
354    // From MixerParticipant
355    int32_t GetAudioFrame(int32_t id, AudioFrame& audioFrame);
356    int32_t NeededFrequency(int32_t id);
357
358    // From MonitorObserver
359    void OnPeriodicProcess();
360
361    // From FileCallback
362    void PlayNotification(int32_t id,
363                          uint32_t durationMs);
364    void RecordNotification(int32_t id,
365                            uint32_t durationMs);
366    void PlayFileEnded(int32_t id);
367    void RecordFileEnded(int32_t id);
368
369    uint32_t InstanceId() const
370    {
371        return _instanceId;
372    }
373    int32_t ChannelId() const
374    {
375        return _channelId;
376    }
377    bool Playing() const
378    {
379        return _playing;
380    }
381    bool Sending() const
382    {
383        // A lock is needed because |_sending| is accessed by both
384        // TransmitMixer::PrepareDemux() and StartSend()/StopSend(), which
385        // are called by different threads.
386        CriticalSectionScoped cs(&_callbackCritSect);
387        return _sending;
388    }
389    bool Receiving() const
390    {
391        return _receiving;
392    }
393    bool ExternalTransport() const
394    {
395        return _externalTransport;
396    }
397    bool ExternalMixing() const
398    {
399        return _externalMixing;
400    }
401    bool OutputIsOnHold() const
402    {
403        return _outputIsOnHold;
404    }
405    bool InputIsOnHold() const
406    {
407        return _inputIsOnHold;
408    }
409    RtpRtcp* RtpRtcpModulePtr() const
410    {
411        return _rtpRtcpModule.get();
412    }
413    int8_t OutputEnergyLevel() const
414    {
415        return _outputAudioLevel.Level();
416    }
417    uint32_t Demultiplex(const AudioFrame& audioFrame);
418    // Demultiplex the data to the channel's |_audioFrame|. The difference
419    // between this method and the overloaded method above is that |audio_data|
420    // does not go through transmit_mixer and APM.
421    void Demultiplex(const int16_t* audio_data,
422                     int sample_rate,
423                     int number_of_frames,
424                     int number_of_channels);
425    uint32_t PrepareEncodeAndSend(int mixingFrequency);
426    uint32_t EncodeAndSend();
427
428private:
429    bool ReceivePacket(const uint8_t* packet, int packet_length,
430                       const RTPHeader& header, bool in_order);
431    bool HandleEncapsulation(const uint8_t* packet,
432                             int packet_length,
433                             const RTPHeader& header);
434    bool IsPacketInOrder(const RTPHeader& header) const;
435    bool IsPacketRetransmitted(const RTPHeader& header, bool in_order) const;
436    int ResendPackets(const uint16_t* sequence_numbers, int length);
437    int InsertInbandDtmfTone();
438    int32_t MixOrReplaceAudioWithFile(int mixingFrequency);
439    int32_t MixAudioWithFile(AudioFrame& audioFrame, int mixingFrequency);
440    void UpdateDeadOrAliveCounters(bool alive);
441    int32_t SendPacketRaw(const void *data, int len, bool RTCP);
442    void UpdatePacketDelay(uint32_t timestamp,
443                           uint16_t sequenceNumber);
444    void RegisterReceiveCodecsToRTPModule();
445    int ApmProcessRx(AudioFrame& audioFrame);
446
447    int SetRedPayloadType(int red_payload_type);
448
449    CriticalSectionWrapper& _fileCritSect;
450    CriticalSectionWrapper& _callbackCritSect;
451    CriticalSectionWrapper& volume_settings_critsect_;
452    uint32_t _instanceId;
453    int32_t _channelId;
454
455    scoped_ptr<RtpHeaderParser> rtp_header_parser_;
456    scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_;
457    scoped_ptr<ReceiveStatistics> rtp_receive_statistics_;
458    scoped_ptr<RtpReceiver> rtp_receiver_;
459    TelephoneEventHandler* telephone_event_handler_;
460    scoped_ptr<RtpRtcp> _rtpRtcpModule;
461    scoped_ptr<AudioCodingModule> audio_coding_;
462    RtpDump& _rtpDumpIn;
463    RtpDump& _rtpDumpOut;
464    AudioLevel _outputAudioLevel;
465    bool _externalTransport;
466    AudioFrame _audioFrame;
467    scoped_array<int16_t> mono_recording_audio_;
468    // Resampler is used when input data is stereo while codec is mono.
469    PushResampler input_resampler_;
470    uint8_t _audioLevel_dBov;
471    FilePlayer* _inputFilePlayerPtr;
472    FilePlayer* _outputFilePlayerPtr;
473    FileRecorder* _outputFileRecorderPtr;
474    int _inputFilePlayerId;
475    int _outputFilePlayerId;
476    int _outputFileRecorderId;
477    bool _inputFilePlaying;
478    bool _outputFilePlaying;
479    bool _outputFileRecording;
480    DtmfInbandQueue _inbandDtmfQueue;
481    DtmfInband _inbandDtmfGenerator;
482    bool _inputExternalMedia;
483    bool _outputExternalMedia;
484    VoEMediaProcess* _inputExternalMediaCallbackPtr;
485    VoEMediaProcess* _outputExternalMediaCallbackPtr;
486    uint8_t* _encryptionRTPBufferPtr;
487    uint8_t* _decryptionRTPBufferPtr;
488    uint8_t* _encryptionRTCPBufferPtr;
489    uint8_t* _decryptionRTCPBufferPtr;
490    uint32_t _timeStamp;
491    uint8_t _sendTelephoneEventPayloadType;
492
493    // Timestamp of the audio pulled from NetEq.
494    uint32_t jitter_buffer_playout_timestamp_;
495    uint32_t playout_timestamp_rtp_;
496    uint32_t playout_timestamp_rtcp_;
497    uint32_t playout_delay_ms_;
498    uint32_t _numberOfDiscardedPackets;
499    uint16_t send_sequence_number_;
500    uint8_t restored_packet_[kVoiceEngineMaxIpPacketSizeBytes];
501
502    // uses
503    Statistics* _engineStatisticsPtr;
504    OutputMixer* _outputMixerPtr;
505    TransmitMixer* _transmitMixerPtr;
506    ProcessThread* _moduleProcessThreadPtr;
507    AudioDeviceModule* _audioDeviceModulePtr;
508    VoiceEngineObserver* _voiceEngineObserverPtr; // owned by base
509    CriticalSectionWrapper* _callbackCritSectPtr; // owned by base
510    Transport* _transportPtr; // WebRtc socket or external transport
511    Encryption* _encryptionPtr; // WebRtc SRTP or external encryption
512    scoped_ptr<AudioProcessing> rtp_audioproc_;
513    scoped_ptr<AudioProcessing> rx_audioproc_; // far end AudioProcessing
514    VoERxVadCallback* _rxVadObserverPtr;
515    int32_t _oldVadDecision;
516    int32_t _sendFrameType; // Send data is voice, 1-voice, 0-otherwise
517    VoERTPObserver* _rtpObserverPtr;
518    VoERTCPObserver* _rtcpObserverPtr;
519    // VoEBase
520    bool _outputIsOnHold;
521    bool _externalPlayout;
522    bool _externalMixing;
523    bool _inputIsOnHold;
524    bool _playing;
525    bool _sending;
526    bool _receiving;
527    bool _mixFileWithMicrophone;
528    bool _rtpObserver;
529    bool _rtcpObserver;
530    // VoEVolumeControl
531    bool _mute;
532    float _panLeft;
533    float _panRight;
534    float _outputGain;
535    // VoEEncryption
536    bool _encrypting;
537    bool _decrypting;
538    // VoEDtmf
539    bool _playOutbandDtmfEvent;
540    bool _playInbandDtmfEvent;
541    // VoeRTP_RTCP
542    uint8_t _extraPayloadType;
543    bool _insertExtraRTPPacket;
544    bool _extraMarkerBit;
545    uint32_t _lastLocalTimeStamp;
546    uint32_t _lastRemoteTimeStamp;
547    int8_t _lastPayloadType;
548    bool _includeAudioLevelIndication;
549    // VoENetwork
550    bool _rtpPacketTimedOut;
551    bool _rtpPacketTimeOutIsEnabled;
552    uint32_t _rtpTimeOutSeconds;
553    bool _connectionObserver;
554    VoEConnectionObserver* _connectionObserverPtr;
555    uint32_t _countAliveDetections;
556    uint32_t _countDeadDetections;
557    AudioFrame::SpeechType _outputSpeechType;
558    // VoEVideoSync
559    uint32_t _average_jitter_buffer_delay_us;
560    int least_required_delay_ms_;
561    uint32_t _previousTimestamp;
562    uint16_t _recPacketDelayMs;
563    // VoEAudioProcessing
564    bool _RxVadDetection;
565    bool _rxApmIsEnabled;
566    bool _rxAgcIsEnabled;
567    bool _rxNsIsEnabled;
568    bool restored_packet_in_use_;
569};
570
571}  // namespace voe
572}  // namespace webrtc
573
574#endif  // WEBRTC_VOICE_ENGINE_CHANNEL_H
575