Revert of Prevent Opus DTX from generating intermittent noise during silence (patchset #10 id:250001 of https://codereview.webrtc.org/1415173005/ )
Reason for revert: Breaks voe_auto_test on all three "large tests bots". https://build.chromium.org/p/client.webrtc/builders/Win32%20Release%20%5Blarge%20tests%5D/builds/5630/steps/voe_auto_test/logs/stdio https://build.chromium.org/p/client.webrtc/builders/Mac32%20Release%20%5Blarge%20tests%5D/builds/5599/steps/voe_auto_test/logs/stdio https://build.chromium.org/p/client.webrtc/builders/Linux64%20Release%20%5Blarge%20tests%5D/builds/5645/steps/voe_auto_test/logs/stdio Notice these bots are no longer a part of the default trybot set, so they have to be run manually when working with code that affects their tests (they were removed as they queued up all the time in the CQ, and usually don't catch breakages). Original issue's description: > Prevent Opus DTX from generating intermittent noise during silence. > > Opus may have an internal error that causes this. Here we make a workaround by adding some small disturbance to the input signals to break a long sequence of zeros. > > BUG=webrtc:5127 > > Committed: https://crrev.com/f475add57eada116bc960fe2935876ec8c077977 > Cr-Commit-Position: refs/heads/master@{#10565} TBR=tina.legrand@webrtc.org,kwiberg@webrtc.org,solenberg@webrtc.org,minyue@webrtc.org NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=webrtc:5127 Review URL: https://codereview.webrtc.org/1428613004 Cr-Commit-Position: refs/heads/master@{#10567}
This commit is contained in:
@ -11,7 +11,6 @@
|
||||
#include "webrtc/modules/audio_coding/codecs/opus/include/opus_interface.h"
|
||||
#include "webrtc/modules/audio_coding/codecs/opus/opus_inst.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
@ -30,61 +29,48 @@ enum {
|
||||
|
||||
/* Default frame size, 20 ms @ 48 kHz, in samples (for one channel). */
|
||||
kWebRtcOpusDefaultFrameSize = 960,
|
||||
|
||||
// Maximum number of consecutive zeros, beyond or equal to which DTX can fail.
|
||||
kZeroBreakCount = 157,
|
||||
|
||||
#if defined(OPUS_FIXED_POINT)
|
||||
kZeroBreakValue = 10,
|
||||
#else
|
||||
kZeroBreakValue = 1,
|
||||
#endif
|
||||
};
|
||||
|
||||
int16_t WebRtcOpus_EncoderCreate(OpusEncInst** inst,
|
||||
int32_t channels,
|
||||
int32_t application) {
|
||||
int opus_app;
|
||||
if (!inst)
|
||||
return -1;
|
||||
OpusEncInst* state;
|
||||
if (inst != NULL) {
|
||||
state = (OpusEncInst*) calloc(1, sizeof(OpusEncInst));
|
||||
if (state) {
|
||||
int opus_app;
|
||||
switch (application) {
|
||||
case 0: {
|
||||
opus_app = OPUS_APPLICATION_VOIP;
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
opus_app = OPUS_APPLICATION_AUDIO;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
free(state);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
switch (application) {
|
||||
case 0:
|
||||
opus_app = OPUS_APPLICATION_VOIP;
|
||||
break;
|
||||
case 1:
|
||||
opus_app = OPUS_APPLICATION_AUDIO;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
int error;
|
||||
state->encoder = opus_encoder_create(48000, channels, opus_app,
|
||||
&error);
|
||||
state->in_dtx_mode = 0;
|
||||
if (error == OPUS_OK && state->encoder != NULL) {
|
||||
*inst = state;
|
||||
return 0;
|
||||
}
|
||||
free(state);
|
||||
}
|
||||
}
|
||||
|
||||
OpusEncInst* state = calloc(1, sizeof(OpusEncInst));
|
||||
assert(state);
|
||||
|
||||
// Allocate zero counters.
|
||||
state->zero_counts = calloc(channels, sizeof(size_t));
|
||||
assert(state->zero_counts);
|
||||
|
||||
int error;
|
||||
state->encoder = opus_encoder_create(48000, channels, opus_app,
|
||||
&error);
|
||||
if (error != OPUS_OK || !state->encoder) {
|
||||
WebRtcOpus_EncoderFree(state);
|
||||
return -1;
|
||||
}
|
||||
|
||||
state->in_dtx_mode = 0;
|
||||
state->channels = channels;
|
||||
|
||||
*inst = state;
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int16_t WebRtcOpus_EncoderFree(OpusEncInst* inst) {
|
||||
if (inst) {
|
||||
opus_encoder_destroy(inst->encoder);
|
||||
free(inst->zero_counts);
|
||||
free(inst);
|
||||
return 0;
|
||||
} else {
|
||||
@ -98,42 +84,13 @@ int WebRtcOpus_Encode(OpusEncInst* inst,
|
||||
size_t length_encoded_buffer,
|
||||
uint8_t* encoded) {
|
||||
int res;
|
||||
size_t i;
|
||||
int c;
|
||||
|
||||
int16_t buffer[2 * 48 * kWebRtcOpusMaxEncodeFrameSizeMs];
|
||||
|
||||
if (samples > 48 * kWebRtcOpusMaxEncodeFrameSizeMs) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
const int channels = inst->channels;
|
||||
int use_buffer = 0;
|
||||
|
||||
// Break long consecutive zeros by forcing a "1" every |kZeroBreakCount|
|
||||
// samples.
|
||||
if (inst->in_dtx_mode) {
|
||||
for (i = 0; i < samples; ++i) {
|
||||
for (c = 0; c < channels; ++c) {
|
||||
if (audio_in[i * channels + c] == 0) {
|
||||
++inst->zero_counts[c];
|
||||
if (inst->zero_counts[c] == kZeroBreakCount) {
|
||||
if (!use_buffer) {
|
||||
memcpy(buffer, audio_in, samples * channels * sizeof(int16_t));
|
||||
use_buffer = 1;
|
||||
}
|
||||
buffer[i * channels + c] = kZeroBreakValue;
|
||||
inst->zero_counts[c] = 0;
|
||||
}
|
||||
} else {
|
||||
inst->zero_counts[c] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res = opus_encode(inst->encoder,
|
||||
use_buffer ? buffer : audio_in,
|
||||
(const opus_int16*)audio_in,
|
||||
(int)samples,
|
||||
encoded,
|
||||
(opus_int32)length_encoded_buffer);
|
||||
|
||||
Reference in New Issue
Block a user