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