/*
 *  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_MODULES_RTP_RTCP_SOURCE_RTCP_RECEIVER_H_
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_RECEIVER_H_

#include <map>
#include <set>
#include <vector>

#include "webrtc/base/criticalsection.h"
#include "webrtc/base/thread_annotations.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "webrtc/modules/rtp_rtcp/source/rtcp_receiver_help.h"
#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
#include "webrtc/typedefs.h"

namespace webrtc {
namespace rtcp {
class TmmbItem;
}  // namespace rtcp

class RTCPReceiver {
 public:
  class ModuleRtpRtcp {
   public:
    virtual void SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set) = 0;
    virtual void OnRequestSendReport() = 0;
    virtual void OnReceivedNack(
        const std::vector<uint16_t>& nack_sequence_numbers) = 0;
    virtual void OnReceivedRtcpReportBlocks(
        const ReportBlockList& report_blocks) = 0;

   protected:
    virtual ~ModuleRtpRtcp() = default;
  };

  RTCPReceiver(Clock* clock,
               bool receiver_only,
               RtcpPacketTypeCounterObserver* packet_type_counter_observer,
               RtcpBandwidthObserver* rtcp_bandwidth_observer,
               RtcpIntraFrameObserver* rtcp_intra_frame_observer,
               TransportFeedbackObserver* transport_feedback_observer,
               ModuleRtpRtcp* owner);
  virtual ~RTCPReceiver();

  bool IncomingPacket(const uint8_t* packet, size_t packet_size);

  int64_t LastReceived();
  int64_t LastReceivedReceiverReport() const;

  void SetSsrcs(uint32_t main_ssrc, const std::set<uint32_t>& registered_ssrcs);
  void SetRemoteSSRC(uint32_t ssrc);
  uint32_t RemoteSSRC() const;

  int32_t IncomingRTCPPacket(
      RTCPHelp::RTCPPacketInformation& rtcpPacketInformation,
      RTCPUtility::RTCPParserV2* rtcpParser);

  void TriggerCallbacksFromRTCPPacket(
      RTCPHelp::RTCPPacketInformation& rtcpPacketInformation);

  // get received cname
  int32_t CNAME(uint32_t remoteSSRC, char cName[RTCP_CNAME_SIZE]) const;

  // get received NTP
  bool NTP(uint32_t* ReceivedNTPsecs,
           uint32_t* ReceivedNTPfrac,
           uint32_t* RTCPArrivalTimeSecs,
           uint32_t* RTCPArrivalTimeFrac,
           uint32_t* rtcp_timestamp) const;

  bool LastReceivedXrReferenceTimeInfo(RtcpReceiveTimeInfo* info) const;

  // get rtt
  int32_t RTT(uint32_t remoteSSRC,
              int64_t* RTT,
              int64_t* avgRTT,
              int64_t* minRTT,
              int64_t* maxRTT) const;

  int32_t SenderInfoReceived(RTCPSenderInfo* senderInfo) const;

  void SetRtcpXrRrtrStatus(bool enable);
  bool GetAndResetXrRrRtt(int64_t* rtt_ms);

  // get statistics
  int32_t StatisticsReceived(std::vector<RTCPReportBlock>* receiveBlocks) const;

  // Returns true if we haven't received an RTCP RR for several RTCP
  // intervals, but only triggers true once.
  bool RtcpRrTimeout(int64_t rtcp_interval_ms);

  // Returns true if we haven't received an RTCP RR telling the receive side
  // has not received RTP packets for too long, i.e. extended highest sequence
  // number hasn't increased for several RTCP intervals. The function only
  // returns true once until a new RR is received.
  bool RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms);

  std::vector<rtcp::TmmbItem> TmmbrReceived() const;

  bool UpdateRTCPReceiveInformationTimers();

  std::vector<rtcp::TmmbItem> BoundingSet(bool* tmmbr_owner);

  void UpdateTmmbr();

  void RegisterRtcpStatisticsCallback(RtcpStatisticsCallback* callback);
  RtcpStatisticsCallback* GetRtcpStatisticsCallback();

 protected:
  RTCPUtility::RTCPCnameInformation* CreateCnameInformation(
      uint32_t remoteSSRC);
  RTCPUtility::RTCPCnameInformation* GetCnameInformation(
      uint32_t remoteSSRC) const;

  RTCPHelp::RTCPReceiveInformation* CreateReceiveInformation(
      uint32_t remoteSSRC);
  RTCPHelp::RTCPReceiveInformation* GetReceiveInformation(uint32_t remoteSSRC);

  void HandleSenderReceiverReport(
      RTCPUtility::RTCPParserV2& rtcpParser,
      RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleReportBlock(const RTCPUtility::RTCPPacket& rtcpPacket,
                         RTCPHelp::RTCPPacketInformation& rtcpPacketInformation,
                         uint32_t remoteSSRC)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleSDES(RTCPUtility::RTCPParserV2& rtcpParser,
                  RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleSDESChunk(RTCPUtility::RTCPParserV2& rtcpParser)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleXrHeader(RTCPUtility::RTCPParserV2& parser,
                      RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleXrReceiveReferenceTime(
      RTCPUtility::RTCPParserV2& parser,
      RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleXrDlrrReportBlock(
      RTCPUtility::RTCPParserV2& parser,
      RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleXrDlrrReportBlockItem(
      const RTCPUtility::RTCPPacket& packet,
      RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleXRVOIPMetric(
      RTCPUtility::RTCPParserV2& rtcpParser,
      RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleNACK(RTCPUtility::RTCPParserV2& rtcpParser,
                  RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleNACKItem(const RTCPUtility::RTCPPacket& rtcpPacket,
                      RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleBYE(RTCPUtility::RTCPParserV2& rtcpParser)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser,
                 RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleSLI(RTCPUtility::RTCPParserV2& rtcpParser,
                 RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleSLIItem(const RTCPUtility::RTCPPacket& rtcpPacket,
                     RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleRPSI(RTCPUtility::RTCPParserV2& rtcpParser,
                  RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser,
                     RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleREMBItem(RTCPUtility::RTCPParserV2& rtcpParser,
                      RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleIJ(RTCPUtility::RTCPParserV2& rtcpParser,
                RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleIJItem(const RTCPUtility::RTCPPacket& rtcpPacket,
                    RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleTMMBR(RTCPUtility::RTCPParserV2& rtcpParser,
                   RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleTMMBRItem(RTCPHelp::RTCPReceiveInformation& receiveInfo,
                       const RTCPUtility::RTCPPacket& rtcpPacket,
                       RTCPHelp::RTCPPacketInformation& rtcpPacketInformation,
                       uint32_t senderSSRC)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleTMMBN(RTCPUtility::RTCPParserV2& rtcpParser,
                   RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleSR_REQ(RTCPUtility::RTCPParserV2& rtcpParser,
                    RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleTMMBNItem(RTCPHelp::RTCPReceiveInformation& receiveInfo,
                       const RTCPUtility::RTCPPacket& rtcpPacket)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleFIR(RTCPUtility::RTCPParserV2& rtcpParser,
                 RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleFIRItem(RTCPHelp::RTCPReceiveInformation* receiveInfo,
                     const RTCPUtility::RTCPPacket& rtcpPacket,
                     RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleAPP(RTCPUtility::RTCPParserV2& rtcpParser,
                 RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleAPPItem(RTCPUtility::RTCPParserV2& rtcpParser,
                     RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  void HandleTransportFeedback(
      RTCPUtility::RTCPParserV2* rtcp_parser,
      RTCPHelp::RTCPPacketInformation* rtcp_packet_information)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

 private:
  typedef std::map<uint32_t, RTCPHelp::RTCPReceiveInformation*> ReceivedInfoMap;
  // RTCP report block information mapped by remote SSRC.
  typedef std::map<uint32_t, RTCPHelp::RTCPReportBlockInformation*>
      ReportBlockInfoMap;
  // RTCP report block information map mapped by source SSRC.
  typedef std::map<uint32_t, ReportBlockInfoMap> ReportBlockMap;

  RTCPHelp::RTCPReportBlockInformation* CreateOrGetReportBlockInformation(
      uint32_t remote_ssrc,
      uint32_t source_ssrc)
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);
  RTCPHelp::RTCPReportBlockInformation* GetReportBlockInformation(
      uint32_t remote_ssrc,
      uint32_t source_ssrc) const
      EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver);

  Clock* const _clock;
  const bool receiver_only_;
  int64_t _lastReceived;
  ModuleRtpRtcp& _rtpRtcp;

  rtc::CriticalSection _criticalSectionFeedbacks;
  RtcpBandwidthObserver* const _cbRtcpBandwidthObserver;
  RtcpIntraFrameObserver* const _cbRtcpIntraFrameObserver;
  TransportFeedbackObserver* const _cbTransportFeedbackObserver;

  rtc::CriticalSection _criticalSectionRTCPReceiver;
  uint32_t main_ssrc_ GUARDED_BY(_criticalSectionRTCPReceiver);
  uint32_t _remoteSSRC GUARDED_BY(_criticalSectionRTCPReceiver);
  std::set<uint32_t> registered_ssrcs_ GUARDED_BY(_criticalSectionRTCPReceiver);

  // Received send report
  RTCPSenderInfo _remoteSenderInfo;
  // when did we receive the last send report
  uint32_t _lastReceivedSRNTPsecs;
  uint32_t _lastReceivedSRNTPfrac;

  // Received XR receive time report.
  RtcpReceiveTimeInfo _remoteXRReceiveTimeInfo;
  // Time when the report was received.
  uint32_t _lastReceivedXRNTPsecs;
  uint32_t _lastReceivedXRNTPfrac;
  // Estimated rtt, zero when there is no valid estimate.
  bool xr_rrtr_status_ GUARDED_BY(_criticalSectionRTCPReceiver);
  int64_t xr_rr_rtt_ms_;

  // Received report blocks.
  ReportBlockMap _receivedReportBlockMap
      GUARDED_BY(_criticalSectionRTCPReceiver);
  ReceivedInfoMap _receivedInfoMap;
  std::map<uint32_t, RTCPUtility::RTCPCnameInformation*> _receivedCnameMap;

  // The last time we received an RTCP RR.
  int64_t _lastReceivedRrMs;

  // The time we last received an RTCP RR telling we have successfully
  // delivered RTP packet to the remote side.
  int64_t _lastIncreasedSequenceNumberMs;

  RtcpStatisticsCallback* stats_callback_ GUARDED_BY(_criticalSectionFeedbacks);

  RtcpPacketTypeCounterObserver* const packet_type_counter_observer_;
  RtcpPacketTypeCounter packet_type_counter_;

  RTCPUtility::NackStats nack_stats_;

  size_t num_skipped_packets_;
  int64_t last_skipped_packets_warning_;
};
}  // namespace webrtc
#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_RECEIVER_H_
