git-svn-id: http://webrtc.googlecode.com/svn/trunk@156 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/src/modules/video_coding/main/source/timestamp_map.cc b/src/modules/video_coding/main/source/timestamp_map.cc
new file mode 100644
index 0000000..f19819b
--- /dev/null
+++ b/src/modules/video_coding/main/source/timestamp_map.cc
@@ -0,0 +1,99 @@
+/*
+ * 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 "timestamp_map.h"
+#include <stdlib.h>
+#include <assert.h>
+
+namespace webrtc {
+
+// Constructor. Optional parameter specifies maximum number of
+// coexisting timers.
+VCMTimestampMap::VCMTimestampMap(WebRtc_Word32 length):
+ _nextAddIx(0),
+ _nextPopIx(0)
+{
+ if (length <= 0)
+ {
+ // default
+ length = 10;
+ }
+
+ _map = new VCMTimestampDataTuple[length];
+ _length = length;
+}
+
+// Destructor.
+VCMTimestampMap::~VCMTimestampMap()
+{
+ delete [] _map;
+}
+
+// Empty the list of timers.
+void
+VCMTimestampMap::Reset()
+{
+ _nextAddIx = 0;
+ _nextPopIx = 0;
+}
+
+WebRtc_Word32
+VCMTimestampMap::Add(WebRtc_UWord32 timestamp, void* data)
+{
+ _map[_nextAddIx].timestamp = timestamp;
+ _map[_nextAddIx].data = data;
+ _nextAddIx = (_nextAddIx + 1) % _length;
+
+ if (_nextAddIx == _nextPopIx)
+ {
+ // Circular list full; forget oldest entry
+ _nextPopIx = (_nextPopIx + 1) % _length;
+ return -1;
+ }
+ return 0;
+}
+
+void*
+VCMTimestampMap::Pop(WebRtc_UWord32 timestamp)
+{
+ while (!IsEmpty())
+ {
+ if (_map[_nextPopIx].timestamp == timestamp)
+ {
+ // found start time for this timestamp
+ void* data = _map[_nextPopIx].data;
+ _map[_nextPopIx].data = NULL;
+ _nextPopIx = (_nextPopIx + 1) % _length;
+ return data;
+ }
+ else if (_map[_nextPopIx].timestamp > timestamp)
+ {
+ // the timestamp we are looking for is not in the list
+ assert(_nextPopIx < _length && _nextPopIx >= 0);
+ return NULL;
+ }
+
+ // not in this position, check next (and forget this position)
+ _nextPopIx = (_nextPopIx + 1) % _length;
+ }
+
+ // could not find matching timestamp in list
+ assert(_nextPopIx < _length && _nextPopIx >= 0);
+ return NULL;
+}
+
+// Check if no timers are currently running
+bool
+VCMTimestampMap::IsEmpty() const
+{
+ return (_nextAddIx == _nextPopIx);
+}
+
+}