/*
 *  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 "webrtc/modules/include/module_common_types.h"
#include "webrtc/typedefs.h"

namespace webrtc {

// Struct for holding RTP packets.
struct Packet {
  RTPHeader header;
  uint8_t* payload;  // Datagram excluding RTP header and header extension.
  size_t payload_length;
  bool primary;  // Primary, i.e., not redundant payload.
  int waiting_time;
  bool sync_packet;

  // Constructor.
  Packet()
      : payload(NULL),
        payload_length(0),
        primary(true),
        waiting_time(0),
        sync_packet(false) {
  }

  // 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_
