2013-01-29 12:09:21 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2013 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.
|
|
|
|
|
*/
|
|
|
|
|
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "modules/audio_coding/neteq/decision_logic_normal.h"
|
2013-01-29 12:09:21 +00:00
|
|
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "modules/audio_coding/neteq/buffer_level_filter.h"
|
|
|
|
|
#include "modules/audio_coding/neteq/decoder_database.h"
|
|
|
|
|
#include "modules/audio_coding/neteq/delay_manager.h"
|
|
|
|
|
#include "modules/audio_coding/neteq/expand.h"
|
|
|
|
|
#include "modules/audio_coding/neteq/packet_buffer.h"
|
|
|
|
|
#include "modules/audio_coding/neteq/sync_buffer.h"
|
|
|
|
|
#include "modules/include/module_common_types.h"
|
2013-01-29 12:09:21 +00:00
|
|
|
|
|
|
|
|
namespace webrtc {
|
|
|
|
|
|
|
|
|
|
Operations DecisionLogicNormal::GetDecisionSpecialized(
|
|
|
|
|
const SyncBuffer& sync_buffer,
|
|
|
|
|
const Expand& expand,
|
Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.
This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.
This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002
The change is being landed as TBR to all the folks who reviewed the above.
BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher
Review URL: https://codereview.webrtc.org/1230503003 .
Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 14:52:23 -07:00
|
|
|
size_t decoder_frame_length,
|
2016-10-18 04:06:13 -07:00
|
|
|
const Packet* next_packet,
|
2013-01-29 12:09:21 +00:00
|
|
|
Modes prev_mode,
|
|
|
|
|
bool play_dtmf,
|
2016-05-03 08:18:47 -07:00
|
|
|
bool* reset_decoder,
|
|
|
|
|
size_t generated_noise_samples) {
|
2013-01-29 12:09:21 +00:00
|
|
|
assert(playout_mode_ == kPlayoutOn || playout_mode_ == kPlayoutStreaming);
|
|
|
|
|
// Guard for errors, to avoid getting stuck in error mode.
|
|
|
|
|
if (prev_mode == kModeError) {
|
2016-10-18 04:06:13 -07:00
|
|
|
if (!next_packet) {
|
2013-01-29 12:09:21 +00:00
|
|
|
return kExpand;
|
|
|
|
|
} else {
|
|
|
|
|
return kUndefined; // Use kUndefined to flag for a reset.
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t target_timestamp = sync_buffer.end_timestamp();
|
|
|
|
|
uint32_t available_timestamp = 0;
|
2014-02-17 11:37:16 +00:00
|
|
|
bool is_cng_packet = false;
|
2016-10-18 04:06:13 -07:00
|
|
|
if (next_packet) {
|
|
|
|
|
available_timestamp = next_packet->timestamp;
|
2013-01-29 12:09:21 +00:00
|
|
|
is_cng_packet =
|
2016-10-18 04:06:13 -07:00
|
|
|
decoder_database_->IsComfortNoise(next_packet->payload_type);
|
2013-01-29 12:09:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (is_cng_packet) {
|
2016-05-03 08:18:47 -07:00
|
|
|
return CngOperation(prev_mode, target_timestamp, available_timestamp,
|
|
|
|
|
generated_noise_samples);
|
2013-01-29 12:09:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Handle the case with no packet at all available (except maybe DTMF).
|
2016-10-18 04:06:13 -07:00
|
|
|
if (!next_packet) {
|
2013-01-29 12:09:21 +00:00
|
|
|
return NoPacket(play_dtmf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If the expand period was very long, reset NetEQ since it is likely that the
|
|
|
|
|
// sender was restarted.
|
|
|
|
|
if (num_consecutive_expands_ > kReinitAfterExpands) {
|
|
|
|
|
*reset_decoder = true;
|
|
|
|
|
return kNormal;
|
|
|
|
|
}
|
|
|
|
|
|
Match existing type usage better.
This makes a variety of small changes to synchronize bits of code using different types, remove useless code or casts, and add explicit casts in some places previously doing implicit ones. For example:
* Change a few type declarations to better match how the majority of code uses those objects.
* Eliminate "< 0" check for unsigned values.
* Replace "(float)sin(x)", where |x| is also a float, with "sinf(x)", and similar.
* Add casts to uint32_t in many places timestamps were used and the existing code stored signed values into the unsigned objects.
* Remove downcasts when the results would be passed to a larger type, e.g. calling "foo((int16_t)x)" with an int |x| when foo() takes an int instead of an int16_t.
* Similarly, add casts when passing a larger type to a function taking a smaller one.
* Add casts to int16_t when doing something like "int16_t = int16_t + int16_t" as the "+" operation would implicitly upconvert to int, and similar.
* Use "false" instead of "0" for setting a bool.
* Shift a few temp types when doing a multi-stage calculation involving typecasts, so as to put the most logical/semantically correct type possible into the temps. For example, when doing "int foo = int + int; size_t bar = (size_t)foo + size_t;", we might change |foo| to a size_t and move the cast if it makes more sense for |foo| to be represented as a size_t.
BUG=none
R=andrew@webrtc.org, asapersson@webrtc.org, henrika@webrtc.org, juberti@webrtc.org, kwiberg@webrtc.org
TBR=andrew, asapersson, henrika
Review URL: https://codereview.webrtc.org/1168753002
Cr-Commit-Position: refs/heads/master@{#9419}
2015-06-11 12:55:50 -07:00
|
|
|
const uint32_t five_seconds_samples =
|
|
|
|
|
static_cast<uint32_t>(5 * 8000 * fs_mult_);
|
2013-01-29 12:09:21 +00:00
|
|
|
// Check if the required packet is available.
|
|
|
|
|
if (target_timestamp == available_timestamp) {
|
|
|
|
|
return ExpectedPacketAvailable(prev_mode, play_dtmf);
|
2014-11-04 14:03:58 +00:00
|
|
|
} else if (!PacketBuffer::IsObsoleteTimestamp(
|
|
|
|
|
available_timestamp, target_timestamp, five_seconds_samples)) {
|
2013-01-29 12:09:21 +00:00
|
|
|
return FuturePacketAvailable(sync_buffer, expand, decoder_frame_length,
|
|
|
|
|
prev_mode, target_timestamp,
|
2016-05-03 08:18:47 -07:00
|
|
|
available_timestamp, play_dtmf,
|
|
|
|
|
generated_noise_samples);
|
2013-01-29 12:09:21 +00:00
|
|
|
} else {
|
|
|
|
|
// This implies that available_timestamp < target_timestamp, which can
|
2014-11-04 14:03:58 +00:00
|
|
|
// happen when a new stream or codec is received. Signal for a reset.
|
|
|
|
|
return kUndefined;
|
2013-01-29 12:09:21 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Operations DecisionLogicNormal::CngOperation(Modes prev_mode,
|
|
|
|
|
uint32_t target_timestamp,
|
2016-05-03 08:18:47 -07:00
|
|
|
uint32_t available_timestamp,
|
|
|
|
|
size_t generated_noise_samples) {
|
2013-01-29 12:09:21 +00:00
|
|
|
// Signed difference between target and available timestamp.
|
Match existing type usage better.
This makes a variety of small changes to synchronize bits of code using different types, remove useless code or casts, and add explicit casts in some places previously doing implicit ones. For example:
* Change a few type declarations to better match how the majority of code uses those objects.
* Eliminate "< 0" check for unsigned values.
* Replace "(float)sin(x)", where |x| is also a float, with "sinf(x)", and similar.
* Add casts to uint32_t in many places timestamps were used and the existing code stored signed values into the unsigned objects.
* Remove downcasts when the results would be passed to a larger type, e.g. calling "foo((int16_t)x)" with an int |x| when foo() takes an int instead of an int16_t.
* Similarly, add casts when passing a larger type to a function taking a smaller one.
* Add casts to int16_t when doing something like "int16_t = int16_t + int16_t" as the "+" operation would implicitly upconvert to int, and similar.
* Use "false" instead of "0" for setting a bool.
* Shift a few temp types when doing a multi-stage calculation involving typecasts, so as to put the most logical/semantically correct type possible into the temps. For example, when doing "int foo = int + int; size_t bar = (size_t)foo + size_t;", we might change |foo| to a size_t and move the cast if it makes more sense for |foo| to be represented as a size_t.
BUG=none
R=andrew@webrtc.org, asapersson@webrtc.org, henrika@webrtc.org, juberti@webrtc.org, kwiberg@webrtc.org
TBR=andrew, asapersson, henrika
Review URL: https://codereview.webrtc.org/1168753002
Cr-Commit-Position: refs/heads/master@{#9419}
2015-06-11 12:55:50 -07:00
|
|
|
int32_t timestamp_diff = static_cast<int32_t>(
|
2016-05-03 08:18:47 -07:00
|
|
|
static_cast<uint32_t>(generated_noise_samples + target_timestamp) -
|
Match existing type usage better.
This makes a variety of small changes to synchronize bits of code using different types, remove useless code or casts, and add explicit casts in some places previously doing implicit ones. For example:
* Change a few type declarations to better match how the majority of code uses those objects.
* Eliminate "< 0" check for unsigned values.
* Replace "(float)sin(x)", where |x| is also a float, with "sinf(x)", and similar.
* Add casts to uint32_t in many places timestamps were used and the existing code stored signed values into the unsigned objects.
* Remove downcasts when the results would be passed to a larger type, e.g. calling "foo((int16_t)x)" with an int |x| when foo() takes an int instead of an int16_t.
* Similarly, add casts when passing a larger type to a function taking a smaller one.
* Add casts to int16_t when doing something like "int16_t = int16_t + int16_t" as the "+" operation would implicitly upconvert to int, and similar.
* Use "false" instead of "0" for setting a bool.
* Shift a few temp types when doing a multi-stage calculation involving typecasts, so as to put the most logical/semantically correct type possible into the temps. For example, when doing "int foo = int + int; size_t bar = (size_t)foo + size_t;", we might change |foo| to a size_t and move the cast if it makes more sense for |foo| to be represented as a size_t.
BUG=none
R=andrew@webrtc.org, asapersson@webrtc.org, henrika@webrtc.org, juberti@webrtc.org, kwiberg@webrtc.org
TBR=andrew, asapersson, henrika
Review URL: https://codereview.webrtc.org/1168753002
Cr-Commit-Position: refs/heads/master@{#9419}
2015-06-11 12:55:50 -07:00
|
|
|
available_timestamp);
|
|
|
|
|
int32_t optimal_level_samp = static_cast<int32_t>(
|
|
|
|
|
(delay_manager_->TargetLevel() * packet_length_samples_) >> 8);
|
2017-05-16 07:13:15 -07:00
|
|
|
const int64_t excess_waiting_time_samp =
|
|
|
|
|
-static_cast<int64_t>(timestamp_diff) - optimal_level_samp;
|
2013-01-29 12:09:21 +00:00
|
|
|
|
|
|
|
|
if (excess_waiting_time_samp > optimal_level_samp / 2) {
|
|
|
|
|
// The waiting time for this packet will be longer than 1.5
|
2016-05-03 08:18:47 -07:00
|
|
|
// times the wanted buffer delay. Apply fast-forward to cut the
|
2013-01-29 12:09:21 +00:00
|
|
|
// waiting time down to the optimal.
|
2017-05-16 07:13:15 -07:00
|
|
|
noise_fast_forward_ = rtc::dchecked_cast<size_t>(noise_fast_forward_ +
|
|
|
|
|
excess_waiting_time_samp);
|
|
|
|
|
timestamp_diff =
|
|
|
|
|
rtc::saturated_cast<int32_t>(timestamp_diff + excess_waiting_time_samp);
|
2013-01-29 12:09:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (timestamp_diff < 0 && prev_mode == kModeRfc3389Cng) {
|
|
|
|
|
// Not time to play this packet yet. Wait another round before using this
|
|
|
|
|
// packet. Keep on playing CNG from previous CNG parameters.
|
|
|
|
|
return kRfc3389CngNoPacket;
|
|
|
|
|
} else {
|
|
|
|
|
// Otherwise, go for the CNG packet now.
|
2016-05-03 08:18:47 -07:00
|
|
|
noise_fast_forward_ = 0;
|
2013-01-29 12:09:21 +00:00
|
|
|
return kRfc3389Cng;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Operations DecisionLogicNormal::NoPacket(bool play_dtmf) {
|
|
|
|
|
if (cng_state_ == kCngRfc3389On) {
|
|
|
|
|
// Keep on playing comfort noise.
|
|
|
|
|
return kRfc3389CngNoPacket;
|
|
|
|
|
} else if (cng_state_ == kCngInternalOn) {
|
|
|
|
|
// Keep on playing codec internal comfort noise.
|
|
|
|
|
return kCodecInternalCng;
|
|
|
|
|
} else if (play_dtmf) {
|
|
|
|
|
return kDtmf;
|
|
|
|
|
} else {
|
|
|
|
|
// Nothing to play, do expand.
|
|
|
|
|
return kExpand;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Operations DecisionLogicNormal::ExpectedPacketAvailable(Modes prev_mode,
|
|
|
|
|
bool play_dtmf) {
|
|
|
|
|
if (prev_mode != kModeExpand && !play_dtmf) {
|
|
|
|
|
// Check criterion for time-stretching.
|
|
|
|
|
int low_limit, high_limit;
|
|
|
|
|
delay_manager_->BufferLimits(&low_limit, &high_limit);
|
2015-05-27 14:33:29 +02:00
|
|
|
if (buffer_level_filter_->filtered_current_level() >= high_limit << 2)
|
|
|
|
|
return kFastAccelerate;
|
|
|
|
|
if (TimescaleAllowed()) {
|
|
|
|
|
if (buffer_level_filter_->filtered_current_level() >= high_limit)
|
|
|
|
|
return kAccelerate;
|
|
|
|
|
if (buffer_level_filter_->filtered_current_level() < low_limit)
|
|
|
|
|
return kPreemptiveExpand;
|
2013-01-29 12:09:21 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return kNormal;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Operations DecisionLogicNormal::FuturePacketAvailable(
|
|
|
|
|
const SyncBuffer& sync_buffer,
|
|
|
|
|
const Expand& expand,
|
Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.
This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.
This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002
The change is being landed as TBR to all the folks who reviewed the above.
BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher
Review URL: https://codereview.webrtc.org/1230503003 .
Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 14:52:23 -07:00
|
|
|
size_t decoder_frame_length,
|
2013-01-29 12:09:21 +00:00
|
|
|
Modes prev_mode,
|
|
|
|
|
uint32_t target_timestamp,
|
|
|
|
|
uint32_t available_timestamp,
|
2016-05-03 08:18:47 -07:00
|
|
|
bool play_dtmf,
|
|
|
|
|
size_t generated_noise_samples) {
|
2013-01-29 12:09:21 +00:00
|
|
|
// Required packet is not available, but a future packet is.
|
|
|
|
|
// Check if we should continue with an ongoing expand because the new packet
|
|
|
|
|
// is too far into the future.
|
|
|
|
|
uint32_t timestamp_leap = available_timestamp - target_timestamp;
|
|
|
|
|
if ((prev_mode == kModeExpand) &&
|
|
|
|
|
!ReinitAfterExpands(timestamp_leap) &&
|
|
|
|
|
!MaxWaitForPacket() &&
|
|
|
|
|
PacketTooEarly(timestamp_leap) &&
|
|
|
|
|
UnderTargetLevel()) {
|
|
|
|
|
if (play_dtmf) {
|
|
|
|
|
// Still have DTMF to play, so do not do expand.
|
|
|
|
|
return kDtmf;
|
|
|
|
|
} else {
|
|
|
|
|
// Nothing to play.
|
|
|
|
|
return kExpand;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.
This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.
This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002
The change is being landed as TBR to all the folks who reviewed the above.
BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher
Review URL: https://codereview.webrtc.org/1230503003 .
Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 14:52:23 -07:00
|
|
|
const size_t samples_left =
|
|
|
|
|
sync_buffer.FutureLength() - expand.overlap_length();
|
|
|
|
|
const size_t cur_size_samples = samples_left +
|
2013-01-29 12:09:21 +00:00
|
|
|
packet_buffer_.NumPacketsInBuffer() * decoder_frame_length;
|
|
|
|
|
|
|
|
|
|
// If previous was comfort noise, then no merge is needed.
|
|
|
|
|
if (prev_mode == kModeRfc3389Cng ||
|
|
|
|
|
prev_mode == kModeCodecInternalCng) {
|
|
|
|
|
// Keep the same delay as before the CNG (or maximum 70 ms in buffer as
|
|
|
|
|
// safety precaution), but make sure that the number of samples in buffer
|
|
|
|
|
// is no higher than 4 times the optimal level. (Note that TargetLevel()
|
|
|
|
|
// is in Q8.)
|
2016-05-03 08:18:47 -07:00
|
|
|
if (static_cast<uint32_t>(generated_noise_samples + target_timestamp) >=
|
Match existing type usage better.
This makes a variety of small changes to synchronize bits of code using different types, remove useless code or casts, and add explicit casts in some places previously doing implicit ones. For example:
* Change a few type declarations to better match how the majority of code uses those objects.
* Eliminate "< 0" check for unsigned values.
* Replace "(float)sin(x)", where |x| is also a float, with "sinf(x)", and similar.
* Add casts to uint32_t in many places timestamps were used and the existing code stored signed values into the unsigned objects.
* Remove downcasts when the results would be passed to a larger type, e.g. calling "foo((int16_t)x)" with an int |x| when foo() takes an int instead of an int16_t.
* Similarly, add casts when passing a larger type to a function taking a smaller one.
* Add casts to int16_t when doing something like "int16_t = int16_t + int16_t" as the "+" operation would implicitly upconvert to int, and similar.
* Use "false" instead of "0" for setting a bool.
* Shift a few temp types when doing a multi-stage calculation involving typecasts, so as to put the most logical/semantically correct type possible into the temps. For example, when doing "int foo = int + int; size_t bar = (size_t)foo + size_t;", we might change |foo| to a size_t and move the cast if it makes more sense for |foo| to be represented as a size_t.
BUG=none
R=andrew@webrtc.org, asapersson@webrtc.org, henrika@webrtc.org, juberti@webrtc.org, kwiberg@webrtc.org
TBR=andrew, asapersson, henrika
Review URL: https://codereview.webrtc.org/1168753002
Cr-Commit-Position: refs/heads/master@{#9419}
2015-06-11 12:55:50 -07:00
|
|
|
available_timestamp ||
|
2013-01-29 12:09:21 +00:00
|
|
|
cur_size_samples >
|
Match existing type usage better.
This makes a variety of small changes to synchronize bits of code using different types, remove useless code or casts, and add explicit casts in some places previously doing implicit ones. For example:
* Change a few type declarations to better match how the majority of code uses those objects.
* Eliminate "< 0" check for unsigned values.
* Replace "(float)sin(x)", where |x| is also a float, with "sinf(x)", and similar.
* Add casts to uint32_t in many places timestamps were used and the existing code stored signed values into the unsigned objects.
* Remove downcasts when the results would be passed to a larger type, e.g. calling "foo((int16_t)x)" with an int |x| when foo() takes an int instead of an int16_t.
* Similarly, add casts when passing a larger type to a function taking a smaller one.
* Add casts to int16_t when doing something like "int16_t = int16_t + int16_t" as the "+" operation would implicitly upconvert to int, and similar.
* Use "false" instead of "0" for setting a bool.
* Shift a few temp types when doing a multi-stage calculation involving typecasts, so as to put the most logical/semantically correct type possible into the temps. For example, when doing "int foo = int + int; size_t bar = (size_t)foo + size_t;", we might change |foo| to a size_t and move the cast if it makes more sense for |foo| to be represented as a size_t.
BUG=none
R=andrew@webrtc.org, asapersson@webrtc.org, henrika@webrtc.org, juberti@webrtc.org, kwiberg@webrtc.org
TBR=andrew, asapersson, henrika
Review URL: https://codereview.webrtc.org/1168753002
Cr-Commit-Position: refs/heads/master@{#9419}
2015-06-11 12:55:50 -07:00
|
|
|
((delay_manager_->TargetLevel() * packet_length_samples_) >> 8) *
|
|
|
|
|
4) {
|
2013-01-29 12:09:21 +00:00
|
|
|
// Time to play this new packet.
|
|
|
|
|
return kNormal;
|
|
|
|
|
} else {
|
|
|
|
|
// Too early to play this new packet; keep on playing comfort noise.
|
|
|
|
|
if (prev_mode == kModeRfc3389Cng) {
|
|
|
|
|
return kRfc3389CngNoPacket;
|
|
|
|
|
} else { // prevPlayMode == kModeCodecInternalCng.
|
|
|
|
|
return kCodecInternalCng;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Do not merge unless we have done an expand before.
|
2016-10-13 02:43:34 -07:00
|
|
|
if (prev_mode == kModeExpand) {
|
2013-01-29 12:09:21 +00:00
|
|
|
return kMerge;
|
|
|
|
|
} else if (play_dtmf) {
|
|
|
|
|
// Play DTMF instead of expand.
|
|
|
|
|
return kDtmf;
|
|
|
|
|
} else {
|
|
|
|
|
return kExpand;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DecisionLogicNormal::UnderTargetLevel() const {
|
|
|
|
|
return buffer_level_filter_->filtered_current_level() <=
|
|
|
|
|
delay_manager_->TargetLevel();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DecisionLogicNormal::ReinitAfterExpands(uint32_t timestamp_leap) const {
|
|
|
|
|
return timestamp_leap >=
|
|
|
|
|
static_cast<uint32_t>(output_size_samples_ * kReinitAfterExpands);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DecisionLogicNormal::PacketTooEarly(uint32_t timestamp_leap) const {
|
|
|
|
|
return timestamp_leap >
|
|
|
|
|
static_cast<uint32_t>(output_size_samples_ * num_consecutive_expands_);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DecisionLogicNormal::MaxWaitForPacket() const {
|
|
|
|
|
return num_consecutive_expands_ >= kMaxWaitForPacket;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace webrtc
|