Simplify VCMTimestampMap.

Fixes code formatting and uses size_t properly. Also makes use of
IsNewerTimestamp instead of a simple > check, which should fix an
edge-case bug.

BUG=
R=stefan@webrtc.org

Review URL: https://codereview.webrtc.org/1358863002

Cr-Commit-Position: refs/heads/master@{#10094}
diff --git a/webrtc/modules/video_coding/main/source/generic_decoder.cc b/webrtc/modules/video_coding/main/source/generic_decoder.cc
index 1cd67df..f874e16 100644
--- a/webrtc/modules/video_coding/main/source/generic_decoder.cc
+++ b/webrtc/modules/video_coding/main/source/generic_decoder.cc
@@ -53,8 +53,7 @@
     VCMReceiveCallback* callback;
     {
         CriticalSectionScoped cs(_critSect);
-        frameInfo = static_cast<VCMFrameInformation*>(
-            _timestampMap.Pop(decodedImage.timestamp()));
+        frameInfo = _timestampMap.Pop(decodedImage.timestamp());
         callback = _receiveCallback;
     }
 
@@ -103,10 +102,10 @@
     return _lastReceivedPictureID;
 }
 
-int32_t VCMDecodedFrameCallback::Map(uint32_t timestamp, VCMFrameInformation* frameInfo)
-{
-    CriticalSectionScoped cs(_critSect);
-    return _timestampMap.Add(timestamp, frameInfo);
+void VCMDecodedFrameCallback::Map(uint32_t timestamp,
+                                  VCMFrameInformation* frameInfo) {
+  CriticalSectionScoped cs(_critSect);
+  _timestampMap.Add(timestamp, frameInfo);
 }
 
 int32_t VCMDecodedFrameCallback::Pop(uint32_t timestamp)
diff --git a/webrtc/modules/video_coding/main/source/generic_decoder.h b/webrtc/modules/video_coding/main/source/generic_decoder.h
index ce64998..09929e6 100644
--- a/webrtc/modules/video_coding/main/source/generic_decoder.h
+++ b/webrtc/modules/video_coding/main/source/generic_decoder.h
@@ -46,7 +46,7 @@
 
     uint64_t LastReceivedPictureID() const;
 
-    int32_t Map(uint32_t timestamp, VCMFrameInformation* frameInfo);
+    void Map(uint32_t timestamp, VCMFrameInformation* frameInfo);
     int32_t Pop(uint32_t timestamp);
 
 private:
diff --git a/webrtc/modules/video_coding/main/source/timestamp_map.cc b/webrtc/modules/video_coding/main/source/timestamp_map.cc
index f3806bb..c68a5af 100644
--- a/webrtc/modules/video_coding/main/source/timestamp_map.cc
+++ b/webrtc/modules/video_coding/main/source/timestamp_map.cc
@@ -10,90 +10,56 @@
 
 #include <assert.h>
 #include <stdlib.h>
+
+#include "webrtc/modules/interface/module_common_types.h"
 #include "webrtc/modules/video_coding/main/source/timestamp_map.h"
 
 namespace webrtc {
 
-// Constructor. Optional parameter specifies maximum number of
-// coexisting timers.
-VCMTimestampMap::VCMTimestampMap(int32_t length):
-    _nextAddIx(0),
-    _nextPopIx(0)
-{
-    if (length <= 0)
-    {
-        // default
-        length = 10;
+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;
     }
 
-    _map = new VCMTimestampDataTuple[length];
-    _length = length;
+    // 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;
 }
 
-// Destructor.
-VCMTimestampMap::~VCMTimestampMap()
-{
-    delete [] _map;
+bool VCMTimestampMap::IsEmpty() const {
+  return (next_add_idx_ == next_pop_idx_);
 }
-
-// Empty the list of timers.
-void
-VCMTimestampMap::Reset()
-{
-    _nextAddIx = 0;
-    _nextPopIx = 0;
-}
-
-int32_t
-VCMTimestampMap::Add(uint32_t 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(uint32_t 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);
-}
-
 }
diff --git a/webrtc/modules/video_coding/main/source/timestamp_map.h b/webrtc/modules/video_coding/main/source/timestamp_map.h
index 14e0629..3d6f1bc 100644
--- a/webrtc/modules/video_coding/main/source/timestamp_map.h
+++ b/webrtc/modules/video_coding/main/source/timestamp_map.h
@@ -11,40 +11,35 @@
 #ifndef WEBRTC_MODULES_VIDEO_CODING_TIMESTAMP_MAP_H_
 #define WEBRTC_MODULES_VIDEO_CODING_TIMESTAMP_MAP_H_
 
+#include "webrtc/base/scoped_ptr.h"
 #include "webrtc/typedefs.h"
 
-namespace webrtc
-{
+namespace webrtc {
 
-struct VCMTimestampDataTuple
-{
-    uint32_t    timestamp;
-    void*             data;
-};
+struct VCMFrameInformation;
 
-class VCMTimestampMap
-{
-public:
-    // Constructor. Optional parameter specifies maximum number of
-    // timestamps in map.
-    VCMTimestampMap(const int32_t length = 10);
+class VCMTimestampMap {
+ public:
+  explicit VCMTimestampMap(size_t capacity);
+  ~VCMTimestampMap();
 
-    // Destructor.
-    ~VCMTimestampMap();
+  // Empty the map.
+  void Reset();
 
-    // Empty the map
-    void Reset();
+  void Add(uint32_t timestamp, VCMFrameInformation* data);
+  VCMFrameInformation* Pop(uint32_t timestamp);
 
-    int32_t Add(uint32_t timestamp, void*  data);
-    void* Pop(uint32_t timestamp);
+ private:
+  struct TimestampDataTuple {
+    uint32_t timestamp;
+    VCMFrameInformation* data;
+  };
+  bool IsEmpty() const;
 
-private:
-    bool IsEmpty() const;
-
-    VCMTimestampDataTuple* _map;
-    int32_t                   _nextAddIx;
-    int32_t                   _nextPopIx;
-    int32_t                   _length;
+  rtc::scoped_ptr<TimestampDataTuple[]> ring_buffer_;
+  const size_t capacity_;
+  size_t next_add_idx_;
+  size_t next_pop_idx_;
 };
 
 }  // namespace webrtc