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 GetReceiveBandwidthEstimatorStats(
214 ReceiveBandwidthEstimatorStats* output) const;
216 // Called on any new send bitrate estimate.
217 void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer);
219 int32_t StartRTPDump(const char file_nameUTF8[1024],
220 RTPDirections direction);
221 int32_t StopRTPDump(RTPDirections direction);
223 // Implements RtcpFeedback.
224 // TODO(pwestin) Depricate this functionality.
225 virtual void OnApplicationDataReceived(const int32_t id,
226 const uint8_t sub_type,
228 const uint16_t length,
229 const uint8_t* data);
230 // Implements RtpFeedback.
231 virtual int32_t OnInitializeDecoder(
233 const int8_t payload_type,
234 const char payload_name[RTP_PAYLOAD_NAME_SIZE],
236 const uint8_t channels,
237 const uint32_t rate);
238 virtual void OnIncomingSSRCChanged(const int32_t id,
239 const uint32_t ssrc);
240 virtual void OnIncomingCSRCChanged(const int32_t id,
243 virtual void ResetStatistics(uint32_t);
245 int32_t SetLocalReceiver(const uint16_t rtp_port,
246 const uint16_t rtcp_port,
247 const char* ip_address);
248 int32_t GetLocalReceiver(uint16_t* rtp_port,
250 char* ip_address) const;
251 int32_t SetSendDestination(const char* ip_address,
252 const uint16_t rtp_port,
253 const uint16_t rtcp_port,
254 const uint16_t source_rtp_port,
255 const uint16_t source_rtcp_port);
256 int32_t GetSendDestination(char* ip_address,
259 uint16_t* source_rtp_port,
260 uint16_t* source_rtcp_port) const;
261 int32_t GetSourceInfo(uint16_t* rtp_port,
264 uint32_t ip_address_length);
266 int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC);
271 int32_t StartReceive();
272 int32_t StopReceive();
274 int32_t RegisterSendTransport(Transport* transport);
275 int32_t DeregisterSendTransport();
277 // Incoming packet from external transport.
278 int32_t ReceivedRTPPacket(const void* rtp_packet,
279 const int32_t rtp_packet_length,
280 const PacketTime& packet_time);
282 // Incoming packet from external transport.
283 int32_t ReceivedRTCPPacket(const void* rtcp_packet,
284 const int32_t rtcp_packet_length);
286 // Sets the maximum transfer unit size for the network link, i.e. including
287 // IP, UDP and RTP headers.
288 int32_t SetMTU(uint16_t mtu);
290 // Returns maximum allowed payload size, i.e. the maximum allowed size of
291 // encoded data in each packet.
292 uint16_t MaxDataPayloadLength() const;
293 int32_t SetMaxPacketBurstSize(uint16_t max_number_of_packets);
294 int32_t SetPacketBurstSpreadState(bool enable, const uint16_t frame_periodMS);
296 int32_t EnableColorEnhancement(bool enable);
298 // Gets the modules used by the channel.
301 CallStatsObserver* GetStatsObserver();
303 // Implements VCMReceiveCallback.
304 virtual int32_t FrameToRender(I420VideoFrame& video_frame); // NOLINT
306 // Implements VCMReceiveCallback.
307 virtual int32_t ReceivedDecodedReferenceFrame(
308 const uint64_t picture_id);
310 // Implements VCMReceiveCallback.
311 virtual void IncomingCodecChanged(const VideoCodec& codec);
313 // Implements VCMReceiveStatisticsCallback.
314 virtual int32_t OnReceiveStatisticsUpdate(const uint32_t bit_rate,
315 const uint32_t frame_rate);
317 // Implements VCMDecoderTimingCallback.
318 virtual void OnDecoderTiming(int decode_ms,
320 int current_delay_ms,
322 int jitter_buffer_ms,
323 int min_playout_delay_ms,
324 int render_delay_ms);
326 // Implements VideoFrameTypeCallback.
327 virtual int32_t RequestKeyFrame();
329 // Implements VideoFrameTypeCallback.
330 virtual int32_t SliceLossIndicationRequest(
331 const uint64_t picture_id);
333 // Implements VideoPacketRequestCallback.
334 virtual int32_t ResendPackets(const uint16_t* sequence_numbers,
337 int32_t SetVoiceChannel(int32_t ve_channel_id,
338 VoEVideoSync* ve_sync_interface);
339 int32_t VoiceChannel();
341 // Implements ViEFrameProviderBase.
342 virtual int FrameCallbackChanged() {return -1;}
344 int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter);
346 // New-style callbacks, used by VideoReceiveStream.
347 void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback);
348 void RegisterPreDecodeImageCallback(
349 EncodedImageCallback* pre_decode_callback);
351 void RegisterSendFrameCountObserver(FrameCountObserver* observer);
353 void ReceivedBWEPacket(int64_t arrival_time_ms, int payload_size,
354 const RTPHeader& header);
357 static bool ChannelDecodeThreadFunction(void* obj);
358 bool ChannelDecodeProcess();
360 void OnRttUpdate(uint32_t rtt);
363 // Assumed to be protected.
364 int32_t StartDecodeThread();
365 int32_t StopDecodeThread();
367 int32_t ProcessNACKRequest(const bool enable);
368 int32_t ProcessFECRequest(const bool enable,
369 const unsigned char payload_typeRED,
370 const unsigned char payload_typeFEC);
371 // Compute NACK list parameters for the buffering mode.
372 int GetRequiredNackListSize(int target_delay_ms);
376 uint32_t number_of_cores_;
377 uint8_t num_socket_threads_;
379 // Used for all registered callbacks except rendering.
380 scoped_ptr<CriticalSectionWrapper> callback_cs_;
381 scoped_ptr<CriticalSectionWrapper> rtp_rtcp_cs_;
383 RtpRtcp* default_rtp_rtcp_;
385 // Owned modules/classes.
386 scoped_ptr<RtpRtcp> rtp_rtcp_;
387 std::list<RtpRtcp*> simulcast_rtp_rtcp_;
388 std::list<RtpRtcp*> removed_rtp_rtcp_;
389 VideoCodingModule& vcm_;
390 ViEReceiver vie_receiver_;
391 ViESender vie_sender_;
392 ViESyncModule vie_sync_;
394 // Helper to report call statistics.
395 scoped_ptr<ChannelStatsObserver> stats_observer_;
398 ProcessThread& module_process_thread_;
399 ViEDecoderObserver* codec_observer_;
400 bool do_key_frame_callbackRequest_;
401 ViERTPObserver* rtp_observer_;
402 ViERTCPObserver* rtcp_observer_;
403 RtcpIntraFrameObserver* intra_frame_observer_;
404 RtcpRttStats* rtt_stats_;
405 PacedSender* paced_sender_;
407 scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_;
408 int send_timestamp_extension_id_;
409 int absolute_send_time_extension_id_;
411 Transport* external_transport_;
414 // Current receive codec used for codec change callback.
415 VideoCodec receive_codec_;
416 bool wait_for_key_frame_;
417 ThreadWrapper* decode_thread_;
419 ViEEffectFilter* effect_filter_;
420 bool color_enhancement_;
422 // User set MTU, -1 if not set.
426 int nack_history_size_sender_;
427 int max_nack_reordering_threshold_;
428 I420FrameCallback* pre_render_callback_;
429 const Config& config_;
432 } // namespace webrtc
434 #endif // WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_