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