vie_channel.h revision 8d02f5dc7146ebc35c30fc3f7e1cbfa6802486a2
1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
25e954814a8d73ae1d4095bf951cbbaf3e6b6f8eepwestin@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
11e06ca3cef68cec1fa97b3d476c99d98c68f04ff2mflodman@webrtc.org#ifndef WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
12e06ca3cef68cec1fa97b3d476c99d98c68f04ff2mflodman@webrtc.org#define WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
141da1ce0da5fcc029dbc2a134a9760e1b398b02d7pwestin@webrtc.org#include <list>
151da1ce0da5fcc029dbc2a134a9760e1b398b02d7pwestin@webrtc.org
1682dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
1782dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
1882dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
1982dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
2082dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/system_wrappers/interface/tick_util.h"
2182dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/typedefs.h"
2282dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/include/vie_network.h"
2382dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/include/vie_rtp_rtcp.h"
2482dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_defines.h"
2582dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_frame_provider_base.h"
2682dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_receiver.h"
2782dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_sender.h"
2882dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_sync_module.h"
29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
3003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.orgnamespace webrtc {
31470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
32aea96d36e3691de0f95734f6d88bb94474903b34fischman@webrtc.orgclass CallStatsObserver;
337c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.orgclass ChannelStatsObserver;
347707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass Config;
35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass CriticalSectionWrapper;
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass Encryption;
37fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.orgclass I420FrameCallback;
38571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.orgclass PacedSender;
39470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ProcessThread;
401ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.orgclass RtcpRttStats;
417707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass RtpRtcp;
42470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ThreadWrapper;
43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViEDecoderObserver;
44470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViEEffectFilter;
45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViERTCPObserver;
46470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViERTPObserver;
477707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoCodingModule;
487707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoDecoder;
497707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoRenderCallback;
50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass VoEVideoSync;
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
5203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.orgclass ViEChannel
5303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org    : public VCMFrameTypeCallback,
5403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public VCMReceiveCallback,
5503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public VCMReceiveStatisticsCallback,
5637bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org      public VCMDecoderTimingCallback,
5703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public VCMPacketRequestCallback,
5803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public RtcpFeedback,
5903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public RtpFeedback,
6003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public ViEFrameProviderBase {
6103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public:
627c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org  friend class ChannelStatsObserver;
637c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
64b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  ViEChannel(int32_t channel_id,
65b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org             int32_t engine_id,
66b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org             uint32_t number_of_cores,
677707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.org             const Config& config,
6849888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org             ProcessThread& module_process_thread,
6949888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org             RtcpIntraFrameObserver* intra_frame_observer,
702853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org             RtcpBandwidthObserver* bandwidth_observer,
719354cc965c04a0c79ea36622043751596a6fd015stefan@webrtc.org             RemoteBitrateEstimator* remote_bitrate_estimator,
721ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.org             RtcpRttStats* rtt_stats,
73571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org             PacedSender* paced_sender,
744e8eabaab13d039efc4cf25b3510526f79dc5406stefan@webrtc.org             RtpRtcp* default_rtp_rtcp,
754e8eabaab13d039efc4cf25b3510526f79dc5406stefan@webrtc.org             bool sender);
7603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ~ViEChannel();
7703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
78b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t Init();
7903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
8003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the encoder to use for the channel. |new_stream| indicates the encoder
8103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // type has changed and we should start a new RTP stream.
82b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSendCodec(const VideoCodec& video_codec, bool new_stream = true);
83b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetReceiveCodec(const VideoCodec& video_codec);
84b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetReceiveCodec(VideoCodec* video_codec);
85b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterCodecObserver(ViEDecoderObserver* observer);
8629758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // Registers an external decoder. |buffered_rendering| means that the decoder
8729758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // will render frames after decoding according to the render timestamp
8829758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // provided by the video coding module. |render_delay| indicates the time
8929758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // needed to decode and render a frame.
90b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterExternalDecoder(const uint8_t pl_type,
91b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                  VideoDecoder* decoder,
92b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                  bool buffered_rendering,
93b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                  int32_t render_delay);
94b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t DeRegisterExternalDecoder(const uint8_t pl_type);
95b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceiveCodecStatistics(uint32_t* num_key_frames,
96b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                 uint32_t* num_delta_frames);
97b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  uint32_t DiscardedPackets() const;
9803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
994aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org  // Returns the estimated delay in milliseconds.
1004aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org  int ReceiveDelay() const;
1014aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org
10203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Only affects calls to SetReceiveCodec done after this call.
103b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t WaitForKeyFrame(bool wait);
10403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
10503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // If enabled, a key frame request will be sent as soon as there are lost
10603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // packets. If |only_key_frames| are set, requests are only sent for loss in
10703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // key frames.
108b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSignalPacketLossStatus(bool enable, bool only_key_frames);
109b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org
110b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetRTCPMode(const RTCPMethod rtcp_mode);
111b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRTCPMode(RTCPMethod* rtcp_mode);
112b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetNACKStatus(const bool enable);
113b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetFECStatus(const bool enable,
114b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                       const unsigned char payload_typeRED,
115b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                       const unsigned char payload_typeFEC);
116b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetHybridNACKFECStatus(const bool enable,
117b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                 const unsigned char payload_typeRED,
118b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                 const unsigned char payload_typeFEC);
119ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int SetSenderBufferingMode(int target_delay_ms);
120ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int SetReceiverBufferingMode(int target_delay_ms);
121b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetKeyFrameRequestMethod(const KeyFrameRequestMethod method);
12284dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org  bool EnableRemb(bool enable);
12390071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org  int SetSendTimestampOffsetStatus(bool enable, int id);
12490071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org  int SetReceiveTimestampOffsetStatus(bool enable, int id);
125cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org  int SetSendAbsoluteSendTimeStatus(bool enable, int id);
126cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org  int SetReceiveAbsoluteSendTimeStatus(bool enable, int id);
127a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  bool GetReceiveAbsoluteSendTimeStatus() const;
1288d02f5dc7146ebc35c30fc3f7e1cbfa6802486a2asapersson@webrtc.org  void SetRtcpXrRrtrStatus(bool enable);
1295a7507f26af65222bfee8eb0d386ba68d48534e3mflodman@webrtc.org  void SetTransmissionSmoothingStatus(bool enable);
130b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t EnableTMMBR(const bool enable);
131b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t EnableKeyFrameRequestCallback(const bool enable);
13203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
13303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets SSRC for outgoing stream.
134b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSSRC(const uint32_t SSRC,
135b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                  const StreamType usage,
136b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                  const unsigned char simulcast_idx);
13703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
138d6ec386ff56a47b685c0a0d1ce0ce17ac7745ff9mflodman@webrtc.org  // Gets SSRC for outgoing stream number |idx|.
139b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetLocalSSRC(uint8_t idx, unsigned int* ssrc);
14003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
14103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets SSRC for the incoming stream.
142b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRemoteSSRC(uint32_t* ssrc);
14303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
14403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets the CSRC for the incoming stream.
145b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRemoteCSRC(uint32_t CSRCs[kRtpCsrcSize]);
14603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
1479f5ebb525130f207229dfa350ce8c2bdd22163c7mflodman@webrtc.org  int SetRtxSendPayloadType(int payload_type);
1489f5ebb525130f207229dfa350ce8c2bdd22163c7mflodman@webrtc.org  void SetRtxReceivePayloadType(int payload_type);
1499f5ebb525130f207229dfa350ce8c2bdd22163c7mflodman@webrtc.org
15003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the starting sequence number, must be called before StartSend.
151b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetStartSequenceNumber(uint16_t sequence_number);
15203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
15303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the CName for the outgoing stream on the channel.
154b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetRTCPCName(const char rtcp_cname[]);
15503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
15603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets the CName for the outgoing stream on the channel.
157b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRTCPCName(char rtcp_cname[]);
15803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
15903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets the CName of the incoming stream.
160b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRemoteRTCPCName(char rtcp_cname[]);
161b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterRtpObserver(ViERTPObserver* observer);
162b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterRtcpObserver(ViERTCPObserver* observer);
163b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SendApplicationDefinedRTCPPacket(
164b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint8_t sub_type,
165b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      uint32_t name,
166b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint8_t* data,
167b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      uint16_t data_length_in_bytes);
16803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
16960c9bbd976a1eb11375de597dcacd4a9d81455e7perkj@webrtc.org  // Returns statistics reported by the remote client in an RTCP packet.
170b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetSendRtcpStatistics(uint16_t* fraction_lost,
171b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* cumulative_lost,
172b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* extended_max,
173b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* jitter_samples,
174b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                int32_t* rtt_ms);
17503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
17660c9bbd976a1eb11375de597dcacd4a9d81455e7perkj@webrtc.org  // Returns our localy created statistics of the received RTP stream.
177b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetReceivedRtcpStatistics(uint16_t* fraction_lost,
178b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                    uint32_t* cumulative_lost,
179b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                    uint32_t* extended_max,
180b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                    uint32_t* jitter_samples,
181b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                    int32_t* rtt_ms);
18203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
18303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets sent/received packets statistics.
184b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRtpStatistics(uint32_t* bytes_sent,
185b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           uint32_t* packets_sent,
186b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           uint32_t* bytes_received,
187b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           uint32_t* packets_received) const;
188f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org  void GetBandwidthUsage(uint32_t* total_bitrate_sent,
189f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org                         uint32_t* video_bitrate_sent,
190f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org                         uint32_t* fec_bitrate_sent,
191f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org                         uint32_t* nackBitrateSent) const;
1924fd5527ab1ba986e94671eacc96ad56f26d282bcmflodman@webrtc.org  void GetEstimatedReceiveBandwidth(uint32_t* estimated_bandwidth) const;
1933e820e5109cf34b2bdb216a637a92a6ce8904816mflodman@webrtc.org
194b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StartRTPDump(const char file_nameUTF8[1024],
195b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                       RTPDirections direction);
196b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StopRTPDump(RTPDirections direction);
19703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
19803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements RtcpFeedback.
1992853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  // TODO(pwestin) Depricate this functionality.
200b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual void OnApplicationDataReceived(const int32_t id,
201b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                         const uint8_t sub_type,
202b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                         const uint32_t name,
203b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                         const uint16_t length,
204b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                         const uint8_t* data);
20503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements RtpFeedback.
206b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t OnInitializeDecoder(
207b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const int32_t id,
208b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const int8_t payload_type,
20939e9659fc6a70f9416205c942d21deea060a8997leozwang@webrtc.org      const char payload_name[RTP_PAYLOAD_NAME_SIZE],
21003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      const int frequency,
211b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint8_t channels,
212b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint32_t rate);
213b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual void OnIncomingSSRCChanged(const int32_t id,
214286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org                                     const uint32_t ssrc);
215b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual void OnIncomingCSRCChanged(const int32_t id,
216b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                     const uint32_t CSRC,
21703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org                                     const bool added);
218286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org  virtual void ResetStatistics(uint32_t);
21903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
220b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetLocalReceiver(const uint16_t rtp_port,
221b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           const uint16_t rtcp_port,
222b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           const char* ip_address);
223b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetLocalReceiver(uint16_t* rtp_port,
224b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           uint16_t* rtcp_port,
225b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           char* ip_address) const;
226b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSendDestination(const char* ip_address,
227b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             const uint16_t rtp_port,
228b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             const uint16_t rtcp_port,
229b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             const uint16_t source_rtp_port,
230b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             const uint16_t source_rtcp_port);
231b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetSendDestination(char* ip_address,
232b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             uint16_t* rtp_port,
233b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             uint16_t* rtcp_port,
234b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             uint16_t* source_rtp_port,
235b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             uint16_t* source_rtcp_port) const;
236b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetSourceInfo(uint16_t* rtp_port,
237b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                        uint16_t* rtcp_port,
238b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                        char* ip_address,
239b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                        uint32_t ip_address_length);
240b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org
241822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC);
242b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org
243b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StartSend();
244b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StopSend();
24503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool Sending();
246b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StartReceive();
247b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StopReceive();
24803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
249b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterSendTransport(Transport* transport);
250b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t DeregisterSendTransport();
25103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
25203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Incoming packet from external transport.
253b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceivedRTPPacket(const void* rtp_packet,
254b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                            const int32_t rtp_packet_length);
25503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
25603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Incoming packet from external transport.
257b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceivedRTCPPacket(const void* rtcp_packet,
258b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             const int32_t rtcp_packet_length);
25903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
26003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the maximum transfer unit size for the network link, i.e. including
26103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // IP, UDP and RTP headers.
262b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetMTU(uint16_t mtu);
26303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
26403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Returns maximum allowed payload size, i.e. the maximum allowed size of
26503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // encoded data in each packet.
266b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  uint16_t MaxDataPayloadLength() const;
267b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetMaxPacketBurstSize(uint16_t max_number_of_packets);
268b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetPacketBurstSpreadState(bool enable, const uint16_t frame_periodMS);
269b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org
270b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t EnableColorEnhancement(bool enable);
27103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
27284dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org  // Gets the modules used by the channel.
27384dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org  RtpRtcp* rtp_rtcp();
27484dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org
275aea96d36e3691de0f95734f6d88bb94474903b34fischman@webrtc.org  CallStatsObserver* GetStatsObserver();
2767c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
27703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VCMReceiveCallback.
278b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t FrameToRender(I420VideoFrame& video_frame);  // NOLINT
27903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
28003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VCMReceiveCallback.
281b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t ReceivedDecodedReferenceFrame(
282b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint64_t picture_id);
28303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
2840d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org  // Implements VCMReceiveCallback.
2850d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org  virtual void IncomingCodecChanged(const VideoCodec& codec);
2860d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org
28737bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  // Implements VCMReceiveStatisticsCallback.
288822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  virtual int32_t OnReceiveStatisticsUpdate(const uint32_t bit_rate,
289b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                    const uint32_t frame_rate);
29003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
29137bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  // Implements VCMDecoderTimingCallback.
29237bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  virtual void OnDecoderTiming(int decode_ms,
29337bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int max_decode_ms,
29437bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int current_delay_ms,
29537bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int target_delay_ms,
29637bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int jitter_buffer_ms,
29737bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int min_playout_delay_ms,
29837bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int render_delay_ms);
29937bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org
30003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VideoFrameTypeCallback.
301b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t RequestKeyFrame();
30203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
30303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VideoFrameTypeCallback.
304b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t SliceLossIndicationRequest(
305b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint64_t picture_id);
30603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
30703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VideoPacketRequestCallback.
308b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t ResendPackets(const uint16_t* sequence_numbers,
309b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint16_t length);
31003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
311b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterExternalEncryption(Encryption* encryption);
312b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t DeRegisterExternalEncryption();
31303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
314b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetVoiceChannel(int32_t ve_channel_id,
315b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                          VoEVideoSync* ve_sync_interface);
316b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t VoiceChannel();
31703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
31803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements ViEFrameProviderBase.
31903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  virtual int FrameCallbackChanged() {return -1;}
32003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
321b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter);
32203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
323fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org  // New-style callback, used by VideoReceiveStream.
324fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org  void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback);
325fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org
32603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org protected:
32703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  static bool ChannelDecodeThreadFunction(void* obj);
32803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool ChannelDecodeProcess();
32903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
3307c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org  void OnRttUpdate(uint32_t rtt);
3317c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
33203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org private:
33303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Assumed to be protected.
334b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StartDecodeThread();
335b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StopDecodeThread();
33603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
337b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ProcessNACKRequest(const bool enable);
338b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ProcessFECRequest(const bool enable,
339b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                            const unsigned char payload_typeRED,
340b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                            const unsigned char payload_typeFEC);
341ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  // Compute NACK list parameters for the buffering mode.
342ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int GetRequiredNackListSize(int target_delay_ms);
34303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
344b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t channel_id_;
345b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t engine_id_;
346b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  uint32_t number_of_cores_;
347b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  uint8_t num_socket_threads_;
34803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
34903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Used for all registered callbacks except rendering.
350d32c44738a034977b659bb4a2e76a97f027555e4mflodman@webrtc.org  scoped_ptr<CriticalSectionWrapper> callback_cs_;
3512d1fc9bf17da046fedb88d27900f4d443142dbe6pwestin@webrtc.org  scoped_ptr<CriticalSectionWrapper> rtp_rtcp_cs_;
352470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
3533c383abd2725c511071904a1914ca4a5933d1b22turaj@webrtc.org  RtpRtcp* default_rtp_rtcp_;
3542853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org
3552853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  // Owned modules/classes.
3562853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  scoped_ptr<RtpRtcp> rtp_rtcp_;
35703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  std::list<RtpRtcp*> simulcast_rtp_rtcp_;
35859b2d5fbce3cee1ccaf5e23ce8ece9e315bae2d0mflodman@webrtc.org  std::list<RtpRtcp*> removed_rtp_rtcp_;
35903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  VideoCodingModule& vcm_;
3602853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  ViEReceiver vie_receiver_;
3612853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  ViESender vie_sender_;
3622853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  ViESyncModule vie_sync_;
363470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
3647c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org  // Helper to report call statistics.
3657c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org  scoped_ptr<ChannelStatsObserver> stats_observer_;
3667c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
36703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Not owned.
36803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ProcessThread& module_process_thread_;
36903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ViEDecoderObserver* codec_observer_;
37003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool do_key_frame_callbackRequest_;
37103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ViERTPObserver* rtp_observer_;
37203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ViERTCPObserver* rtcp_observer_;
37349888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org  RtcpIntraFrameObserver* intra_frame_observer_;
3741ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.org  RtcpRttStats* rtt_stats_;
375571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  PacedSender* paced_sender_;
376571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
377209442a56099e47e4a87fa6a556e34c782165df4pwestin@webrtc.org  scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_;
37890071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org  int send_timestamp_extension_id_;
379cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org  int absolute_send_time_extension_id_;
380a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  bool receive_absolute_send_time_enabled_;
38103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool using_packet_spread_;
382470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
38303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  Transport* external_transport_;
384470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
38503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool decoder_reset_;
3860d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org  // Current receive codec used for codec change callback.
3870d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org  VideoCodec receive_codec_;
38803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool wait_for_key_frame_;
38903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ThreadWrapper* decode_thread_;
390470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
39103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  Encryption* external_encryption_;
392470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
39303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ViEEffectFilter* effect_filter_;
39403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool color_enhancement_;
395470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
396a6a9964346655963f7efb0e0c49a009fda020ef2mflodman@webrtc.org  // User set MTU, -1 if not set.
397a6a9964346655963f7efb0e0c49a009fda020ef2mflodman@webrtc.org  uint16_t mtu_;
3984e8eabaab13d039efc4cf25b3510526f79dc5406stefan@webrtc.org  const bool sender_;
399dbe97d25500170e4a830f2276096323c3a3c3269mikhal@webrtc.org
400dbe97d25500170e4a830f2276096323c3a3c3269mikhal@webrtc.org  int nack_history_size_sender_;
401ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int max_nack_reordering_threshold_;
402fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org  I420FrameCallback* pre_render_callback_;
40303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org};
404470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
40503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org}  // namespace webrtc
406470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
407e06ca3cef68cec1fa97b3d476c99d98c68f04ff2mflodman@webrtc.org#endif  // WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
408