Corrections of the render buffering scheme in AEC3 to ensure causality

This CL modifies the refactored render buffering scheme in AEC3
so that:
-A non-causal state can never occur which means that situations with
 nonrecoverable echo should not occur.
-For a stable audio pipeline with a predefined API call jitter,
 render overruns and underruns can never occur.

Bug: webrtc:8629,chromium:793305
Change-Id: I06ba1c368f92db95274090b08475dd02dbb85145
Reviewed-on: https://webrtc-review.googlesource.com/29861
Commit-Queue: Per Åhgren <peah@webrtc.org>
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21215}
diff --git a/modules/audio_processing/aec3/matrix_buffer.h b/modules/audio_processing/aec3/matrix_buffer.h
index 67980ba..64aac0a 100644
--- a/modules/audio_processing/aec3/matrix_buffer.h
+++ b/modules/audio_processing/aec3/matrix_buffer.h
@@ -23,17 +23,20 @@
   MatrixBuffer(size_t size, size_t height, size_t width);
   ~MatrixBuffer();
 
-  size_t IncIndex(size_t index) {
-    return index < buffer.size() - 1 ? index + 1 : 0;
+  int IncIndex(int index) const {
+    RTC_DCHECK_EQ(buffer.size(), static_cast<size_t>(size));
+    return index < size - 1 ? index + 1 : 0;
   }
 
-  size_t DecIndex(size_t index) {
-    return index > 0 ? index - 1 : buffer.size() - 1;
+  int DecIndex(int index) const {
+    RTC_DCHECK_EQ(buffer.size(), static_cast<size_t>(size));
+    return index > 0 ? index - 1 : size - 1;
   }
 
-  size_t OffsetIndex(size_t index, int offset) {
-    RTC_DCHECK_GE(buffer.size(), offset);
-    return (buffer.size() + index + offset) % buffer.size();
+  int OffsetIndex(int index, int offset) const {
+    RTC_DCHECK_EQ(buffer.size(), static_cast<size_t>(size));
+    RTC_DCHECK_GE(size, offset);
+    return (size + index + offset) % size;
   }
 
   void UpdateWriteIndex(int offset) { write = OffsetIndex(write, offset); }
@@ -43,10 +46,10 @@
   void IncReadIndex() { read = IncIndex(read); }
   void DecReadIndex() { read = DecIndex(read); }
 
-  size_t size;
+  const int size;
   std::vector<std::vector<std::vector<float>>> buffer;
-  size_t write = 0;
-  size_t read = 0;
+  int write = 0;
+  int read = 0;
 };
 
 }  // namespace webrtc