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