| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 // iii) With one exception, i.e., the histogram based algorithm can overrule | 251 // iii) With one exception, i.e., the histogram based algorithm can overrule |
| 252 // the instantaneous one if |is_histogram_valid| = 1 and the histogram | 252 // the instantaneous one if |is_histogram_valid| = 1 and the histogram |
| 253 // is significantly strong. | 253 // is significantly strong. |
| 254 is_robust |= is_histogram_valid && | 254 is_robust |= is_histogram_valid && |
| 255 (self->histogram[candidate_delay] > self->last_delay_histogram); | 255 (self->histogram[candidate_delay] > self->last_delay_histogram); |
| 256 | 256 |
| 257 return is_robust; | 257 return is_robust; |
| 258 } | 258 } |
| 259 | 259 |
| 260 void WebRtc_FreeBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self) { | 260 void WebRtc_FreeBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self) { |
| 261 | 261 if (self == nullptr) { |
| 262 if (self == NULL) { | |
| 263 return; | 262 return; |
| 264 } | 263 } |
| 265 | 264 |
| 266 free(self->binary_far_history); | 265 free(self->binary_far_history); |
| 267 self->binary_far_history = NULL; | 266 self->binary_far_history = nullptr; |
| 268 | 267 |
| 269 free(self->far_bit_counts); | 268 free(self->far_bit_counts); |
| 270 self->far_bit_counts = NULL; | 269 self->far_bit_counts = nullptr; |
| 271 | 270 |
| 272 free(self); | 271 free(self); |
| 273 } | 272 } |
| 274 | 273 |
| 275 BinaryDelayEstimatorFarend* WebRtc_CreateBinaryDelayEstimatorFarend( | 274 BinaryDelayEstimatorFarend* WebRtc_CreateBinaryDelayEstimatorFarend( |
| 276 int history_size) { | 275 int history_size) { |
| 277 BinaryDelayEstimatorFarend* self = NULL; | 276 BinaryDelayEstimatorFarend* self = nullptr; |
| 278 | 277 |
| 279 if (history_size > 1) { | 278 if (history_size > 1) { |
| 280 // Sanity conditions fulfilled. | 279 // Sanity conditions fulfilled. |
| 281 self = static_cast<BinaryDelayEstimatorFarend*>( | 280 self = static_cast<BinaryDelayEstimatorFarend*>( |
| 282 malloc(sizeof(BinaryDelayEstimatorFarend))); | 281 malloc(sizeof(BinaryDelayEstimatorFarend))); |
| 283 } | 282 } |
| 284 if (self == NULL) { | 283 if (self == nullptr) { |
| 285 return NULL; | 284 return nullptr; |
| 286 } | 285 } |
| 287 | 286 |
| 288 self->history_size = 0; | 287 self->history_size = 0; |
| 289 self->binary_far_history = NULL; | 288 self->binary_far_history = nullptr; |
| 290 self->far_bit_counts = NULL; | 289 self->far_bit_counts = nullptr; |
| 291 if (WebRtc_AllocateFarendBufferMemory(self, history_size) == 0) { | 290 if (WebRtc_AllocateFarendBufferMemory(self, history_size) == 0) { |
| 292 WebRtc_FreeBinaryDelayEstimatorFarend(self); | 291 WebRtc_FreeBinaryDelayEstimatorFarend(self); |
| 293 self = NULL; | 292 self = nullptr; |
| 294 } | 293 } |
| 295 return self; | 294 return self; |
| 296 } | 295 } |
| 297 | 296 |
| 298 int WebRtc_AllocateFarendBufferMemory(BinaryDelayEstimatorFarend* self, | 297 int WebRtc_AllocateFarendBufferMemory(BinaryDelayEstimatorFarend* self, |
| 299 int history_size) { | 298 int history_size) { |
| 300 RTC_DCHECK(self); | 299 RTC_DCHECK(self); |
| 301 // (Re-)Allocate memory for history buffers. | 300 // (Re-)Allocate memory for history buffers. |
| 302 self->binary_far_history = static_cast<uint32_t*>( | 301 self->binary_far_history = static_cast<uint32_t*>( |
| 303 realloc(self->binary_far_history, | 302 realloc(self->binary_far_history, |
| 304 history_size * sizeof(*self->binary_far_history))); | 303 history_size * sizeof(*self->binary_far_history))); |
| 305 self->far_bit_counts = static_cast<int*>( | 304 self->far_bit_counts = static_cast<int*>( |
| 306 realloc(self->far_bit_counts, | 305 realloc(self->far_bit_counts, |
| 307 history_size * sizeof(*self->far_bit_counts))); | 306 history_size * sizeof(*self->far_bit_counts))); |
| 308 if ((self->binary_far_history == NULL) || (self->far_bit_counts == NULL)) { | 307 if ((self->binary_far_history == nullptr) || |
| 308 (self->far_bit_counts == nullptr)) { |
| 309 history_size = 0; | 309 history_size = 0; |
| 310 } | 310 } |
| 311 // Fill with zeros if we have expanded the buffers. | 311 // Fill with zeros if we have expanded the buffers. |
| 312 if (history_size > self->history_size) { | 312 if (history_size > self->history_size) { |
| 313 int size_diff = history_size - self->history_size; | 313 int size_diff = history_size - self->history_size; |
| 314 memset(&self->binary_far_history[self->history_size], | 314 memset(&self->binary_far_history[self->history_size], |
| 315 0, | 315 0, |
| 316 sizeof(*self->binary_far_history) * size_diff); | 316 sizeof(*self->binary_far_history) * size_diff); |
| 317 memset(&self->far_bit_counts[self->history_size], | 317 memset(&self->far_bit_counts[self->history_size], |
| 318 0, | 318 0, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 handle->binary_far_history[0] = binary_far_spectrum; | 371 handle->binary_far_history[0] = binary_far_spectrum; |
| 372 | 372 |
| 373 // Shift history of far-end binary spectrum bit counts and insert bit count | 373 // Shift history of far-end binary spectrum bit counts and insert bit count |
| 374 // of current |binary_far_spectrum|. | 374 // of current |binary_far_spectrum|. |
| 375 memmove(&(handle->far_bit_counts[1]), &(handle->far_bit_counts[0]), | 375 memmove(&(handle->far_bit_counts[1]), &(handle->far_bit_counts[0]), |
| 376 (handle->history_size - 1) * sizeof(int)); | 376 (handle->history_size - 1) * sizeof(int)); |
| 377 handle->far_bit_counts[0] = BitCount(binary_far_spectrum); | 377 handle->far_bit_counts[0] = BitCount(binary_far_spectrum); |
| 378 } | 378 } |
| 379 | 379 |
| 380 void WebRtc_FreeBinaryDelayEstimator(BinaryDelayEstimator* self) { | 380 void WebRtc_FreeBinaryDelayEstimator(BinaryDelayEstimator* self) { |
| 381 | 381 if (self == nullptr) { |
| 382 if (self == NULL) { | |
| 383 return; | 382 return; |
| 384 } | 383 } |
| 385 | 384 |
| 386 free(self->mean_bit_counts); | 385 free(self->mean_bit_counts); |
| 387 self->mean_bit_counts = NULL; | 386 self->mean_bit_counts = nullptr; |
| 388 | 387 |
| 389 free(self->bit_counts); | 388 free(self->bit_counts); |
| 390 self->bit_counts = NULL; | 389 self->bit_counts = nullptr; |
| 391 | 390 |
| 392 free(self->binary_near_history); | 391 free(self->binary_near_history); |
| 393 self->binary_near_history = NULL; | 392 self->binary_near_history = nullptr; |
| 394 | 393 |
| 395 free(self->histogram); | 394 free(self->histogram); |
| 396 self->histogram = NULL; | 395 self->histogram = nullptr; |
| 397 | 396 |
| 398 // BinaryDelayEstimator does not have ownership of |farend|, hence we do not | 397 // BinaryDelayEstimator does not have ownership of |farend|, hence we do not |
| 399 // free the memory here. That should be handled separately by the user. | 398 // free the memory here. That should be handled separately by the user. |
| 400 self->farend = NULL; | 399 self->farend = nullptr; |
| 401 | 400 |
| 402 free(self); | 401 free(self); |
| 403 } | 402 } |
| 404 | 403 |
| 405 BinaryDelayEstimator* WebRtc_CreateBinaryDelayEstimator( | 404 BinaryDelayEstimator* WebRtc_CreateBinaryDelayEstimator( |
| 406 BinaryDelayEstimatorFarend* farend, int max_lookahead) { | 405 BinaryDelayEstimatorFarend* farend, int max_lookahead) { |
| 407 BinaryDelayEstimator* self = NULL; | 406 BinaryDelayEstimator* self = nullptr; |
| 408 | 407 |
| 409 if ((farend != NULL) && (max_lookahead >= 0)) { | 408 if ((farend != nullptr) && (max_lookahead >= 0)) { |
| 410 // Sanity conditions fulfilled. | 409 // Sanity conditions fulfilled. |
| 411 self = static_cast<BinaryDelayEstimator*>( | 410 self = static_cast<BinaryDelayEstimator*>( |
| 412 malloc(sizeof(BinaryDelayEstimator))); | 411 malloc(sizeof(BinaryDelayEstimator))); |
| 413 } | 412 } |
| 414 if (self == NULL) { | 413 if (self == nullptr) { |
| 415 return NULL; | 414 return nullptr; |
| 416 } | 415 } |
| 417 | 416 |
| 418 self->farend = farend; | 417 self->farend = farend; |
| 419 self->near_history_size = max_lookahead + 1; | 418 self->near_history_size = max_lookahead + 1; |
| 420 self->history_size = 0; | 419 self->history_size = 0; |
| 421 self->robust_validation_enabled = 0; // Disabled by default. | 420 self->robust_validation_enabled = 0; // Disabled by default. |
| 422 self->allowed_offset = 0; | 421 self->allowed_offset = 0; |
| 423 | 422 |
| 424 self->lookahead = max_lookahead; | 423 self->lookahead = max_lookahead; |
| 425 | 424 |
| 426 // Allocate memory for spectrum and history buffers. | 425 // Allocate memory for spectrum and history buffers. |
| 427 self->mean_bit_counts = NULL; | 426 self->mean_bit_counts = nullptr; |
| 428 self->bit_counts = NULL; | 427 self->bit_counts = nullptr; |
| 429 self->histogram = NULL; | 428 self->histogram = nullptr; |
| 430 self->binary_near_history = static_cast<uint32_t*>( | 429 self->binary_near_history = static_cast<uint32_t*>( |
| 431 malloc((max_lookahead + 1) * sizeof(*self->binary_near_history))); | 430 malloc((max_lookahead + 1) * sizeof(*self->binary_near_history))); |
| 432 if (self->binary_near_history == NULL || | 431 if (self->binary_near_history == nullptr || |
| 433 WebRtc_AllocateHistoryBufferMemory(self, farend->history_size) == 0) { | 432 WebRtc_AllocateHistoryBufferMemory(self, farend->history_size) == 0) { |
| 434 WebRtc_FreeBinaryDelayEstimator(self); | 433 WebRtc_FreeBinaryDelayEstimator(self); |
| 435 self = NULL; | 434 self = nullptr; |
| 436 } | 435 } |
| 437 | 436 |
| 438 return self; | 437 return self; |
| 439 } | 438 } |
| 440 | 439 |
| 441 int WebRtc_AllocateHistoryBufferMemory(BinaryDelayEstimator* self, | 440 int WebRtc_AllocateHistoryBufferMemory(BinaryDelayEstimator* self, |
| 442 int history_size) { | 441 int history_size) { |
| 443 BinaryDelayEstimatorFarend* far = self->farend; | 442 BinaryDelayEstimatorFarend* far = self->farend; |
| 444 // (Re-)Allocate memory for spectrum and history buffers. | 443 // (Re-)Allocate memory for spectrum and history buffers. |
| 445 if (history_size != far->history_size) { | 444 if (history_size != far->history_size) { |
| 446 // Only update far-end buffers if we need. | 445 // Only update far-end buffers if we need. |
| 447 history_size = WebRtc_AllocateFarendBufferMemory(far, history_size); | 446 history_size = WebRtc_AllocateFarendBufferMemory(far, history_size); |
| 448 } | 447 } |
| 449 // The extra array element in |mean_bit_counts| and |histogram| is a dummy | 448 // The extra array element in |mean_bit_counts| and |histogram| is a dummy |
| 450 // element only used while |last_delay| == -2, i.e., before we have a valid | 449 // element only used while |last_delay| == -2, i.e., before we have a valid |
| 451 // estimate. | 450 // estimate. |
| 452 self->mean_bit_counts = static_cast<int32_t*>( | 451 self->mean_bit_counts = static_cast<int32_t*>( |
| 453 realloc(self->mean_bit_counts, | 452 realloc(self->mean_bit_counts, |
| 454 (history_size + 1) * sizeof(*self->mean_bit_counts))); | 453 (history_size + 1) * sizeof(*self->mean_bit_counts))); |
| 455 self->bit_counts = static_cast<int32_t*>( | 454 self->bit_counts = static_cast<int32_t*>( |
| 456 realloc(self->bit_counts, history_size * sizeof(*self->bit_counts))); | 455 realloc(self->bit_counts, history_size * sizeof(*self->bit_counts))); |
| 457 self->histogram = static_cast<float*>( | 456 self->histogram = static_cast<float*>( |
| 458 realloc(self->histogram, (history_size + 1) * sizeof(*self->histogram))); | 457 realloc(self->histogram, (history_size + 1) * sizeof(*self->histogram))); |
| 459 | 458 |
| 460 if ((self->mean_bit_counts == NULL) || | 459 if ((self->mean_bit_counts == nullptr) || (self->bit_counts == nullptr) || |
| 461 (self->bit_counts == NULL) || | 460 (self->histogram == nullptr)) { |
| 462 (self->histogram == NULL)) { | |
| 463 history_size = 0; | 461 history_size = 0; |
| 464 } | 462 } |
| 465 // Fill with zeros if we have expanded the buffers. | 463 // Fill with zeros if we have expanded the buffers. |
| 466 if (history_size > self->history_size) { | 464 if (history_size > self->history_size) { |
| 467 int size_diff = history_size - self->history_size; | 465 int size_diff = history_size - self->history_size; |
| 468 memset(&self->mean_bit_counts[self->history_size], | 466 memset(&self->mean_bit_counts[self->history_size], |
| 469 0, | 467 0, |
| 470 sizeof(*self->mean_bit_counts) * size_diff); | 468 sizeof(*self->mean_bit_counts) * size_diff); |
| 471 memset(&self->bit_counts[self->history_size], | 469 memset(&self->bit_counts[self->history_size], |
| 472 0, | 470 0, |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 int32_t diff = new_value - *mean_value; | 692 int32_t diff = new_value - *mean_value; |
| 695 | 693 |
| 696 // mean_new = mean_value + ((new_value - mean_value) >> factor); | 694 // mean_new = mean_value + ((new_value - mean_value) >> factor); |
| 697 if (diff < 0) { | 695 if (diff < 0) { |
| 698 diff = -((-diff) >> factor); | 696 diff = -((-diff) >> factor); |
| 699 } else { | 697 } else { |
| 700 diff = (diff >> factor); | 698 diff = (diff >> factor); |
| 701 } | 699 } |
| 702 *mean_value += diff; | 700 *mean_value += diff; |
| 703 } | 701 } |
| OLD | NEW |