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 <assert.h>
12 #include <stdlib.h>
13 
14 #include "webrtc/modules/include/module_common_types.h"
15 #include "webrtc/modules/video_coding/timestamp_map.h"
16 
17 namespace webrtc {
18 
VCMTimestampMap(size_t capacity)19 VCMTimestampMap::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()25 VCMTimestampMap::~VCMTimestampMap() {}
26 
Add(uint32_t timestamp,VCMFrameInformation * data)27 void 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)38 VCMFrameInformation* 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() const60 bool VCMTimestampMap::IsEmpty() const {
61   return (next_add_idx_ == next_pop_idx_);
62 }
63 }  // namespace webrtc
64