/* * 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_MAIN_SOURCE_VIE_CHANNEL_H_ #define WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_CHANNEL_H_ // Defines #include "vie_defines.h" #include "typedefs.h" #include "vie_network.h" #include "rtp_rtcp_defines.h" #include "udp_transport.h" #include "video_coding_defines.h" #ifdef WEBRTC_SRTP #include "SrtpModule.h" #endif #include "tick_util.h" #include "vie_frame_provider_base.h" #include "vie_file_recorder.h" // Forward declarations class SrtpModule; class VideoRenderCallback; namespace webrtc { class CriticalSectionWrapper; class Encryption; class ProcessThread; class RtpRtcp; class ThreadWrapper; class VideoCodingModule; class VideoDecoder; class ViEDecoderObserver; class ViEEffectFilter; class ViENetworkObserver; class ViEReceiver; class ViERTCPObserver; class ViERTPObserver; class ViESender; class ViESyncModule; class VoEVideoSync; class ViEChannel: public VCMFrameTypeCallback, // VCM Module public VCMReceiveCallback, // VCM Module public VCMReceiveStatisticsCallback, // VCM Module public VCMPacketRequestCallback, // VCM Module public VCMFrameStorageCallback, // VCM Module public RtcpFeedback, // RTP/RTCP Module public RtpFeedback, // RTP/RTCP Module public ViEFrameProviderBase { public: ViEChannel(WebRtc_Word32 channelId, WebRtc_Word32 engineId, WebRtc_UWord32 numberOfCores, ProcessThread& moduleProcessThread); ~ViEChannel(); WebRtc_Word32 Init(); //----------------------------------------------------------------- // Codecs //----------------------------------------------------------------- WebRtc_Word32 SetSendCodec(const VideoCodec& videoCodec, bool newStream = true); WebRtc_Word32 SetReceiveCodec(const VideoCodec& videoCodec); WebRtc_Word32 GetReceiveCodec(VideoCodec& videoCodec); WebRtc_Word32 RegisterCodecObserver(ViEDecoderObserver* observer); WebRtc_Word32 RegisterExternalDecoder(const WebRtc_UWord8 plType, VideoDecoder* decoder, bool decoderRender, WebRtc_Word32 renderDelay); WebRtc_Word32 DeRegisterExternalDecoder(const WebRtc_UWord8 plType); WebRtc_Word32 ReceiveCodecStatistics(WebRtc_UWord32& numKeyFrames, WebRtc_UWord32& numDeltaFrames); WebRtc_Word32 WaitForKeyFrame(bool wait); WebRtc_Word32 SetSignalPacketLossStatus(bool enable, bool onlyKeyFrames); //----------------------------------------------------------------- // RTP/RTCP //----------------------------------------------------------------- WebRtc_Word32 SetRTCPMode(const RTCPMethod rtcpMode); WebRtc_Word32 GetRTCPMode(RTCPMethod& rtcpMode); WebRtc_Word32 SetNACKStatus(const bool enable); WebRtc_Word32 SetFECStatus(const bool enable, const unsigned char payloadTypeRED, const unsigned char payloadTypeFEC); WebRtc_Word32 SetKeyFrameRequestMethod(const KeyFrameRequestMethod method); WebRtc_Word32 EnableTMMBR(const bool enable); WebRtc_Word32 EnableKeyFrameRequestCallback(const bool enable); WebRtc_Word32 SetSSRC(const WebRtc_UWord32 SSRC); WebRtc_Word32 GetLocalSSRC(WebRtc_UWord32& SSRC); WebRtc_Word32 GetRemoteSSRC(WebRtc_UWord32& SSRC); WebRtc_Word32 GetRemoteCSRC(unsigned int CSRCs[kRtpCsrcSize]); WebRtc_Word32 SetStartSequenceNumber(WebRtc_UWord16 sequenceNumber); WebRtc_Word32 SetRTCPCName(const WebRtc_Word8 rtcpCName[]); WebRtc_Word32 GetRTCPCName(WebRtc_Word8 rtcpCName[]); WebRtc_Word32 GetRemoteRTCPCName(WebRtc_Word8 rtcpCName[]); WebRtc_Word32 RegisterRtpObserver(ViERTPObserver* observer); WebRtc_Word32 RegisterRtcpObserver(ViERTCPObserver* observer); WebRtc_Word32 SendApplicationDefinedRTCPPacket( const WebRtc_UWord8 subType, WebRtc_UWord32 name, const WebRtc_UWord8* data, WebRtc_UWord16 dataLengthInBytes); WebRtc_Word32 GetSendRtcpStatistics(WebRtc_UWord16& fractionLost, WebRtc_UWord32& cumulativeLost, WebRtc_UWord32& extendedMax, WebRtc_UWord32& jitterSamples, WebRtc_Word32& rttMs); WebRtc_Word32 GetReceivedRtcpStatistics(WebRtc_UWord16& fractionLost, WebRtc_UWord32& cumulativeLost, WebRtc_UWord32& extendedMax, WebRtc_UWord32& jitterSamples, WebRtc_Word32& rttMs); WebRtc_Word32 GetRtpStatistics(WebRtc_UWord32& bytesSent, WebRtc_UWord32& packetsSent, WebRtc_UWord32& bytesReceived, WebRtc_UWord32& packetsReceived) const; WebRtc_Word32 SetKeepAliveStatus(const bool enable, const WebRtc_Word8 unknownPayloadType, const WebRtc_UWord16 deltaTransmitTimeMS); WebRtc_Word32 GetKeepAliveStatus(bool& enable, WebRtc_Word8& unknownPayloadType, WebRtc_UWord16& deltaTransmitTimeMS); WebRtc_Word32 StartRTPDump(const char fileNameUTF8[1024], RTPDirections direction); WebRtc_Word32 StopRTPDump(RTPDirections direction); // Implements RtcpFeedback virtual void OnLipSyncUpdate(const WebRtc_Word32 id, const WebRtc_Word32 audioVideoOffset); virtual void OnApplicationDataReceived(const WebRtc_Word32 id, const WebRtc_UWord8 subType, 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 payloadType, const WebRtc_Word8 payloadName[RTP_PAYLOAD_NAME_SIZE], const WebRtc_UWord32 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 packetType); 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); //----------------------------------------------------------------- // Network //----------------------------------------------------------------- // Soure and destination WebRtc_Word32 SetLocalReceiver(const WebRtc_UWord16 rtpPort, const WebRtc_UWord16 rtcpPort, const WebRtc_Word8* ipAddress); WebRtc_Word32 GetLocalReceiver(WebRtc_UWord16& rtpPort, WebRtc_UWord16& rtcpPort, WebRtc_Word8* ipAddress) const; WebRtc_Word32 SetSendDestination(const WebRtc_Word8* ipAddress, const WebRtc_UWord16 rtpPort, const WebRtc_UWord16 rtcpPort, const WebRtc_UWord16 sourceRtpPort, const WebRtc_UWord16 sourceRtcpPort); WebRtc_Word32 GetSendDestination(WebRtc_Word8* ipAddress, WebRtc_UWord16& rtpPort, WebRtc_UWord16& rtcpPort, WebRtc_UWord16& sourceRtpPort, WebRtc_UWord16& sourceRtcpPort) const; WebRtc_Word32 GetSourceInfo(WebRtc_UWord16& rtpPort, WebRtc_UWord16& rtcpPort, WebRtc_Word8* ipAddress, WebRtc_UWord32 ipAddressLength); // Start/Stop Send/Receive WebRtc_Word32 StartSend(); WebRtc_Word32 StopSend(); bool Sending(); WebRtc_Word32 StartReceive(); WebRtc_Word32 StopReceive(); bool Receiving(); // External transport WebRtc_Word32 RegisterSendTransport(Transport& transport); WebRtc_Word32 DeregisterSendTransport(); WebRtc_Word32 ReceivedRTPPacket(const void* rtpPacket, const WebRtc_Word32 rtpPacketLength); WebRtc_Word32 ReceivedRTCPPacket(const void* rtcpPacket, const WebRtc_Word32 rtcpPacketLength); // IPv6 WebRtc_Word32 EnableIPv6(); bool IsIPv6Enabled(); // Source IP address and port filter WebRtc_Word32 SetSourceFilter(const WebRtc_UWord16 rtpPort, const WebRtc_UWord16 rtcpPort, const WebRtc_Word8* ipAddress); WebRtc_Word32 GetSourceFilter(WebRtc_UWord16& rtpPort, WebRtc_UWord16& rtcpPort, WebRtc_Word8* ipAddress) const; // ToS WebRtc_Word32 SetToS(const WebRtc_Word32 DSCP, const bool useSetSockOpt); WebRtc_Word32 GetToS(WebRtc_Word32& DSCP, bool& useSetSockOpt) const; // GQoS WebRtc_Word32 SetSendGQoS(const bool enable, const WebRtc_Word32 serviceType, const WebRtc_UWord32 maxBitrate, const WebRtc_Word32 overrideDSCP); WebRtc_Word32 GetSendGQoS(bool& enabled, WebRtc_Word32& serviceType, WebRtc_Word32& overrideDSCP) const; // Network settings WebRtc_Word32 SetMTU(WebRtc_UWord16 mtu); WebRtc_UWord16 MaxDataPayloadLength() const; WebRtc_Word32 SetMaxPacketBurstSize(WebRtc_UWord16 maxNumberOfPackets); WebRtc_Word32 SetPacketBurstSpreadState(bool enable, const WebRtc_UWord16 framePeriodMS); // Packet timout notification WebRtc_Word32 SetPacketTimeoutNotification(bool enable, WebRtc_UWord32 timeoutSeconds); // Periodic dead-or-alive reports WebRtc_Word32 RegisterNetworkObserver(ViENetworkObserver* observer); bool NetworkObserverRegistered(); WebRtc_Word32 SetPeriodicDeadOrAliveStatus(const bool enable, const WebRtc_UWord32 sampleTimeSeconds); WebRtc_Word32 SendUDPPacket(const WebRtc_Word8* data, const WebRtc_UWord32 length, WebRtc_Word32& transmittedBytes, bool useRtcpSocket); //----------------------------------------------------------------- // Image processing //----------------------------------------------------------------- WebRtc_Word32 EnableColorEnhancement(bool enable); //----------------------------------------------------------------- // Register sender //----------------------------------------------------------------- WebRtc_Word32 RegisterSendRtpRtcpModule(RtpRtcp& sendRtpRtcpModule); WebRtc_Word32 DeregisterSendRtpRtcpModule(); // Implements VCM::VCMReceiveCallback, getting decoded frames from // VCM. virtual WebRtc_Word32 FrameToRender(VideoFrame& videoFrame); // Implements VCM::VCMReceiveCallback, getting info about decoded // frames from VCM. virtual WebRtc_Word32 ReceivedDecodedReferenceFrame( const WebRtc_UWord64 pictureId); //Implements VCM::VideoFrameStorageCallback virtual WebRtc_Word32 StoreReceivedFrame( const EncodedVideoData& frameToStore); // Implements VCM::VideoReceiveStatisticsCallback virtual WebRtc_Word32 ReceiveStatistics(const WebRtc_UWord32 bitRate, const WebRtc_UWord32 frameRate); // Implements VCM::VideoFrameTypeCallback virtual WebRtc_Word32 FrameTypeRequest(const FrameType frameType); // Implements VCM::VideoFrameTypeCallback virtual WebRtc_Word32 SliceLossIndicationRequest( const WebRtc_UWord64 pictureId); // Implements VCM::VideoPacketRequestCallback virtual WebRtc_Word32 ResendPackets(const WebRtc_UWord16* sequenceNumbers, WebRtc_UWord16 length); #ifdef WEBRTC_SRTP //SRTP WebRtc_Word32 EnableSRTPSend( const SrtpModule::CipherTypes cipherType, const unsigned int cipherKeyLength, const SrtpModule::AuthenticationTypes authType, const unsigned int authKeyLength, const unsigned int authTagLength, const SrtpModule::SecurityLevels level, const WebRtc_UWord8* key, const bool useForRTCP); WebRtc_Word32 DisableSRTPSend(); WebRtc_Word32 EnableSRTPReceive( const SrtpModule::CipherTypes cipherType, const unsigned int cipherKeyLength, const SrtpModule::AuthenticationTypes authType, const unsigned int authKeyLength, const unsigned int authTagLength, const SrtpModule::SecurityLevels level, const WebRtc_UWord8* key, const bool useForRTCP); WebRtc_Word32 DisableSRTPReceive(); #endif WebRtc_Word32 RegisterExternalEncryption(Encryption* encryption); WebRtc_Word32 DeRegisterExternalEncryption(); //Voice Engine WebRtc_Word32 SetVoiceChannel(WebRtc_Word32 veChannelId, VoEVideoSync* veSyncInterface); WebRtc_Word32 VoiceChannel(); //ViEFrameProviderBase virtual int FrameCallbackChanged(){return -1;} // Effect filter WebRtc_Word32 RegisterEffectFilter(ViEEffectFilter* effectFilter); WebRtc_Word32 SetInverseH263Logic(const bool enable); // File recording ViEFileRecorder& GetIncomingFileRecorder(); void ReleaseIncomingFileRecorder(); protected: // Thread function according to ThreadWrapper static bool ChannelDecodeThreadFunction(void* obj); bool ChannelDecodeProcess(); private: WebRtc_Word32 StartDecodeThread(); WebRtc_Word32 StopDecodeThread(); // General members WebRtc_Word32 _channelId; WebRtc_Word32 _engineId; WebRtc_UWord32 _numberOfCores; WebRtc_UWord8 _numSocketThreads; // Critical sections // Used for all registered callbacks except rendering. CriticalSectionWrapper& _callbackCritsect; // Use the same as above instead a seperate? CriticalSectionWrapper& _dataCritsect; // Owned modules/classes RtpRtcp& _rtpRtcp; #ifndef WEBRTC_EXTERNAL_TRANSPORT UdpTransport& _socketTransport; #endif VideoCodingModule& _vcm; ViEReceiver& _vieReceiver; ViESender& _vieSender; ViESyncModule& _vieSync;//Lip syncronization //Uses ProcessThread& _moduleProcessThread; ViEDecoderObserver* _codecObserver; bool _doKeyFrameCallbackRequest; ViERTPObserver* _rtpObserver; ViERTCPObserver* _rtcpObserver; ViENetworkObserver* _networkObserver; bool _rtpPacketTimeout; bool _usingPacketSpread; // Registered members Transport* _ptrExternalTransport; // Codec bool _decoderReset; bool _waitForKeyFrame; // Decoder ThreadWrapper* _ptrDecodeThread; //SRTP - using seperate pointers for encryption and decryption to support // simultaneous operations. SrtpModule* _ptrSrtpModuleEncryption; SrtpModule* _ptrSrtpModuleDecryption; Encryption* _ptrExternalEncryption; // Effect filter and color enhancement ViEEffectFilter* _effectFilter; bool _colorEnhancement; // Time when RTT time was last reported to VCM JB. TickTime _vcmRTTReported; //Recording ViEFileRecorder _fileRecorder; }; } // namespace webrtc #endif // WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_CHANNEL_H_