1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <list>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
17065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
18065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
19065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
20065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/system_wrappers/interface/tick_util.h"
21065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/typedefs.h"
22065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/include/vie_network.h"
23065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/include/vie_rtp_rtcp.h"
24065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_defines.h"
25065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_frame_provider_base.h"
26065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_receiver.h"
27065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_sender.h"
28065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_sync_module.h"
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
320329e591cd17957836fd295ae9b31f7d3a73e5e8fischman@webrtc.orgclass CallStatsObserver;
3378696d33d7711eb8208400908237c384b235bf74mflodman@webrtc.orgclass ChannelStatsObserver;
34ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.orgclass Config;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper;
362e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.orgclass EncodedImageCallback;
3763301bd03e009d309d1fdca1217f8708be610f32pbos@webrtc.orgclass I420FrameCallback;
385e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.orgclass PacedSender;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ProcessThread;
40c4af4cf7814bb773d838aefa476c196e5f1bc360asapersson@webrtc.orgclass RtcpRttStats;
41ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.orgclass RtpRtcp;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ThreadWrapper;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEDecoderObserver;
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEEffectFilter;
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViERTCPObserver;
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViERTPObserver;
47ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.orgclass VideoCodingModule;
48ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.orgclass VideoDecoder;
49ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.orgclass VideoRenderCallback;
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VoEVideoSync;
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEChannel
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    : public VCMFrameTypeCallback,
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public VCMReceiveCallback,
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public VCMReceiveStatisticsCallback,
56ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org      public VCMDecoderTimingCallback,
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public VCMPacketRequestCallback,
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public RtcpFeedback,
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public RtpFeedback,
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public ViEFrameProviderBase {
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
6278696d33d7711eb8208400908237c384b235bf74mflodman@webrtc.org  friend class ChannelStatsObserver;
6378696d33d7711eb8208400908237c384b235bf74mflodman@webrtc.org
6467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  ViEChannel(int32_t channel_id,
6567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org             int32_t engine_id,
6667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org             uint32_t number_of_cores,
67ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org             const Config& config,
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             ProcessThread& module_process_thread,
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             RtcpIntraFrameObserver* intra_frame_observer,
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             RtcpBandwidthObserver* bandwidth_observer,
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             RemoteBitrateEstimator* remote_bitrate_estimator,
72c4af4cf7814bb773d838aefa476c196e5f1bc360asapersson@webrtc.org             RtcpRttStats* rtt_stats,
735e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.org             PacedSender* paced_sender,
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             RtpRtcp* default_rtp_rtcp,
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             bool sender);
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~ViEChannel();
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
7867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t Init();
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Sets the encoder to use for the channel. |new_stream| indicates the encoder
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // type has changed and we should start a new RTP stream.
8267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetSendCodec(const VideoCodec& video_codec, bool new_stream = true);
8367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetReceiveCodec(const VideoCodec& video_codec);
8467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetReceiveCodec(VideoCodec* video_codec);
8567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterCodecObserver(ViEDecoderObserver* observer);
86208a648d4f269c1cbaa65e16b842b2b4694b9b59pbos@webrtc.org  // Registers an external decoder. |buffered_rendering| means that the decoder
87208a648d4f269c1cbaa65e16b842b2b4694b9b59pbos@webrtc.org  // will render frames after decoding according to the render timestamp
88208a648d4f269c1cbaa65e16b842b2b4694b9b59pbos@webrtc.org  // provided by the video coding module. |render_delay| indicates the time
89208a648d4f269c1cbaa65e16b842b2b4694b9b59pbos@webrtc.org  // needed to decode and render a frame.
9067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterExternalDecoder(const uint8_t pl_type,
9167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                  VideoDecoder* decoder,
9267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                  bool buffered_rendering,
9367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                  int32_t render_delay);
9467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t DeRegisterExternalDecoder(const uint8_t pl_type);
9567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t ReceiveCodecStatistics(uint32_t* num_key_frames,
9667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                 uint32_t* num_delta_frames);
9767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  uint32_t DiscardedPackets() const;
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
99f314c80eb667406101dbc5810fda799f67030a0fmflodman@webrtc.org  // Returns the estimated delay in milliseconds.
100f314c80eb667406101dbc5810fda799f67030a0fmflodman@webrtc.org  int ReceiveDelay() const;
101f314c80eb667406101dbc5810fda799f67030a0fmflodman@webrtc.org
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Only affects calls to SetReceiveCodec done after this call.
10367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t WaitForKeyFrame(bool wait);
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // If enabled, a key frame request will be sent as soon as there are lost
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // packets. If |only_key_frames| are set, requests are only sent for loss in
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // key frames.
10867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetSignalPacketLossStatus(bool enable, bool only_key_frames);
10967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org
11067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetRTCPMode(const RTCPMethod rtcp_mode);
11167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetRTCPMode(RTCPMethod* rtcp_mode);
11267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetNACKStatus(const bool enable);
11367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetFECStatus(const bool enable,
11467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                       const unsigned char payload_typeRED,
11567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                       const unsigned char payload_typeFEC);
11667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetHybridNACKFECStatus(const bool enable,
11767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                 const unsigned char payload_typeRED,
11867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                 const unsigned char payload_typeFEC);
1199d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  int SetSenderBufferingMode(int target_delay_ms);
1209d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  int SetReceiverBufferingMode(int target_delay_ms);
12167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetKeyFrameRequestMethod(const KeyFrameRequestMethod method);
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool EnableRemb(bool enable);
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int SetSendTimestampOffsetStatus(bool enable, int id);
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int SetReceiveTimestampOffsetStatus(bool enable, int id);
125453f9c0b3e2c0396b9e519ef37267a2056b65bd2solenberg@webrtc.org  int SetSendAbsoluteSendTimeStatus(bool enable, int id);
126453f9c0b3e2c0396b9e519ef37267a2056b65bd2solenberg@webrtc.org  int SetReceiveAbsoluteSendTimeStatus(bool enable, int id);
127f40e9b6ea200906facbabf507d0ef15ceae61fa3solenberg@webrtc.org  bool GetReceiveAbsoluteSendTimeStatus() const;
1283dc7ff30185a2d7a597acb69183fca73bd1004d8asapersson@webrtc.org  void SetRtcpXrRrtrStatus(bool enable);
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void SetTransmissionSmoothingStatus(bool enable);
13067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t EnableTMMBR(const bool enable);
13167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t EnableKeyFrameRequestCallback(const bool enable);
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Sets SSRC for outgoing stream.
13467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetSSRC(const uint32_t SSRC,
13567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                  const StreamType usage,
13667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                  const unsigned char simulcast_idx);
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
138b6d9cfc6347e490751e142ba5fb89e4a975ed442mflodman@webrtc.org  // Gets SSRC for outgoing stream number |idx|.
13967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetLocalSSRC(uint8_t idx, unsigned int* ssrc);
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Gets SSRC for the incoming stream.
14267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetRemoteSSRC(uint32_t* ssrc);
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Gets the CSRC for the incoming stream.
14567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetRemoteCSRC(uint32_t CSRCs[kRtpCsrcSize]);
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1477bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org  int SetRtxSendPayloadType(int payload_type);
1486845de7e4eed28e61c3edb263fb4bbcd65ff76fbstefan@webrtc.org  // Only has an effect once RTX is enabled.
1496845de7e4eed28e61c3edb263fb4bbcd65ff76fbstefan@webrtc.org  void SetPadWithRedundantPayloads(bool enable);
1507bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org  void SetRtxReceivePayloadType(int payload_type);
1517bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Sets the starting sequence number, must be called before StartSend.
15367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetStartSequenceNumber(uint16_t sequence_number);
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Sets the CName for the outgoing stream on the channel.
15667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetRTCPCName(const char rtcp_cname[]);
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Gets the CName for the outgoing stream on the channel.
15967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetRTCPCName(char rtcp_cname[]);
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Gets the CName of the incoming stream.
16267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetRemoteRTCPCName(char rtcp_cname[]);
16367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterRtpObserver(ViERTPObserver* observer);
16467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterRtcpObserver(ViERTCPObserver* observer);
16567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SendApplicationDefinedRTCPPacket(
16667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      const uint8_t sub_type,
16767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      uint32_t name,
16867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      const uint8_t* data,
16967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      uint16_t data_length_in_bytes);
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns statistics reported by the remote client in an RTCP packet.
17267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetSendRtcpStatistics(uint16_t* fraction_lost,
17367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                uint32_t* cumulative_lost,
17467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                uint32_t* extended_max,
17567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                uint32_t* jitter_samples,
17667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                int32_t* rtt_ms);
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1789b30fd3991cf4fdbab0141e297c5b2e55fc65937sprang@webrtc.org  // Called on receipt of RTCP report block from remote side.
1799b30fd3991cf4fdbab0141e297c5b2e55fc65937sprang@webrtc.org  void RegisterSendChannelRtcpStatisticsCallback(
1809b30fd3991cf4fdbab0141e297c5b2e55fc65937sprang@webrtc.org      RtcpStatisticsCallback* callback);
1819b30fd3991cf4fdbab0141e297c5b2e55fc65937sprang@webrtc.org
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns our localy created statistics of the received RTP stream.
18367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetReceivedRtcpStatistics(uint16_t* fraction_lost,
18467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                    uint32_t* cumulative_lost,
18567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                    uint32_t* extended_max,
18667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                    uint32_t* jitter_samples,
18767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                    int32_t* rtt_ms);
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1894f1f5fa55d803fc0b7f3fd4f6a25a0f84c4e3280sprang@webrtc.org  // Called on generation of RTCP stats
1904f1f5fa55d803fc0b7f3fd4f6a25a0f84c4e3280sprang@webrtc.org  void RegisterReceiveChannelRtcpStatisticsCallback(
1914f1f5fa55d803fc0b7f3fd4f6a25a0f84c4e3280sprang@webrtc.org      RtcpStatisticsCallback* callback);
1924f1f5fa55d803fc0b7f3fd4f6a25a0f84c4e3280sprang@webrtc.org
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Gets sent/received packets statistics.
19467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetRtpStatistics(uint32_t* bytes_sent,
19567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                           uint32_t* packets_sent,
19667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                           uint32_t* bytes_received,
19767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                           uint32_t* packets_received) const;
198b113981639e341ed642be9ca74c22a83d2b33a28sprang@webrtc.org
199b113981639e341ed642be9ca74c22a83d2b33a28sprang@webrtc.org  // Called on update of RTP statistics.
200b113981639e341ed642be9ca74c22a83d2b33a28sprang@webrtc.org  void RegisterSendChannelRtpStatisticsCallback(
2017d99cd47d8055ec6815f2862b75a0bdf53304199sprang@webrtc.org      StreamDataCountersCallback* callback);
2027d99cd47d8055ec6815f2862b75a0bdf53304199sprang@webrtc.org
2037d99cd47d8055ec6815f2862b75a0bdf53304199sprang@webrtc.org  // Called on update of RTP statistics.
2047d99cd47d8055ec6815f2862b75a0bdf53304199sprang@webrtc.org  void RegisterReceiveChannelRtpStatisticsCallback(
205b113981639e341ed642be9ca74c22a83d2b33a28sprang@webrtc.org      StreamDataCountersCallback* callback);
206b113981639e341ed642be9ca74c22a83d2b33a28sprang@webrtc.org
2074a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  void GetRtcpPacketTypeCounters(RtcpPacketTypeCounter* packets_sent,
2084a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org                                 RtcpPacketTypeCounter* packets_received) const;
2094a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void GetBandwidthUsage(uint32_t* total_bitrate_sent,
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         uint32_t* video_bitrate_sent,
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         uint32_t* fec_bitrate_sent,
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         uint32_t* nackBitrateSent) const;
214ee234be7908840221b78e6489d42ea792d4ce87dstefan@webrtc.org  bool GetSendSideDelay(int* avg_send_delay, int* max_send_delay) const;
215d1e7facca966ca4b7632940d71f62deea5094083jiayl@webrtc.org  void GetReceiveBandwidthEstimatorStats(
216d1e7facca966ca4b7632940d71f62deea5094083jiayl@webrtc.org      ReceiveBandwidthEstimatorStats* output) const;
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
218b70db6dbe962f01976f2e1e9a4141c1ee37e3801sprang@webrtc.org  // Called on any new send bitrate estimate.
219b70db6dbe962f01976f2e1e9a4141c1ee37e3801sprang@webrtc.org  void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer);
220b70db6dbe962f01976f2e1e9a4141c1ee37e3801sprang@webrtc.org
22167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t StartRTPDump(const char file_nameUTF8[1024],
22267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                       RTPDirections direction);
22367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t StopRTPDump(RTPDirections direction);
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements RtcpFeedback.
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(pwestin) Depricate this functionality.
22767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual void OnApplicationDataReceived(const int32_t id,
22867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                         const uint8_t sub_type,
22967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                         const uint32_t name,
23067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                         const uint16_t length,
23167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                         const uint8_t* data);
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements RtpFeedback.
23367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual int32_t OnInitializeDecoder(
23467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      const int32_t id,
23567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      const int8_t payload_type,
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const char payload_name[RTP_PAYLOAD_NAME_SIZE],
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const int frequency,
23867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      const uint8_t channels,
23967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      const uint32_t rate);
24067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual void OnIncomingSSRCChanged(const int32_t id,
241a20e2d4c9ae860db62de6e304bfdf517c049ec3dstefan@webrtc.org                                     const uint32_t ssrc);
24267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual void OnIncomingCSRCChanged(const int32_t id,
24367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                     const uint32_t CSRC,
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     const bool added);
245a20e2d4c9ae860db62de6e304bfdf517c049ec3dstefan@webrtc.org  virtual void ResetStatistics(uint32_t);
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetLocalReceiver(const uint16_t rtp_port,
24867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                           const uint16_t rtcp_port,
24967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                           const char* ip_address);
25067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetLocalReceiver(uint16_t* rtp_port,
25167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                           uint16_t* rtcp_port,
25267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                           char* ip_address) const;
25367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetSendDestination(const char* ip_address,
25467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                             const uint16_t rtp_port,
25567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                             const uint16_t rtcp_port,
25667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                             const uint16_t source_rtp_port,
25767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                             const uint16_t source_rtcp_port);
25867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetSendDestination(char* ip_address,
25967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                             uint16_t* rtp_port,
26067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                             uint16_t* rtcp_port,
26167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                             uint16_t* source_rtp_port,
26267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                             uint16_t* source_rtcp_port) const;
26367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetSourceInfo(uint16_t* rtp_port,
26467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                        uint16_t* rtcp_port,
26567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                        char* ip_address,
26667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                        uint32_t ip_address_length);
26767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org
2687fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org  int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC);
26967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org
27067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t StartSend();
27167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t StopSend();
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool Sending();
27367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t StartReceive();
27467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t StopReceive();
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
27667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterSendTransport(Transport* transport);
27767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t DeregisterSendTransport();
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Incoming packet from external transport.
28067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t ReceivedRTPPacket(const void* rtp_packet,
281efeb8ce7e183005e557a2d107203e2057cec26a8wu@webrtc.org                            const int32_t rtp_packet_length,
282efeb8ce7e183005e557a2d107203e2057cec26a8wu@webrtc.org                            const PacketTime& packet_time);
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Incoming packet from external transport.
28567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t ReceivedRTCPPacket(const void* rtcp_packet,
28667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                             const int32_t rtcp_packet_length);
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Sets the maximum transfer unit size for the network link, i.e. including
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // IP, UDP and RTP headers.
29067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetMTU(uint16_t mtu);
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns maximum allowed payload size, i.e. the maximum allowed size of
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // encoded data in each packet.
29467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  uint16_t MaxDataPayloadLength() const;
29567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetMaxPacketBurstSize(uint16_t max_number_of_packets);
29667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetPacketBurstSpreadState(bool enable, const uint16_t frame_periodMS);
29767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org
29867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t EnableColorEnhancement(bool enable);
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Gets the modules used by the channel.
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  RtpRtcp* rtp_rtcp();
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
3030329e591cd17957836fd295ae9b31f7d3a73e5e8fischman@webrtc.org  CallStatsObserver* GetStatsObserver();
30478696d33d7711eb8208400908237c384b235bf74mflodman@webrtc.org
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements VCMReceiveCallback.
30667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual int32_t FrameToRender(I420VideoFrame& video_frame);  // NOLINT
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements VCMReceiveCallback.
30967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual int32_t ReceivedDecodedReferenceFrame(
31067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      const uint64_t picture_id);
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
312d893b3fbd858898bd280f94a74854a86a6b91888wuchengli@chromium.org  // Implements VCMReceiveCallback.
313d893b3fbd858898bd280f94a74854a86a6b91888wuchengli@chromium.org  virtual void IncomingCodecChanged(const VideoCodec& codec);
314d893b3fbd858898bd280f94a74854a86a6b91888wuchengli@chromium.org
315ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org  // Implements VCMReceiveStatisticsCallback.
3167fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org  virtual int32_t OnReceiveStatisticsUpdate(const uint32_t bit_rate,
31767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                    const uint32_t frame_rate);
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
319ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org  // Implements VCMDecoderTimingCallback.
320ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org  virtual void OnDecoderTiming(int decode_ms,
321ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                               int max_decode_ms,
322ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                               int current_delay_ms,
323ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                               int target_delay_ms,
324ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                               int jitter_buffer_ms,
325ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                               int min_playout_delay_ms,
326ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                               int render_delay_ms);
327ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements VideoFrameTypeCallback.
32967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual int32_t RequestKeyFrame();
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements VideoFrameTypeCallback.
33267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual int32_t SliceLossIndicationRequest(
33367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      const uint64_t picture_id);
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements VideoPacketRequestCallback.
33667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual int32_t ResendPackets(const uint16_t* sequence_numbers,
33767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                uint16_t length);
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
33967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetVoiceChannel(int32_t ve_channel_id,
34067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                          VoEVideoSync* ve_sync_interface);
34167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t VoiceChannel();
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements ViEFrameProviderBase.
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int FrameCallbackChanged() {return -1;}
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
34667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter);
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
3482e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org  // New-style callbacks, used by VideoReceiveStream.
34963301bd03e009d309d1fdca1217f8708be610f32pbos@webrtc.org  void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback);
3502e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org  void RegisterPreDecodeImageCallback(
3512e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org      EncodedImageCallback* pre_decode_callback);
35263301bd03e009d309d1fdca1217f8708be610f32pbos@webrtc.org
3535fdd10a56c3d7dcf2ea3cb2cd1118f616b783d24sprang@webrtc.org  void RegisterSendFrameCountObserver(FrameCountObserver* observer);
3545fdd10a56c3d7dcf2ea3cb2cd1118f616b783d24sprang@webrtc.org
3552d3624ceb06407a4440433f816612fc150bfea42solenberg@webrtc.org  void ReceivedBWEPacket(int64_t arrival_time_ms, int payload_size,
3562d3624ceb06407a4440433f816612fc150bfea42solenberg@webrtc.org                         const RTPHeader& header);
3572d3624ceb06407a4440433f816612fc150bfea42solenberg@webrtc.org
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected:
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static bool ChannelDecodeThreadFunction(void* obj);
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool ChannelDecodeProcess();
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
36278696d33d7711eb8208400908237c384b235bf74mflodman@webrtc.org  void OnRttUpdate(uint32_t rtt);
36378696d33d7711eb8208400908237c384b235bf74mflodman@webrtc.org
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Assumed to be protected.
36667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t StartDecodeThread();
36767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t StopDecodeThread();
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
36967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t ProcessNACKRequest(const bool enable);
37067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t ProcessFECRequest(const bool enable,
37167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                            const unsigned char payload_typeRED,
37267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                            const unsigned char payload_typeFEC);
3739d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  // Compute NACK list parameters for the buffering mode.
3749d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  int GetRequiredNackListSize(int target_delay_ms);
3756845de7e4eed28e61c3edb263fb4bbcd65ff76fbstefan@webrtc.org  void SetRtxSendStatus(bool enable);
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
37767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t channel_id_;
37867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t engine_id_;
37967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  uint32_t number_of_cores_;
38067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  uint8_t num_socket_threads_;
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Used for all registered callbacks except rendering.
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<CriticalSectionWrapper> callback_cs_;
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<CriticalSectionWrapper> rtp_rtcp_cs_;
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  RtpRtcp* default_rtp_rtcp_;
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Owned modules/classes.
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<RtpRtcp> rtp_rtcp_;
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::list<RtpRtcp*> simulcast_rtp_rtcp_;
39155e6f58d72aafc45106908c1647b00c2904cc21emflodman@webrtc.org  std::list<RtpRtcp*> removed_rtp_rtcp_;
3927f545616b05eed76656b178a0134c20c1aac240cpbos@webrtc.org  VideoCodingModule* const vcm_;
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEReceiver vie_receiver_;
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViESender vie_sender_;
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViESyncModule vie_sync_;
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39778696d33d7711eb8208400908237c384b235bf74mflodman@webrtc.org  // Helper to report call statistics.
39878696d33d7711eb8208400908237c384b235bf74mflodman@webrtc.org  scoped_ptr<ChannelStatsObserver> stats_observer_;
39978696d33d7711eb8208400908237c384b235bf74mflodman@webrtc.org
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Not owned.
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ProcessThread& module_process_thread_;
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEDecoderObserver* codec_observer_;
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool do_key_frame_callbackRequest_;
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViERTPObserver* rtp_observer_;
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViERTCPObserver* rtcp_observer_;
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  RtcpIntraFrameObserver* intra_frame_observer_;
407c4af4cf7814bb773d838aefa476c196e5f1bc360asapersson@webrtc.org  RtcpRttStats* rtt_stats_;
4085e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.org  PacedSender* paced_sender_;
4096845de7e4eed28e61c3edb263fb4bbcd65ff76fbstefan@webrtc.org  bool pad_with_redundant_payloads_;
4105e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.org
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_;
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int send_timestamp_extension_id_;
413453f9c0b3e2c0396b9e519ef37267a2056b65bd2solenberg@webrtc.org  int absolute_send_time_extension_id_;
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  Transport* external_transport_;
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool decoder_reset_;
418d893b3fbd858898bd280f94a74854a86a6b91888wuchengli@chromium.org  // Current receive codec used for codec change callback.
419d893b3fbd858898bd280f94a74854a86a6b91888wuchengli@chromium.org  VideoCodec receive_codec_;
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool wait_for_key_frame_;
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ThreadWrapper* decode_thread_;
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEEffectFilter* effect_filter_;
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool color_enhancement_;
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // User set MTU, -1 if not set.
427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint16_t mtu_;
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const bool sender_;
42916196644914f7b91ba8029c936ca2cf65e771749mikhal@webrtc.org
43016196644914f7b91ba8029c936ca2cf65e771749mikhal@webrtc.org  int nack_history_size_sender_;
4319d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  int max_nack_reordering_threshold_;
43263301bd03e009d309d1fdca1217f8708be610f32pbos@webrtc.org  I420FrameCallback* pre_render_callback_;
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
438