1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_VIDEO_VIE_CHANNEL_H_ 12 #define WEBRTC_VIDEO_VIE_CHANNEL_H_ 13 14 #include <list> 15 #include <map> 16 #include <vector> 17 18 #include "webrtc/base/platform_thread.h" 19 #include "webrtc/base/scoped_ptr.h" 20 #include "webrtc/base/scoped_ref_ptr.h" 21 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" 22 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" 23 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 24 #include "webrtc/modules/video_coding/include/video_coding_defines.h" 25 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 26 #include "webrtc/system_wrappers/include/tick_util.h" 27 #include "webrtc/typedefs.h" 28 #include "webrtc/video/vie_receiver.h" 29 #include "webrtc/video/vie_sync_module.h" 30 31 namespace webrtc { 32 33 class CallStatsObserver; 34 class ChannelStatsObserver; 35 class Config; 36 class CriticalSectionWrapper; 37 class EncodedImageCallback; 38 class I420FrameCallback; 39 class IncomingVideoStream; 40 class PacedSender; 41 class PacketRouter; 42 class PayloadRouter; 43 class ProcessThread; 44 class ReceiveStatisticsProxy; 45 class ReportBlockStats; 46 class RtcpRttStats; 47 class ViEChannelProtectionCallback; 48 class ViERTPObserver; 49 class VideoCodingModule; 50 class VideoDecoder; 51 class VideoRenderCallback; 52 class VoEVideoSync; 53 54 enum StreamType { 55 kViEStreamTypeNormal = 0, // Normal media stream 56 kViEStreamTypeRtx = 1 // Retransmission media stream 57 }; 58 59 class ViEChannel : public VCMFrameTypeCallback, 60 public VCMReceiveCallback, 61 public VCMReceiveStatisticsCallback, 62 public VCMDecoderTimingCallback, 63 public VCMPacketRequestCallback, 64 public RtpFeedback { 65 public: 66 friend class ChannelStatsObserver; 67 friend class ViEChannelProtectionCallback; 68 69 ViEChannel(uint32_t number_of_cores, 70 Transport* transport, 71 ProcessThread* module_process_thread, 72 RtcpIntraFrameObserver* intra_frame_observer, 73 RtcpBandwidthObserver* bandwidth_observer, 74 TransportFeedbackObserver* transport_feedback_observer, 75 RemoteBitrateEstimator* remote_bitrate_estimator, 76 RtcpRttStats* rtt_stats, 77 PacedSender* paced_sender, 78 PacketRouter* packet_router, 79 size_t max_rtp_streams, 80 bool sender); 81 ~ViEChannel(); 82 83 int32_t Init(); 84 85 // Sets the encoder to use for the channel. |new_stream| indicates the encoder 86 // type has changed and we should start a new RTP stream. 87 int32_t SetSendCodec(const VideoCodec& video_codec, bool new_stream = true); 88 int32_t SetReceiveCodec(const VideoCodec& video_codec); 89 // Registers an external decoder. 90 void RegisterExternalDecoder(const uint8_t pl_type, VideoDecoder* decoder); 91 int32_t ReceiveCodecStatistics(uint32_t* num_key_frames, 92 uint32_t* num_delta_frames); 93 uint32_t DiscardedPackets() const; 94 95 // Returns the estimated delay in milliseconds. 96 int ReceiveDelay() const; 97 98 void SetExpectedRenderDelay(int delay_ms); 99 100 void SetRTCPMode(const RtcpMode rtcp_mode); 101 void SetProtectionMode(bool enable_nack, 102 bool enable_fec, 103 int payload_type_red, 104 int payload_type_fec); 105 bool IsSendingFecEnabled(); 106 int SetSenderBufferingMode(int target_delay_ms); 107 int SetSendTimestampOffsetStatus(bool enable, int id); 108 int SetReceiveTimestampOffsetStatus(bool enable, int id); 109 int SetSendAbsoluteSendTimeStatus(bool enable, int id); 110 int SetReceiveAbsoluteSendTimeStatus(bool enable, int id); 111 int SetSendVideoRotationStatus(bool enable, int id); 112 int SetReceiveVideoRotationStatus(bool enable, int id); 113 int SetSendTransportSequenceNumber(bool enable, int id); 114 int SetReceiveTransportSequenceNumber(bool enable, int id); 115 void SetRtcpXrRrtrStatus(bool enable); 116 void EnableTMMBR(bool enable); 117 118 // Sets SSRC for outgoing stream. 119 int32_t SetSSRC(const uint32_t SSRC, 120 const StreamType usage, 121 const unsigned char simulcast_idx); 122 123 // Gets SSRC for outgoing stream number |idx|. 124 int32_t GetLocalSSRC(uint8_t idx, unsigned int* ssrc); 125 126 // Gets SSRC for the incoming stream. 127 uint32_t GetRemoteSSRC(); 128 129 int SetRtxSendPayloadType(int payload_type, int associated_payload_type); 130 void SetRtxReceivePayloadType(int payload_type, int associated_payload_type); 131 // If set to true, the RTX payload type mapping supplied in 132 // |SetRtxReceivePayloadType| will be used when restoring RTX packets. Without 133 // it, RTX packets will always be restored to the last non-RTX packet payload 134 // type received. 135 void SetUseRtxPayloadMappingOnRestore(bool val); 136 137 void SetRtpStateForSsrc(uint32_t ssrc, const RtpState& rtp_state); 138 RtpState GetRtpStateForSsrc(uint32_t ssrc); 139 140 // Sets the CName for the outgoing stream on the channel. 141 int32_t SetRTCPCName(const char* rtcp_cname); 142 143 // Gets the CName of the incoming stream. 144 int32_t GetRemoteRTCPCName(char rtcp_cname[]); 145 146 // Returns statistics reported by the remote client in an RTCP packet. 147 // TODO(pbos): Remove this along with VideoSendStream::GetRtt(). 148 int32_t GetSendRtcpStatistics(uint16_t* fraction_lost, 149 uint32_t* cumulative_lost, 150 uint32_t* extended_max, 151 uint32_t* jitter_samples, 152 int64_t* rtt_ms); 153 154 // Called on receipt of RTCP report block from remote side. 155 void RegisterSendChannelRtcpStatisticsCallback( 156 RtcpStatisticsCallback* callback); 157 158 // Called on generation of RTCP stats 159 void RegisterReceiveChannelRtcpStatisticsCallback( 160 RtcpStatisticsCallback* callback); 161 162 // Gets send statistics for the rtp and rtx stream. 163 void GetSendStreamDataCounters(StreamDataCounters* rtp_counters, 164 StreamDataCounters* rtx_counters) const; 165 166 // Gets received stream data counters. 167 void GetReceiveStreamDataCounters(StreamDataCounters* rtp_counters, 168 StreamDataCounters* rtx_counters) const; 169 170 // Called on update of RTP statistics. 171 void RegisterSendChannelRtpStatisticsCallback( 172 StreamDataCountersCallback* callback); 173 174 // Called on update of RTP statistics. 175 void RegisterReceiveChannelRtpStatisticsCallback( 176 StreamDataCountersCallback* callback); 177 178 void GetSendRtcpPacketTypeCounter( 179 RtcpPacketTypeCounter* packet_counter) const; 180 181 void GetReceiveRtcpPacketTypeCounter( 182 RtcpPacketTypeCounter* packet_counter) const; 183 184 void RegisterSendSideDelayObserver(SendSideDelayObserver* observer); 185 186 // Called on any new send bitrate estimate. 187 void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer); 188 189 // Implements RtpFeedback. 190 int32_t OnInitializeDecoder(const int8_t payload_type, 191 const char payload_name[RTP_PAYLOAD_NAME_SIZE], 192 const int frequency, 193 const size_t channels, 194 const uint32_t rate) override; 195 void OnIncomingSSRCChanged(const uint32_t ssrc) override; 196 void OnIncomingCSRCChanged(const uint32_t CSRC, const bool added) override; 197 198 int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC); 199 200 int32_t StartSend(); 201 int32_t StopSend(); 202 bool Sending(); 203 void StartReceive(); 204 void StopReceive(); 205 206 int32_t ReceivedRTPPacket(const void* rtp_packet, 207 const size_t rtp_packet_length, 208 const PacketTime& packet_time); 209 int32_t ReceivedRTCPPacket(const void* rtcp_packet, 210 const size_t rtcp_packet_length); 211 212 // Sets the maximum transfer unit size for the network link, i.e. including 213 // IP, UDP and RTP headers. 214 int32_t SetMTU(uint16_t mtu); 215 216 // Gets the modules used by the channel. 217 RtpRtcp* rtp_rtcp(); 218 rtc::scoped_refptr<PayloadRouter> send_payload_router(); 219 VCMProtectionCallback* vcm_protection_callback(); 220 221 222 CallStatsObserver* GetStatsObserver(); 223 224 // Implements VCMReceiveCallback. 225 virtual int32_t FrameToRender(VideoFrame& video_frame); // NOLINT 226 227 // Implements VCMReceiveCallback. 228 virtual int32_t ReceivedDecodedReferenceFrame( 229 const uint64_t picture_id); 230 231 // Implements VCMReceiveCallback. 232 void OnIncomingPayloadType(int payload_type) override; 233 void OnDecoderImplementationName(const char* implementation_name) override; 234 235 // Implements VCMReceiveStatisticsCallback. 236 void OnReceiveRatesUpdated(uint32_t bit_rate, uint32_t frame_rate) override; 237 void OnDiscardedPacketsUpdated(int discarded_packets) override; 238 void OnFrameCountsUpdated(const FrameCounts& frame_counts) override; 239 240 // Implements VCMDecoderTimingCallback. 241 virtual void OnDecoderTiming(int decode_ms, 242 int max_decode_ms, 243 int current_delay_ms, 244 int target_delay_ms, 245 int jitter_buffer_ms, 246 int min_playout_delay_ms, 247 int render_delay_ms); 248 249 // Implements FrameTypeCallback. 250 virtual int32_t RequestKeyFrame(); 251 252 // Implements FrameTypeCallback. 253 virtual int32_t SliceLossIndicationRequest( 254 const uint64_t picture_id); 255 256 // Implements VideoPacketRequestCallback. 257 int32_t ResendPackets(const uint16_t* sequence_numbers, 258 uint16_t length) override; 259 260 int32_t SetVoiceChannel(int32_t ve_channel_id, 261 VoEVideoSync* ve_sync_interface); 262 int32_t VoiceChannel(); 263 264 // New-style callbacks, used by VideoReceiveStream. 265 void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback); 266 void RegisterPreDecodeImageCallback( 267 EncodedImageCallback* pre_decode_callback); 268 269 void RegisterSendFrameCountObserver(FrameCountObserver* observer); 270 void RegisterRtcpPacketTypeCounterObserver( 271 RtcpPacketTypeCounterObserver* observer); 272 void RegisterReceiveStatisticsProxy( 273 ReceiveStatisticsProxy* receive_statistics_proxy); 274 void SetIncomingVideoStream(IncomingVideoStream* incoming_video_stream); 275 276 protected: 277 static bool ChannelDecodeThreadFunction(void* obj); 278 bool ChannelDecodeProcess(); 279 280 void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms); 281 282 int ProtectionRequest(const FecProtectionParams* delta_fec_params, 283 const FecProtectionParams* key_fec_params, 284 uint32_t* sent_video_rate_bps, 285 uint32_t* sent_nack_rate_bps, 286 uint32_t* sent_fec_rate_bps); 287 288 private: 289 static std::vector<RtpRtcp*> CreateRtpRtcpModules( 290 bool receiver_only, 291 ReceiveStatistics* receive_statistics, 292 Transport* outgoing_transport, 293 RtcpIntraFrameObserver* intra_frame_callback, 294 RtcpBandwidthObserver* bandwidth_callback, 295 TransportFeedbackObserver* transport_feedback_callback, 296 RtcpRttStats* rtt_stats, 297 RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer, 298 RemoteBitrateEstimator* remote_bitrate_estimator, 299 RtpPacketSender* paced_sender, 300 TransportSequenceNumberAllocator* transport_sequence_number_allocator, 301 BitrateStatisticsObserver* send_bitrate_observer, 302 FrameCountObserver* send_frame_count_observer, 303 SendSideDelayObserver* send_side_delay_observer, 304 size_t num_modules); 305 306 // Assumed to be protected. 307 void StartDecodeThread(); 308 void StopDecodeThread(); 309 310 void ProcessNACKRequest(const bool enable); 311 // Compute NACK list parameters for the buffering mode. 312 int GetRequiredNackListSize(int target_delay_ms); 313 void SetRtxSendStatus(bool enable); 314 315 void UpdateHistograms(); 316 317 // ViEChannel exposes methods that allow to modify observers and callbacks 318 // to be modified. Such an API-style is cumbersome to implement and maintain 319 // at all the levels when comparing to only setting them at construction. As 320 // so this class instantiates its children with a wrapper that can be modified 321 // at a later time. 322 template <class T> 323 class RegisterableCallback : public T { 324 public: 325 RegisterableCallback() 326 : critsect_(CriticalSectionWrapper::CreateCriticalSection()), 327 callback_(NULL) {} 328 329 void Set(T* callback) { 330 CriticalSectionScoped cs(critsect_.get()); 331 callback_ = callback; 332 } 333 334 protected: 335 // Note: this should be implemented with a RW-lock to allow simultaneous 336 // calls into the callback. However that doesn't seem to be needed for the 337 // current type of callbacks covered by this class. 338 rtc::scoped_ptr<CriticalSectionWrapper> critsect_; 339 T* callback_ GUARDED_BY(critsect_); 340 341 private: 342 RTC_DISALLOW_COPY_AND_ASSIGN(RegisterableCallback); 343 }; 344 345 class RegisterableBitrateStatisticsObserver: 346 public RegisterableCallback<BitrateStatisticsObserver> { 347 virtual void Notify(const BitrateStatistics& total_stats, 348 const BitrateStatistics& retransmit_stats, 349 uint32_t ssrc) { 350 CriticalSectionScoped cs(critsect_.get()); 351 if (callback_) 352 callback_->Notify(total_stats, retransmit_stats, ssrc); 353 } 354 } send_bitrate_observer_; 355 356 class RegisterableFrameCountObserver 357 : public RegisterableCallback<FrameCountObserver> { 358 public: 359 virtual void FrameCountUpdated(const FrameCounts& frame_counts, 360 uint32_t ssrc) { 361 CriticalSectionScoped cs(critsect_.get()); 362 if (callback_) 363 callback_->FrameCountUpdated(frame_counts, ssrc); 364 } 365 366 private: 367 } send_frame_count_observer_; 368 369 class RegisterableSendSideDelayObserver : 370 public RegisterableCallback<SendSideDelayObserver> { 371 void SendSideDelayUpdated(int avg_delay_ms, 372 int max_delay_ms, 373 uint32_t ssrc) override { 374 CriticalSectionScoped cs(critsect_.get()); 375 if (callback_) 376 callback_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, ssrc); 377 } 378 } send_side_delay_observer_; 379 380 class RegisterableRtcpPacketTypeCounterObserver 381 : public RegisterableCallback<RtcpPacketTypeCounterObserver> { 382 public: 383 void RtcpPacketTypesCounterUpdated( 384 uint32_t ssrc, 385 const RtcpPacketTypeCounter& packet_counter) override { 386 CriticalSectionScoped cs(critsect_.get()); 387 if (callback_) 388 callback_->RtcpPacketTypesCounterUpdated(ssrc, packet_counter); 389 counter_map_[ssrc] = packet_counter; 390 } 391 392 virtual std::map<uint32_t, RtcpPacketTypeCounter> GetPacketTypeCounterMap() 393 const { 394 CriticalSectionScoped cs(critsect_.get()); 395 return counter_map_; 396 } 397 398 private: 399 std::map<uint32_t, RtcpPacketTypeCounter> counter_map_ 400 GUARDED_BY(critsect_); 401 } rtcp_packet_type_counter_observer_; 402 403 const uint32_t number_of_cores_; 404 const bool sender_; 405 406 ProcessThread* const module_process_thread_; 407 408 // Used for all registered callbacks except rendering. 409 rtc::scoped_ptr<CriticalSectionWrapper> crit_; 410 411 // Owned modules/classes. 412 rtc::scoped_refptr<PayloadRouter> send_payload_router_; 413 rtc::scoped_ptr<ViEChannelProtectionCallback> vcm_protection_callback_; 414 415 VideoCodingModule* const vcm_; 416 ViEReceiver vie_receiver_; 417 ViESyncModule vie_sync_; 418 419 // Helper to report call statistics. 420 rtc::scoped_ptr<ChannelStatsObserver> stats_observer_; 421 422 // Not owned. 423 ReceiveStatisticsProxy* receive_stats_callback_ GUARDED_BY(crit_); 424 FrameCounts receive_frame_counts_ GUARDED_BY(crit_); 425 IncomingVideoStream* incoming_video_stream_ GUARDED_BY(crit_); 426 RtcpIntraFrameObserver* const intra_frame_observer_; 427 RtcpRttStats* const rtt_stats_; 428 PacedSender* const paced_sender_; 429 PacketRouter* const packet_router_; 430 431 const rtc::scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_; 432 TransportFeedbackObserver* const transport_feedback_observer_; 433 434 rtc::PlatformThread decode_thread_; 435 436 int nack_history_size_sender_; 437 int max_nack_reordering_threshold_; 438 I420FrameCallback* pre_render_callback_ GUARDED_BY(crit_); 439 440 const rtc::scoped_ptr<ReportBlockStats> report_block_stats_sender_; 441 442 int64_t time_of_first_rtt_ms_ GUARDED_BY(crit_); 443 int64_t rtt_sum_ms_ GUARDED_BY(crit_); 444 int64_t last_rtt_ms_ GUARDED_BY(crit_); 445 size_t num_rtts_ GUARDED_BY(crit_); 446 447 // RtpRtcp modules, declared last as they use other members on construction. 448 const std::vector<RtpRtcp*> rtp_rtcp_modules_; 449 size_t num_active_rtp_rtcp_modules_ GUARDED_BY(crit_); 450 }; 451 452 } // namespace webrtc 453 454 #endif // WEBRTC_VIDEO_VIE_CHANNEL_H_ 455