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_ENGINE_VIE_CHANNEL_H_ 12 #define WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_ 13 14 #include <list> 15 16 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" 17 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 18 #include "webrtc/modules/video_coding/main/interface/video_coding_defines.h" 19 #include "webrtc/system_wrappers/interface/scoped_ptr.h" 20 #include "webrtc/system_wrappers/interface/tick_util.h" 21 #include "webrtc/typedefs.h" 22 #include "webrtc/video_engine/include/vie_network.h" 23 #include "webrtc/video_engine/include/vie_rtp_rtcp.h" 24 #include "webrtc/video_engine/vie_defines.h" 25 #include "webrtc/video_engine/vie_frame_provider_base.h" 26 #include "webrtc/video_engine/vie_receiver.h" 27 #include "webrtc/video_engine/vie_sender.h" 28 #include "webrtc/video_engine/vie_sync_module.h" 29 30 namespace webrtc { 31 32 class CallStatsObserver; 33 class ChannelStatsObserver; 34 class Config; 35 class CriticalSectionWrapper; 36 class EncodedImageCallback; 37 class I420FrameCallback; 38 class PacedSender; 39 class ProcessThread; 40 class RtcpRttStats; 41 class RtpRtcp; 42 class ThreadWrapper; 43 class ViEDecoderObserver; 44 class ViEEffectFilter; 45 class ViERTCPObserver; 46 class ViERTPObserver; 47 class VideoCodingModule; 48 class VideoDecoder; 49 class VideoRenderCallback; 50 class VoEVideoSync; 51 52 class ViEChannel 53 : public VCMFrameTypeCallback, 54 public VCMReceiveCallback, 55 public VCMReceiveStatisticsCallback, 56 public VCMDecoderTimingCallback, 57 public VCMPacketRequestCallback, 58 public RtcpFeedback, 59 public RtpFeedback, 60 public ViEFrameProviderBase { 61 public: 62 friend class ChannelStatsObserver; 63 64 ViEChannel(int32_t channel_id, 65 int32_t engine_id, 66 uint32_t number_of_cores, 67 const Config& config, 68 ProcessThread& module_process_thread, 69 RtcpIntraFrameObserver* intra_frame_observer, 70 RtcpBandwidthObserver* bandwidth_observer, 71 RemoteBitrateEstimator* remote_bitrate_estimator, 72 RtcpRttStats* rtt_stats, 73 PacedSender* paced_sender, 74 RtpRtcp* default_rtp_rtcp, 75 bool sender); 76 ~ViEChannel(); 77 78 int32_t Init(); 79 80 // Sets the encoder to use for the channel. |new_stream| indicates the encoder 81 // type has changed and we should start a new RTP stream. 82 int32_t SetSendCodec(const VideoCodec& video_codec, bool new_stream = true); 83 int32_t SetReceiveCodec(const VideoCodec& video_codec); 84 int32_t GetReceiveCodec(VideoCodec* video_codec); 85 int32_t RegisterCodecObserver(ViEDecoderObserver* observer); 86 // Registers an external decoder. |buffered_rendering| means that the decoder 87 // will render frames after decoding according to the render timestamp 88 // provided by the video coding module. |render_delay| indicates the time 89 // needed to decode and render a frame. 90 int32_t RegisterExternalDecoder(const uint8_t pl_type, 91 VideoDecoder* decoder, 92 bool buffered_rendering, 93 int32_t render_delay); 94 int32_t DeRegisterExternalDecoder(const uint8_t pl_type); 95 int32_t ReceiveCodecStatistics(uint32_t* num_key_frames, 96 uint32_t* num_delta_frames); 97 uint32_t DiscardedPackets() const; 98 99 // Returns the estimated delay in milliseconds. 100 int ReceiveDelay() const; 101 102 // Only affects calls to SetReceiveCodec done after this call. 103 int32_t WaitForKeyFrame(bool wait); 104 105 // If enabled, a key frame request will be sent as soon as there are lost 106 // packets. If |only_key_frames| are set, requests are only sent for loss in 107 // key frames. 108 int32_t SetSignalPacketLossStatus(bool enable, bool only_key_frames); 109 110 int32_t SetRTCPMode(const RTCPMethod rtcp_mode); 111 int32_t GetRTCPMode(RTCPMethod* rtcp_mode); 112 int32_t SetNACKStatus(const bool enable); 113 int32_t SetFECStatus(const bool enable, 114 const unsigned char payload_typeRED, 115 const unsigned char payload_typeFEC); 116 int32_t SetHybridNACKFECStatus(const bool enable, 117 const unsigned char payload_typeRED, 118 const unsigned char payload_typeFEC); 119 int SetSenderBufferingMode(int target_delay_ms); 120 int SetReceiverBufferingMode(int target_delay_ms); 121 int32_t SetKeyFrameRequestMethod(const KeyFrameRequestMethod method); 122 bool EnableRemb(bool enable); 123 int SetSendTimestampOffsetStatus(bool enable, int id); 124 int SetReceiveTimestampOffsetStatus(bool enable, int id); 125 int SetSendAbsoluteSendTimeStatus(bool enable, int id); 126 int SetReceiveAbsoluteSendTimeStatus(bool enable, int id); 127 bool GetReceiveAbsoluteSendTimeStatus() const; 128 void SetRtcpXrRrtrStatus(bool enable); 129 void SetTransmissionSmoothingStatus(bool enable); 130 int32_t EnableTMMBR(const bool enable); 131 int32_t EnableKeyFrameRequestCallback(const bool enable); 132 133 // Sets SSRC for outgoing stream. 134 int32_t SetSSRC(const uint32_t SSRC, 135 const StreamType usage, 136 const unsigned char simulcast_idx); 137 138 // Gets SSRC for outgoing stream number |idx|. 139 int32_t GetLocalSSRC(uint8_t idx, unsigned int* ssrc); 140 141 // Gets SSRC for the incoming stream. 142 int32_t GetRemoteSSRC(uint32_t* ssrc); 143 144 // Gets the CSRC for the incoming stream. 145 int32_t GetRemoteCSRC(uint32_t CSRCs[kRtpCsrcSize]); 146 147 int SetRtxSendPayloadType(int payload_type); 148 // Only has an effect once RTX is enabled. 149 void SetPadWithRedundantPayloads(bool enable); 150 void SetRtxReceivePayloadType(int payload_type); 151 152 // Sets the starting sequence number, must be called before StartSend. 153 int32_t SetStartSequenceNumber(uint16_t sequence_number); 154 155 // Sets the CName for the outgoing stream on the channel. 156 int32_t SetRTCPCName(const char rtcp_cname[]); 157 158 // Gets the CName for the outgoing stream on the channel. 159 int32_t GetRTCPCName(char rtcp_cname[]); 160 161 // Gets the CName of the incoming stream. 162 int32_t GetRemoteRTCPCName(char rtcp_cname[]); 163 int32_t RegisterRtpObserver(ViERTPObserver* observer); 164 int32_t RegisterRtcpObserver(ViERTCPObserver* observer); 165 int32_t SendApplicationDefinedRTCPPacket( 166 const uint8_t sub_type, 167 uint32_t name, 168 const uint8_t* data, 169 uint16_t data_length_in_bytes); 170 171 // Returns statistics reported by the remote client in an RTCP packet. 172 int32_t GetSendRtcpStatistics(uint16_t* fraction_lost, 173 uint32_t* cumulative_lost, 174 uint32_t* extended_max, 175 uint32_t* jitter_samples, 176 int32_t* rtt_ms); 177 178 // Called on receipt of RTCP report block from remote side. 179 void RegisterSendChannelRtcpStatisticsCallback( 180 RtcpStatisticsCallback* callback); 181 182 // Returns our localy created statistics of the received RTP stream. 183 int32_t GetReceivedRtcpStatistics(uint16_t* fraction_lost, 184 uint32_t* cumulative_lost, 185 uint32_t* extended_max, 186 uint32_t* jitter_samples, 187 int32_t* rtt_ms); 188 189 // Called on generation of RTCP stats 190 void RegisterReceiveChannelRtcpStatisticsCallback( 191 RtcpStatisticsCallback* callback); 192 193 // Gets sent/received packets statistics. 194 int32_t GetRtpStatistics(uint32_t* bytes_sent, 195 uint32_t* packets_sent, 196 uint32_t* bytes_received, 197 uint32_t* packets_received) const; 198 199 // Called on update of RTP statistics. 200 void RegisterSendChannelRtpStatisticsCallback( 201 StreamDataCountersCallback* callback); 202 203 // Called on update of RTP statistics. 204 void RegisterReceiveChannelRtpStatisticsCallback( 205 StreamDataCountersCallback* callback); 206 207 void GetRtcpPacketTypeCounters(RtcpPacketTypeCounter* packets_sent, 208 RtcpPacketTypeCounter* packets_received) const; 209 210 void GetBandwidthUsage(uint32_t* total_bitrate_sent, 211 uint32_t* video_bitrate_sent, 212 uint32_t* fec_bitrate_sent, 213 uint32_t* nackBitrateSent) const; 214 bool GetSendSideDelay(int* avg_send_delay, int* max_send_delay) const; 215 void GetReceiveBandwidthEstimatorStats( 216 ReceiveBandwidthEstimatorStats* output) const; 217 218 // Called on any new send bitrate estimate. 219 void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer); 220 221 int32_t StartRTPDump(const char file_nameUTF8[1024], 222 RTPDirections direction); 223 int32_t StopRTPDump(RTPDirections direction); 224 225 // Implements RtcpFeedback. 226 // TODO(pwestin) Depricate this functionality. 227 virtual void OnApplicationDataReceived(const int32_t id, 228 const uint8_t sub_type, 229 const uint32_t name, 230 const uint16_t length, 231 const uint8_t* data); 232 // Implements RtpFeedback. 233 virtual int32_t OnInitializeDecoder( 234 const int32_t id, 235 const int8_t payload_type, 236 const char payload_name[RTP_PAYLOAD_NAME_SIZE], 237 const int frequency, 238 const uint8_t channels, 239 const uint32_t rate); 240 virtual void OnIncomingSSRCChanged(const int32_t id, 241 const uint32_t ssrc); 242 virtual void OnIncomingCSRCChanged(const int32_t id, 243 const uint32_t CSRC, 244 const bool added); 245 virtual void ResetStatistics(uint32_t); 246 247 int32_t SetLocalReceiver(const uint16_t rtp_port, 248 const uint16_t rtcp_port, 249 const char* ip_address); 250 int32_t GetLocalReceiver(uint16_t* rtp_port, 251 uint16_t* rtcp_port, 252 char* ip_address) const; 253 int32_t SetSendDestination(const char* ip_address, 254 const uint16_t rtp_port, 255 const uint16_t rtcp_port, 256 const uint16_t source_rtp_port, 257 const uint16_t source_rtcp_port); 258 int32_t GetSendDestination(char* ip_address, 259 uint16_t* rtp_port, 260 uint16_t* rtcp_port, 261 uint16_t* source_rtp_port, 262 uint16_t* source_rtcp_port) const; 263 int32_t GetSourceInfo(uint16_t* rtp_port, 264 uint16_t* rtcp_port, 265 char* ip_address, 266 uint32_t ip_address_length); 267 268 int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC); 269 270 int32_t StartSend(); 271 int32_t StopSend(); 272 bool Sending(); 273 int32_t StartReceive(); 274 int32_t StopReceive(); 275 276 int32_t RegisterSendTransport(Transport* transport); 277 int32_t DeregisterSendTransport(); 278 279 // Incoming packet from external transport. 280 int32_t ReceivedRTPPacket(const void* rtp_packet, 281 const int32_t rtp_packet_length, 282 const PacketTime& packet_time); 283 284 // Incoming packet from external transport. 285 int32_t ReceivedRTCPPacket(const void* rtcp_packet, 286 const int32_t rtcp_packet_length); 287 288 // Sets the maximum transfer unit size for the network link, i.e. including 289 // IP, UDP and RTP headers. 290 int32_t SetMTU(uint16_t mtu); 291 292 // Returns maximum allowed payload size, i.e. the maximum allowed size of 293 // encoded data in each packet. 294 uint16_t MaxDataPayloadLength() const; 295 int32_t SetMaxPacketBurstSize(uint16_t max_number_of_packets); 296 int32_t SetPacketBurstSpreadState(bool enable, const uint16_t frame_periodMS); 297 298 int32_t EnableColorEnhancement(bool enable); 299 300 // Gets the modules used by the channel. 301 RtpRtcp* rtp_rtcp(); 302 303 CallStatsObserver* GetStatsObserver(); 304 305 // Implements VCMReceiveCallback. 306 virtual int32_t FrameToRender(I420VideoFrame& video_frame); // NOLINT 307 308 // Implements VCMReceiveCallback. 309 virtual int32_t ReceivedDecodedReferenceFrame( 310 const uint64_t picture_id); 311 312 // Implements VCMReceiveCallback. 313 virtual void IncomingCodecChanged(const VideoCodec& codec); 314 315 // Implements VCMReceiveStatisticsCallback. 316 virtual int32_t OnReceiveStatisticsUpdate(const uint32_t bit_rate, 317 const uint32_t frame_rate); 318 319 // Implements VCMDecoderTimingCallback. 320 virtual void OnDecoderTiming(int decode_ms, 321 int max_decode_ms, 322 int current_delay_ms, 323 int target_delay_ms, 324 int jitter_buffer_ms, 325 int min_playout_delay_ms, 326 int render_delay_ms); 327 328 // Implements VideoFrameTypeCallback. 329 virtual int32_t RequestKeyFrame(); 330 331 // Implements VideoFrameTypeCallback. 332 virtual int32_t SliceLossIndicationRequest( 333 const uint64_t picture_id); 334 335 // Implements VideoPacketRequestCallback. 336 virtual int32_t ResendPackets(const uint16_t* sequence_numbers, 337 uint16_t length); 338 339 int32_t SetVoiceChannel(int32_t ve_channel_id, 340 VoEVideoSync* ve_sync_interface); 341 int32_t VoiceChannel(); 342 343 // Implements ViEFrameProviderBase. FrameCallbackChanged()344 virtual int FrameCallbackChanged() {return -1;} 345 346 int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter); 347 348 // New-style callbacks, used by VideoReceiveStream. 349 void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback); 350 void RegisterPreDecodeImageCallback( 351 EncodedImageCallback* pre_decode_callback); 352 353 void RegisterSendFrameCountObserver(FrameCountObserver* observer); 354 355 void ReceivedBWEPacket(int64_t arrival_time_ms, int payload_size, 356 const RTPHeader& header); 357 358 protected: 359 static bool ChannelDecodeThreadFunction(void* obj); 360 bool ChannelDecodeProcess(); 361 362 void OnRttUpdate(uint32_t rtt); 363 364 private: 365 // Assumed to be protected. 366 int32_t StartDecodeThread(); 367 int32_t StopDecodeThread(); 368 369 int32_t ProcessNACKRequest(const bool enable); 370 int32_t ProcessFECRequest(const bool enable, 371 const unsigned char payload_typeRED, 372 const unsigned char payload_typeFEC); 373 // Compute NACK list parameters for the buffering mode. 374 int GetRequiredNackListSize(int target_delay_ms); 375 void SetRtxSendStatus(bool enable); 376 377 int32_t channel_id_; 378 int32_t engine_id_; 379 uint32_t number_of_cores_; 380 uint8_t num_socket_threads_; 381 382 // Used for all registered callbacks except rendering. 383 scoped_ptr<CriticalSectionWrapper> callback_cs_; 384 scoped_ptr<CriticalSectionWrapper> rtp_rtcp_cs_; 385 386 RtpRtcp* default_rtp_rtcp_; 387 388 // Owned modules/classes. 389 scoped_ptr<RtpRtcp> rtp_rtcp_; 390 std::list<RtpRtcp*> simulcast_rtp_rtcp_; 391 std::list<RtpRtcp*> removed_rtp_rtcp_; 392 VideoCodingModule* const vcm_; 393 ViEReceiver vie_receiver_; 394 ViESender vie_sender_; 395 ViESyncModule vie_sync_; 396 397 // Helper to report call statistics. 398 scoped_ptr<ChannelStatsObserver> stats_observer_; 399 400 // Not owned. 401 ProcessThread& module_process_thread_; 402 ViEDecoderObserver* codec_observer_; 403 bool do_key_frame_callbackRequest_; 404 ViERTPObserver* rtp_observer_; 405 ViERTCPObserver* rtcp_observer_; 406 RtcpIntraFrameObserver* intra_frame_observer_; 407 RtcpRttStats* rtt_stats_; 408 PacedSender* paced_sender_; 409 bool pad_with_redundant_payloads_; 410 411 scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_; 412 int send_timestamp_extension_id_; 413 int absolute_send_time_extension_id_; 414 415 Transport* external_transport_; 416 417 bool decoder_reset_; 418 // Current receive codec used for codec change callback. 419 VideoCodec receive_codec_; 420 bool wait_for_key_frame_; 421 ThreadWrapper* decode_thread_; 422 423 ViEEffectFilter* effect_filter_; 424 bool color_enhancement_; 425 426 // User set MTU, -1 if not set. 427 uint16_t mtu_; 428 const bool sender_; 429 430 int nack_history_size_sender_; 431 int max_nack_reordering_threshold_; 432 I420FrameCallback* pre_render_callback_; 433 }; 434 435 } // namespace webrtc 436 437 #endif // WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_ 438