/*
 *  Copyright (c) 2011 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.
 */

#include <assert.h>
#include <stdlib.h>

#include "webrtc/modules/include/module_common_types.h"
#include "webrtc/modules/video_coding/timestamp_map.h"

namespace webrtc {

VCMTimestampMap::VCMTimestampMap(size_t capacity)
    : ring_buffer_(new TimestampDataTuple[capacity]),
      capacity_(capacity),
      next_add_idx_(0),
      next_pop_idx_(0) {}

VCMTimestampMap::~VCMTimestampMap() {}

void VCMTimestampMap::Add(uint32_t timestamp, VCMFrameInformation* data) {
  ring_buffer_[next_add_idx_].timestamp = timestamp;
  ring_buffer_[next_add_idx_].data = data;
  next_add_idx_ = (next_add_idx_ + 1) % capacity_;

  if (next_add_idx_ == next_pop_idx_) {
    // Circular list full; forget oldest entry.
    next_pop_idx_ = (next_pop_idx_ + 1) % capacity_;
  }
}

VCMFrameInformation* VCMTimestampMap::Pop(uint32_t timestamp) {
  while (!IsEmpty()) {
    if (ring_buffer_[next_pop_idx_].timestamp == timestamp) {
      // Found start time for this timestamp.
      VCMFrameInformation* data = ring_buffer_[next_pop_idx_].data;
      ring_buffer_[next_pop_idx_].data = nullptr;
      next_pop_idx_ = (next_pop_idx_ + 1) % capacity_;
      return data;
    } else if (IsNewerTimestamp(ring_buffer_[next_pop_idx_].timestamp,
                                timestamp)) {
      // The timestamp we are looking for is not in the list.
      return nullptr;
    }

    // Not in this position, check next (and forget this position).
    next_pop_idx_ = (next_pop_idx_ + 1) % capacity_;
  }

  // Could not find matching timestamp in list.
  return nullptr;
}

bool VCMTimestampMap::IsEmpty() const {
  return (next_add_idx_ == next_pop_idx_);
}
}  // namespace webrtc
