2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
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.
11 #ifndef WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
12 #define WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
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"
32 class CallStatsObserver;
33 class ChannelStatsObserver;
35 class CriticalSectionWrapper;
36 class EncodedImageCallback;
37 class I420FrameCallback;
43 class ViEDecoderObserver;
44 class ViEEffectFilter;
45 class ViERTCPObserver;
47 class VideoCodingModule;
49 class VideoRenderCallback;
53 : public VCMFrameTypeCallback,
54 public VCMReceiveCallback,
55 public VCMReceiveStatisticsCallback,
56 public VCMDecoderTimingCallback,
57 public VCMPacketRequestCallback,
60 public ViEFrameProviderBase {
62 friend class ChannelStatsObserver;
64 ViEChannel(int32_t channel_id,
66 uint32_t number_of_cores,
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,
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;
99 // Returns the estimated delay in milliseconds.
100 int ReceiveDelay() const;
102 // Only affects calls to SetReceiveCodec done after this call.
103 int32_t WaitForKeyFrame(bool wait);
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
108 int32_t SetSignalPacketLossStatus(bool enable, bool only_key_frames);
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);
133 // Sets SSRC for outgoing stream.
134 int32_t SetSSRC(const uint32_t SSRC,
135 const StreamType usage,
136 const unsigned char simulcast_idx);
138 // Gets SSRC for outgoing stream number |idx|.
139 int32_t GetLocalSSRC(uint8_t idx, unsigned int* ssrc);
141 // Gets SSRC for the incoming stream.
142 int32_t GetRemoteSSRC(uint32_t* ssrc);
144 // Gets the CSRC for the incoming stream.
145 int32_t GetRemoteCSRC(uint32_t CSRCs[kRtpCsrcSize]);
147 int SetRtxSendPayloadType(int payload_type);
148 void SetRtxReceivePayloadType(int payload_type);
150 // Sets the starting sequence number, must be called before StartSend.
151 int32_t SetStartSequenceNumber(uint16_t sequence_number);
153 // Sets the CName for the outgoing stream on the channel.
154 int32_t SetRTCPCName(const char rtcp_cname[]);
156 // Gets the CName for the outgoing stream on the channel.
157 int32_t GetRTCPCName(char rtcp_cname[]);
159 // Gets the CName of the incoming stream.
160 int32_t GetRemoteRTCPCName(char rtcp_cname[]);
161 int32_t RegisterRtpObserver(ViERTPObserver* observer);
162 int32_t RegisterRtcpObserver(ViERTCPObserver* observer);
163 int32_t SendApplicationDefinedRTCPPacket(
164 const uint8_t sub_type,
167 uint16_t data_length_in_bytes);
169 // Returns statistics reported by the remote client in an RTCP packet.
170 int32_t GetSendRtcpStatistics(uint16_t* fraction_lost,
171 uint32_t* cumulative_lost,
172 uint32_t* extended_max,
173 uint32_t* jitter_samples,
176 // Called on receipt of RTCP report block from remote side.
177 void RegisterSendChannelRtcpStatisticsCallback(
178 RtcpStatisticsCallback* callback);
180 // Returns our localy created statistics of the received RTP stream.
181 int32_t GetReceivedRtcpStatistics(uint16_t* fraction_lost,
182 uint32_t* cumulative_lost,
183 uint32_t* extended_max,
184 uint32_t* jitter_samples,
187 // Called on generation of RTCP stats
188 void RegisterReceiveChannelRtcpStatisticsCallback(
189 RtcpStatisticsCallback* callback);
191 // Gets sent/received packets statistics.
192 int32_t GetRtpStatistics(uint32_t* bytes_sent,
193 uint32_t* packets_sent,
194 uint32_t* bytes_received,
195 uint32_t* packets_received) const;
197 // Called on update of RTP statistics.
198 void RegisterSendChannelRtpStatisticsCallback(
199 StreamDataCountersCallback* callback);
201 // Called on update of RTP statistics.
202 void RegisterReceiveChannelRtpStatisticsCallback(
203 StreamDataCountersCallback* callback);
205 void GetRtcpPacketTypeCounters(RtcpPacketTypeCounter* packets_sent,
206 RtcpPacketTypeCounter* packets_received) const;
208 void GetBandwidthUsage(uint32_t* total_bitrate_sent,
209 uint32_t* video_bitrate_sent,
210 uint32_t* fec_bitrate_sent,
211 uint32_t* nackBitrateSent) const;
212 bool GetSendSideDelay(int* avg_send_delay, int* max_send_delay) const;
213 void GetEstimatedReceiveBandwidth(uint32_t* estimated_bandwidth) const;
214 void GetReceiveBandwidthEstimatorStats(
215 ReceiveBandwidthEstimatorStats* output) const;
217 // Called on any new send bitrate estimate.
218 void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer);
220 int32_t StartRTPDump(const char file_nameUTF8[1024],
221 RTPDirections direction);
222 int32_t StopRTPDump(RTPDirections direction);
224 // Implements RtcpFeedback.
225 // TODO(pwestin) Depricate this functionality.
226 virtual void OnApplicationDataReceived(const int32_t id,
227 const uint8_t sub_type,
229 const uint16_t length,
230 const uint8_t* data);
231 // Implements RtpFeedback.
232 virtual int32_t OnInitializeDecoder(
234 const int8_t payload_type,
235 const char payload_name[RTP_PAYLOAD_NAME_SIZE],
237 const uint8_t channels,
238 const uint32_t rate);
239 virtual void OnIncomingSSRCChanged(const int32_t id,
240 const uint32_t ssrc);
241 virtual void OnIncomingCSRCChanged(const int32_t id,
244 virtual void ResetStatistics(uint32_t);
246 int32_t SetLocalReceiver(const uint16_t rtp_port,
247 const uint16_t rtcp_port,
248 const char* ip_address);
249 int32_t GetLocalReceiver(uint16_t* rtp_port,
251 char* ip_address) const;
252 int32_t SetSendDestination(const char* ip_address,
253 const uint16_t rtp_port,
254 const uint16_t rtcp_port,
255 const uint16_t source_rtp_port,
256 const uint16_t source_rtcp_port);
257 int32_t GetSendDestination(char* ip_address,
260 uint16_t* source_rtp_port,
261 uint16_t* source_rtcp_port) const;
262 int32_t GetSourceInfo(uint16_t* rtp_port,
265 uint32_t ip_address_length);
267 int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC);
272 int32_t StartReceive();
273 int32_t StopReceive();
275 int32_t RegisterSendTransport(Transport* transport);
276 int32_t DeregisterSendTransport();
278 // Incoming packet from external transport.
279 int32_t ReceivedRTPPacket(const void* rtp_packet,
280 const int32_t rtp_packet_length,
281 const PacketTime& packet_time);
283 // Incoming packet from external transport.
284 int32_t ReceivedRTCPPacket(const void* rtcp_packet,
285 const int32_t rtcp_packet_length);
287 // Sets the maximum transfer unit size for the network link, i.e. including
288 // IP, UDP and RTP headers.
289 int32_t SetMTU(uint16_t mtu);
291 // Returns maximum allowed payload size, i.e. the maximum allowed size of
292 // encoded data in each packet.
293 uint16_t MaxDataPayloadLength() const;
294 int32_t SetMaxPacketBurstSize(uint16_t max_number_of_packets);
295 int32_t SetPacketBurstSpreadState(bool enable, const uint16_t frame_periodMS);
297 int32_t EnableColorEnhancement(bool enable);
299 // Gets the modules used by the channel.
302 CallStatsObserver* GetStatsObserver();
304 // Implements VCMReceiveCallback.
305 virtual int32_t FrameToRender(I420VideoFrame& video_frame); // NOLINT
307 // Implements VCMReceiveCallback.
308 virtual int32_t ReceivedDecodedReferenceFrame(
309 const uint64_t picture_id);
311 // Implements VCMReceiveCallback.
312 virtual void IncomingCodecChanged(const VideoCodec& codec);
314 // Implements VCMReceiveStatisticsCallback.
315 virtual int32_t OnReceiveStatisticsUpdate(const uint32_t bit_rate,
316 const uint32_t frame_rate);
318 // Implements VCMDecoderTimingCallback.
319 virtual void OnDecoderTiming(int decode_ms,
321 int current_delay_ms,
323 int jitter_buffer_ms,
324 int min_playout_delay_ms,
325 int render_delay_ms);
327 // Implements VideoFrameTypeCallback.
328 virtual int32_t RequestKeyFrame();
330 // Implements VideoFrameTypeCallback.
331 virtual int32_t SliceLossIndicationRequest(
332 const uint64_t picture_id);
334 // Implements VideoPacketRequestCallback.
335 virtual int32_t ResendPackets(const uint16_t* sequence_numbers,
338 int32_t SetVoiceChannel(int32_t ve_channel_id,
339 VoEVideoSync* ve_sync_interface);
340 int32_t VoiceChannel();
342 // Implements ViEFrameProviderBase.
343 virtual int FrameCallbackChanged() {return -1;}
345 int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter);
347 // New-style callbacks, used by VideoReceiveStream.
348 void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback);
349 void RegisterPreDecodeImageCallback(
350 EncodedImageCallback* pre_decode_callback);
352 void RegisterSendFrameCountObserver(FrameCountObserver* observer);
354 void ReceivedBWEPacket(int64_t arrival_time_ms, int payload_size,
355 const RTPHeader& header);
358 static bool ChannelDecodeThreadFunction(void* obj);
359 bool ChannelDecodeProcess();
361 void OnRttUpdate(uint32_t rtt);
364 // Assumed to be protected.
365 int32_t StartDecodeThread();
366 int32_t StopDecodeThread();
368 int32_t ProcessNACKRequest(const bool enable);
369 int32_t ProcessFECRequest(const bool enable,
370 const unsigned char payload_typeRED,
371 const unsigned char payload_typeFEC);
372 // Compute NACK list parameters for the buffering mode.
373 int GetRequiredNackListSize(int target_delay_ms);
377 uint32_t number_of_cores_;
378 uint8_t num_socket_threads_;
380 // Used for all registered callbacks except rendering.
381 scoped_ptr<CriticalSectionWrapper> callback_cs_;
382 scoped_ptr<CriticalSectionWrapper> rtp_rtcp_cs_;
384 RtpRtcp* default_rtp_rtcp_;
386 // Owned modules/classes.
387 scoped_ptr<RtpRtcp> rtp_rtcp_;
388 std::list<RtpRtcp*> simulcast_rtp_rtcp_;
389 std::list<RtpRtcp*> removed_rtp_rtcp_;
390 VideoCodingModule& vcm_;
391 ViEReceiver vie_receiver_;
392 ViESender vie_sender_;
393 ViESyncModule vie_sync_;
395 // Helper to report call statistics.
396 scoped_ptr<ChannelStatsObserver> stats_observer_;
399 ProcessThread& module_process_thread_;
400 ViEDecoderObserver* codec_observer_;
401 bool do_key_frame_callbackRequest_;
402 ViERTPObserver* rtp_observer_;
403 ViERTCPObserver* rtcp_observer_;
404 RtcpIntraFrameObserver* intra_frame_observer_;
405 RtcpRttStats* rtt_stats_;
406 PacedSender* paced_sender_;
408 scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_;
409 int send_timestamp_extension_id_;
410 int absolute_send_time_extension_id_;
412 Transport* external_transport_;
415 // Current receive codec used for codec change callback.
416 VideoCodec receive_codec_;
417 bool wait_for_key_frame_;
418 ThreadWrapper* decode_thread_;
420 ViEEffectFilter* effect_filter_;
421 bool color_enhancement_;
423 // User set MTU, -1 if not set.
427 int nack_history_size_sender_;
428 int max_nack_reordering_threshold_;
429 I420FrameCallback* pre_render_callback_;
430 const Config& config_;
433 } // namespace webrtc
435 #endif // WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_