/*
 *  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.
 */

// This sub-API supports the following functionalities:
//
//  - Callbacks for RTP and RTCP events such as modified SSRC or CSRC.
//  - SSRC handling.
//  - Transmission of RTCP sender reports.
//  - Obtaining RTCP data from incoming RTCP sender reports.
//  - RTP and RTCP statistics (jitter, packet loss, RTT etc.).
//  - Redundant Coding (RED)
//  - Writing RTP and RTCP packets to binary files for off-line analysis of
//    the call quality.
//
// Usage example, omitting error checking:
//
//  using namespace webrtc;
//  VoiceEngine* voe = VoiceEngine::Create();
//  VoEBase* base = VoEBase::GetInterface(voe);
//  VoERTP_RTCP* rtp_rtcp  = VoERTP_RTCP::GetInterface(voe);
//  base->Init();
//  int ch = base->CreateChannel();
//  ...
//  rtp_rtcp->SetLocalSSRC(ch, 12345);
//  ...
//  base->DeleteChannel(ch);
//  base->Terminate();
//  base->Release();
//  rtp_rtcp->Release();
//  VoiceEngine::Delete(voe);
//
#ifndef VOICE_ENGINE_VOE_RTP_RTCP_H_
#define VOICE_ENGINE_VOE_RTP_RTCP_H_

#include <vector>
#include "common_types.h"  // NOLINT(build/include)

namespace webrtc {

class VoiceEngine;

// VoERTPObserver
class WEBRTC_DLLEXPORT VoERTPObserver {
 public:
  virtual void OnIncomingCSRCChanged(int channel,
                                     unsigned int CSRC,
                                     bool added) = 0;

  virtual void OnIncomingSSRCChanged(int channel, unsigned int SSRC) = 0;

 protected:
  virtual ~VoERTPObserver() {}
};

// CallStatistics
struct CallStatistics {
  unsigned short fractionLost;
  unsigned int cumulativeLost;
  unsigned int extendedMax;
  unsigned int jitterSamples;
  int64_t rttMs;
  size_t bytesSent;
  int packetsSent;
  size_t bytesReceived;
  int packetsReceived;
  // The capture ntp time (in local timebase) of the first played out audio
  // frame.
  int64_t capture_start_ntp_time_ms_;
};

// See section 6.4.1 in http://www.ietf.org/rfc/rfc3550.txt for details.
struct SenderInfo {
  uint32_t NTP_timestamp_high;
  uint32_t NTP_timestamp_low;
  uint32_t RTP_timestamp;
  uint32_t sender_packet_count;
  uint32_t sender_octet_count;
};

// See section 6.4.2 in http://www.ietf.org/rfc/rfc3550.txt for details.
struct ReportBlock {
  uint32_t sender_SSRC;  // SSRC of sender
  uint32_t source_SSRC;
  uint8_t fraction_lost;
  uint32_t cumulative_num_packets_lost;
  uint32_t extended_highest_sequence_number;
  uint32_t interarrival_jitter;
  uint32_t last_SR_timestamp;
  uint32_t delay_since_last_SR;
};

// VoERTP_RTCP
class WEBRTC_DLLEXPORT VoERTP_RTCP {
 public:
  // Factory for the VoERTP_RTCP sub-API. Increases an internal
  // reference counter if successful. Returns NULL if the API is not
  // supported or if construction fails.
  static VoERTP_RTCP* GetInterface(VoiceEngine* voiceEngine);

  // Releases the VoERTP_RTCP sub-API and decreases an internal
  // reference counter. Returns the new reference count. This value should
  // be zero for all sub-API:s before the VoiceEngine object can be safely
  // deleted.
  virtual int Release() = 0;

  // Sets the local RTP synchronization source identifier (SSRC) explicitly.
  virtual int SetLocalSSRC(int channel, unsigned int ssrc) = 0;

  // Gets the local RTP SSRC of a specified |channel|.
  virtual int GetLocalSSRC(int channel, unsigned int& ssrc) = 0;

  // Gets the SSRC of the incoming RTP packets.
  virtual int GetRemoteSSRC(int channel, unsigned int& ssrc) = 0;

  // Sets the status of rtp-audio-level-indication on a specific |channel|.
  virtual int SetSendAudioLevelIndicationStatus(int channel,
                                                bool enable,
                                                unsigned char id = 1) = 0;

  // Sets the RTCP status on a specific |channel|.
  virtual int SetRTCPStatus(int channel, bool enable) = 0;

  // Gets the RTCP status on a specific |channel|.
  virtual int GetRTCPStatus(int channel, bool& enabled) = 0;

  // Sets the canonical name (CNAME) parameter for RTCP reports on a
  // specific |channel|.
  virtual int SetRTCP_CNAME(int channel, const char cName[256]) = 0;

  // Gets the canonical name (CNAME) parameter for incoming RTCP reports
  // on a specific channel.
  virtual int GetRemoteRTCP_CNAME(int channel, char cName[256]) = 0;

  // Gets RTCP statistics for a specific |channel|.
  virtual int GetRTCPStatistics(int channel, CallStatistics& stats) = 0;

 protected:
  VoERTP_RTCP() {}
  virtual ~VoERTP_RTCP() {}
};

}  // namespace webrtc

#endif  // #ifndef VOICE_ENGINE_VOE_RTP_RTCP_H_
