OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 24 matching lines...) Expand all Loading... |
35 // If the region is contiguous, |data_ptr_bytes_2| will be zero. | 35 // If the region is contiguous, |data_ptr_bytes_2| will be zero. |
36 // If non-contiguous, |data_ptr_bytes_2| will be the size in bytes of the second | 36 // If non-contiguous, |data_ptr_bytes_2| will be the size in bytes of the second |
37 // region. Returns room available to be read or |element_count|, whichever is | 37 // region. Returns room available to be read or |element_count|, whichever is |
38 // smaller. | 38 // smaller. |
39 static size_t GetBufferReadRegions(RingBuffer* buf, | 39 static size_t GetBufferReadRegions(RingBuffer* buf, |
40 size_t element_count, | 40 size_t element_count, |
41 void** data_ptr_1, | 41 void** data_ptr_1, |
42 size_t* data_ptr_bytes_1, | 42 size_t* data_ptr_bytes_1, |
43 void** data_ptr_2, | 43 void** data_ptr_2, |
44 size_t* data_ptr_bytes_2) { | 44 size_t* data_ptr_bytes_2) { |
45 | |
46 const size_t readable_elements = WebRtc_available_read(buf); | 45 const size_t readable_elements = WebRtc_available_read(buf); |
47 const size_t read_elements = (readable_elements < element_count ? | 46 const size_t read_elements = (readable_elements < element_count ? |
48 readable_elements : element_count); | 47 readable_elements : element_count); |
49 const size_t margin = buf->element_count - buf->read_pos; | 48 const size_t margin = buf->element_count - buf->read_pos; |
50 | 49 |
51 // Check to see if read is not contiguous. | 50 // Check to see if read is not contiguous. |
52 if (read_elements > margin) { | 51 if (read_elements > margin) { |
53 // Write data in two blocks that wrap the buffer. | 52 // Write data in two blocks that wrap the buffer. |
54 *data_ptr_1 = buf->data + buf->read_pos * buf->element_size; | 53 *data_ptr_1 = buf->data + buf->read_pos * buf->element_size; |
55 *data_ptr_bytes_1 = margin * buf->element_size; | 54 *data_ptr_bytes_1 = margin * buf->element_size; |
56 *data_ptr_2 = buf->data; | 55 *data_ptr_2 = buf->data; |
57 *data_ptr_bytes_2 = (read_elements - margin) * buf->element_size; | 56 *data_ptr_bytes_2 = (read_elements - margin) * buf->element_size; |
58 } else { | 57 } else { |
59 *data_ptr_1 = buf->data + buf->read_pos * buf->element_size; | 58 *data_ptr_1 = buf->data + buf->read_pos * buf->element_size; |
60 *data_ptr_bytes_1 = read_elements * buf->element_size; | 59 *data_ptr_bytes_1 = read_elements * buf->element_size; |
61 *data_ptr_2 = NULL; | 60 *data_ptr_2 = NULL; |
62 *data_ptr_bytes_2 = 0; | 61 *data_ptr_bytes_2 = 0; |
63 } | 62 } |
64 | 63 |
65 return read_elements; | 64 return read_elements; |
66 } | 65 } |
67 | 66 |
68 RingBuffer* WebRtc_CreateBuffer(size_t element_count, size_t element_size) { | 67 RingBuffer* WebRtc_CreateBuffer(size_t element_count, size_t element_size) { |
69 RingBuffer* self = NULL; | 68 RingBuffer* self = NULL; |
70 if (element_count == 0 || element_size == 0) { | 69 if (element_count == 0 || element_size == 0) { |
71 return NULL; | 70 return NULL; |
72 } | 71 } |
73 | 72 |
74 self = malloc(sizeof(RingBuffer)); | 73 self = static_cast<RingBuffer*>(malloc(sizeof(RingBuffer))); |
75 if (!self) { | 74 if (!self) { |
76 return NULL; | 75 return NULL; |
77 } | 76 } |
78 | 77 |
79 self->data = malloc(element_count * element_size); | 78 self->data = static_cast<char*>(malloc(element_count * element_size)); |
80 if (!self->data) { | 79 if (!self->data) { |
81 free(self); | 80 free(self); |
82 self = NULL; | 81 self = NULL; |
83 return NULL; | 82 return NULL; |
84 } | 83 } |
85 | 84 |
86 self->element_count = element_count; | 85 self->element_count = element_count; |
87 self->element_size = element_size; | 86 self->element_size = element_size; |
88 WebRtc_InitBuffer(self); | 87 WebRtc_InitBuffer(self); |
89 | 88 |
90 return self; | 89 return self; |
91 } | 90 } |
92 | 91 |
93 void WebRtc_InitBuffer(RingBuffer* self) { | 92 void WebRtc_InitBuffer(RingBuffer* self) { |
94 self->read_pos = 0; | 93 self->read_pos = 0; |
95 self->write_pos = 0; | 94 self->write_pos = 0; |
96 self->rw_wrap = SAME_WRAP; | 95 self->rw_wrap = SAME_WRAP; |
97 | 96 |
98 // Initialize buffer to zeros | 97 // Initialize buffer to zeros |
99 memset(self->data, 0, self->element_count * self->element_size); | 98 memset(self->data, 0, self->element_count * self->element_size); |
100 } | 99 } |
101 | 100 |
102 void WebRtc_FreeBuffer(void* handle) { | 101 void WebRtc_FreeBuffer(void* handle) { |
103 RingBuffer* self = (RingBuffer*)handle; | 102 RingBuffer* self = static_cast<RingBuffer*>(handle); |
104 if (!self) { | 103 if (!self) { |
105 return; | 104 return; |
106 } | 105 } |
107 | 106 |
108 free(self->data); | 107 free(self->data); |
109 free(self); | 108 free(self); |
110 } | 109 } |
111 | 110 |
112 size_t WebRtc_ReadBuffer(RingBuffer* self, | 111 size_t WebRtc_ReadBuffer(RingBuffer* self, |
113 void** data_ptr, | 112 void** data_ptr, |
114 void* data, | 113 void* data, |
115 size_t element_count) { | 114 size_t element_count) { |
116 | |
117 if (self == NULL) { | 115 if (self == NULL) { |
118 return 0; | 116 return 0; |
119 } | 117 } |
120 if (data == NULL) { | 118 if (data == NULL) { |
121 return 0; | 119 return 0; |
122 } | 120 } |
123 | 121 |
124 { | 122 { |
125 void* buf_ptr_1 = NULL; | 123 void* buf_ptr_1 = NULL; |
126 void* buf_ptr_2 = NULL; | 124 void* buf_ptr_2 = NULL; |
127 size_t buf_ptr_bytes_1 = 0; | 125 size_t buf_ptr_bytes_1 = 0; |
128 size_t buf_ptr_bytes_2 = 0; | 126 size_t buf_ptr_bytes_2 = 0; |
129 const size_t read_count = GetBufferReadRegions(self, | 127 const size_t read_count = GetBufferReadRegions(self, |
130 element_count, | 128 element_count, |
131 &buf_ptr_1, | 129 &buf_ptr_1, |
132 &buf_ptr_bytes_1, | 130 &buf_ptr_bytes_1, |
133 &buf_ptr_2, | 131 &buf_ptr_2, |
134 &buf_ptr_bytes_2); | 132 &buf_ptr_bytes_2); |
135 | 133 |
136 if (buf_ptr_bytes_2 > 0) { | 134 if (buf_ptr_bytes_2 > 0) { |
137 // We have a wrap around when reading the buffer. Copy the buffer data to | 135 // We have a wrap around when reading the buffer. Copy the buffer data to |
138 // |data| and point to it. | 136 // |data| and point to it. |
139 memcpy(data, buf_ptr_1, buf_ptr_bytes_1); | 137 memcpy(data, buf_ptr_1, buf_ptr_bytes_1); |
140 memcpy(((char*) data) + buf_ptr_bytes_1, buf_ptr_2, buf_ptr_bytes_2); | 138 memcpy(static_cast<char*>(data) + buf_ptr_bytes_1, buf_ptr_2, |
| 139 buf_ptr_bytes_2); |
141 buf_ptr_1 = data; | 140 buf_ptr_1 = data; |
142 } else if (!data_ptr) { | 141 } else if (!data_ptr) { |
143 // No wrap, but a memcpy was requested. | 142 // No wrap, but a memcpy was requested. |
144 memcpy(data, buf_ptr_1, buf_ptr_bytes_1); | 143 memcpy(data, buf_ptr_1, buf_ptr_bytes_1); |
145 } | 144 } |
146 if (data_ptr) { | 145 if (data_ptr) { |
147 // |buf_ptr_1| == |data| in the case of a wrap. | 146 // |buf_ptr_1| == |data| in the case of a wrap. |
148 *data_ptr = buf_ptr_1; | 147 *data_ptr = buf_ptr_1; |
149 } | 148 } |
150 | 149 |
151 // Update read position | 150 // Update read position |
152 WebRtc_MoveReadPtr(self, (int) read_count); | 151 WebRtc_MoveReadPtr(self, static_cast<int>(read_count)); |
153 | 152 |
154 return read_count; | 153 return read_count; |
155 } | 154 } |
156 } | 155 } |
157 | 156 |
158 size_t WebRtc_WriteBuffer(RingBuffer* self, | 157 size_t WebRtc_WriteBuffer(RingBuffer* self, |
159 const void* data, | 158 const void* data, |
160 size_t element_count) { | 159 size_t element_count) { |
161 if (!self) { | 160 if (!self) { |
162 return 0; | 161 return 0; |
(...skipping 27 matching lines...) Expand all Loading... |
190 } | 189 } |
191 | 190 |
192 int WebRtc_MoveReadPtr(RingBuffer* self, int element_count) { | 191 int WebRtc_MoveReadPtr(RingBuffer* self, int element_count) { |
193 if (!self) { | 192 if (!self) { |
194 return 0; | 193 return 0; |
195 } | 194 } |
196 | 195 |
197 { | 196 { |
198 // We need to be able to take care of negative changes, hence use "int" | 197 // We need to be able to take care of negative changes, hence use "int" |
199 // instead of "size_t". | 198 // instead of "size_t". |
200 const int free_elements = (int) WebRtc_available_write(self); | 199 const int free_elements = static_cast<int>(WebRtc_available_write(self)); |
201 const int readable_elements = (int) WebRtc_available_read(self); | 200 const int readable_elements = static_cast<int>(WebRtc_available_read(self)); |
202 int read_pos = (int) self->read_pos; | 201 int read_pos = static_cast<int>(self->read_pos); |
203 | 202 |
204 if (element_count > readable_elements) { | 203 if (element_count > readable_elements) { |
205 element_count = readable_elements; | 204 element_count = readable_elements; |
206 } | 205 } |
207 if (element_count < -free_elements) { | 206 if (element_count < -free_elements) { |
208 element_count = -free_elements; | 207 element_count = -free_elements; |
209 } | 208 } |
210 | 209 |
211 read_pos += element_count; | 210 read_pos += element_count; |
212 if (read_pos > (int) self->element_count) { | 211 if (read_pos > static_cast<int>(self->element_count)) { |
213 // Buffer wrap around. Restart read position and wrap indicator. | 212 // Buffer wrap around. Restart read position and wrap indicator. |
214 read_pos -= (int) self->element_count; | 213 read_pos -= static_cast<int>(self->element_count); |
215 self->rw_wrap = SAME_WRAP; | 214 self->rw_wrap = SAME_WRAP; |
216 } | 215 } |
217 if (read_pos < 0) { | 216 if (read_pos < 0) { |
218 // Buffer wrap around. Restart read position and wrap indicator. | 217 // Buffer wrap around. Restart read position and wrap indicator. |
219 read_pos += (int) self->element_count; | 218 read_pos += static_cast<int>(self->element_count); |
220 self->rw_wrap = DIFF_WRAP; | 219 self->rw_wrap = DIFF_WRAP; |
221 } | 220 } |
222 | 221 |
223 self->read_pos = (size_t) read_pos; | 222 self->read_pos = static_cast<size_t>(read_pos); |
224 | 223 |
225 return element_count; | 224 return element_count; |
226 } | 225 } |
227 } | 226 } |
228 | 227 |
229 size_t WebRtc_available_read(const RingBuffer* self) { | 228 size_t WebRtc_available_read(const RingBuffer* self) { |
230 if (!self) { | 229 if (!self) { |
231 return 0; | 230 return 0; |
232 } | 231 } |
233 | 232 |
234 if (self->rw_wrap == SAME_WRAP) { | 233 if (self->rw_wrap == SAME_WRAP) { |
235 return self->write_pos - self->read_pos; | 234 return self->write_pos - self->read_pos; |
236 } else { | 235 } else { |
237 return self->element_count - self->read_pos + self->write_pos; | 236 return self->element_count - self->read_pos + self->write_pos; |
238 } | 237 } |
239 } | 238 } |
240 | 239 |
241 size_t WebRtc_available_write(const RingBuffer* self) { | 240 size_t WebRtc_available_write(const RingBuffer* self) { |
242 if (!self) { | 241 if (!self) { |
243 return 0; | 242 return 0; |
244 } | 243 } |
245 | 244 |
246 return self->element_count - WebRtc_available_read(self); | 245 return self->element_count - WebRtc_available_read(self); |
247 } | 246 } |
OLD | NEW |