/*
 *  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/base/buffer.h"
#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.
  rtc::Buffer payload;
  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_
