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 GetBandwidthUsage(uint32_t* total_bitrate_sent,
206 uint32_t* video_bitrate_sent,
207 uint32_t* fec_bitrate_sent,
208 uint32_t* nackBitrateSent) const;
209 bool GetSendSideDelay(int* avg_send_delay, int* max_send_delay) const;
210 void GetEstimatedReceiveBandwidth(uint32_t* estimated_bandwidth) const;
211 void GetReceiveBandwidthEstimatorStats(
212 ReceiveBandwidthEstimatorStats* output) const;
214 // Called on any new send bitrate estimate.
215 void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer);
217 int32_t StartRTPDump(const char file_nameUTF8[1024],
218 RTPDirections direction);
219 int32_t StopRTPDump(RTPDirections direction);
221 // Implements RtcpFeedback.
222 // TODO(pwestin) Depricate this functionality.
223 virtual void OnApplicationDataReceived(const int32_t id,
224 const uint8_t sub_type,
226 const uint16_t length,
227 const uint8_t* data);
228 // Implements RtpFeedback.
229 virtual int32_t OnInitializeDecoder(
231 const int8_t payload_type,
232 const char payload_name[RTP_PAYLOAD_NAME_SIZE],
234 const uint8_t channels,
235 const uint32_t rate);
236 virtual void OnIncomingSSRCChanged(const int32_t id,
237 const uint32_t ssrc);
238 virtual void OnIncomingCSRCChanged(const int32_t id,
241 virtual void ResetStatistics(uint32_t);
243 int32_t SetLocalReceiver(const uint16_t rtp_port,
244 const uint16_t rtcp_port,
245 const char* ip_address);
246 int32_t GetLocalReceiver(uint16_t* rtp_port,
248 char* ip_address) const;
249 int32_t SetSendDestination(const char* ip_address,
250 const uint16_t rtp_port,
251 const uint16_t rtcp_port,
252 const uint16_t source_rtp_port,
253 const uint16_t source_rtcp_port);
254 int32_t GetSendDestination(char* ip_address,
257 uint16_t* source_rtp_port,
258 uint16_t* source_rtcp_port) const;
259 int32_t GetSourceInfo(uint16_t* rtp_port,
262 uint32_t ip_address_length);
264 int32_t SetRemoteSSRCType(const StreamType usage, const uint32_t SSRC);
269 int32_t StartReceive();
270 int32_t StopReceive();
272 int32_t RegisterSendTransport(Transport* transport);
273 int32_t DeregisterSendTransport();
275 // Incoming packet from external transport.
276 int32_t ReceivedRTPPacket(const void* rtp_packet,
277 const int32_t rtp_packet_length,
278 const PacketTime& packet_time);
280 // Incoming packet from external transport.
281 int32_t ReceivedRTCPPacket(const void* rtcp_packet,
282 const int32_t rtcp_packet_length);
284 // Sets the maximum transfer unit size for the network link, i.e. including
285 // IP, UDP and RTP headers.
286 int32_t SetMTU(uint16_t mtu);
288 // Returns maximum allowed payload size, i.e. the maximum allowed size of
289 // encoded data in each packet.
290 uint16_t MaxDataPayloadLength() const;
291 int32_t SetMaxPacketBurstSize(uint16_t max_number_of_packets);
292 int32_t SetPacketBurstSpreadState(bool enable, const uint16_t frame_periodMS);
294 int32_t EnableColorEnhancement(bool enable);
296 // Gets the modules used by the channel.
299 CallStatsObserver* GetStatsObserver();
301 // Implements VCMReceiveCallback.
302 virtual int32_t FrameToRender(I420VideoFrame& video_frame); // NOLINT
304 // Implements VCMReceiveCallback.
305 virtual int32_t ReceivedDecodedReferenceFrame(
306 const uint64_t picture_id);
308 // Implements VCMReceiveCallback.
309 virtual void IncomingCodecChanged(const VideoCodec& codec);
311 // Implements VCMReceiveStatisticsCallback.
312 virtual int32_t OnReceiveStatisticsUpdate(const uint32_t bit_rate,
313 const uint32_t frame_rate);
315 // Implements VCMDecoderTimingCallback.
316 virtual void OnDecoderTiming(int decode_ms,
318 int current_delay_ms,
320 int jitter_buffer_ms,
321 int min_playout_delay_ms,
322 int render_delay_ms);
324 // Implements VideoFrameTypeCallback.
325 virtual int32_t RequestKeyFrame();
327 // Implements VideoFrameTypeCallback.
328 virtual int32_t SliceLossIndicationRequest(
329 const uint64_t picture_id);
331 // Implements VideoPacketRequestCallback.
332 virtual int32_t ResendPackets(const uint16_t* sequence_numbers,
335 int32_t SetVoiceChannel(int32_t ve_channel_id,
336 VoEVideoSync* ve_sync_interface);
337 int32_t VoiceChannel();
339 // Implements ViEFrameProviderBase.
340 virtual int FrameCallbackChanged() {return -1;}
342 int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter);
344 // New-style callbacks, used by VideoReceiveStream.
345 void RegisterPreRenderCallback(I420FrameCallback* pre_render_callback);
346 void RegisterPreDecodeImageCallback(
347 EncodedImageCallback* pre_decode_callback);
349 void RegisterSendFrameCountObserver(FrameCountObserver* observer);
352 static bool ChannelDecodeThreadFunction(void* obj);
353 bool ChannelDecodeProcess();
355 void OnRttUpdate(uint32_t rtt);
358 // Assumed to be protected.
359 int32_t StartDecodeThread();
360 int32_t StopDecodeThread();
362 int32_t ProcessNACKRequest(const bool enable);
363 int32_t ProcessFECRequest(const bool enable,
364 const unsigned char payload_typeRED,
365 const unsigned char payload_typeFEC);
366 // Compute NACK list parameters for the buffering mode.
367 int GetRequiredNackListSize(int target_delay_ms);
371 uint32_t number_of_cores_;
372 uint8_t num_socket_threads_;
374 // Used for all registered callbacks except rendering.
375 scoped_ptr<CriticalSectionWrapper> callback_cs_;
376 scoped_ptr<CriticalSectionWrapper> rtp_rtcp_cs_;
378 RtpRtcp* default_rtp_rtcp_;
380 // Owned modules/classes.
381 scoped_ptr<RtpRtcp> rtp_rtcp_;
382 std::list<RtpRtcp*> simulcast_rtp_rtcp_;
383 std::list<RtpRtcp*> removed_rtp_rtcp_;
384 VideoCodingModule& vcm_;
385 ViEReceiver vie_receiver_;
386 ViESender vie_sender_;
387 ViESyncModule vie_sync_;
389 // Helper to report call statistics.
390 scoped_ptr<ChannelStatsObserver> stats_observer_;
393 ProcessThread& module_process_thread_;
394 ViEDecoderObserver* codec_observer_;
395 bool do_key_frame_callbackRequest_;
396 ViERTPObserver* rtp_observer_;
397 ViERTCPObserver* rtcp_observer_;
398 RtcpIntraFrameObserver* intra_frame_observer_;
399 RtcpRttStats* rtt_stats_;
400 PacedSender* paced_sender_;
402 scoped_ptr<RtcpBandwidthObserver> bandwidth_observer_;
403 int send_timestamp_extension_id_;
404 int absolute_send_time_extension_id_;
406 Transport* external_transport_;
409 // Current receive codec used for codec change callback.
410 VideoCodec receive_codec_;
411 bool wait_for_key_frame_;
412 ThreadWrapper* decode_thread_;
414 ViEEffectFilter* effect_filter_;
415 bool color_enhancement_;
417 // User set MTU, -1 if not set.
421 int nack_history_size_sender_;
422 int max_nack_reordering_threshold_;
423 I420FrameCallback* pre_render_callback_;
424 const Config& config_;
427 } // namespace webrtc
429 #endif // WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_