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