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