Improvements for NetEqControllers

When creating a NetEqController it can be useful to have access to a
webrtc::Clock*. Also, NetEqControllers should have access to the
contents of the sync buffer when making decisions.

Bug: webrtc:11005
Change-Id: I7fdba75ce661b2ace52458620a8c1f3c990e5ac2
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/167208
Commit-Queue: Ivo Creusen <ivoc@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30368}
This commit is contained in:
Ivo Creusen
2020-01-24 11:04:56 +01:00
committed by Commit Bot
parent 9bac68c0cc
commit 88636c6dac
6 changed files with 19 additions and 5 deletions

View File

@ -55,6 +55,7 @@ rtc_source_set("neteq_controller_api") {
":neteq_api", ":neteq_api",
":tick_timer", ":tick_timer",
"../../rtc_base:rtc_base_approved", "../../rtc_base:rtc_base_approved",
"../../system_wrappers:system_wrappers",
"//third_party/abseil-cpp/absl/types:optional", "//third_party/abseil-cpp/absl/types:optional",
] ]
} }

View File

@ -1,11 +1,14 @@
specific_include_rules = { specific_include_rules = {
"neteq_factory\.h": [
"+system_wrappers/include/clock.h",
],
"custom_neteq_factory\.h": [ "custom_neteq_factory\.h": [
"+system_wrappers/include/clock.h", "+system_wrappers/include/clock.h",
], ],
"default_neteq_factory\.h": [ "default_neteq_factory\.h": [
"+system_wrappers/include/clock.h", "+system_wrappers/include/clock.h",
], ],
"neteq_controller\.h": [
"+system_wrappers/include/clock.h",
],
"neteq_factory\.h": [
"+system_wrappers/include/clock.h",
],
} }

2
api/neteq/OWNERS Normal file
View File

@ -0,0 +1,2 @@
ivoc@webrtc.org
hlundin@webrtc.org

View File

@ -20,6 +20,7 @@
#include "absl/types/optional.h" #include "absl/types/optional.h"
#include "api/neteq/neteq.h" #include "api/neteq/neteq.h"
#include "api/neteq/tick_timer.h" #include "api/neteq/tick_timer.h"
#include "system_wrappers/include/clock.h"
namespace webrtc { namespace webrtc {
@ -67,6 +68,7 @@ class NetEqController {
int max_packets_in_buffer; int max_packets_in_buffer;
int base_min_delay_ms; int base_min_delay_ms;
TickTimer* tick_timer; TickTimer* tick_timer;
webrtc::Clock* clock = nullptr;
}; };
struct PacketInfo { struct PacketInfo {
@ -92,6 +94,7 @@ class NetEqController {
bool play_dtmf; bool play_dtmf;
size_t generated_noise_samples; size_t generated_noise_samples;
PacketBufferInfo packet_buffer_info; PacketBufferInfo packet_buffer_info;
size_t sync_buffer_samples;
}; };
virtual ~NetEqController() = default; virtual ~NetEqController() = default;

View File

@ -61,13 +61,15 @@ std::unique_ptr<NetEqController> CreateNetEqController(
int max_packets_in_buffer, int max_packets_in_buffer,
bool enable_rtx_handling, bool enable_rtx_handling,
bool allow_time_stretching, bool allow_time_stretching,
TickTimer* tick_timer) { TickTimer* tick_timer,
webrtc::Clock* clock) {
NetEqController::Config config; NetEqController::Config config;
config.base_min_delay_ms = base_min_delay; config.base_min_delay_ms = base_min_delay;
config.max_packets_in_buffer = max_packets_in_buffer; config.max_packets_in_buffer = max_packets_in_buffer;
config.enable_rtx_handling = enable_rtx_handling; config.enable_rtx_handling = enable_rtx_handling;
config.allow_time_stretching = allow_time_stretching; config.allow_time_stretching = allow_time_stretching;
config.tick_timer = tick_timer; config.tick_timer = tick_timer;
config.clock = clock;
return controller_factory.CreateNetEqController(config); return controller_factory.CreateNetEqController(config);
} }
@ -93,7 +95,8 @@ NetEqImpl::Dependencies::Dependencies(
config.max_packets_in_buffer, config.max_packets_in_buffer,
config.enable_rtx_handling, config.enable_rtx_handling,
!config.for_test_no_time_stretching, !config.for_test_no_time_stretching,
tick_timer.get())), tick_timer.get(),
clock)),
red_payload_splitter(new RedPayloadSplitter), red_payload_splitter(new RedPayloadSplitter),
timestamp_scaler(new TimestampScaler(*decoder_database)), timestamp_scaler(new TimestampScaler(*decoder_database)),
accelerate_factory(new AccelerateFactory), accelerate_factory(new AccelerateFactory),
@ -1084,6 +1087,7 @@ int NetEqImpl::GetDecision(Operation* operation,
status.last_mode = last_mode_; status.last_mode = last_mode_;
status.play_dtmf = *play_dtmf; status.play_dtmf = *play_dtmf;
status.generated_noise_samples = generated_noise_samples; status.generated_noise_samples = generated_noise_samples;
status.sync_buffer_samples = sync_buffer_->FutureLength();
if (packet) { if (packet) {
status.next_packet = { status.next_packet = {
packet->timestamp, packet->frame && packet->frame->IsDtxPacket(), packet->timestamp, packet->frame && packet->frame->IsDtxPacket(),

View File

@ -125,6 +125,7 @@ class NetEqImplTest : public ::testing::Test {
controller_config.enable_rtx_handling = config_.enable_rtx_handling; controller_config.enable_rtx_handling = config_.enable_rtx_handling;
controller_config.allow_time_stretching = true; controller_config.allow_time_stretching = true;
controller_config.max_packets_in_buffer = config_.max_packets_in_buffer; controller_config.max_packets_in_buffer = config_.max_packets_in_buffer;
controller_config.clock = &clock_;
deps.neteq_controller = deps.neteq_controller =
std::make_unique<DecisionLogic>(std::move(controller_config)); std::make_unique<DecisionLogic>(std::move(controller_config));
} }