vie_channel.h revision 4070935f4fb5b9fb2df246d7073fe0ba7e350791
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; 364070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.orgclass EncodedImageCallback; 37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass Encryption; 38fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.orgclass I420FrameCallback; 39571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.orgclass PacedSender; 40470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ProcessThread; 411ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.orgclass RtcpRttStats; 427707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass RtpRtcp; 43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ThreadWrapper; 44470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViEDecoderObserver; 45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViEEffectFilter; 46470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViERTCPObserver; 47470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViERTPObserver; 487707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoCodingModule; 497707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoDecoder; 507707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoRenderCallback; 51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass VoEVideoSync; 52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 5303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.orgclass ViEChannel 5403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org : public VCMFrameTypeCallback, 5503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public VCMReceiveCallback, 5603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public VCMReceiveStatisticsCallback, 5737bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org public VCMDecoderTimingCallback, 5803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public VCMPacketRequestCallback, 5903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public RtcpFeedback, 6003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public RtpFeedback, 6103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public ViEFrameProviderBase { 6203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public: 637c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org friend class ChannelStatsObserver; 647c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org 65b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org ViEChannel(int32_t channel_id, 66b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t engine_id, 67b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t number_of_cores, 687707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.org const Config& config, 6949888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org ProcessThread& module_process_thread, 7049888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org RtcpIntraFrameObserver* intra_frame_observer, 712853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org RtcpBandwidthObserver* bandwidth_observer, 729354cc965c04a0c79ea36622043751596a6fd015stefan@webrtc.org RemoteBitrateEstimator* remote_bitrate_estimator, 731ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.org RtcpRttStats* rtt_stats, 74571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org PacedSender* paced_sender, 754e8eabaab13d039efc4cf25b3510526f79dc5406stefan@webrtc.org RtpRtcp* default_rtp_rtcp, 764e8eabaab13d039efc4cf25b3510526f79dc5406stefan@webrtc.org bool sender); 7703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org ~ViEChannel(); 7803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 79b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t Init(); 8003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 8103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Sets the encoder to use for the channel. |new_stream| indicates the encoder 8203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // type has changed and we should start a new RTP stream. 83b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetSendCodec(const VideoCodec& video_codec, bool new_stream = true); 84b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetReceiveCodec(const VideoCodec& video_codec); 85b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetReceiveCodec(VideoCodec* video_codec); 86b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t RegisterCodecObserver(ViEDecoderObserver* observer); 8729758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org // Registers an external decoder. |buffered_rendering| means that the decoder 8829758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org // will render frames after decoding according to the render timestamp 8929758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org // provided by the video coding module. |render_delay| indicates the time 9029758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org // needed to decode and render a frame. 91b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t RegisterExternalDecoder(const uint8_t pl_type, 92b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org VideoDecoder* decoder, 93b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org bool buffered_rendering, 94b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t render_delay); 95b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t DeRegisterExternalDecoder(const uint8_t pl_type); 96b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t ReceiveCodecStatistics(uint32_t* num_key_frames, 97b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t* num_delta_frames); 98b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t DiscardedPackets() const; 9903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 1004aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org // Returns the estimated delay in milliseconds. 1014aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org int ReceiveDelay() const; 1024aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org 10303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Only affects calls to SetReceiveCodec done after this call. 104b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t WaitForKeyFrame(bool wait); 10503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 10603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // If enabled, a key frame request will be sent as soon as there are lost 10703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // packets. If |only_key_frames| are set, requests are only sent for loss in 10803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // key frames. 109b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetSignalPacketLossStatus(bool enable, bool only_key_frames); 110b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org 111b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetRTCPMode(const RTCPMethod rtcp_mode); 112b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetRTCPMode(RTCPMethod* rtcp_mode); 113b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetNACKStatus(const bool enable); 114b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetFECStatus(const bool enable, 115b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const unsigned char payload_typeRED, 116b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const unsigned char payload_typeFEC); 117b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetHybridNACKFECStatus(const bool enable, 118b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const unsigned char payload_typeRED, 119b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const unsigned char payload_typeFEC); 120ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org int SetSenderBufferingMode(int target_delay_ms); 121ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org int SetReceiverBufferingMode(int target_delay_ms); 122b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetKeyFrameRequestMethod(const KeyFrameRequestMethod method); 12384dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org bool EnableRemb(bool enable); 12490071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org int SetSendTimestampOffsetStatus(bool enable, int id); 12590071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org int SetReceiveTimestampOffsetStatus(bool enable, int id); 126cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org int SetSendAbsoluteSendTimeStatus(bool enable, int id); 127cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org int SetReceiveAbsoluteSendTimeStatus(bool enable, int id); 128a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org bool GetReceiveAbsoluteSendTimeStatus() const; 1298d02f5dc7146ebc35c30fc3f7e1cbfa6802486a2asapersson@webrtc.org void SetRtcpXrRrtrStatus(bool enable); 1305a7507f26af65222bfee8eb0d386ba68d48534e3mflodman@webrtc.org void SetTransmissionSmoothingStatus(bool enable); 131b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t EnableTMMBR(const bool enable); 132b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t EnableKeyFrameRequestCallback(const bool enable); 13303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 13403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Sets SSRC for outgoing stream. 135b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetSSRC(const uint32_t SSRC, 136b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const StreamType usage, 137b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const unsigned char simulcast_idx); 13803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 139d6ec386ff56a47b685c0a0d1ce0ce17ac7745ff9mflodman@webrtc.org // Gets SSRC for outgoing stream number |idx|. 140b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetLocalSSRC(uint8_t idx, unsigned int* ssrc); 14103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 14203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Gets SSRC for the incoming stream. 143b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetRemoteSSRC(uint32_t* ssrc); 14403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 14503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Gets the CSRC for the incoming stream. 146b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetRemoteCSRC(uint32_t CSRCs[kRtpCsrcSize]); 14703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 1489f5ebb525130f207229dfa350ce8c2bdd22163c7mflodman@webrtc.org int SetRtxSendPayloadType(int payload_type); 1499f5ebb525130f207229dfa350ce8c2bdd22163c7mflodman@webrtc.org void SetRtxReceivePayloadType(int payload_type); 1509f5ebb525130f207229dfa350ce8c2bdd22163c7mflodman@webrtc.org 15103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Sets the starting sequence number, must be called before StartSend. 152b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetStartSequenceNumber(uint16_t sequence_number); 15303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 15403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Sets the CName for the outgoing stream on the channel. 155b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetRTCPCName(const char rtcp_cname[]); 15603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 15703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Gets the CName for the outgoing stream on the channel. 158b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetRTCPCName(char rtcp_cname[]); 15903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 16003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Gets the CName of the incoming stream. 161b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetRemoteRTCPCName(char rtcp_cname[]); 162b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t RegisterRtpObserver(ViERTPObserver* observer); 163b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t RegisterRtcpObserver(ViERTCPObserver* observer); 164b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SendApplicationDefinedRTCPPacket( 165b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint8_t sub_type, 166b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t name, 167b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint8_t* data, 168b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint16_t data_length_in_bytes); 16903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 17060c9bbd976a1eb11375de597dcacd4a9d81455e7perkj@webrtc.org // Returns statistics reported by the remote client in an RTCP packet. 171b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetSendRtcpStatistics(uint16_t* fraction_lost, 172b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t* cumulative_lost, 173b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t* extended_max, 174b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t* jitter_samples, 175b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t* rtt_ms); 17603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 17760c9bbd976a1eb11375de597dcacd4a9d81455e7perkj@webrtc.org // Returns our localy created statistics of the received RTP stream. 178b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetReceivedRtcpStatistics(uint16_t* fraction_lost, 179b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t* cumulative_lost, 180b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t* extended_max, 181b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t* jitter_samples, 182b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t* rtt_ms); 18303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 18403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Gets sent/received packets statistics. 185b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetRtpStatistics(uint32_t* bytes_sent, 186b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t* packets_sent, 187b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t* bytes_received, 188b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t* packets_received) const; 189f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org void GetBandwidthUsage(uint32_t* total_bitrate_sent, 190f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org uint32_t* video_bitrate_sent, 191f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org uint32_t* fec_bitrate_sent, 192f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org uint32_t* nackBitrateSent) const; 1934fd5527ab1ba986e94671eacc96ad56f26d282bcmflodman@webrtc.org void GetEstimatedReceiveBandwidth(uint32_t* estimated_bandwidth) const; 1943e820e5109cf34b2bdb216a637a92a6ce8904816mflodman@webrtc.org 195b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t StartRTPDump(const char file_nameUTF8[1024], 196b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org RTPDirections direction); 197b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t StopRTPDump(RTPDirections direction); 19803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 19903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Implements RtcpFeedback. 2002853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org // TODO(pwestin) Depricate this functionality. 201b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org virtual void OnApplicationDataReceived(const int32_t id, 202b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint8_t sub_type, 203b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint32_t name, 204b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint16_t length, 205b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint8_t* data); 20603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Implements RtpFeedback. 207b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org virtual int32_t OnInitializeDecoder( 208b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const int32_t id, 209b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const int8_t payload_type, 21039e9659fc6a70f9416205c942d21deea060a8997leozwang@webrtc.org const char payload_name[RTP_PAYLOAD_NAME_SIZE], 21103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org const int frequency, 212b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint8_t channels, 213b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint32_t rate); 214b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org virtual void OnIncomingSSRCChanged(const int32_t id, 215286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org const uint32_t ssrc); 216b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org virtual void OnIncomingCSRCChanged(const int32_t id, 217b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint32_t CSRC, 21803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org const bool added); 219286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org virtual void ResetStatistics(uint32_t); 22003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 221b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetLocalReceiver(const uint16_t rtp_port, 222b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint16_t rtcp_port, 223b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const char* ip_address); 224b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetLocalReceiver(uint16_t* rtp_port, 225b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint16_t* rtcp_port, 226b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org char* ip_address) const; 227b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetSendDestination(const char* ip_address, 228b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint16_t rtp_port, 229b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint16_t rtcp_port, 230b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint16_t source_rtp_port, 231b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint16_t source_rtcp_port); 232b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetSendDestination(char* ip_address, 233b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint16_t* rtp_port, 234b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint16_t* rtcp_port, 235b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint16_t* source_rtp_port, 236b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint16_t* source_rtcp_port) const; 237b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t GetSourceInfo(uint16_t* rtp_port, 238b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint16_t* rtcp_port, 239b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org char* ip_address, 240b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t ip_address_length); 241b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org 242822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC); 243b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org 244b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t StartSend(); 245b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t StopSend(); 24603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org bool Sending(); 247b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t StartReceive(); 248b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t StopReceive(); 24903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 250b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t RegisterSendTransport(Transport* transport); 251b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t DeregisterSendTransport(); 25203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 25303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Incoming packet from external transport. 254b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t ReceivedRTPPacket(const void* rtp_packet, 255b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const int32_t rtp_packet_length); 25603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 25703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Incoming packet from external transport. 258b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t ReceivedRTCPPacket(const void* rtcp_packet, 259b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const int32_t rtcp_packet_length); 26003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 26103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Sets the maximum transfer unit size for the network link, i.e. including 26203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // IP, UDP and RTP headers. 263b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetMTU(uint16_t mtu); 26403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 26503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Returns maximum allowed payload size, i.e. the maximum allowed size of 26603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // encoded data in each packet. 267b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint16_t MaxDataPayloadLength() const; 268b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetMaxPacketBurstSize(uint16_t max_number_of_packets); 269b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetPacketBurstSpreadState(bool enable, const uint16_t frame_periodMS); 270b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org 271b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t EnableColorEnhancement(bool enable); 27203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 27384dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org // Gets the modules used by the channel. 27484dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org RtpRtcp* rtp_rtcp(); 27584dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org 276aea96d36e3691de0f95734f6d88bb94474903b34fischman@webrtc.org CallStatsObserver* GetStatsObserver(); 2777c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org 27803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Implements VCMReceiveCallback. 279b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org virtual int32_t FrameToRender(I420VideoFrame& video_frame); // NOLINT 28003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 28103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Implements VCMReceiveCallback. 282b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org virtual int32_t ReceivedDecodedReferenceFrame( 283b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint64_t picture_id); 28403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 2850d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org // Implements VCMReceiveCallback. 2860d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org virtual void IncomingCodecChanged(const VideoCodec& codec); 2870d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org 28837bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org // Implements VCMReceiveStatisticsCallback. 289822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org virtual int32_t OnReceiveStatisticsUpdate(const uint32_t bit_rate, 290b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint32_t frame_rate); 29103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 29237bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org // Implements VCMDecoderTimingCallback. 29337bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org virtual void OnDecoderTiming(int decode_ms, 29437bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org int max_decode_ms, 29537bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org int current_delay_ms, 29637bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org int target_delay_ms, 29737bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org int jitter_buffer_ms, 29837bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org int min_playout_delay_ms, 29937bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org int render_delay_ms); 30037bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org 30103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Implements VideoFrameTypeCallback. 302b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org virtual int32_t RequestKeyFrame(); 30303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 30403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Implements VideoFrameTypeCallback. 305b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org virtual int32_t SliceLossIndicationRequest( 306b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const uint64_t picture_id); 30703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 30803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Implements VideoPacketRequestCallback. 309b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org virtual int32_t ResendPackets(const uint16_t* sequence_numbers, 310b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint16_t length); 31103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 312b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t RegisterExternalEncryption(Encryption* encryption); 313b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t DeRegisterExternalEncryption(); 31403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 315b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t SetVoiceChannel(int32_t ve_channel_id, 316b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org VoEVideoSync* ve_sync_interface); 317b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t VoiceChannel(); 31803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 31903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Implements ViEFrameProviderBase. 32003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org virtual int FrameCallbackChanged() {return -1;} 32103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 322b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter); 32303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 3244070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org // New-style callbacks, used by VideoReceiveStream. 325fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback); 3264070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org void RegisterPreDecodeImageCallback( 3274070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org EncodedImageCallback* pre_decode_callback); 328fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org 32903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org protected: 33003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org static bool ChannelDecodeThreadFunction(void* obj); 33103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org bool ChannelDecodeProcess(); 33203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 3337c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org void OnRttUpdate(uint32_t rtt); 3347c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org 33503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org private: 33603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Assumed to be protected. 337b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t StartDecodeThread(); 338b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t StopDecodeThread(); 33903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 340b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t ProcessNACKRequest(const bool enable); 341b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t ProcessFECRequest(const bool enable, 342b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const unsigned char payload_typeRED, 343b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org const unsigned char payload_typeFEC); 344ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org // Compute NACK list parameters for the buffering mode. 345ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org int GetRequiredNackListSize(int target_delay_ms); 34603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 347b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t channel_id_; 348b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org int32_t engine_id_; 349b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint32_t number_of_cores_; 350b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org uint8_t num_socket_threads_; 35103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org 35203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Used for all registered callbacks except rendering. 353d32c44738a034977b659bb4a2e76a97f027555e4mflodman@webrtc.org scoped_ptr<CriticalSectionWrapper> callback_cs_; 3542d1fc9bf17da046fedb88d27900f4d443142dbe6pwestin@webrtc.org scoped_ptr<CriticalSectionWrapper> rtp_rtcp_cs_; 355470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 3563c383abd2725c511071904a1914ca4a5933d1b22turaj@webrtc.org RtpRtcp* default_rtp_rtcp_; 3572853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 3582853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org // Owned modules/classes. 3592853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org scoped_ptr<RtpRtcp> rtp_rtcp_; 36003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org std::list<RtpRtcp*> simulcast_rtp_rtcp_; 36159b2d5fbce3cee1ccaf5e23ce8ece9e315bae2d0mflodman@webrtc.org std::list<RtpRtcp*> removed_rtp_rtcp_; 36203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org VideoCodingModule& vcm_; 3632853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org ViEReceiver vie_receiver_; 3642853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org ViESender vie_sender_; 3652853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org ViESyncModule vie_sync_; 366470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 3677c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org // Helper to report call statistics. 3687c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org scoped_ptr<ChannelStatsObserver> stats_observer_; 3697c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org 37003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org // Not owned. 37103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org ProcessThread& module_process_thread_; 37203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org ViEDecoderObserver* codec_observer_; 37303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org bool do_key_frame_callbackRequest_; 37403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org ViERTPObserver* rtp_observer_; 37503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org ViERTCPObserver* rtcp_observer_; 37649888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org RtcpIntraFrameObserver* intra_frame_observer_; 3771ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.org RtcpRttStats* rtt_stats_; 378571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org PacedSender* paced_sender_; 379571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org 380209442a56099e47e4a87fa6a556e34c782165df4pwestin@webrtc.org scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_; 38190071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org int send_timestamp_extension_id_; 382cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org int absolute_send_time_extension_id_; 383a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org bool receive_absolute_send_time_enabled_; 38403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org bool using_packet_spread_; 385470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 38603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org Transport* external_transport_; 387470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 38803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org bool decoder_reset_; 3890d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org // Current receive codec used for codec change callback. 3900d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org VideoCodec receive_codec_; 39103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org bool wait_for_key_frame_; 39203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org ThreadWrapper* decode_thread_; 393470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 39403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org Encryption* external_encryption_; 395470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 39603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org ViEEffectFilter* effect_filter_; 39703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org bool color_enhancement_; 398470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 399a6a9964346655963f7efb0e0c49a009fda020ef2mflodman@webrtc.org // User set MTU, -1 if not set. 400a6a9964346655963f7efb0e0c49a009fda020ef2mflodman@webrtc.org uint16_t mtu_; 4014e8eabaab13d039efc4cf25b3510526f79dc5406stefan@webrtc.org const bool sender_; 402dbe97d25500170e4a830f2276096323c3a3c3269mikhal@webrtc.org 403dbe97d25500170e4a830f2276096323c3a3c3269mikhal@webrtc.org int nack_history_size_sender_; 404ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org int max_nack_reordering_threshold_; 405fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org I420FrameCallback* pre_render_callback_; 40603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org}; 407470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 40803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org} // namespace webrtc 409470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 410e06ca3cef68cec1fa97b3d476c99d98c68f04ff2mflodman@webrtc.org#endif // WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_ 411