/* * Copyright (c) 2012 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. */ #ifndef WEBRTC_VIDEO_ENGINE_VIE_RECEIVER_H_ #define WEBRTC_VIDEO_ENGINE_VIE_RECEIVER_H_ #include #include "webrtc/engine_configurations.h" #include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h" #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" #include "webrtc/system_wrappers/interface/scoped_ptr.h" #include "webrtc/typedefs.h" #include "webrtc/video_engine/include/vie_network.h" #include "webrtc/video_engine/vie_defines.h" namespace webrtc { class CriticalSectionWrapper; class FecReceiver; class RemoteNtpTimeEstimator; class ReceiveStatistics; class RemoteBitrateEstimator; class RtpDump; class RtpHeaderParser; class RTPPayloadRegistry; class RtpReceiver; class RtpRtcp; class VideoCodingModule; struct ReceiveBandwidthEstimatorStats; class ViEReceiver : public RtpData { public: ViEReceiver(const int32_t channel_id, VideoCodingModule* module_vcm, RemoteBitrateEstimator* remote_bitrate_estimator, RtpFeedback* rtp_feedback); ~ViEReceiver(); bool SetReceiveCodec(const VideoCodec& video_codec); bool RegisterPayload(const VideoCodec& video_codec); void SetNackStatus(bool enable, int max_nack_reordering_threshold); void SetRtxPayloadType(int payload_type); void SetRtxSsrc(uint32_t ssrc); uint32_t GetRemoteSsrc() const; int GetCsrcs(uint32_t* csrcs) const; void SetRtpRtcpModule(RtpRtcp* module); RtpReceiver* GetRtpReceiver() const; void RegisterSimulcastRtpRtcpModules(const std::list& rtp_modules); bool SetReceiveTimestampOffsetStatus(bool enable, int id); bool SetReceiveAbsoluteSendTimeStatus(bool enable, int id); void StartReceive(); void StopReceive(); int StartRTPDump(const char file_nameUTF8[1024]); int StopRTPDump(); // Receives packets from external transport. int ReceivedRTPPacket(const void* rtp_packet, int rtp_packet_length, const PacketTime& packet_time); int ReceivedRTCPPacket(const void* rtcp_packet, int rtcp_packet_length); // Implements RtpData. virtual int32_t OnReceivedPayloadData( const uint8_t* payload_data, const uint16_t payload_size, const WebRtcRTPHeader* rtp_header) OVERRIDE; virtual bool OnRecoveredPacket(const uint8_t* packet, int packet_length) OVERRIDE; void GetReceiveBandwidthEstimatorStats( ReceiveBandwidthEstimatorStats* output) const; ReceiveStatistics* GetReceiveStatistics() const; void ReceivedBWEPacket(int64_t arrival_time_ms, int payload_size, const RTPHeader& header); private: int InsertRTPPacket(const uint8_t* rtp_packet, int rtp_packet_length, const PacketTime& packet_time); bool ReceivePacket(const uint8_t* packet, int packet_length, const RTPHeader& header, bool in_order); // Parses and handles for instance RTX and RED headers. // This function assumes that it's being called from only one thread. bool ParseAndHandleEncapsulatingHeader(const uint8_t* packet, int packet_length, const RTPHeader& header); int InsertRTCPPacket(const uint8_t* rtcp_packet, int rtcp_packet_length); bool IsPacketInOrder(const RTPHeader& header) const; bool IsPacketRetransmitted(const RTPHeader& header, bool in_order) const; scoped_ptr receive_cs_; scoped_ptr rtp_header_parser_; scoped_ptr rtp_payload_registry_; scoped_ptr rtp_receiver_; scoped_ptr rtp_receive_statistics_; scoped_ptr fec_receiver_; RtpRtcp* rtp_rtcp_; std::list rtp_rtcp_simulcast_; VideoCodingModule* vcm_; RemoteBitrateEstimator* remote_bitrate_estimator_; scoped_ptr ntp_estimator_; RtpDump* rtp_dump_; bool receiving_; uint8_t restored_packet_[kViEMaxMtu]; bool restored_packet_in_use_; bool receiving_ast_enabled_; }; } // namespace webrt #endif // WEBRTC_VIDEO_ENGINE_VIE_RECEIVER_H_