/* * 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 "modules/video_coding/timestamp_map.h" #include #include "modules/include/module_common_types_public.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