/*
 *  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_HELP_H_
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_RECEIVER_HELP_H_

#include <list>
#include <map>
#include <memory>
#include <vector>

#include "webrtc/base/constructormagic.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "webrtc/modules/rtp_rtcp/source/tmmbr_help.h"
#include "webrtc/typedefs.h"

namespace webrtc {
namespace rtcp {
class TransportFeedback;
}
namespace RTCPHelp {

class RTCPReportBlockInformation {
 public:
  RTCPReportBlockInformation();
  ~RTCPReportBlockInformation();

  // Statistics
  RTCPReportBlock remoteReceiveBlock;
  uint32_t remoteMaxJitter;

  // RTT
  int64_t RTT;
  int64_t minRTT;
  int64_t maxRTT;
  int64_t avgRTT;
  uint32_t numAverageCalcs;
};

class RTCPPacketInformation {
 public:
  RTCPPacketInformation();
  ~RTCPPacketInformation();

  void AddVoIPMetric(const RTCPVoIPMetric* metric);

  void AddApplicationData(const uint8_t* data, const uint16_t size);

  void AddNACKPacket(const uint16_t packetID);
  void ResetNACKPacketIdArray();

  void AddReportInfo(const RTCPReportBlockInformation& report_block_info);

  uint32_t rtcpPacketTypeFlags;  // RTCPPacketTypeFlags bit field
  uint32_t remoteSSRC;

  std::list<uint16_t> nackSequenceNumbers;

  uint8_t applicationSubType;
  uint32_t applicationName;
  uint8_t* applicationData;
  uint16_t applicationLength;

  ReportBlockList report_blocks;
  int64_t rtt;

  uint32_t interArrivalJitter;

  uint8_t sliPictureId;
  uint64_t rpsiPictureId;
  uint32_t receiverEstimatedMaxBitrate;

  uint32_t ntp_secs;
  uint32_t ntp_frac;
  uint32_t rtp_timestamp;

  uint32_t xr_originator_ssrc;
  bool xr_dlrr_item;
  std::unique_ptr<RTCPVoIPMetric> VoIPMetric;

  std::unique_ptr<rtcp::TransportFeedback> transport_feedback_;

 private:
  RTC_DISALLOW_COPY_AND_ASSIGN(RTCPPacketInformation);
};

class RTCPReceiveInformation {
 public:
  RTCPReceiveInformation();
  ~RTCPReceiveInformation();

  void InsertTmmbrItem(uint32_t sender_ssrc,
                       const rtcp::TmmbItem& tmmbr_item,
                       int64_t current_time_ms);

  void GetTmmbrSet(int64_t current_time_ms,
                   std::vector<rtcp::TmmbItem>* candidates);

  void ClearTmmbr();

  int64_t last_time_received_ms = 0;

  int32_t last_fir_sequence_number = -1;
  int64_t last_fir_request_ms = 0;

  bool ready_for_delete = false;

  std::vector<rtcp::TmmbItem> tmmbn;

 private:
  struct TimedTmmbrItem {
    rtcp::TmmbItem tmmbr_item;
    int64_t last_updated_ms;
  };

  std::map<uint32_t, TimedTmmbrItem> tmmbr_;
};

}  // end namespace RTCPHelp
}  // namespace webrtc

#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_RECEIVER_HELP_H_
