1 /* 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "modules/video_coding/timestamp_map.h" 12 13 #include <stdlib.h> 14 15 #include "modules/include/module_common_types_public.h" 16 17 namespace webrtc { 18 VCMTimestampMap(size_t capacity)19VCMTimestampMap::VCMTimestampMap(size_t capacity) 20 : ring_buffer_(new TimestampDataTuple[capacity]), 21 capacity_(capacity), 22 next_add_idx_(0), 23 next_pop_idx_(0) {} 24 ~VCMTimestampMap()25VCMTimestampMap::~VCMTimestampMap() {} 26 Add(uint32_t timestamp,VCMFrameInformation * data)27void VCMTimestampMap::Add(uint32_t timestamp, VCMFrameInformation* data) { 28 ring_buffer_[next_add_idx_].timestamp = timestamp; 29 ring_buffer_[next_add_idx_].data = data; 30 next_add_idx_ = (next_add_idx_ + 1) % capacity_; 31 32 if (next_add_idx_ == next_pop_idx_) { 33 // Circular list full; forget oldest entry. 34 next_pop_idx_ = (next_pop_idx_ + 1) % capacity_; 35 } 36 } 37 Pop(uint32_t timestamp)38VCMFrameInformation* VCMTimestampMap::Pop(uint32_t timestamp) { 39 while (!IsEmpty()) { 40 if (ring_buffer_[next_pop_idx_].timestamp == timestamp) { 41 // Found start time for this timestamp. 42 VCMFrameInformation* data = ring_buffer_[next_pop_idx_].data; 43 ring_buffer_[next_pop_idx_].data = nullptr; 44 next_pop_idx_ = (next_pop_idx_ + 1) % capacity_; 45 return data; 46 } else if (IsNewerTimestamp(ring_buffer_[next_pop_idx_].timestamp, 47 timestamp)) { 48 // The timestamp we are looking for is not in the list. 49 return nullptr; 50 } 51 52 // Not in this position, check next (and forget this position). 53 next_pop_idx_ = (next_pop_idx_ + 1) % capacity_; 54 } 55 56 // Could not find matching timestamp in list. 57 return nullptr; 58 } 59 IsEmpty() const60bool VCMTimestampMap::IsEmpty() const { 61 return (next_add_idx_ == next_pop_idx_); 62 } 63 } // namespace webrtc 64