/*
 *  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_AUDIO_CODING_NETEQ_PACKET_H_
#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_PACKET_H_

#include <list>
#include <memory>

#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
#include "webrtc/modules/include/module_common_types.h"
#include "webrtc/typedefs.h"

namespace webrtc {

// Struct for holding RTP packets.
struct Packet {
  RTPHeader header;
  // Datagram excluding RTP header and header extension.
  uint8_t* payload = nullptr;
  size_t payload_length = 0;
  bool primary = true;  // Primary, i.e., not redundant payload.
  bool sync_packet = false;
  std::unique_ptr<TickTimer::Stopwatch> waiting_time;

  Packet();
  ~Packet();

  // Comparison operators. Establish a packet ordering based on (1) timestamp,
  // (2) sequence number, (3) regular packet vs sync-packet and (4) redundancy.
  // Timestamp and sequence numbers are compared taking wrap-around into
  // account. If both timestamp and sequence numbers are identical and one of
  // the packets is sync-packet, the regular packet is considered earlier. For
  // two regular packets with the same sequence number and timestamp a primary
  // payload is considered "smaller" than a secondary.
  bool operator==(const Packet& rhs) const {
    return (this->header.timestamp == rhs.header.timestamp &&
        this->header.sequenceNumber == rhs.header.sequenceNumber &&
        this->primary == rhs.primary &&
        this->sync_packet == rhs.sync_packet);
  }
  bool operator!=(const Packet& rhs) const { return !operator==(rhs); }
  bool operator<(const Packet& rhs) const {
    if (this->header.timestamp == rhs.header.timestamp) {
      if (this->header.sequenceNumber == rhs.header.sequenceNumber) {
        // Timestamp and sequence numbers are identical. A sync packet should
        // be recognized "larger" (i.e. "later") compared to a "network packet"
        // (regular packet from network not sync-packet). If none of the packets
        // are sync-packets, then deem the left hand side to be "smaller"
        // (i.e., "earlier") if it is  primary, and right hand side is not.
        //
        // The condition on sync packets to be larger than "network packets,"
        // given same RTP sequence number and timestamp, guarantees that a
        // "network packet" to be inserted in an earlier position into
        // |packet_buffer_| compared to a sync packet of same timestamp and
        // sequence number.
        if (rhs.sync_packet)
          return true;
        if (this->sync_packet)
          return false;
        return (this->primary && !rhs.primary);
      }
      return (static_cast<uint16_t>(rhs.header.sequenceNumber
          - this->header.sequenceNumber) < 0xFFFF / 2);
    }
    return (static_cast<uint32_t>(rhs.header.timestamp
        - this->header.timestamp) < 0xFFFFFFFF / 2);
  }
  bool operator>(const Packet& rhs) const { return rhs.operator<(*this); }
  bool operator<=(const Packet& rhs) const { return !operator>(rhs); }
  bool operator>=(const Packet& rhs) const { return !operator<(rhs); }
};

// A list of packets.
typedef std::list<Packet*> PacketList;

}  // namespace webrtc
#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_PACKET_H_
