vie_channel.h revision e62202fedf57b74cc263246c0586ee353978caf8
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"
1782dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
18ece3890d3a40fe911ae895e28c329491e795b14dpbos@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
1982dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
2082dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
21d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
227ac374abd7bafcc6f0a3ef4b4a8952a52c48d2f1mflodman@webrtc.org#include "webrtc/system_wrappers/interface/scoped_refptr.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/include/vie_network.h"
2682dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/include/vie_rtp_rtcp.h"
2782dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_defines.h"
2882dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_frame_provider_base.h"
2982dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_receiver.h"
3082dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_sender.h"
3182dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/video_engine/vie_sync_module.h"
32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
3303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.orgnamespace webrtc {
34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
35aea96d36e3691de0f95734f6d88bb94474903b34fischman@webrtc.orgclass CallStatsObserver;
367c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.orgclass ChannelStatsObserver;
377707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass Config;
38470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass CriticalSectionWrapper;
394070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.orgclass EncodedImageCallback;
40fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.orgclass I420FrameCallback;
41571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.orgclass PacedSender;
42e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmerclass PacketRouter;
4302270cd718fd2047bbbf99fbe344e3d988480b57mflodman@webrtc.orgclass PayloadRouter;
44470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ProcessThread;
45ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.orgclass ReceiveStatisticsProxy;
46823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgclass ReportBlockStats;
471ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.orgclass RtcpRttStats;
48470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ThreadWrapper;
4996abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.orgclass ViEChannelProtectionCallback;
50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViEDecoderObserver;
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViEEffectFilter;
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViERTPObserver;
537707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoCodingModule;
547707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoDecoder;
557707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass VideoRenderCallback;
56470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass VoEVideoSync;
57470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
5803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.orgclass ViEChannel
5903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org    : public VCMFrameTypeCallback,
6003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public VCMReceiveCallback,
6103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public VCMReceiveStatisticsCallback,
6237bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org      public VCMDecoderTimingCallback,
6303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public VCMPacketRequestCallback,
6403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public RtpFeedback,
6503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      public ViEFrameProviderBase {
6603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org public:
677c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org  friend class ChannelStatsObserver;
6896abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  friend class ViEChannelProtectionCallback;
697c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
70b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  ViEChannel(int32_t channel_id,
71b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org             int32_t engine_id,
72b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org             uint32_t number_of_cores,
737707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.org             const Config& config,
7449888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org             ProcessThread& module_process_thread,
7549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org             RtcpIntraFrameObserver* intra_frame_observer,
762853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org             RtcpBandwidthObserver* bandwidth_observer,
779354cc965c04a0c79ea36622043751596a6fd015stefan@webrtc.org             RemoteBitrateEstimator* remote_bitrate_estimator,
781ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.org             RtcpRttStats* rtt_stats,
79571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org             PacedSender* paced_sender,
80e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer             PacketRouter* packet_router,
8140367f984b2922fbfcf58d7e485ac0ef59149768pbos@webrtc.org             bool sender,
8240367f984b2922fbfcf58d7e485ac0ef59149768pbos@webrtc.org             bool disable_default_encoder);
8303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ~ViEChannel();
8403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
85b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t Init();
8603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
8703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the encoder to use for the channel. |new_stream| indicates the encoder
8803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // type has changed and we should start a new RTP stream.
89b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSendCodec(const VideoCodec& video_codec, bool new_stream = true);
90b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetReceiveCodec(const VideoCodec& video_codec);
91b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetReceiveCodec(VideoCodec* video_codec);
92b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterCodecObserver(ViEDecoderObserver* observer);
9329758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // Registers an external decoder. |buffered_rendering| means that the decoder
9429758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // will render frames after decoding according to the render timestamp
9529758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // provided by the video coding module. |render_delay| indicates the time
9629758de9b6313cc4288fbc77c40bce471d3ca5e2pbos@webrtc.org  // needed to decode and render a frame.
97b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterExternalDecoder(const uint8_t pl_type,
98b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                  VideoDecoder* decoder,
99b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                  bool buffered_rendering,
100b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                  int32_t render_delay);
101b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t DeRegisterExternalDecoder(const uint8_t pl_type);
102b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceiveCodecStatistics(uint32_t* num_key_frames,
103b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                 uint32_t* num_delta_frames);
104b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  uint32_t DiscardedPackets() const;
10503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
1064aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org  // Returns the estimated delay in milliseconds.
1074aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org  int ReceiveDelay() const;
1084aee6b637d6830145396e7216ce15314c1feec92mflodman@webrtc.org
10903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Only affects calls to SetReceiveCodec done after this call.
110b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t WaitForKeyFrame(bool wait);
11103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
11203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // If enabled, a key frame request will be sent as soon as there are lost
11303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // packets. If |only_key_frames| are set, requests are only sent for loss in
11403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // key frames.
115b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSignalPacketLossStatus(bool enable, bool only_key_frames);
116b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org
117d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void SetRTCPMode(const RTCPMethod rtcp_mode);
118d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  RTCPMethod GetRTCPMode() const;
119b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetNACKStatus(const bool enable);
120b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetFECStatus(const bool enable,
121b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                       const unsigned char payload_typeRED,
122b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                       const unsigned char payload_typeFEC);
123b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetHybridNACKFECStatus(const bool enable,
124b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                 const unsigned char payload_typeRED,
125b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                 const unsigned char payload_typeFEC);
12696abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  bool IsSendingFecEnabled();
127ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int SetSenderBufferingMode(int target_delay_ms);
128ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int SetReceiverBufferingMode(int target_delay_ms);
129b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetKeyFrameRequestMethod(const KeyFrameRequestMethod method);
130d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void EnableRemb(bool enable);
13190071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org  int SetSendTimestampOffsetStatus(bool enable, int id);
13290071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org  int SetReceiveTimestampOffsetStatus(bool enable, int id);
133cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org  int SetSendAbsoluteSendTimeStatus(bool enable, int id);
134cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org  int SetReceiveAbsoluteSendTimeStatus(bool enable, int id);
135a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  bool GetReceiveAbsoluteSendTimeStatus() const;
136fdd10579496123c9a7fdc0bf185e2a26a12ed340guoweis@webrtc.org  int SetSendVideoRotationStatus(bool enable, int id);
137fdd10579496123c9a7fdc0bf185e2a26a12ed340guoweis@webrtc.org  int SetReceiveVideoRotationStatus(bool enable, int id);
1388d02f5dc7146ebc35c30fc3f7e1cbfa6802486a2asapersson@webrtc.org  void SetRtcpXrRrtrStatus(bool enable);
1395a7507f26af65222bfee8eb0d386ba68d48534e3mflodman@webrtc.org  void SetTransmissionSmoothingStatus(bool enable);
140d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void EnableTMMBR(bool enable);
141b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t EnableKeyFrameRequestCallback(const bool enable);
14203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
14303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets SSRC for outgoing stream.
144b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSSRC(const uint32_t SSRC,
145b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                  const StreamType usage,
146b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                  const unsigned char simulcast_idx);
14703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
148d6ec386ff56a47b685c0a0d1ce0ce17ac7745ff9mflodman@webrtc.org  // Gets SSRC for outgoing stream number |idx|.
149b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetLocalSSRC(uint8_t idx, unsigned int* ssrc);
15003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
15103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets SSRC for the incoming stream.
152b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRemoteSSRC(uint32_t* ssrc);
15303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
15403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets the CSRC for the incoming stream.
155b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRemoteCSRC(uint32_t CSRCs[kRtpCsrcSize]);
15603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
157e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  int SetRtxSendPayloadType(int payload_type, int associated_payload_type);
158e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  void SetRtxReceivePayloadType(int payload_type, int associated_payload_type);
1599f5ebb525130f207229dfa350ce8c2bdd22163c7mflodman@webrtc.org
16003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the starting sequence number, must be called before StartSend.
161b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetStartSequenceNumber(uint16_t sequence_number);
16203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
1632bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  void SetRtpStateForSsrc(uint32_t ssrc, const RtpState& rtp_state);
1642bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  RtpState GetRtpStateForSsrc(uint32_t ssrc);
1652bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org
16603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the CName for the outgoing stream on the channel.
167b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetRTCPCName(const char rtcp_cname[]);
16803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
16903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets the CName of the incoming stream.
170b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetRemoteRTCPCName(char rtcp_cname[]);
171b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterRtpObserver(ViERTPObserver* observer);
172b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SendApplicationDefinedRTCPPacket(
173b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint8_t sub_type,
174b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      uint32_t name,
175b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint8_t* data,
176b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      uint16_t data_length_in_bytes);
17703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
17860c9bbd976a1eb11375de597dcacd4a9d81455e7perkj@webrtc.org  // Returns statistics reported by the remote client in an RTCP packet.
179b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetSendRtcpStatistics(uint16_t* fraction_lost,
180b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* cumulative_lost,
181b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* extended_max,
182b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint32_t* jitter_samples,
18316825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org                                int64_t* rtt_ms);
18403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
185a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org  // Called on receipt of RTCP report block from remote side.
186a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org  void RegisterSendChannelRtcpStatisticsCallback(
187a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org      RtcpStatisticsCallback* callback);
188a6ad6e5b589465f6a51ce46ee87d50e00bfd85b2sprang@webrtc.org
18960c9bbd976a1eb11375de597dcacd4a9d81455e7perkj@webrtc.org  // Returns our localy created statistics of the received RTP stream.
190b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetReceivedRtcpStatistics(uint16_t* fraction_lost,
191b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                    uint32_t* cumulative_lost,
192b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                    uint32_t* extended_max,
193b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                    uint32_t* jitter_samples,
19416825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org                                    int64_t* rtt_ms);
19503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
19654ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org  // Called on generation of RTCP stats
19754ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org  void RegisterReceiveChannelRtcpStatisticsCallback(
19854ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org      RtcpStatisticsCallback* callback);
19954ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org
20003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Gets sent/received packets statistics.
2014591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  int32_t GetRtpStatistics(size_t* bytes_sent,
202b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           uint32_t* packets_sent,
2034591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                           size_t* bytes_received,
204b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           uint32_t* packets_received) const;
205ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org
20697d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org  // Gets send statistics for the rtp and rtx stream.
20797d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org  void GetSendStreamDataCounters(StreamDataCounters* rtp_counters,
20897d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org                                 StreamDataCounters* rtx_counters) const;
20997d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org
210d952c40c7e31c1603988c1f09ebfba9f17c6a866asapersson@webrtc.org  // Gets received stream data counters.
21197d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org  void GetReceiveStreamDataCounters(StreamDataCounters* rtp_counters,
21297d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org                                    StreamDataCounters* rtx_counters) const;
213d952c40c7e31c1603988c1f09ebfba9f17c6a866asapersson@webrtc.org
214ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  // Called on update of RTP statistics.
215ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  void RegisterSendChannelRtpStatisticsCallback(
2160e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org      StreamDataCountersCallback* callback);
2170e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org
2180e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org  // Called on update of RTP statistics.
2190e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org  void RegisterReceiveChannelRtpStatisticsCallback(
220ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org      StreamDataCountersCallback* callback);
221ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org
222352b2d7a19d6313273608c26edf8900e592a3831Ã…sa Persson  void GetSendRtcpPacketTypeCounter(
223352b2d7a19d6313273608c26edf8900e592a3831Ã…sa Persson      RtcpPacketTypeCounter* packet_counter) const;
224352b2d7a19d6313273608c26edf8900e592a3831Ã…sa Persson
225352b2d7a19d6313273608c26edf8900e592a3831Ã…sa Persson  void GetReceiveRtcpPacketTypeCounter(
226352b2d7a19d6313273608c26edf8900e592a3831Ã…sa Persson      RtcpPacketTypeCounter* packet_counter) const;
2278098e0747879b191335e8de1e16b87cf6adbdf54asapersson@webrtc.org
228f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org  void GetBandwidthUsage(uint32_t* total_bitrate_sent,
229f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org                         uint32_t* video_bitrate_sent,
230f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org                         uint32_t* fec_bitrate_sent,
231f5e99db10bcbf6e7997ac67089bf11f6aad4956cmflodman@webrtc.org                         uint32_t* nackBitrateSent) const;
232168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  // TODO(holmer): Deprecated. We should use the SendSideDelayObserver instead
233168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  // to avoid deadlocks.
2340a3c1471b873ea7f81bff2faa7cf0d9e563c7d53stefan@webrtc.org  bool GetSendSideDelay(int* avg_send_delay, int* max_send_delay) const;
235168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  void RegisterSendSideDelayObserver(SendSideDelayObserver* observer);
2363e820e5109cf34b2bdb216a637a92a6ce8904816mflodman@webrtc.org
2376811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org  // Called on any new send bitrate estimate.
2386811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org  void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer);
2396811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org
240b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StartRTPDump(const char file_nameUTF8[1024],
241b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                       RTPDirections direction);
242b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StopRTPDump(RTPDirections direction);
24303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
24403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements RtpFeedback.
245b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t OnInitializeDecoder(
246b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const int32_t id,
247b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const int8_t payload_type,
24839e9659fc6a70f9416205c942d21deea060a8997leozwang@webrtc.org      const char payload_name[RTP_PAYLOAD_NAME_SIZE],
24903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org      const int frequency,
250b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint8_t channels,
251b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint32_t rate);
252b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual void OnIncomingSSRCChanged(const int32_t id,
253286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org                                     const uint32_t ssrc);
254b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual void OnIncomingCSRCChanged(const int32_t id,
255b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                     const uint32_t CSRC,
25603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org                                     const bool added);
257286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org  virtual void ResetStatistics(uint32_t);
25803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
259b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetLocalReceiver(const uint16_t rtp_port,
260b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           const uint16_t rtcp_port,
261b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           const char* ip_address);
262b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetLocalReceiver(uint16_t* rtp_port,
263b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           uint16_t* rtcp_port,
264b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                           char* ip_address) const;
265b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetSendDestination(const char* ip_address,
266b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             const uint16_t rtp_port,
267b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             const uint16_t rtcp_port,
268b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             const uint16_t source_rtp_port,
269b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             const uint16_t source_rtcp_port);
270b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetSendDestination(char* ip_address,
271b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             uint16_t* rtp_port,
272b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             uint16_t* rtcp_port,
273b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             uint16_t* source_rtp_port,
274b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                             uint16_t* source_rtcp_port) const;
275b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t GetSourceInfo(uint16_t* rtp_port,
276b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                        uint16_t* rtcp_port,
277b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                        char* ip_address,
278b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                        uint32_t ip_address_length);
279b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org
280822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC);
281b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org
282b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StartSend();
283b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StopSend();
28403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool Sending();
285b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StartReceive();
286b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StopReceive();
28703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
288b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterSendTransport(Transport* transport);
289b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t DeregisterSendTransport();
29003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
29103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Incoming packet from external transport.
292b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceivedRTPPacket(const void* rtp_packet,
2934591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                            const size_t rtp_packet_length,
294a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org                            const PacketTime& packet_time);
29503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
29603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Incoming packet from external transport.
297b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ReceivedRTCPPacket(const void* rtcp_packet,
2984591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                             const size_t rtcp_packet_length);
29903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
30003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Sets the maximum transfer unit size for the network link, i.e. including
30103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // IP, UDP and RTP headers.
302b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetMTU(uint16_t mtu);
30303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
30403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Returns maximum allowed payload size, i.e. the maximum allowed size of
30503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // encoded data in each packet.
306b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  uint16_t MaxDataPayloadLength() const;
307b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetMaxPacketBurstSize(uint16_t max_number_of_packets);
308b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetPacketBurstSpreadState(bool enable, const uint16_t frame_periodMS);
309b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org
310b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t EnableColorEnhancement(bool enable);
31103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
31284dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org  // Gets the modules used by the channel.
31384dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org  RtpRtcp* rtp_rtcp();
3147ac374abd7bafcc6f0a3ef4b4a8952a52c48d2f1mflodman@webrtc.org  scoped_refptr<PayloadRouter> send_payload_router();
31596abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  VCMProtectionCallback* vcm_protection_callback();
31696abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org
31784dc3d134dca17df970e6a4a3e83543c0729799amflodman@webrtc.org
318aea96d36e3691de0f95734f6d88bb94474903b34fischman@webrtc.org  CallStatsObserver* GetStatsObserver();
3197c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
32003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VCMReceiveCallback.
3212056ee3e3c7683ae4b2c4b12da99c3105c4f46a9magjed@webrtc.org  virtual int32_t FrameToRender(I420VideoFrame& video_frame);  // NOLINT
32203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
32303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VCMReceiveCallback.
324b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t ReceivedDecodedReferenceFrame(
325b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint64_t picture_id);
32603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
3270d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org  // Implements VCMReceiveCallback.
3280d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org  virtual void IncomingCodecChanged(const VideoCodec& codec);
3290d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org
33037bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  // Implements VCMReceiveStatisticsCallback.
33114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void OnReceiveRatesUpdated(uint32_t bit_rate, uint32_t frame_rate) override;
33214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void OnDiscardedPacketsUpdated(int discarded_packets) override;
33314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void OnFrameCountsUpdated(const FrameCounts& frame_counts) override;
33403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
33537bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  // Implements VCMDecoderTimingCallback.
33637bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org  virtual void OnDecoderTiming(int decode_ms,
33737bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int max_decode_ms,
33837bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int current_delay_ms,
33937bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int target_delay_ms,
34037bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int jitter_buffer_ms,
34137bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int min_playout_delay_ms,
34237bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org                               int render_delay_ms);
34337bb4974e7095cbcbbf36602c6603ea4d99347c9fischman@webrtc.org
34403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VideoFrameTypeCallback.
345b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t RequestKeyFrame();
34603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
34703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VideoFrameTypeCallback.
348b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t SliceLossIndicationRequest(
349b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org      const uint64_t picture_id);
35003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
35103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements VideoPacketRequestCallback.
352b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  virtual int32_t ResendPackets(const uint16_t* sequence_numbers,
353b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                                uint16_t length);
35403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
355b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t SetVoiceChannel(int32_t ve_channel_id,
356b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                          VoEVideoSync* ve_sync_interface);
357b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t VoiceChannel();
35803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
35903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Implements ViEFrameProviderBase.
36003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  virtual int FrameCallbackChanged() {return -1;}
36103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
362b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter);
36303c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
3644070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org  // New-style callbacks, used by VideoReceiveStream.
365fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org  void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback);
3664070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org  void RegisterPreDecodeImageCallback(
3674070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org      EncodedImageCallback* pre_decode_callback);
368fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org
36971f055fb41336316324942f828e022e2f7d93ec7sprang@webrtc.org  void RegisterSendFrameCountObserver(FrameCountObserver* observer);
3701d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  void RegisterRtcpPacketTypeCounterObserver(
3711d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      RtcpPacketTypeCounterObserver* observer);
372ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org  void RegisterReceiveStatisticsProxy(
373ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org      ReceiveStatisticsProxy* receive_statistics_proxy);
3744591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  void ReceivedBWEPacket(int64_t arrival_time_ms, size_t payload_size,
3753fb8f7bbb0c5e074d0744c57905c5f49bb7d8304solenberg@webrtc.org                         const RTPHeader& header);
3763fb8f7bbb0c5e074d0744c57905c5f49bb7d8304solenberg@webrtc.org
37703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org protected:
37803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  static bool ChannelDecodeThreadFunction(void* obj);
37903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool ChannelDecodeProcess();
38003c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
38116825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org  void OnRttUpdate(int64_t rtt);
3827c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
38396abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org  int ProtectionRequest(const FecProtectionParams* delta_fec_params,
38496abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        const FecProtectionParams* key_fec_params,
38596abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        uint32_t* sent_video_rate_bps,
38696abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        uint32_t* sent_nack_rate_bps,
38796abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org                        uint32_t* sent_fec_rate_bps);
38896abda0316312183307a0c95e9417f10eab7e05bmflodman@webrtc.org
38903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org private:
390be9d2a45499d87f3b04e644fc173b0d997a9eeeapbos@webrtc.org  void ReserveRtpRtcpModules(size_t total_modules)
391be9d2a45499d87f3b04e644fc173b0d997a9eeeapbos@webrtc.org      EXCLUSIVE_LOCKS_REQUIRED(rtp_rtcp_cs_);
392be9d2a45499d87f3b04e644fc173b0d997a9eeeapbos@webrtc.org  RtpRtcp* GetRtpRtcpModule(size_t simulcast_idx) const
393be9d2a45499d87f3b04e644fc173b0d997a9eeeapbos@webrtc.org      EXCLUSIVE_LOCKS_REQUIRED(rtp_rtcp_cs_);
394ece3890d3a40fe911ae895e28c329491e795b14dpbos@webrtc.org  RtpRtcp::Configuration CreateRtpRtcpConfiguration();
395be9d2a45499d87f3b04e644fc173b0d997a9eeeapbos@webrtc.org  RtpRtcp* CreateRtpRtcpModule();
39603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Assumed to be protected.
397b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StartDecodeThread();
398b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t StopDecodeThread();
39903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
400b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ProcessNACKRequest(const bool enable);
401b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t ProcessFECRequest(const bool enable,
402b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                            const unsigned char payload_typeRED,
403b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org                            const unsigned char payload_typeFEC);
404ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  // Compute NACK list parameters for the buffering mode.
405ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int GetRequiredNackListSize(int target_delay_ms);
406fbb567dacd76298c5721eae8d0d2cb46fffc9d31stefan@webrtc.org  void SetRtxSendStatus(bool enable);
40703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
40896dc685143094e5834248b38ca4b03ee9f85d694asapersson@webrtc.org  void UpdateHistograms();
40997d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org  void UpdateHistogramsAtStopSend();
41096dc685143094e5834248b38ca4b03ee9f85d694asapersson@webrtc.org
411d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // ViEChannel exposes methods that allow to modify observers and callbacks
412d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // to be modified. Such an API-style is cumbersome to implement and maintain
413d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // at all the levels when comparing to only setting them at construction. As
414d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // so this class instantiates its children with a wrapper that can be modified
415d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  // at a later time.
416d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  template <class T>
417d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  class RegisterableCallback : public T {
418d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org   public:
419d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    RegisterableCallback()
420d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org        : critsect_(CriticalSectionWrapper::CreateCriticalSection()),
421d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org          callback_(NULL) {}
422d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
423d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    void Set(T* callback) {
424d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      CriticalSectionScoped cs(critsect_.get());
425d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      callback_ = callback;
426d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    }
427d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
428d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org   protected:
429d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    // Note: this should be implemented with a RW-lock to allow simultaneous
430d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    // calls into the callback. However that doesn't seem to be needed for the
431d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    // current type of callbacks covered by this class.
43200b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org    rtc::scoped_ptr<CriticalSectionWrapper> critsect_;
433d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    T* callback_ GUARDED_BY(critsect_);
434d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
435d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org   private:
436d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    DISALLOW_COPY_AND_ASSIGN(RegisterableCallback);
437d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org  };
438d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
4398f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org  class RegisterableBitrateStatisticsObserver:
4408f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org    public RegisterableCallback<BitrateStatisticsObserver> {
4410bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org    virtual void Notify(const BitrateStatistics& total_stats,
4420bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org                        const BitrateStatistics& retransmit_stats,
4430bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org                        uint32_t ssrc) {
444d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      CriticalSectionScoped cs(critsect_.get());
445d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org      if (callback_)
4460bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org        callback_->Notify(total_stats, retransmit_stats, ssrc);
447d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org    }
4483e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org  } send_bitrate_observer_;
449d11bec40b25e5990bf05b410676587f6f38b9b8candresp@webrtc.org
4508f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org  class RegisterableFrameCountObserver
4518f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org      : public RegisterableCallback<FrameCountObserver> {
452ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org   public:
453ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org    virtual void FrameCountUpdated(const FrameCounts& frame_counts,
454ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org                                   uint32_t ssrc) {
4558f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org      CriticalSectionScoped cs(critsect_.get());
4568f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org      if (callback_)
457ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org        callback_->FrameCountUpdated(frame_counts, ssrc);
4588f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org    }
459ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org
460ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org   private:
46155707692105a4765f8f321ec7c30a1034d03d23apbos@webrtc.org  } send_frame_count_observer_;
4628f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org
463168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  class RegisterableSendSideDelayObserver :
464168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org      public RegisterableCallback<SendSideDelayObserver> {
46514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    void SendSideDelayUpdated(int avg_delay_ms,
46614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                              int max_delay_ms,
46714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                              uint32_t ssrc) override {
468168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org      CriticalSectionScoped cs(critsect_.get());
469168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org      if (callback_)
470168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org        callback_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, ssrc);
471168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org    }
472168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  } send_side_delay_observer_;
473168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org
4741d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  class RegisterableRtcpPacketTypeCounterObserver
4751d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      : public RegisterableCallback<RtcpPacketTypeCounterObserver> {
4761d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org   public:
47714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org    void RtcpPacketTypesCounterUpdated(
4781d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        uint32_t ssrc,
4791d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        const RtcpPacketTypeCounter& packet_counter) override {
4801d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      CriticalSectionScoped cs(critsect_.get());
4811d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      if (callback_)
4821d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        callback_->RtcpPacketTypesCounterUpdated(ssrc, packet_counter);
4831d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      counter_map_[ssrc] = packet_counter;
4841d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    }
4851d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org
4861d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    virtual std::map<uint32_t, RtcpPacketTypeCounter> GetPacketTypeCounterMap()
4871d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        const {
4881d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      CriticalSectionScoped cs(critsect_.get());
4891d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      return counter_map_;
4901d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    }
4911d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org
4921d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org   private:
4931d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org    std::map<uint32_t, RtcpPacketTypeCounter> counter_map_
4941d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org        GUARDED_BY(critsect_);
4951d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  } rtcp_packet_type_counter_observer_;
4961d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org
497b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t channel_id_;
498b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  int32_t engine_id_;
499b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  uint32_t number_of_cores_;
500b238d1210b528eff706078c781fb55987c66d006pbos@webrtc.org  uint8_t num_socket_threads_;
50103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org
50203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Used for all registered callbacks except rendering.
50300b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<CriticalSectionWrapper> callback_cs_;
50400b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<CriticalSectionWrapper> rtp_rtcp_cs_;
505470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
5062853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  // Owned modules/classes.
50700b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<RtpRtcp> rtp_rtcp_;
50803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  std::list<RtpRtcp*> simulcast_rtp_rtcp_;
50959b2d5fbce3cee1ccaf5e23ce8ece9e315bae2d0mflodman@webrtc.org  std::list<RtpRtcp*> removed_rtp_rtcp_;
5107ac374abd7bafcc6f0a3ef4b4a8952a52c48d2f1mflodman@webrtc.org  scoped_refptr<PayloadRouter> send_payload_router_;
51100b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<ViEChannelProtectionCallback> vcm_protection_callback_;
51202270cd718fd2047bbbf99fbe344e3d988480b57mflodman@webrtc.org
5136e98ef4b35aa63383c9b232e27532df7ebe909c6pbos@webrtc.org  VideoCodingModule* const vcm_;
5142853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  ViEReceiver vie_receiver_;
5152853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  ViESender vie_sender_;
5162853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  ViESyncModule vie_sync_;
517470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
5187c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org  // Helper to report call statistics.
51900b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<ChannelStatsObserver> stats_observer_;
5207c894b7cc718773f32d21985ff33a64f9e13946emflodman@webrtc.org
52103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  // Not owned.
52255707692105a4765f8f321ec7c30a1034d03d23apbos@webrtc.org  VCMReceiveStatisticsCallback* vcm_receive_stats_callback_
52355707692105a4765f8f321ec7c30a1034d03d23apbos@webrtc.org      GUARDED_BY(callback_cs_);
52455707692105a4765f8f321ec7c30a1034d03d23apbos@webrtc.org  FrameCounts receive_frame_counts_ GUARDED_BY(callback_cs_);
52503c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ProcessThread& module_process_thread_;
52603c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ViEDecoderObserver* codec_observer_;
52703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool do_key_frame_callbackRequest_;
52803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ViERTPObserver* rtp_observer_;
52949888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org  RtcpIntraFrameObserver* intra_frame_observer_;
5301ae1d0c47145f1036c3844a5cd1b536c22565325asapersson@webrtc.org  RtcpRttStats* rtt_stats_;
531571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  PacedSender* paced_sender_;
532e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer  PacketRouter* packet_router_;
533571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
53400b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_;
53590071dd64744cbdef19bf4383b8287dba77b0f9emflodman@webrtc.org  int send_timestamp_extension_id_;
536cb9cff0c7190ac66660056245f7095d7a8c3e247solenberg@webrtc.org  int absolute_send_time_extension_id_;
537fdd10579496123c9a7fdc0bf185e2a26a12ed340guoweis@webrtc.org  int video_rotation_extension_id_;
538470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
53903c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  Transport* external_transport_;
540470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
54103c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool decoder_reset_;
5420d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org  // Current receive codec used for codec change callback.
5430d94c2f81c303c874463a5000bc461098bdb6227wuchengli@chromium.org  VideoCodec receive_codec_;
54403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool wait_for_key_frame_;
545361981faa86668cd9b20a2837d0b166fc024cd9btommi@webrtc.org  rtc::scoped_ptr<ThreadWrapper> decode_thread_;
546470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
54703c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  ViEEffectFilter* effect_filter_;
54803c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org  bool color_enhancement_;
549470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
550a6a9964346655963f7efb0e0c49a009fda020ef2mflodman@webrtc.org  // User set MTU, -1 if not set.
551a6a9964346655963f7efb0e0c49a009fda020ef2mflodman@webrtc.org  uint16_t mtu_;
5524e8eabaab13d039efc4cf25b3510526f79dc5406stefan@webrtc.org  const bool sender_;
55340367f984b2922fbfcf58d7e485ac0ef59149768pbos@webrtc.org  // Used to skip default encoder in the new API.
55440367f984b2922fbfcf58d7e485ac0ef59149768pbos@webrtc.org  const bool disable_default_encoder_;
555dbe97d25500170e4a830f2276096323c3a3c3269mikhal@webrtc.org
556dbe97d25500170e4a830f2276096323c3a3c3269mikhal@webrtc.org  int nack_history_size_sender_;
557ef9f76a59d9f24dee02dc1fc40197254372714c9mikhal@webrtc.org  int max_nack_reordering_threshold_;
558fe1ef935e7d35b465bd00744cc188f08198265b6pbos@webrtc.org  I420FrameCallback* pre_render_callback_;
55958e2d262fc6a67d069f6c5b8c5043748570521f9stefan@webrtc.org
56000b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<ReportBlockStats> report_block_stats_sender_;
56100b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<ReportBlockStats> report_block_stats_receiver_;
56203c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org};
563470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
56403c06505fb7f928501a787580a4a7416d7af31eemflodman@webrtc.org}  // namespace webrtc
565470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
566e06ca3cef68cec1fa97b3d476c99d98c68f04ff2mflodman@webrtc.org#endif  // WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
567