a4863dbdf0
Only changed include paths in files, gyp-files and Android.mk. TEST=vie_auto_test and peerconnection_client builds. Review URL: http://webrtc-codereview.appspot.com/330017 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1281 4adac7df-926f-26a2-2b94-8c16560cd09d
399 lines
16 KiB
C++
399 lines
16 KiB
C++
/*
|
|
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
// vie_channel.h
|
|
|
|
#ifndef WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
|
|
#define WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
|
|
|
|
#include <list>
|
|
|
|
#include "modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
|
|
#include "modules/udp_transport/interface/udp_transport.h"
|
|
#include "modules/video_coding/main/interface/video_coding_defines.h"
|
|
#include "system_wrappers/interface/tick_util.h"
|
|
#include "typedefs.h"
|
|
#include "video_engine/include/vie_network.h"
|
|
#include "video_engine/include/vie_rtp_rtcp.h"
|
|
#include "video_engine/vie_defines.h"
|
|
#include "video_engine/vie_file_recorder.h"
|
|
#include "video_engine/vie_frame_provider_base.h"
|
|
|
|
namespace webrtc {
|
|
|
|
class CriticalSectionWrapper;
|
|
class Encryption;
|
|
class ProcessThread;
|
|
class RtpRtcp;
|
|
class ThreadWrapper;
|
|
class VideoCodingModule;
|
|
class VideoDecoder;
|
|
class VideoRenderCallback;
|
|
class ViEDecoderObserver;
|
|
class ViEEffectFilter;
|
|
class ViENetworkObserver;
|
|
class ViEReceiver;
|
|
class ViERTCPObserver;
|
|
class ViERTPObserver;
|
|
class ViESender;
|
|
class ViESyncModule;
|
|
class VoEVideoSync;
|
|
|
|
class ViEChannel
|
|
: public VCMFrameTypeCallback,
|
|
public VCMReceiveCallback,
|
|
public VCMReceiveStatisticsCallback,
|
|
public VCMPacketRequestCallback,
|
|
public VCMFrameStorageCallback,
|
|
public RtcpFeedback,
|
|
public RtpFeedback,
|
|
public ViEFrameProviderBase {
|
|
public:
|
|
ViEChannel(WebRtc_Word32 channel_id,
|
|
WebRtc_Word32 engine_id,
|
|
WebRtc_UWord32 number_of_cores,
|
|
ProcessThread& module_process_thread);
|
|
~ViEChannel();
|
|
|
|
WebRtc_Word32 Init();
|
|
|
|
// Sets the encoder to use for the channel. |new_stream| indicates the encoder
|
|
// type has changed and we should start a new RTP stream.
|
|
WebRtc_Word32 SetSendCodec(const VideoCodec& video_codec,
|
|
bool new_stream = true);
|
|
WebRtc_Word32 SetReceiveCodec(const VideoCodec& video_codec);
|
|
WebRtc_Word32 GetReceiveCodec(VideoCodec& video_codec);
|
|
WebRtc_Word32 RegisterCodecObserver(ViEDecoderObserver* observer);
|
|
// Registers an external decoder. |decoder_render| is set to true if the
|
|
// decoder will do the rendering. If |decoder_render| is set,|render_delay|
|
|
// indicates the time needed to decode and render a frame.
|
|
WebRtc_Word32 RegisterExternalDecoder(const WebRtc_UWord8 pl_type,
|
|
VideoDecoder* decoder,
|
|
bool decoder_render,
|
|
WebRtc_Word32 render_delay);
|
|
WebRtc_Word32 DeRegisterExternalDecoder(const WebRtc_UWord8 pl_type);
|
|
WebRtc_Word32 ReceiveCodecStatistics(WebRtc_UWord32& num_key_frames,
|
|
WebRtc_UWord32& num_delta_frames);
|
|
WebRtc_UWord32 DiscardedPackets() const;
|
|
|
|
// Only affects calls to SetReceiveCodec done after this call.
|
|
WebRtc_Word32 WaitForKeyFrame(bool wait);
|
|
|
|
// If enabled, a key frame request will be sent as soon as there are lost
|
|
// packets. If |only_key_frames| are set, requests are only sent for loss in
|
|
// key frames.
|
|
WebRtc_Word32 SetSignalPacketLossStatus(bool enable, bool only_key_frames);
|
|
|
|
WebRtc_Word32 SetRTCPMode(const RTCPMethod rtcp_mode);
|
|
WebRtc_Word32 GetRTCPMode(RTCPMethod& rtcp_mode);
|
|
WebRtc_Word32 SetNACKStatus(const bool enable);
|
|
WebRtc_Word32 SetFECStatus(const bool enable,
|
|
const unsigned char payload_typeRED,
|
|
const unsigned char payload_typeFEC);
|
|
WebRtc_Word32 SetHybridNACKFECStatus(const bool enable,
|
|
const unsigned char payload_typeRED,
|
|
const unsigned char payload_typeFEC);
|
|
WebRtc_Word32 SetKeyFrameRequestMethod(const KeyFrameRequestMethod method);
|
|
WebRtc_Word32 EnableTMMBR(const bool enable);
|
|
WebRtc_Word32 EnableKeyFrameRequestCallback(const bool enable);
|
|
|
|
// Sets SSRC for outgoing stream.
|
|
WebRtc_Word32 SetSSRC(const WebRtc_UWord32 SSRC,
|
|
const StreamType usage,
|
|
const unsigned char simulcast_idx);
|
|
|
|
// Gets SSRC for outgoing stream.
|
|
WebRtc_Word32 GetLocalSSRC(WebRtc_UWord32& SSRC);
|
|
|
|
// Gets SSRC for the incoming stream.
|
|
WebRtc_Word32 GetRemoteSSRC(WebRtc_UWord32& SSRC);
|
|
|
|
// Gets the CSRC for the incoming stream.
|
|
WebRtc_Word32 GetRemoteCSRC(unsigned int CSRCs[kRtpCsrcSize]);
|
|
|
|
// Sets the starting sequence number, must be called before StartSend.
|
|
WebRtc_Word32 SetStartSequenceNumber(WebRtc_UWord16 sequence_number);
|
|
|
|
// Sets the CName for the outgoing stream on the channel.
|
|
WebRtc_Word32 SetRTCPCName(const WebRtc_Word8 rtcp_cname[]);
|
|
|
|
// Gets the CName for the outgoing stream on the channel.
|
|
WebRtc_Word32 GetRTCPCName(WebRtc_Word8 rtcp_cname[]);
|
|
|
|
// Gets the CName of the incoming stream.
|
|
WebRtc_Word32 GetRemoteRTCPCName(WebRtc_Word8 rtcp_cname[]);
|
|
WebRtc_Word32 RegisterRtpObserver(ViERTPObserver* observer);
|
|
WebRtc_Word32 RegisterRtcpObserver(ViERTCPObserver* observer);
|
|
WebRtc_Word32 SendApplicationDefinedRTCPPacket(
|
|
const WebRtc_UWord8 sub_type,
|
|
WebRtc_UWord32 name,
|
|
const WebRtc_UWord8* data,
|
|
WebRtc_UWord16 data_length_in_bytes);
|
|
|
|
// Gets statistics sent in RTCP packets to remote side.
|
|
WebRtc_Word32 GetSendRtcpStatistics(WebRtc_UWord16& fraction_lost,
|
|
WebRtc_UWord32& cumulative_lost,
|
|
WebRtc_UWord32& extended_max,
|
|
WebRtc_UWord32& jitter_samples,
|
|
WebRtc_Word32& rtt_ms);
|
|
|
|
// Gets statistics received in RTCP packets from remote side.
|
|
WebRtc_Word32 GetReceivedRtcpStatistics(WebRtc_UWord16& fraction_lost,
|
|
WebRtc_UWord32& cumulative_lost,
|
|
WebRtc_UWord32& extended_max,
|
|
WebRtc_UWord32& jitter_samples,
|
|
WebRtc_Word32& rtt_ms);
|
|
|
|
// Gets sent/received packets statistics.
|
|
WebRtc_Word32 GetRtpStatistics(WebRtc_UWord32& bytes_sent,
|
|
WebRtc_UWord32& packets_sent,
|
|
WebRtc_UWord32& bytes_received,
|
|
WebRtc_UWord32& packets_received) const;
|
|
void GetBandwidthUsage(WebRtc_UWord32& total_bitrate_sent,
|
|
WebRtc_UWord32& video_bitrate_sent,
|
|
WebRtc_UWord32& fec_bitrate_sent,
|
|
WebRtc_UWord32& nackBitrateSent) const;
|
|
WebRtc_Word32 SetKeepAliveStatus(const bool enable,
|
|
const WebRtc_Word8 unknown_payload_type,
|
|
const WebRtc_UWord16 delta_transmit_timeMS);
|
|
WebRtc_Word32 GetKeepAliveStatus(bool& enable,
|
|
WebRtc_Word8& unknown_payload_type,
|
|
WebRtc_UWord16& delta_transmit_timeMS);
|
|
WebRtc_Word32 StartRTPDump(const char file_nameUTF8[1024],
|
|
RTPDirections direction);
|
|
WebRtc_Word32 StopRTPDump(RTPDirections direction);
|
|
|
|
// Implements RtcpFeedback.
|
|
virtual void OnLipSyncUpdate(const WebRtc_Word32 id,
|
|
const WebRtc_Word32 audio_video_offset);
|
|
virtual void OnApplicationDataReceived(const WebRtc_Word32 id,
|
|
const WebRtc_UWord8 sub_type,
|
|
const WebRtc_UWord32 name,
|
|
const WebRtc_UWord16 length,
|
|
const WebRtc_UWord8* data);
|
|
|
|
// Implements RtpFeedback.
|
|
virtual WebRtc_Word32 OnInitializeDecoder(
|
|
const WebRtc_Word32 id,
|
|
const WebRtc_Word8 payload_type,
|
|
const WebRtc_Word8 payload_name[RTP_PAYLOAD_NAME_SIZE],
|
|
const int frequency,
|
|
const WebRtc_UWord8 channels,
|
|
const WebRtc_UWord32 rate);
|
|
virtual void OnPacketTimeout(const WebRtc_Word32 id);
|
|
virtual void OnReceivedPacket(const WebRtc_Word32 id,
|
|
const RtpRtcpPacketType packet_type);
|
|
virtual void OnPeriodicDeadOrAlive(const WebRtc_Word32 id,
|
|
const RTPAliveType alive);
|
|
virtual void OnIncomingSSRCChanged(const WebRtc_Word32 id,
|
|
const WebRtc_UWord32 SSRC);
|
|
virtual void OnIncomingCSRCChanged(const WebRtc_Word32 id,
|
|
const WebRtc_UWord32 CSRC,
|
|
const bool added);
|
|
|
|
WebRtc_Word32 SetLocalReceiver(const WebRtc_UWord16 rtp_port,
|
|
const WebRtc_UWord16 rtcp_port,
|
|
const WebRtc_Word8* ip_address);
|
|
WebRtc_Word32 GetLocalReceiver(WebRtc_UWord16& rtp_port,
|
|
WebRtc_UWord16& rtcp_port,
|
|
WebRtc_Word8* ip_address) const;
|
|
WebRtc_Word32 SetSendDestination(const WebRtc_Word8* ip_address,
|
|
const WebRtc_UWord16 rtp_port,
|
|
const WebRtc_UWord16 rtcp_port,
|
|
const WebRtc_UWord16 source_rtp_port,
|
|
const WebRtc_UWord16 source_rtcp_port);
|
|
WebRtc_Word32 GetSendDestination(WebRtc_Word8* ip_address,
|
|
WebRtc_UWord16& rtp_port,
|
|
WebRtc_UWord16& rtcp_port,
|
|
WebRtc_UWord16& source_rtp_port,
|
|
WebRtc_UWord16& source_rtcp_port) const;
|
|
WebRtc_Word32 GetSourceInfo(WebRtc_UWord16& rtp_port,
|
|
WebRtc_UWord16& rtcp_port,
|
|
WebRtc_Word8* ip_address,
|
|
WebRtc_UWord32 ip_address_length);
|
|
|
|
|
|
WebRtc_Word32 StartSend();
|
|
WebRtc_Word32 StopSend();
|
|
bool Sending();
|
|
WebRtc_Word32 StartReceive();
|
|
WebRtc_Word32 StopReceive();
|
|
bool Receiving();
|
|
|
|
WebRtc_Word32 RegisterSendTransport(Transport& transport);
|
|
WebRtc_Word32 DeregisterSendTransport();
|
|
|
|
// Incoming packet from external transport.
|
|
WebRtc_Word32 ReceivedRTPPacket(const void* rtp_packet,
|
|
const WebRtc_Word32 rtp_packet_length);
|
|
|
|
// Incoming packet from external transport.
|
|
WebRtc_Word32 ReceivedRTCPPacket(const void* rtcp_packet,
|
|
const WebRtc_Word32 rtcp_packet_length);
|
|
|
|
WebRtc_Word32 EnableIPv6();
|
|
bool IsIPv6Enabled();
|
|
WebRtc_Word32 SetSourceFilter(const WebRtc_UWord16 rtp_port,
|
|
const WebRtc_UWord16 rtcp_port,
|
|
const WebRtc_Word8* ip_address);
|
|
WebRtc_Word32 GetSourceFilter(WebRtc_UWord16& rtp_port,
|
|
WebRtc_UWord16& rtcp_port,
|
|
WebRtc_Word8* ip_address) const;
|
|
|
|
WebRtc_Word32 SetToS(const WebRtc_Word32 DSCP, const bool use_set_sockOpt);
|
|
WebRtc_Word32 GetToS(WebRtc_Word32& DSCP, bool& use_set_sockOpt) const;
|
|
WebRtc_Word32 SetSendGQoS(const bool enable,
|
|
const WebRtc_Word32 service_type,
|
|
const WebRtc_UWord32 max_bitrate,
|
|
const WebRtc_Word32 overrideDSCP);
|
|
WebRtc_Word32 GetSendGQoS(bool& enabled, WebRtc_Word32& service_type,
|
|
WebRtc_Word32& overrideDSCP) const;
|
|
|
|
// Sets the maximum transfer unit size for the network link, i.e. including
|
|
// IP, UDP and RTP headers.
|
|
WebRtc_Word32 SetMTU(WebRtc_UWord16 mtu);
|
|
|
|
// Returns maximum allowed payload size, i.e. the maximum allowed size of
|
|
// encoded data in each packet.
|
|
WebRtc_UWord16 MaxDataPayloadLength() const;
|
|
WebRtc_Word32 SetMaxPacketBurstSize(WebRtc_UWord16 max_number_of_packets);
|
|
WebRtc_Word32 SetPacketBurstSpreadState(bool enable,
|
|
const WebRtc_UWord16 frame_periodMS);
|
|
|
|
WebRtc_Word32 SetPacketTimeoutNotification(bool enable,
|
|
WebRtc_UWord32 timeout_seconds);
|
|
WebRtc_Word32 RegisterNetworkObserver(ViENetworkObserver* observer);
|
|
bool NetworkObserverRegistered();
|
|
WebRtc_Word32 SetPeriodicDeadOrAliveStatus(
|
|
const bool enable, const WebRtc_UWord32 sample_time_seconds);
|
|
|
|
WebRtc_Word32 SendUDPPacket(const WebRtc_Word8* data,
|
|
const WebRtc_UWord32 length,
|
|
WebRtc_Word32& transmitted_bytes,
|
|
bool use_rtcp_socket);
|
|
|
|
WebRtc_Word32 EnableColorEnhancement(bool enable);
|
|
|
|
// Register send RTP RTCP module, which will deliver encoded frames to the
|
|
// to the channel RTP module.
|
|
WebRtc_Word32 RegisterSendRtpRtcpModule(RtpRtcp& send_rtp_rtcp_module);
|
|
|
|
// Deregisters the send RTP RTCP module, which will stop the encoder input to
|
|
// the channel.
|
|
WebRtc_Word32 DeregisterSendRtpRtcpModule();
|
|
|
|
// Implements VCMReceiveCallback.
|
|
virtual WebRtc_Word32 FrameToRender(VideoFrame& video_frame);
|
|
|
|
// Implements VCMReceiveCallback.
|
|
virtual WebRtc_Word32 ReceivedDecodedReferenceFrame(
|
|
const WebRtc_UWord64 picture_id);
|
|
|
|
// Implements VCM.
|
|
virtual WebRtc_Word32 StoreReceivedFrame(
|
|
const EncodedVideoData& frame_to_store);
|
|
|
|
// Implements VideoReceiveStatisticsCallback.
|
|
virtual WebRtc_Word32 ReceiveStatistics(const WebRtc_UWord32 bit_rate,
|
|
const WebRtc_UWord32 frame_rate);
|
|
|
|
// Implements VideoFrameTypeCallback.
|
|
virtual WebRtc_Word32 FrameTypeRequest(const FrameType frame_type);
|
|
|
|
// Implements VideoFrameTypeCallback.
|
|
virtual WebRtc_Word32 SliceLossIndicationRequest(
|
|
const WebRtc_UWord64 picture_id);
|
|
|
|
// Implements VideoPacketRequestCallback.
|
|
virtual WebRtc_Word32 ResendPackets(const WebRtc_UWord16* sequence_numbers,
|
|
WebRtc_UWord16 length);
|
|
|
|
WebRtc_Word32 RegisterExternalEncryption(Encryption* encryption);
|
|
WebRtc_Word32 DeRegisterExternalEncryption();
|
|
|
|
WebRtc_Word32 SetVoiceChannel(WebRtc_Word32 ve_channel_id,
|
|
VoEVideoSync* ve_sync_interface);
|
|
WebRtc_Word32 VoiceChannel();
|
|
|
|
// Implements ViEFrameProviderBase.
|
|
virtual int FrameCallbackChanged() {return -1;}
|
|
|
|
WebRtc_Word32 RegisterEffectFilter(ViEEffectFilter* effect_filter);
|
|
|
|
WebRtc_Word32 SetInverseH263Logic(const bool enable);
|
|
|
|
ViEFileRecorder& GetIncomingFileRecorder();
|
|
void ReleaseIncomingFileRecorder();
|
|
|
|
protected:
|
|
static bool ChannelDecodeThreadFunction(void* obj);
|
|
bool ChannelDecodeProcess();
|
|
|
|
private:
|
|
// Assumed to be protected.
|
|
WebRtc_Word32 StartDecodeThread();
|
|
WebRtc_Word32 StopDecodeThread();
|
|
|
|
WebRtc_Word32 ProcessNACKRequest(const bool enable);
|
|
WebRtc_Word32 ProcessFECRequest(const bool enable,
|
|
const unsigned char payload_typeRED,
|
|
const unsigned char payload_typeFEC);
|
|
|
|
WebRtc_Word32 channel_id_;
|
|
WebRtc_Word32 engine_id_;
|
|
WebRtc_UWord32 number_of_cores_;
|
|
WebRtc_UWord8 num_socket_threads_;
|
|
|
|
// Used for all registered callbacks except rendering.
|
|
CriticalSectionWrapper& callbackCritsect_;
|
|
|
|
// Owned modules/classes.
|
|
RtpRtcp& rtp_rtcp_;
|
|
RtpRtcp* default_rtp_rtcp_;
|
|
std::list<RtpRtcp*> simulcast_rtp_rtcp_;
|
|
#ifndef WEBRTC_EXTERNAL_TRANSPORT
|
|
UdpTransport& socket_transport_;
|
|
#endif
|
|
VideoCodingModule& vcm_;
|
|
ViEReceiver& vie_receiver_;
|
|
ViESender& vie_sender_;
|
|
ViESyncModule& vie_sync_;
|
|
|
|
// Not owned.
|
|
ProcessThread& module_process_thread_;
|
|
ViEDecoderObserver* codec_observer_;
|
|
bool do_key_frame_callbackRequest_;
|
|
ViERTPObserver* rtp_observer_;
|
|
ViERTCPObserver* rtcp_observer_;
|
|
ViENetworkObserver* networkObserver_;
|
|
bool rtp_packet_timeout_;
|
|
bool using_packet_spread_;
|
|
|
|
Transport* external_transport_;
|
|
|
|
bool decoder_reset_;
|
|
bool wait_for_key_frame_;
|
|
ThreadWrapper* decode_thread_;
|
|
|
|
Encryption* external_encryption_;
|
|
|
|
ViEEffectFilter* effect_filter_;
|
|
bool color_enhancement_;
|
|
|
|
// Time when RTT time was last reported to VCM JB.
|
|
TickTime vcm_rttreported_;
|
|
|
|
ViEFileRecorder file_recorder_;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // WEBRTC_VIDEO_ENGINE_VIE_CHANNEL_H_
|