1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VIDEO_ENGINE_VIE_RECEIVER_H_ 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_VIDEO_ENGINE_VIE_RECEIVER_H_ 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <list> 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/engine_configurations.h" 177fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h" 18065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 19065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 20065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/typedefs.h" 21efeb8ce7e183005e557a2d107203e2057cec26a8wu@webrtc.org#include "webrtc/video_engine/include/vie_network.h" 22065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_defines.h" 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper; 27db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.orgclass FecReceiver; 282fae0d1b007dd3689fd002f31391dab6f1cd6628wu@webrtc.orgclass RemoteNtpTimeEstimator; 297fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.orgclass ReceiveStatistics; 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass RemoteBitrateEstimator; 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass RtpDump; 326696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.orgclass RtpHeaderParser; 337fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.orgclass RTPPayloadRegistry; 347fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.orgclass RtpReceiver; 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass RtpRtcp; 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VideoCodingModule; 37d1e7facca966ca4b7632940d71f62deea5094083jiayl@webrtc.orgstruct ReceiveBandwidthEstimatorStats; 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.orgclass ViEReceiver : public RtpData { 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViEReceiver(const int32_t channel_id, VideoCodingModule* module_vcm, 427fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org RemoteBitrateEstimator* remote_bitrate_estimator, 437fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org RtpFeedback* rtp_feedback); 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ~ViEReceiver(); 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 467fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org bool SetReceiveCodec(const VideoCodec& video_codec); 477fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org bool RegisterPayload(const VideoCodec& video_codec); 487fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 49db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org void SetNackStatus(bool enable, int max_nack_reordering_threshold); 50903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org void SetRtxPayloadType(int payload_type); 51903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org void SetRtxSsrc(uint32_t ssrc); 527fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 537fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org uint32_t GetRemoteSsrc() const; 547fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org int GetCsrcs(uint32_t* csrcs) const; 557fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void SetRtpRtcpModule(RtpRtcp* module); 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 587fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org RtpReceiver* GetRtpReceiver() const; 597fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void RegisterSimulcastRtpRtcpModules(const std::list<RtpRtcp*>& rtp_modules); 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 624e5f9831edffe845ae2474e9f7df0e5f9e35bdd5stefan@webrtc.org bool SetReceiveTimestampOffsetStatus(bool enable, int id); 634e5f9831edffe845ae2474e9f7df0e5f9e35bdd5stefan@webrtc.org bool SetReceiveAbsoluteSendTimeStatus(bool enable, int id); 646696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void StartReceive(); 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void StopReceive(); 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int StartRTPDump(const char file_nameUTF8[1024]); 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int StopRTPDump(); 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Receives packets from external transport. 72efeb8ce7e183005e557a2d107203e2057cec26a8wu@webrtc.org int ReceivedRTPPacket(const void* rtp_packet, int rtp_packet_length, 73efeb8ce7e183005e557a2d107203e2057cec26a8wu@webrtc.org const PacketTime& packet_time); 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int ReceivedRTCPPacket(const void* rtcp_packet, int rtcp_packet_length); 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Implements RtpData. 7767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org virtual int32_t OnReceivedPayloadData( 7867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org const uint8_t* payload_data, 7967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org const uint16_t payload_size, 806dc729b3239305d0f8edd2ecf6bef2e2f6bd661astefan@webrtc.org const WebRtcRTPHeader* rtp_header) OVERRIDE; 816dc729b3239305d0f8edd2ecf6bef2e2f6bd661astefan@webrtc.org virtual bool OnRecoveredPacket(const uint8_t* packet, 826dc729b3239305d0f8edd2ecf6bef2e2f6bd661astefan@webrtc.org int packet_length) OVERRIDE; 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 84d1e7facca966ca4b7632940d71f62deea5094083jiayl@webrtc.org void GetReceiveBandwidthEstimatorStats( 85d1e7facca966ca4b7632940d71f62deea5094083jiayl@webrtc.org ReceiveBandwidthEstimatorStats* output) const; 86d1e7facca966ca4b7632940d71f62deea5094083jiayl@webrtc.org 877fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org ReceiveStatistics* GetReceiveStatistics() const; 887fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 892d3624ceb06407a4440433f816612fc150bfea42solenberg@webrtc.org void ReceivedBWEPacket(int64_t arrival_time_ms, int payload_size, 902d3624ceb06407a4440433f816612fc150bfea42solenberg@webrtc.org const RTPHeader& header); 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private: 92800136d2ca86bc644a2914db8f4a11b13a21dcaasolenberg@webrtc.org int InsertRTPPacket(const uint8_t* rtp_packet, int rtp_packet_length, 93efeb8ce7e183005e557a2d107203e2057cec26a8wu@webrtc.org const PacketTime& packet_time); 947d99cd47d8055ec6815f2862b75a0bdf53304199sprang@webrtc.org bool ReceivePacket(const uint8_t* packet, 957d99cd47d8055ec6815f2862b75a0bdf53304199sprang@webrtc.org int packet_length, 967d99cd47d8055ec6815f2862b75a0bdf53304199sprang@webrtc.org const RTPHeader& header, 977d99cd47d8055ec6815f2862b75a0bdf53304199sprang@webrtc.org bool in_order); 98db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org // Parses and handles for instance RTX and RED headers. 99db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org // This function assumes that it's being called from only one thread. 100db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org bool ParseAndHandleEncapsulatingHeader(const uint8_t* packet, 101db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org int packet_length, 102db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org const RTPHeader& header); 103800136d2ca86bc644a2914db8f4a11b13a21dcaasolenberg@webrtc.org int InsertRTCPPacket(const uint8_t* rtcp_packet, int rtcp_packet_length); 104db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org bool IsPacketInOrder(const RTPHeader& header) const; 1057e97e4c84dc21b2853f5158a03dcceb569e493adstefan@webrtc.org bool IsPacketRetransmitted(const RTPHeader& header, bool in_order) const; 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org scoped_ptr<CriticalSectionWrapper> receive_cs_; 1086696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org scoped_ptr<RtpHeaderParser> rtp_header_parser_; 1097fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_; 1107fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<RtpReceiver> rtp_receiver_; 1117fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<ReceiveStatistics> rtp_receive_statistics_; 112db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org scoped_ptr<FecReceiver> fec_receiver_; 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RtpRtcp* rtp_rtcp_; 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::list<RtpRtcp*> rtp_rtcp_simulcast_; 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoCodingModule* vcm_; 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RemoteBitrateEstimator* remote_bitrate_estimator_; 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1182fae0d1b007dd3689fd002f31391dab6f1cd6628wu@webrtc.org scoped_ptr<RemoteNtpTimeEstimator> ntp_estimator_; 119093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RtpDump* rtp_dump_; 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool receiving_; 122db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org uint8_t restored_packet_[kViEMaxMtu]; 123db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org bool restored_packet_in_use_; 1242d3624ceb06407a4440433f816612fc150bfea42solenberg@webrtc.org bool receiving_ast_enabled_; 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrt 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_VIDEO_ENGINE_VIE_RECEIVER_H_ 130