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