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
117623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#ifndef WEBRTC_VIDEO_VIE_CHANNEL_H_
127623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#define WEBRTC_VIDEO_VIE_CHANNEL_H_
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
141da1ce0da5fcc029dbc2a134a9760e1b398b02d7pwestin@webrtc.org#include <list>
150fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org#include <map>
160fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org#include <vector>
171da1ce0da5fcc029dbc2a134a9760e1b398b02d7pwestin@webrtc.org
188c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström#include "webrtc/base/platform_thread.h"
1900b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
2026b08605e2b99136fcc1cab0800234f469d6e236Peter Boström#include "webrtc/base/scoped_ref_ptr.h"
2182dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
22ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
23ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
242557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/video_coding/include/video_coding_defines.h"
2598f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
2698f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/tick_util.h"
2782dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/typedefs.h"
287623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#include "webrtc/video/vie_receiver.h"
297623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#include "webrtc/video/vie_sync_module.h"
30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
3103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.orgnamespace webrtc {
32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
33aea96d36e3691de0f95734f6d88bb94474903b34fischman@webrtc.orgclass CallStatsObserver;
347c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.orgclass ChannelStatsObserver;
357707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass Config;
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass CriticalSectionWrapper;
374070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.orgclass EncodedImageCallback;
38fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.orgclass I420FrameCallback;
39c4188fd3c74688264621393fc622cb81c042c1acPeter Boströmclass IncomingVideoStream;
40571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.orgclass PacedSender;
41e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmerclass PacketRouter;
4202270cd718fd2047bbbf99fbe344e3d988480b57mflodman@webrtc.orgclass PayloadRouter;
43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ProcessThread;
44ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.orgclass ReceiveStatisticsProxy;
45823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgclass ReportBlockStats;
461ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.orgclass RtcpRttStats;
4796abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.orgclass ViEChannelProtectionCallback;
48470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViERTPObserver;
497707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoCodingModule;
507707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoDecoder;
517707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoRenderCallback;
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass VoEVideoSync;
53470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
54300eeb68f55c5091c7045e377578586733cddf16Peter Boströmenum StreamType {
55300eeb68f55c5091c7045e377578586733cddf16Peter Boström  kViEStreamTypeNormal = 0,  // Normal media stream
56300eeb68f55c5091c7045e377578586733cddf16Peter Boström  kViEStreamTypeRtx = 1      // Retransmission media stream
57300eeb68f55c5091c7045e377578586733cddf16Peter Boström};
58300eeb68f55c5091c7045e377578586733cddf16Peter Boström
5936a1438a66b74628c1f9f3c4d3ea322156958169Peter Boströmclass ViEChannel : public VCMFrameTypeCallback,
6036a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström                   public VCMReceiveCallback,
6136a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström                   public VCMReceiveStatisticsCallback,
6236a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström                   public VCMDecoderTimingCallback,
6336a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström                   public VCMPacketRequestCallback,
6436a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström                   public RtpFeedback {
6503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public:
667c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org  friend class ChannelStatsObserver;
6796abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  friend class ViEChannelProtectionCallback;
687c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
69ac547a653862744d0aae560713f8418ad2852085Peter Boström  ViEChannel(uint32_t number_of_cores,
702251d6e17438e1a085ff4f88ad19de513214bec1Peter Boström             Transport* transport,
71d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström             ProcessThread* module_process_thread,
7249888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org             RtcpIntraFrameObserver* intra_frame_observer,
732853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org             RtcpBandwidthObserver* bandwidth_observer,
745e023eb337eed9746ecea7fc6fbb0fca386f1961sprang             TransportFeedbackObserver* transport_feedback_observer,
759354cc965c04a0c79ea36622043751596a6fd015stefan@webrtc.org             RemoteBitrateEstimator* remote_bitrate_estimator,
761ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.org             RtcpRttStats* rtt_stats,
77571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org             PacedSender* paced_sender,
78e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer             PacketRouter* packet_router,
79d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström             size_t max_rtp_streams,
80d6fc47ea9585fa405d8617ccc0b7704d2c9e8a0apbos             bool sender);
8103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ~ViEChannel();
8203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
83b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t Init();
8403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
8503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the encoder to use for the channel. |new_stream| indicates the encoder
8603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // type has changed and we should start a new RTP stream.
87b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSendCodec(const VideoCodec& video_codec, bool new_stream = true);
88b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetReceiveCodec(const VideoCodec& video_codec);
89796cfaf7f76aa740cc7f4bb2c94f88637e475324perkj  // Registers an external decoder.
90796cfaf7f76aa740cc7f4bb2c94f88637e475324perkj  void RegisterExternalDecoder(const uint8_t pl_type, VideoDecoder* decoder);
91b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceiveCodecStatistics(uint32_t* num_key_frames,
92b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                 uint32_t* num_delta_frames);
93b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  uint32_t DiscardedPackets() const;
9403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
954aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org  // Returns the estimated delay in milliseconds.
964aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org  int ReceiveDelay() const;
974aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org
98796cfaf7f76aa740cc7f4bb2c94f88637e475324perkj  void SetExpectedRenderDelay(int delay_ms);
99796cfaf7f76aa740cc7f4bb2c94f88637e475324perkj
100da903eaabbb6c6830efcafc3c2ade1d36f511e43pbos  void SetRTCPMode(const RtcpMode rtcp_mode);
101ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos  void SetProtectionMode(bool enable_nack,
102ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos                         bool enable_fec,
103ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos                         int payload_type_red,
104ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos                         int payload_type_fec);
10596abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  bool IsSendingFecEnabled();
106ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int SetSenderBufferingMode(int target_delay_ms);
10790071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org  int SetSendTimestampOffsetStatus(bool enable, int id);
10890071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org  int SetReceiveTimestampOffsetStatus(bool enable, int id);
109cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org  int SetSendAbsoluteSendTimeStatus(bool enable, int id);
110cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org  int SetReceiveAbsoluteSendTimeStatus(bool enable, int id);
111fdd10579496123c9a7fdc0bf185e2a26a12ed340guoweis@webrtc.org  int SetSendVideoRotationStatus(bool enable, int id);
112fdd10579496123c9a7fdc0bf185e2a26a12ed340guoweis@webrtc.org  int SetReceiveVideoRotationStatus(bool enable, int id);
113867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  int SetSendTransportSequenceNumber(bool enable, int id);
114867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  int SetReceiveTransportSequenceNumber(bool enable, int id);
1158d02f5dc7146ebc35c30fc3f7e1cbfa6802486a2asapersson@webrtc.org  void SetRtcpXrRrtrStatus(bool enable);
116d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void EnableTMMBR(bool enable);
11703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
11803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets SSRC for outgoing stream.
119b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSSRC(const uint32_t SSRC,
120b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                  const StreamType usage,
121b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                  const unsigned char simulcast_idx);
12203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
123d6ec386ff56a47b685c0a0d1ce0ce17ac7745ff9mflodman@webrtc.org  // Gets SSRC for outgoing stream number |idx|.
124b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetLocalSSRC(uint8_t idx, unsigned int* ssrc);
12503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
12603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets SSRC for the incoming stream.
127949c2f04b4156095090e02f3f13613aadacce88dmflodman  uint32_t GetRemoteSSRC();
12803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
129e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  int SetRtxSendPayloadType(int payload_type, int associated_payload_type);
130e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  void SetRtxReceivePayloadType(int payload_type, int associated_payload_type);
13165220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // If set to true, the RTX payload type mapping supplied in
13265220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // |SetRtxReceivePayloadType| will be used when restoring RTX packets. Without
13365220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // it, RTX packets will always be restored to the last non-RTX packet payload
13465220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // type received.
13565220a70a38ffe252b587775c5e9104606ab7c2cnoahric  void SetUseRtxPayloadMappingOnRestore(bool val);
1369f5ebb525130f207229dfa350ce8c2bdd22163c7mflodman@webrtc.org
1372bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  void SetRtpStateForSsrc(uint32_t ssrc, const RtpState& rtp_state);
1382bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  RtpState GetRtpStateForSsrc(uint32_t ssrc);
1392bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org
14003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the CName for the outgoing stream on the channel.
1419ba52f89acd1b9bc88115880dfe2716147bf3b5dPeter Boström  int32_t SetRTCPCName(const char* rtcp_cname);
14203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
14303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets the CName of the incoming stream.
144b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRemoteRTCPCName(char rtcp_cname[]);
14503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
14660c9bbd976a1eb11375de597dcacd4a9d81455e7perkj@webrtc.org  // Returns statistics reported by the remote client in an RTCP packet.
1479d8b71e4c094efb73837fb90ad8669b811c6845aPeter Boström  // TODO(pbos): Remove this along with VideoSendStream::GetRtt().
148b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetSendRtcpStatistics(uint16_t* fraction_lost,
149b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* cumulative_lost,
150b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* extended_max,
151b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* jitter_samples,
15216825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org                                int64_t* rtt_ms);
15303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
154a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org  // Called on receipt of RTCP report block from remote side.
155a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org  void RegisterSendChannelRtcpStatisticsCallback(
156a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org      RtcpStatisticsCallback* callback);
157a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org
15854ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org  // Called on generation of RTCP stats
15954ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org  void RegisterReceiveChannelRtcpStatisticsCallback(
16054ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org      RtcpStatisticsCallback* callback);
16154ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org
16297d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org  // Gets send statistics for the rtp and rtx stream.
16397d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org  void GetSendStreamDataCounters(StreamDataCounters* rtp_counters,
16497d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org                                 StreamDataCounters* rtx_counters) const;
16597d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org
166d952c40c7e31c1603988c1f09ebfba9f17c6a866asapersson@webrtc.org  // Gets received stream data counters.
16797d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org  void GetReceiveStreamDataCounters(StreamDataCounters* rtp_counters,
16897d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org                                    StreamDataCounters* rtx_counters) const;
169d952c40c7e31c1603988c1f09ebfba9f17c6a866asapersson@webrtc.org
170ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  // Called on update of RTP statistics.
171ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  void RegisterSendChannelRtpStatisticsCallback(
1720e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org      StreamDataCountersCallback* callback);
1730e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org
1740e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org  // Called on update of RTP statistics.
1750e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org  void RegisterReceiveChannelRtpStatisticsCallback(
176ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org      StreamDataCountersCallback* callback);
177ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org
178352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson  void GetSendRtcpPacketTypeCounter(
179352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson      RtcpPacketTypeCounter* packet_counter) const;
180352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
181352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson  void GetReceiveRtcpPacketTypeCounter(
182352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson      RtcpPacketTypeCounter* packet_counter) const;
1838098e0747879b191335e8de1e16b87cf6adbdf54asapersson@webrtc.org
184168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  void RegisterSendSideDelayObserver(SendSideDelayObserver* observer);
1853e820e5109cf34b2bdb216a637a92a6ce8904816mflodman@webrtc.org
1866811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org  // Called on any new send bitrate estimate.
1876811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org  void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer);
1886811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org
18903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements RtpFeedback.
190ac547a653862744d0aae560713f8418ad2852085Peter Boström  int32_t OnInitializeDecoder(const int8_t payload_type,
191ac547a653862744d0aae560713f8418ad2852085Peter Boström                              const char payload_name[RTP_PAYLOAD_NAME_SIZE],
192ac547a653862744d0aae560713f8418ad2852085Peter Boström                              const int frequency,
1936955870806624479723addfae6dcf5d13968796cPeter Kasting                              const size_t channels,
194ac547a653862744d0aae560713f8418ad2852085Peter Boström                              const uint32_t rate) override;
195ac547a653862744d0aae560713f8418ad2852085Peter Boström  void OnIncomingSSRCChanged(const uint32_t ssrc) override;
196ac547a653862744d0aae560713f8418ad2852085Peter Boström  void OnIncomingCSRCChanged(const uint32_t CSRC, const bool added) override;
19703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
198822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC);
199b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org
200b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StartSend();
201b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StopSend();
20203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool Sending();
203cd4a9bd22596c624e5a7f2646a80a40317451882pbos  void StartReceive();
204cd4a9bd22596c624e5a7f2646a80a40317451882pbos  void StopReceive();
20503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
206b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceivedRTPPacket(const void* rtp_packet,
2074591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                            const size_t rtp_packet_length,
208a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org                            const PacketTime& packet_time);
209b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceivedRTCPPacket(const void* rtcp_packet,
2104591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                             const size_t rtcp_packet_length);
21103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
21203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the maximum transfer unit size for the network link, i.e. including
21303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // IP, UDP and RTP headers.
214b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetMTU(uint16_t mtu);
21503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
21684dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org  // Gets the modules used by the channel.
21784dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org  RtpRtcp* rtp_rtcp();
21826b08605e2b99136fcc1cab0800234f469d6e236Peter Boström  rtc::scoped_refptr<PayloadRouter> send_payload_router();
21996abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  VCMProtectionCallback* vcm_protection_callback();
22096abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org
22184dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org
222aea96d36e3691de0f95734f6d88bb94474903b34fischman@webrtc.org  CallStatsObserver* GetStatsObserver();
2237c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
22403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VCMReceiveCallback.
2254765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez  virtual int32_t FrameToRender(VideoFrame& video_frame);  // NOLINT
22603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
22703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VCMReceiveCallback.
228b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t ReceivedDecodedReferenceFrame(
229b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint64_t picture_id);
23003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
2310d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org  // Implements VCMReceiveCallback.
232f42376c60111edba6f29060bf3dd79e75d8dbb97pbos  void OnIncomingPayloadType(int payload_type) override;
233b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström  void OnDecoderImplementationName(const char* implementation_name) override;
2340d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org
23537bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  // Implements VCMReceiveStatisticsCallback.
23614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void OnReceiveRatesUpdated(uint32_t bit_rate, uint32_t frame_rate) override;
23714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void OnDiscardedPacketsUpdated(int discarded_packets) override;
23814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void OnFrameCountsUpdated(const FrameCounts& frame_counts) override;
23903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
24037bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  // Implements VCMDecoderTimingCallback.
24137bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  virtual void OnDecoderTiming(int decode_ms,
24237bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int max_decode_ms,
24337bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int current_delay_ms,
24437bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int target_delay_ms,
24537bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int jitter_buffer_ms,
24637bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int min_playout_delay_ms,
24737bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int render_delay_ms);
24837bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org
24922993e1a0c114122fc1b9de0fc74d4096ec868bdpbos  // Implements FrameTypeCallback.
250b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t RequestKeyFrame();
25103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
25222993e1a0c114122fc1b9de0fc74d4096ec868bdpbos  // Implements FrameTypeCallback.
253b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t SliceLossIndicationRequest(
254b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint64_t picture_id);
25503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
25603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VideoPacketRequestCallback.
257d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  int32_t ResendPackets(const uint16_t* sequence_numbers,
258d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström                        uint16_t length) override;
25903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
260b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetVoiceChannel(int32_t ve_channel_id,
261b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                          VoEVideoSync* ve_sync_interface);
262b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t VoiceChannel();
26303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
2644070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org  // New-style callbacks, used by VideoReceiveStream.
265fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org  void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback);
2664070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org  void RegisterPreDecodeImageCallback(
2674070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org      EncodedImageCallback* pre_decode_callback);
268fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org
26971f055fb41336316324942f828e022e2f7d93ec7sprang@webrtc.org  void RegisterSendFrameCountObserver(FrameCountObserver* observer);
2701d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  void RegisterRtcpPacketTypeCounterObserver(
2711d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      RtcpPacketTypeCounterObserver* observer);
272ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org  void RegisterReceiveStatisticsProxy(
273ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org      ReceiveStatisticsProxy* receive_statistics_proxy);
274c4188fd3c74688264621393fc622cb81c042c1acPeter Boström  void SetIncomingVideoStream(IncomingVideoStream* incoming_video_stream);
2753fb8f7bbb0c5e074d0744c57905c5f49bb7d8304solenberg@webrtc.org
27603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org protected:
27703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  static bool ChannelDecodeThreadFunction(void* obj);
27803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool ChannelDecodeProcess();
27903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
2802328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms);
2817c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
28296abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  int ProtectionRequest(const FecProtectionParams* delta_fec_params,
28396abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        const FecProtectionParams* key_fec_params,
28496abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        uint32_t* sent_video_rate_bps,
28596abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        uint32_t* sent_nack_rate_bps,
28696abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        uint32_t* sent_fec_rate_bps);
28796abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org
28803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org private:
289d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  static std::vector<RtpRtcp*> CreateRtpRtcpModules(
290d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      bool receiver_only,
291d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      ReceiveStatistics* receive_statistics,
292d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      Transport* outgoing_transport,
293d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      RtcpIntraFrameObserver* intra_frame_callback,
294d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      RtcpBandwidthObserver* bandwidth_callback,
2955e023eb337eed9746ecea7fc6fbb0fca386f1961sprang      TransportFeedbackObserver* transport_feedback_callback,
296d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      RtcpRttStats* rtt_stats,
297d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer,
298d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      RemoteBitrateEstimator* remote_bitrate_estimator,
299ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang      RtpPacketSender* paced_sender,
300ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang      TransportSequenceNumberAllocator* transport_sequence_number_allocator,
301d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      BitrateStatisticsObserver* send_bitrate_observer,
302d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      FrameCountObserver* send_frame_count_observer,
303d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      SendSideDelayObserver* send_side_delay_observer,
304d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      size_t num_modules);
305d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström
30603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Assumed to be protected.
307cd4a9bd22596c624e5a7f2646a80a40317451882pbos  void StartDecodeThread();
308cd4a9bd22596c624e5a7f2646a80a40317451882pbos  void StopDecodeThread();
30903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
310ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos  void ProcessNACKRequest(const bool enable);
311ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  // Compute NACK list parameters for the buffering mode.
312ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int GetRequiredNackListSize(int target_delay_ms);
313fbb567dacd76298c5721eae8d0d2cb46fffc9d31stefan@webrtc.org  void SetRtxSendStatus(bool enable);
31403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
31596dc685143094e5834248b38ca4b03ee9f85d694asapersson@webrtc.org  void UpdateHistograms();
31696dc685143094e5834248b38ca4b03ee9f85d694asapersson@webrtc.org
317d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // ViEChannel exposes methods that allow to modify observers and callbacks
318d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // to be modified. Such an API-style is cumbersome to implement and maintain
319d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // at all the levels when comparing to only setting them at construction. As
320d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // so this class instantiates its children with a wrapper that can be modified
321d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // at a later time.
322d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  template <class T>
323d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  class RegisterableCallback : public T {
324d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org   public:
325d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    RegisterableCallback()
326d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org        : critsect_(CriticalSectionWrapper::CreateCriticalSection()),
327d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org          callback_(NULL) {}
328d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
329d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    void Set(T* callback) {
330d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      CriticalSectionScoped cs(critsect_.get());
331d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      callback_ = callback;
332d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    }
333d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
334d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org   protected:
335d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    // Note: this should be implemented with a RW-lock to allow simultaneous
336d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    // calls into the callback. However that doesn't seem to be needed for the
337d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    // current type of callbacks covered by this class.
33800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org    rtc::scoped_ptr<CriticalSectionWrapper> critsect_;
339d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    T* callback_ GUARDED_BY(critsect_);
340d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
341d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org   private:
3423c089d751ede283e21e186885eaf705c3257ccd2henrikg    RTC_DISALLOW_COPY_AND_ASSIGN(RegisterableCallback);
343d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  };
344d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
3458f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org  class RegisterableBitrateStatisticsObserver:
3468f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org    public RegisterableCallback<BitrateStatisticsObserver> {
3470bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org    virtual void Notify(const BitrateStatistics& total_stats,
3480bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org                        const BitrateStatistics& retransmit_stats,
3490bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org                        uint32_t ssrc) {
350d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      CriticalSectionScoped cs(critsect_.get());
351d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      if (callback_)
3520bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org        callback_->Notify(total_stats, retransmit_stats, ssrc);
353d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    }
3543e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org  } send_bitrate_observer_;
355d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
3568f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org  class RegisterableFrameCountObserver
3578f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org      : public RegisterableCallback<FrameCountObserver> {
358ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org   public:
359ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org    virtual void FrameCountUpdated(const FrameCounts& frame_counts,
360ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org                                   uint32_t ssrc) {
3618f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org      CriticalSectionScoped cs(critsect_.get());
3628f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org      if (callback_)
363ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org        callback_->FrameCountUpdated(frame_counts, ssrc);
3648f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org    }
365ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org
366ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org   private:
36755707692105a4765f8f321ec7c30a1034d03d23apbos@webrtc.org  } send_frame_count_observer_;
3688f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org
369168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  class RegisterableSendSideDelayObserver :
370168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org      public RegisterableCallback<SendSideDelayObserver> {
37114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    void SendSideDelayUpdated(int avg_delay_ms,
37214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                              int max_delay_ms,
37314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                              uint32_t ssrc) override {
374168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org      CriticalSectionScoped cs(critsect_.get());
375168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org      if (callback_)
376168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org        callback_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, ssrc);
377168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org    }
378168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  } send_side_delay_observer_;
379168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org
3801d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  class RegisterableRtcpPacketTypeCounterObserver
3811d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      : public RegisterableCallback<RtcpPacketTypeCounterObserver> {
3821d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org   public:
38314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    void RtcpPacketTypesCounterUpdated(
3841d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        uint32_t ssrc,
3851d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        const RtcpPacketTypeCounter& packet_counter) override {
3861d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      CriticalSectionScoped cs(critsect_.get());
3871d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      if (callback_)
3881d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        callback_->RtcpPacketTypesCounterUpdated(ssrc, packet_counter);
3891d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      counter_map_[ssrc] = packet_counter;
3901d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    }
3911d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org
3921d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    virtual std::map<uint32_t, RtcpPacketTypeCounter> GetPacketTypeCounterMap()
3931d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        const {
3941d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      CriticalSectionScoped cs(critsect_.get());
3951d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      return counter_map_;
3961d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    }
3971d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org
3981d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org   private:
3991d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    std::map<uint32_t, RtcpPacketTypeCounter> counter_map_
4001d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        GUARDED_BY(critsect_);
4011d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  } rtcp_packet_type_counter_observer_;
4021d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org
403d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const uint32_t number_of_cores_;
404d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const bool sender_;
405d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström
406d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  ProcessThread* const module_process_thread_;
40703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
40803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Used for all registered callbacks except rendering.
409d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  rtc::scoped_ptr<CriticalSectionWrapper> crit_;
410470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
4112853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  // Owned modules/classes.
41226b08605e2b99136fcc1cab0800234f469d6e236Peter Boström  rtc::scoped_refptr<PayloadRouter> send_payload_router_;
41300b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<ViEChannelProtectionCallback> vcm_protection_callback_;
41402270cd718fd2047bbbf99fbe344e3d988480b57mflodman@webrtc.org
4156e98ef4b35aa63383c9b232e27532df7ebe909c6pbos@webrtc.org  VideoCodingModule* const vcm_;
4162853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  ViEReceiver vie_receiver_;
4172853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  ViESyncModule vie_sync_;
418470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
4197c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org  // Helper to report call statistics.
42000b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<ChannelStatsObserver> stats_observer_;
4217c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
42203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Not owned.
423f42376c60111edba6f29060bf3dd79e75d8dbb97pbos  ReceiveStatisticsProxy* receive_stats_callback_ GUARDED_BY(crit_);
424d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  FrameCounts receive_frame_counts_ GUARDED_BY(crit_);
425d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  IncomingVideoStream* incoming_video_stream_ GUARDED_BY(crit_);
426d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  RtcpIntraFrameObserver* const intra_frame_observer_;
427d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  RtcpRttStats* const rtt_stats_;
428d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  PacedSender* const paced_sender_;
429d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  PacketRouter* const packet_router_;
430d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström
431d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const rtc::scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_;
4325e023eb337eed9746ecea7fc6fbb0fca386f1961sprang  TransportFeedbackObserver* const transport_feedback_observer_;
433d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström
4348c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  rtc::PlatformThread decode_thread_;
435470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
436dbe97d25500170e4a830f2276096323c3a3c3269mikhal@webrtc.org  int nack_history_size_sender_;
437ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int max_nack_reordering_threshold_;
438d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  I420FrameCallback* pre_render_callback_ GUARDED_BY(crit_);
439d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström
440d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const rtc::scoped_ptr<ReportBlockStats> report_block_stats_sender_;
44158e2d262fc6a67d069f6c5b8c5043748570521f9stefan@webrtc.org
4422328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan  int64_t time_of_first_rtt_ms_ GUARDED_BY(crit_);
4432328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan  int64_t rtt_sum_ms_ GUARDED_BY(crit_);
44413c433c299822c6f2aefef46fa6aca52ec46ea49asapersson  int64_t last_rtt_ms_ GUARDED_BY(crit_);
4452328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan  size_t num_rtts_ GUARDED_BY(crit_);
4462328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan
447d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  // RtpRtcp modules, declared last as they use other members on construction.
448d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const std::vector<RtpRtcp*> rtp_rtcp_modules_;
449d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  size_t num_active_rtp_rtcp_modules_ GUARDED_BY(crit_);
45003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org};
451470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
45203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org}  // namespace webrtc
453470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
4547623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#endif  // WEBRTC_VIDEO_VIE_CHANNEL_H_
455