vie_channel.h revision 65220a70a38ffe252b587775c5e9104606ab7c2c
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
1600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
1726b08605e2b99136fcc1cab0800234f469d6e236Peter Boström#include "webrtc/base/scoped_ref_ptr.h"
1882dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
19ece3890d3a40fe911ae895e28c329491e795b14dpbos@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
2082dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
2182dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
22d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
2382dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/system_wrappers/interface/tick_util.h"
2482dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/typedefs.h"
2582dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_defines.h"
2682dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_receiver.h"
2782dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_sync_module.h"
28470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.orgnamespace webrtc {
30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
31aea96d36e3691de0f95734f6d88bb94474903b34fischman@webrtc.orgclass CallStatsObserver;
327c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.orgclass ChannelStatsObserver;
337707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass Config;
34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass CriticalSectionWrapper;
354070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.orgclass EncodedImageCallback;
36fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.orgclass I420FrameCallback;
37c4188fd3c74688264621393fc622cb81c042c1acPeter Boströmclass IncomingVideoStream;
38571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.orgclass PacedSender;
39e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmerclass PacketRouter;
4002270cd718fd2047bbbf99fbe344e3d988480b57mflodman@webrtc.orgclass PayloadRouter;
41470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ProcessThread;
42ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.orgclass ReceiveStatisticsProxy;
43823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgclass ReportBlockStats;
441ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.orgclass RtcpRttStats;
45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ThreadWrapper;
4696abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.orgclass ViEChannelProtectionCallback;
47470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViERTPObserver;
487707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoCodingModule;
497707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoDecoder;
507707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoRenderCallback;
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass VoEVideoSync;
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
53300eeb68f55c5091c7045e377578586733cddf16Peter Boströmenum StreamType {
54300eeb68f55c5091c7045e377578586733cddf16Peter Boström  kViEStreamTypeNormal = 0,  // Normal media stream
55300eeb68f55c5091c7045e377578586733cddf16Peter Boström  kViEStreamTypeRtx = 1      // Retransmission media stream
56300eeb68f55c5091c7045e377578586733cddf16Peter Boström};
57300eeb68f55c5091c7045e377578586733cddf16Peter Boström
5836a1438a66b74628c1f9f3c4d3ea322156958169Peter Boströmclass ViEChannel : public VCMFrameTypeCallback,
5936a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström                   public VCMReceiveCallback,
6036a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström                   public VCMReceiveStatisticsCallback,
6136a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström                   public VCMDecoderTimingCallback,
6236a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström                   public VCMPacketRequestCallback,
6336a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström                   public RtpFeedback {
6403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public:
657c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org  friend class ChannelStatsObserver;
6696abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  friend class ViEChannelProtectionCallback;
677c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
68ac547a653862744d0aae560713f8418ad2852085Peter Boström  ViEChannel(uint32_t number_of_cores,
692251d6e17438e1a085ff4f88ad19de513214bec1Peter Boström             Transport* transport,
70d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström             ProcessThread* module_process_thread,
7149888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org             RtcpIntraFrameObserver* intra_frame_observer,
722853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org             RtcpBandwidthObserver* bandwidth_observer,
735e023eb337eed9746ecea7fc6fbb0fca386f1961sprang             TransportFeedbackObserver* transport_feedback_observer,
749354cc965c04a0c79ea36622043751596a6fd015stefan@webrtc.org             RemoteBitrateEstimator* remote_bitrate_estimator,
751ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.org             RtcpRttStats* rtt_stats,
76571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org             PacedSender* paced_sender,
77e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer             PacketRouter* packet_router,
78d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström             size_t max_rtp_streams,
79d6fc47ea9585fa405d8617ccc0b7704d2c9e8a0apbos             bool sender);
8003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ~ViEChannel();
8103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
82b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t Init();
8303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
8403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the encoder to use for the channel. |new_stream| indicates the encoder
8503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // type has changed and we should start a new RTP stream.
86b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSendCodec(const VideoCodec& video_codec, bool new_stream = true);
87b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetReceiveCodec(const VideoCodec& video_codec);
8829758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // Registers an external decoder. |buffered_rendering| means that the decoder
8929758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // will render frames after decoding according to the render timestamp
9029758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // provided by the video coding module. |render_delay| indicates the time
9129758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // needed to decode and render a frame.
92b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterExternalDecoder(const uint8_t pl_type,
93b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                  VideoDecoder* decoder,
94b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                  bool buffered_rendering,
95b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                  int32_t render_delay);
96b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t DeRegisterExternalDecoder(const uint8_t pl_type);
97b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceiveCodecStatistics(uint32_t* num_key_frames,
98b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                 uint32_t* num_delta_frames);
99b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  uint32_t DiscardedPackets() const;
10003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
1014aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org  // Returns the estimated delay in milliseconds.
1024aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org  int ReceiveDelay() const;
1034aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org
104da903eaabbb6c6830efcafc3c2ade1d36f511e43pbos  void SetRTCPMode(const RtcpMode rtcp_mode);
105ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos  void SetProtectionMode(bool enable_nack,
106ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos                         bool enable_fec,
107ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos                         int payload_type_red,
108ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos                         int payload_type_fec);
10996abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  bool IsSendingFecEnabled();
110ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int SetSenderBufferingMode(int target_delay_ms);
111ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int SetReceiverBufferingMode(int target_delay_ms);
112d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void EnableRemb(bool enable);
11390071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org  int SetSendTimestampOffsetStatus(bool enable, int id);
11490071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org  int SetReceiveTimestampOffsetStatus(bool enable, int id);
115cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org  int SetSendAbsoluteSendTimeStatus(bool enable, int id);
116cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org  int SetReceiveAbsoluteSendTimeStatus(bool enable, int id);
117fdd10579496123c9a7fdc0bf185e2a26a12ed340guoweis@webrtc.org  int SetSendVideoRotationStatus(bool enable, int id);
118fdd10579496123c9a7fdc0bf185e2a26a12ed340guoweis@webrtc.org  int SetReceiveVideoRotationStatus(bool enable, int id);
119867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  int SetSendTransportSequenceNumber(bool enable, int id);
120867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  int SetReceiveTransportSequenceNumber(bool enable, int id);
1218d02f5dc7146ebc35c30fc3f7e1cbfa6802486a2asapersson@webrtc.org  void SetRtcpXrRrtrStatus(bool enable);
122d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void EnableTMMBR(bool enable);
12303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
12403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets SSRC for outgoing stream.
125b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSSRC(const uint32_t SSRC,
126b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                  const StreamType usage,
127b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                  const unsigned char simulcast_idx);
12803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
129d6ec386ff56a47b685c0a0d1ce0ce17ac7745ff9mflodman@webrtc.org  // Gets SSRC for outgoing stream number |idx|.
130b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetLocalSSRC(uint8_t idx, unsigned int* ssrc);
13103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
13203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets SSRC for the incoming stream.
133b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRemoteSSRC(uint32_t* ssrc);
13403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
135e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  int SetRtxSendPayloadType(int payload_type, int associated_payload_type);
136e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  void SetRtxReceivePayloadType(int payload_type, int associated_payload_type);
13765220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // If set to true, the RTX payload type mapping supplied in
13865220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // |SetRtxReceivePayloadType| will be used when restoring RTX packets. Without
13965220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // it, RTX packets will always be restored to the last non-RTX packet payload
14065220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // type received.
14165220a70a38ffe252b587775c5e9104606ab7c2cnoahric  void SetUseRtxPayloadMappingOnRestore(bool val);
1429f5ebb525130f207229dfa350ce8c2bdd22163c7mflodman@webrtc.org
1432bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  void SetRtpStateForSsrc(uint32_t ssrc, const RtpState& rtp_state);
1442bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  RtpState GetRtpStateForSsrc(uint32_t ssrc);
1452bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org
14603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the CName for the outgoing stream on the channel.
1479ba52f89acd1b9bc88115880dfe2716147bf3b5dPeter Boström  int32_t SetRTCPCName(const char* rtcp_cname);
14803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
14903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets the CName of the incoming stream.
150b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRemoteRTCPCName(char rtcp_cname[]);
15103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
15260c9bbd976a1eb11375de597dcacd4a9d81455e7perkj@webrtc.org  // Returns statistics reported by the remote client in an RTCP packet.
1539d8b71e4c094efb73837fb90ad8669b811c6845aPeter Boström  // TODO(pbos): Remove this along with VideoSendStream::GetRtt().
154b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetSendRtcpStatistics(uint16_t* fraction_lost,
155b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* cumulative_lost,
156b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* extended_max,
157b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* jitter_samples,
15816825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org                                int64_t* rtt_ms);
15903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
160a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org  // Called on receipt of RTCP report block from remote side.
161a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org  void RegisterSendChannelRtcpStatisticsCallback(
162a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org      RtcpStatisticsCallback* callback);
163a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org
16454ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org  // Called on generation of RTCP stats
16554ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org  void RegisterReceiveChannelRtcpStatisticsCallback(
16654ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org      RtcpStatisticsCallback* callback);
16754ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org
16897d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org  // Gets send statistics for the rtp and rtx stream.
16997d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org  void GetSendStreamDataCounters(StreamDataCounters* rtp_counters,
17097d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org                                 StreamDataCounters* rtx_counters) const;
17197d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org
172d952c40c7e31c1603988c1f09ebfba9f17c6a866asapersson@webrtc.org  // Gets received stream data counters.
17397d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org  void GetReceiveStreamDataCounters(StreamDataCounters* rtp_counters,
17497d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org                                    StreamDataCounters* rtx_counters) const;
175d952c40c7e31c1603988c1f09ebfba9f17c6a866asapersson@webrtc.org
176ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  // Called on update of RTP statistics.
177ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  void RegisterSendChannelRtpStatisticsCallback(
1780e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org      StreamDataCountersCallback* callback);
1790e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org
1800e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org  // Called on update of RTP statistics.
1810e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org  void RegisterReceiveChannelRtpStatisticsCallback(
182ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org      StreamDataCountersCallback* callback);
183ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org
184352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson  void GetSendRtcpPacketTypeCounter(
185352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson      RtcpPacketTypeCounter* packet_counter) const;
186352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
187352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson  void GetReceiveRtcpPacketTypeCounter(
188352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson      RtcpPacketTypeCounter* packet_counter) const;
1898098e0747879b191335e8de1e16b87cf6adbdf54asapersson@webrtc.org
190168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  void RegisterSendSideDelayObserver(SendSideDelayObserver* observer);
1913e820e5109cf34b2bdb216a637a92a6ce8904816mflodman@webrtc.org
1926811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org  // Called on any new send bitrate estimate.
1936811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org  void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer);
1946811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org
19503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements RtpFeedback.
196ac547a653862744d0aae560713f8418ad2852085Peter Boström  int32_t OnInitializeDecoder(const int8_t payload_type,
197ac547a653862744d0aae560713f8418ad2852085Peter Boström                              const char payload_name[RTP_PAYLOAD_NAME_SIZE],
198ac547a653862744d0aae560713f8418ad2852085Peter Boström                              const int frequency,
199ac547a653862744d0aae560713f8418ad2852085Peter Boström                              const uint8_t channels,
200ac547a653862744d0aae560713f8418ad2852085Peter Boström                              const uint32_t rate) override;
201ac547a653862744d0aae560713f8418ad2852085Peter Boström  void OnIncomingSSRCChanged(const uint32_t ssrc) override;
202ac547a653862744d0aae560713f8418ad2852085Peter Boström  void OnIncomingCSRCChanged(const uint32_t CSRC, const bool added) override;
20303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
204822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC);
205b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org
206b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StartSend();
207b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StopSend();
20803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool Sending();
209cd4a9bd22596c624e5a7f2646a80a40317451882pbos  void StartReceive();
210cd4a9bd22596c624e5a7f2646a80a40317451882pbos  void StopReceive();
21103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
212b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceivedRTPPacket(const void* rtp_packet,
2134591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                            const size_t rtp_packet_length,
214a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org                            const PacketTime& packet_time);
215b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceivedRTCPPacket(const void* rtcp_packet,
2164591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                             const size_t rtcp_packet_length);
21703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
21803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the maximum transfer unit size for the network link, i.e. including
21903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // IP, UDP and RTP headers.
220b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetMTU(uint16_t mtu);
22103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
22284dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org  // Gets the modules used by the channel.
22384dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org  RtpRtcp* rtp_rtcp();
22426b08605e2b99136fcc1cab0800234f469d6e236Peter Boström  rtc::scoped_refptr<PayloadRouter> send_payload_router();
22596abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  VCMProtectionCallback* vcm_protection_callback();
22696abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org
22784dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org
228aea96d36e3691de0f95734f6d88bb94474903b34fischman@webrtc.org  CallStatsObserver* GetStatsObserver();
2297c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
23003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VCMReceiveCallback.
2314765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez  virtual int32_t FrameToRender(VideoFrame& video_frame);  // NOLINT
23203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
23303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VCMReceiveCallback.
234b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t ReceivedDecodedReferenceFrame(
235b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint64_t picture_id);
23603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
2370d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org  // Implements VCMReceiveCallback.
238f42376c60111edba6f29060bf3dd79e75d8dbb97pbos  void OnIncomingPayloadType(int payload_type) override;
2390d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org
24037bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  // Implements VCMReceiveStatisticsCallback.
24114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void OnReceiveRatesUpdated(uint32_t bit_rate, uint32_t frame_rate) override;
24214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void OnDiscardedPacketsUpdated(int discarded_packets) override;
24314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void OnFrameCountsUpdated(const FrameCounts& frame_counts) override;
24403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
24537bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  // Implements VCMDecoderTimingCallback.
24637bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  virtual void OnDecoderTiming(int decode_ms,
24737bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int max_decode_ms,
24837bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int current_delay_ms,
24937bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int target_delay_ms,
25037bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int jitter_buffer_ms,
25137bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int min_playout_delay_ms,
25237bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int render_delay_ms);
25337bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org
25403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VideoFrameTypeCallback.
255b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t RequestKeyFrame();
25603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
25703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VideoFrameTypeCallback.
258b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t SliceLossIndicationRequest(
259b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint64_t picture_id);
26003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
26103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VideoPacketRequestCallback.
262d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  int32_t ResendPackets(const uint16_t* sequence_numbers,
263d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström                        uint16_t length) override;
26403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
265b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetVoiceChannel(int32_t ve_channel_id,
266b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                          VoEVideoSync* ve_sync_interface);
267b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t VoiceChannel();
26803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
2694070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org  // New-style callbacks, used by VideoReceiveStream.
270fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org  void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback);
2714070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org  void RegisterPreDecodeImageCallback(
2724070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org      EncodedImageCallback* pre_decode_callback);
273fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org
27471f055fb41336316324942f828e022e2f7d93ec7sprang@webrtc.org  void RegisterSendFrameCountObserver(FrameCountObserver* observer);
2751d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  void RegisterRtcpPacketTypeCounterObserver(
2761d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      RtcpPacketTypeCounterObserver* observer);
277ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org  void RegisterReceiveStatisticsProxy(
278ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org      ReceiveStatisticsProxy* receive_statistics_proxy);
279c4188fd3c74688264621393fc622cb81c042c1acPeter Boström  void SetIncomingVideoStream(IncomingVideoStream* incoming_video_stream);
2803fb8f7bbb0c5e074d0744c57905c5f49bb7d8304solenberg@webrtc.org
28103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org protected:
28203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  static bool ChannelDecodeThreadFunction(void* obj);
28303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool ChannelDecodeProcess();
28403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
2852328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms);
2867c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
28796abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  int ProtectionRequest(const FecProtectionParams* delta_fec_params,
28896abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        const FecProtectionParams* key_fec_params,
28996abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        uint32_t* sent_video_rate_bps,
29096abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        uint32_t* sent_nack_rate_bps,
29196abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        uint32_t* sent_fec_rate_bps);
29296abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org
29303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org private:
294d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  static std::vector<RtpRtcp*> CreateRtpRtcpModules(
295d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      bool receiver_only,
296d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      ReceiveStatistics* receive_statistics,
297d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      Transport* outgoing_transport,
298d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      RtcpIntraFrameObserver* intra_frame_callback,
299d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      RtcpBandwidthObserver* bandwidth_callback,
3005e023eb337eed9746ecea7fc6fbb0fca386f1961sprang      TransportFeedbackObserver* transport_feedback_callback,
301d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      RtcpRttStats* rtt_stats,
302d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer,
303d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      RemoteBitrateEstimator* remote_bitrate_estimator,
304ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang      RtpPacketSender* paced_sender,
305ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang      TransportSequenceNumberAllocator* transport_sequence_number_allocator,
306d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      BitrateStatisticsObserver* send_bitrate_observer,
307d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      FrameCountObserver* send_frame_count_observer,
308d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      SendSideDelayObserver* send_side_delay_observer,
309d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström      size_t num_modules);
310d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström
31103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Assumed to be protected.
312cd4a9bd22596c624e5a7f2646a80a40317451882pbos  void StartDecodeThread();
313cd4a9bd22596c624e5a7f2646a80a40317451882pbos  void StopDecodeThread();
31403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
315ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos  void ProcessNACKRequest(const bool enable);
316ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  // Compute NACK list parameters for the buffering mode.
317ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int GetRequiredNackListSize(int target_delay_ms);
318fbb567dacd76298c5721eae8d0d2cb46fffc9d31stefan@webrtc.org  void SetRtxSendStatus(bool enable);
31903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
32096dc685143094e5834248b38ca4b03ee9f85d694asapersson@webrtc.org  void UpdateHistograms();
32196dc685143094e5834248b38ca4b03ee9f85d694asapersson@webrtc.org
322d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // ViEChannel exposes methods that allow to modify observers and callbacks
323d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // to be modified. Such an API-style is cumbersome to implement and maintain
324d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // at all the levels when comparing to only setting them at construction. As
325d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // so this class instantiates its children with a wrapper that can be modified
326d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // at a later time.
327d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  template <class T>
328d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  class RegisterableCallback : public T {
329d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org   public:
330d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    RegisterableCallback()
331d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org        : critsect_(CriticalSectionWrapper::CreateCriticalSection()),
332d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org          callback_(NULL) {}
333d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
334d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    void Set(T* callback) {
335d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      CriticalSectionScoped cs(critsect_.get());
336d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      callback_ = callback;
337d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    }
338d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
339d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org   protected:
340d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    // Note: this should be implemented with a RW-lock to allow simultaneous
341d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    // calls into the callback. However that doesn't seem to be needed for the
342d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    // current type of callbacks covered by this class.
34300b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org    rtc::scoped_ptr<CriticalSectionWrapper> critsect_;
344d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    T* callback_ GUARDED_BY(critsect_);
345d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
346d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org   private:
3473c089d751ede283e21e186885eaf705c3257ccd2henrikg    RTC_DISALLOW_COPY_AND_ASSIGN(RegisterableCallback);
348d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  };
349d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
3508f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org  class RegisterableBitrateStatisticsObserver:
3518f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org    public RegisterableCallback<BitrateStatisticsObserver> {
3520bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org    virtual void Notify(const BitrateStatistics& total_stats,
3530bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org                        const BitrateStatistics& retransmit_stats,
3540bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org                        uint32_t ssrc) {
355d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      CriticalSectionScoped cs(critsect_.get());
356d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      if (callback_)
3570bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org        callback_->Notify(total_stats, retransmit_stats, ssrc);
358d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    }
3593e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org  } send_bitrate_observer_;
360d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
3618f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org  class RegisterableFrameCountObserver
3628f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org      : public RegisterableCallback<FrameCountObserver> {
363ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org   public:
364ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org    virtual void FrameCountUpdated(const FrameCounts& frame_counts,
365ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org                                   uint32_t ssrc) {
3668f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org      CriticalSectionScoped cs(critsect_.get());
3678f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org      if (callback_)
368ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org        callback_->FrameCountUpdated(frame_counts, ssrc);
3698f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org    }
370ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org
371ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org   private:
37255707692105a4765f8f321ec7c30a1034d03d23apbos@webrtc.org  } send_frame_count_observer_;
3738f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org
374168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  class RegisterableSendSideDelayObserver :
375168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org      public RegisterableCallback<SendSideDelayObserver> {
37614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    void SendSideDelayUpdated(int avg_delay_ms,
37714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                              int max_delay_ms,
37814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                              uint32_t ssrc) override {
379168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org      CriticalSectionScoped cs(critsect_.get());
380168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org      if (callback_)
381168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org        callback_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, ssrc);
382168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org    }
383168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  } send_side_delay_observer_;
384168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org
3851d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  class RegisterableRtcpPacketTypeCounterObserver
3861d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      : public RegisterableCallback<RtcpPacketTypeCounterObserver> {
3871d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org   public:
38814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    void RtcpPacketTypesCounterUpdated(
3891d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        uint32_t ssrc,
3901d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        const RtcpPacketTypeCounter& packet_counter) override {
3911d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      CriticalSectionScoped cs(critsect_.get());
3921d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      if (callback_)
3931d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        callback_->RtcpPacketTypesCounterUpdated(ssrc, packet_counter);
3941d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      counter_map_[ssrc] = packet_counter;
3951d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    }
3961d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org
3971d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    virtual std::map<uint32_t, RtcpPacketTypeCounter> GetPacketTypeCounterMap()
3981d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        const {
3991d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      CriticalSectionScoped cs(critsect_.get());
4001d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      return counter_map_;
4011d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    }
4021d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org
4031d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org   private:
4041d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    std::map<uint32_t, RtcpPacketTypeCounter> counter_map_
4051d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        GUARDED_BY(critsect_);
4061d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  } rtcp_packet_type_counter_observer_;
4071d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org
408d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const uint32_t number_of_cores_;
409d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const bool sender_;
410d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström
411d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  ProcessThread* const module_process_thread_;
41203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
41303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Used for all registered callbacks except rendering.
414d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  rtc::scoped_ptr<CriticalSectionWrapper> crit_;
415470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
4162853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  // Owned modules/classes.
41726b08605e2b99136fcc1cab0800234f469d6e236Peter Boström  rtc::scoped_refptr<PayloadRouter> send_payload_router_;
41800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<ViEChannelProtectionCallback> vcm_protection_callback_;
41902270cd718fd2047bbbf99fbe344e3d988480b57mflodman@webrtc.org
4206e98ef4b35aa63383c9b232e27532df7ebe909c6pbos@webrtc.org  VideoCodingModule* const vcm_;
4212853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  ViEReceiver vie_receiver_;
4222853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  ViESyncModule vie_sync_;
423470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
4247c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org  // Helper to report call statistics.
42500b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<ChannelStatsObserver> stats_observer_;
4267c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
42703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Not owned.
428f42376c60111edba6f29060bf3dd79e75d8dbb97pbos  ReceiveStatisticsProxy* receive_stats_callback_ GUARDED_BY(crit_);
429d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  FrameCounts receive_frame_counts_ GUARDED_BY(crit_);
430d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  IncomingVideoStream* incoming_video_stream_ GUARDED_BY(crit_);
431d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  RtcpIntraFrameObserver* const intra_frame_observer_;
432d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  RtcpRttStats* const rtt_stats_;
433d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  PacedSender* const paced_sender_;
434d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  PacketRouter* const packet_router_;
435d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström
436d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const rtc::scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_;
4375e023eb337eed9746ecea7fc6fbb0fca386f1961sprang  TransportFeedbackObserver* const transport_feedback_observer_;
438d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström
439361981faa86668cd9b20a2837d0b166fc024cd9btommi@webrtc.org  rtc::scoped_ptr<ThreadWrapper> decode_thread_;
440470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
441dbe97d25500170e4a830f2276096323c3a3c3269mikhal@webrtc.org  int nack_history_size_sender_;
442ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int max_nack_reordering_threshold_;
443d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  I420FrameCallback* pre_render_callback_ GUARDED_BY(crit_);
444d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström
445d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const rtc::scoped_ptr<ReportBlockStats> report_block_stats_sender_;
44658e2d262fc6a67d069f6c5b8c5043748570521f9stefan@webrtc.org
4472328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan  int64_t time_of_first_rtt_ms_ GUARDED_BY(crit_);
4482328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan  int64_t rtt_sum_ms_ GUARDED_BY(crit_);
44913c433c299822c6f2aefef46fa6aca52ec46ea49asapersson  int64_t last_rtt_ms_ GUARDED_BY(crit_);
4502328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan  size_t num_rtts_ GUARDED_BY(crit_);
4512328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan
452d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  // RtpRtcp modules, declared last as they use other members on construction.
453d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const std::vector<RtpRtcp*> rtp_rtcp_modules_;
454d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  size_t num_active_rtp_rtcp_modules_ GUARDED_BY(crit_);
45503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org};
456470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
45703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org}  // namespace webrtc
458470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
459e06ca3cef68cec1fa97b3d476c99d98c68f04ff2mflodman@webrtc.org#endif  // WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
460