1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
239e9659fc6a70f9416205c942d21deea060a8997leozwang@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
117623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#ifndef WEBRTC_VIDEO_VIE_RECEIVER_H_
127623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#define WEBRTC_VIDEO_VIE_RECEIVER_H_
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
141da1ce0da5fcc029dbc2a134a9760e1b398b02d7pwestin@webrtc.org#include <list>
150fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org#include <vector>
161da1ce0da5fcc029dbc2a134a9760e1b398b02d7pwestin@webrtc.org
1700b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
1882dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/engine_configurations.h"
19ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
20ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
2182dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.org#include "webrtc/typedefs.h"
22470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
23ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.orgnamespace webrtc {
24470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass CriticalSectionWrapper;
267bb8f02274ecbfa1f7ef134d708369a369a78c83stefan@webrtc.orgclass FecReceiver;
2788abf11cadc0eb8986561a942ecc13ad9a324f16wu@webrtc.orgclass RemoteNtpTimeEstimator;
28822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.orgclass ReceiveStatistics;
29976a7e61c17047fdc27401a015a1be55749cc914stefan@webrtc.orgclass RemoteBitrateEstimator;
30a5cb98cbbd11e93cb6d0a6232387814aac168c7dstefan@webrtc.orgclass RtpHeaderParser;
31822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.orgclass RTPPayloadRegistry;
32822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.orgclass RtpReceiver;
33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass RtpRtcp;
34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass VideoCodingModule;
351f64f067840212b3e5b67a0d6a50bcd805b5bc1ajiayl@webrtc.orgstruct ReceiveBandwidthEstimatorStats;
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
3782dcc9ff11826d63a76e33cfee4d66d52606e19dpwestin@webrtc.orgclass ViEReceiver : public RtpData {
38ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org public:
39ac547a653862744d0aae560713f8418ad2852085Peter Boström  ViEReceiver(VideoCodingModule* module_vcm,
40822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org              RemoteBitrateEstimator* remote_bitrate_estimator,
41822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org              RtpFeedback* rtp_feedback);
42ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org  ~ViEReceiver();
43ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org
44822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  bool SetReceiveCodec(const VideoCodec& video_codec);
45822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  bool RegisterPayload(const VideoCodec& video_codec);
46822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org
477bb8f02274ecbfa1f7ef134d708369a369a78c83stefan@webrtc.org  void SetNackStatus(bool enable, int max_nack_reordering_threshold);
48e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  void SetRtxPayloadType(int payload_type, int associated_payload_type);
4965220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // If set to true, the RTX payload type mapping supplied in
5065220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // |SetRtxPayloadType| will be used when restoring RTX packets. Without it,
5165220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // RTX packets will always be restored to the last non-RTX packet payload type
5265220a70a38ffe252b587775c5e9104606ab7c2cnoahric  // received.
5365220a70a38ffe252b587775c5e9104606ab7c2cnoahric  void SetUseRtxPayloadMappingOnRestore(bool val);
54ef92755780253c6a7940c89598a206e58e05b810stefan@webrtc.org  void SetRtxSsrc(uint32_t ssrc);
55d952c40c7e31c1603988c1f09ebfba9f17c6a866asapersson@webrtc.org  bool GetRtxSsrc(uint32_t* ssrc) const;
56822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org
57273fbbb921e61273c3d83eb494d0a68db7834d3dasapersson@webrtc.org  bool IsFecEnabled() const;
58273fbbb921e61273c3d83eb494d0a68db7834d3dasapersson@webrtc.org
59822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  uint32_t GetRemoteSsrc() const;
60822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  int GetCsrcs(uint32_t* csrcs) const;
61822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org
622853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  void SetRtpRtcpModule(RtpRtcp* module);
632853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org
64822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  RtpReceiver* GetRtpReceiver() const;
65822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org
66d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  void RegisterRtpRtcpModules(const std::vector<RtpRtcp*>& rtp_modules);
676cff9cf8a3562f76b1dfe4584f447dd66c2d05f2Peter Boström
6808994cc525110d7cef1e3990aef7f2d6fa0a8f2cstefan@webrtc.org  bool SetReceiveTimestampOffsetStatus(bool enable, int id);
6908994cc525110d7cef1e3990aef7f2d6fa0a8f2cstefan@webrtc.org  bool SetReceiveAbsoluteSendTimeStatus(bool enable, int id);
70fdd10579496123c9a7fdc0bf185e2a26a12ed340guoweis@webrtc.org  bool SetReceiveVideoRotationStatus(bool enable, int id);
71867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  bool SetReceiveTransportSequenceNumber(bool enable, int id);
72a5cb98cbbd11e93cb6d0a6232387814aac168c7dstefan@webrtc.org
73ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org  void StartReceive();
74ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org  void StopReceive();
75ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org
76ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org  // Receives packets from external transport.
774591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  int ReceivedRTPPacket(const void* rtp_packet, size_t rtp_packet_length,
78a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org                        const PacketTime& packet_time);
794591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  int ReceivedRTCPPacket(const void* rtcp_packet, size_t rtcp_packet_length);
80ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org
81ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org  // Implements RtpData.
8214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  int32_t OnReceivedPayloadData(const uint8_t* payload_data,
8314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                const size_t payload_size,
8414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                                const WebRtcRTPHeader* rtp_header) override;
8514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  bool OnRecoveredPacket(const uint8_t* packet, size_t packet_length) override;
86ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org
87822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org  ReceiveStatistics* GetReceiveStatistics() const;
880fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org
89ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org private:
904591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  int InsertRTPPacket(const uint8_t* rtp_packet, size_t rtp_packet_length,
91a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org                      const PacketTime& packet_time);
920e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org  bool ReceivePacket(const uint8_t* packet,
934591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                     size_t packet_length,
940e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org                     const RTPHeader& header,
950e93257cee79c0d19ddaef1f14ba750bf469a084sprang@webrtc.org                     bool in_order);
967bb8f02274ecbfa1f7ef134d708369a369a78c83stefan@webrtc.org  // Parses and handles for instance RTX and RED headers.
977bb8f02274ecbfa1f7ef134d708369a369a78c83stefan@webrtc.org  // This function assumes that it's being called from only one thread.
987bb8f02274ecbfa1f7ef134d708369a369a78c83stefan@webrtc.org  bool ParseAndHandleEncapsulatingHeader(const uint8_t* packet,
994591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                         size_t packet_length,
1007bb8f02274ecbfa1f7ef134d708369a369a78c83stefan@webrtc.org                                         const RTPHeader& header);
10137c0559c1edd108b345abcce1939f9b8d78d02a3asapersson@webrtc.org  void NotifyReceiverOfFecPacket(const RTPHeader& header);
1024591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  int InsertRTCPPacket(const uint8_t* rtcp_packet, size_t rtcp_packet_length);
1037bb8f02274ecbfa1f7ef134d708369a369a78c83stefan@webrtc.org  bool IsPacketInOrder(const RTPHeader& header) const;
10448df38114d9502f4b4ad700c011190c608a702d5stefan@webrtc.org  bool IsPacketRetransmitted(const RTPHeader& header, bool in_order) const;
1050800db74b991dec8ef750c428eb611360a1286f4asapersson@webrtc.org  void UpdateHistograms();
106ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org
10700b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<CriticalSectionWrapper> receive_cs_;
108eb24b04f1631aeee670230aa6600d28ae23890d0stefan@webrtc.org  Clock* clock_;
10900b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<RtpHeaderParser> rtp_header_parser_;
11000b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_;
11100b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<RtpReceiver> rtp_receiver_;
112d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  const rtc::scoped_ptr<ReceiveStatistics> rtp_receive_statistics_;
11300b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<FecReceiver> fec_receiver_;
1142853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  RtpRtcp* rtp_rtcp_;
115d6f1a38165455d743fbe61f6980f22be6a3c4de9Peter Boström  std::vector<RtpRtcp*> rtp_rtcp_simulcast_;
1162853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org  VideoCodingModule* vcm_;
117976a7e61c17047fdc27401a015a1be55749cc914stefan@webrtc.org  RemoteBitrateEstimator* remote_bitrate_estimator_;
118ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org
11900b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<RemoteNtpTimeEstimator> ntp_estimator_;
120cd70119a106e42ab7eac58050d067bc050610739wu@webrtc.org
121ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org  bool receiving_;
122c4a1c370aa7e4ec467ff16162ca0eef0cfaf53b0mflodman  uint8_t restored_packet_[IP_PACKET_SIZE];
1237bb8f02274ecbfa1f7ef134d708369a369a78c83stefan@webrtc.org  bool restored_packet_in_use_;
1243fb8f7bbb0c5e074d0744c57905c5f49bb7d8304solenberg@webrtc.org  bool receiving_ast_enabled_;
125fdd10579496123c9a7fdc0bf185e2a26a12ed340guoweis@webrtc.org  bool receiving_cvo_enabled_;
126867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  bool receiving_tsn_enabled_;
127eb24b04f1631aeee670230aa6600d28ae23890d0stefan@webrtc.org  int64_t last_packet_log_ms_;
128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com};
129ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org
1300fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org}  // namespace webrtc
131ad4ee3659e4298d9b006d00399e9a77e18d2eae1mflodman@webrtc.org
1327623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#endif  // WEBRTC_VIDEO_VIE_RECEIVER_H_
133