diff options
Diffstat (limited to 'chromium/third_party/webrtc/modules/audio_coding/neteq/bufstats_decision.c')
-rw-r--r-- | chromium/third_party/webrtc/modules/audio_coding/neteq/bufstats_decision.c | 427 |
1 files changed, 0 insertions, 427 deletions
diff --git a/chromium/third_party/webrtc/modules/audio_coding/neteq/bufstats_decision.c b/chromium/third_party/webrtc/modules/audio_coding/neteq/bufstats_decision.c deleted file mode 100644 index 352e0507746..00000000000 --- a/chromium/third_party/webrtc/modules/audio_coding/neteq/bufstats_decision.c +++ /dev/null @@ -1,427 +0,0 @@ -/* - * Copyright (c) 2011 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. - */ - -/* - * This file contains the function where the main decision logic for buffer level - * adaptation happens. - */ - -#include "buffer_stats.h" - -#include <assert.h> - -#include "signal_processing_library.h" - -#include "automode.h" -#include "neteq_defines.h" -#include "neteq_error_codes.h" -#include "webrtc_neteq.h" - -#define NETEQ_BUFSTAT_20MS_Q7 2560 /* = 20 ms in Q7 */ - -uint16_t WebRtcNetEQ_BufstatsDecision(BufstatsInst_t *inst, int16_t frameSize, - int32_t cur_size, uint32_t targetTS, - uint32_t availableTS, int noPacket, - int cngPacket, int prevPlayMode, - enum WebRtcNetEQPlayoutMode playoutMode, - int timestampsPerCall, int NoOfExpandCalls, - int16_t fs_mult, - int16_t lastModeBGNonly, int playDtmf) -{ - - int currentDelayMs; - int32_t currSizeSamples = cur_size; - int extraDelayPacketsQ8 = 0; - - /* Avoid overflow if the buffer size should be really large (cur_size is limited 256ms) */ - int32_t curr_sizeQ7 = WEBRTC_SPL_LSHIFT_W32(cur_size, 4); - int level_limit_hi, level_limit_lo; - - inst->Automode_inst.prevTimeScale &= (prevPlayMode == MODE_SUCCESS_ACCELERATE - || prevPlayMode == MODE_LOWEN_ACCELERATE || prevPlayMode == MODE_SUCCESS_PREEMPTIVE - || prevPlayMode == MODE_LOWEN_PREEMPTIVE); - - if ((prevPlayMode != MODE_RFC3389CNG) && (prevPlayMode != MODE_CODEC_INTERNAL_CNG)) - { - /* - * Do not update buffer history if currently playing CNG - * since it will bias the filtered buffer level. - */ - WebRtcNetEQ_BufferLevelFilter(cur_size, &(inst->Automode_inst), timestampsPerCall, - fs_mult); - } - else - { - /* only update time counters */ - inst->Automode_inst.packetIatCountSamp += timestampsPerCall; /* packet inter-arrival time */ - inst->Automode_inst.peakIatCountSamp += timestampsPerCall; /* peak inter-arrival time */ - inst->Automode_inst.timescaleHoldOff >>= 1; /* time-scaling limiter */ - } - cur_size = WEBRTC_SPL_MIN(curr_sizeQ7, WEBRTC_SPL_WORD16_MAX); - - /* Calculate VQmon related variables */ - /* avgDelay = avgDelay*(511/512) + currentDelay*(1/512) (sample ms delay in Q8) */ - inst->avgDelayMsQ8 = (int16_t) (WEBRTC_SPL_MUL_16_16_RSFT(inst->avgDelayMsQ8,511,9) - + (cur_size >> 9)); - - /* Update maximum delay if needed */ - currentDelayMs = (curr_sizeQ7 >> 7); - if (currentDelayMs > inst->maxDelayMs) - { - inst->maxDelayMs = currentDelayMs; - } - - /* NetEQ is on with normal or steaming mode */ - if (playoutMode == kPlayoutOn || playoutMode == kPlayoutStreaming) - { - /* Guard for errors, so that it should not get stuck in error mode */ - if (prevPlayMode == MODE_ERROR) - { - if (noPacket) - { - return BUFSTATS_DO_EXPAND; - } - else - { - return BUFSTAT_REINIT; - } - } - - if (prevPlayMode != MODE_EXPAND && prevPlayMode != MODE_FADE_TO_BGN) - { - inst->w16_noExpand = 1; - } - else - { - inst->w16_noExpand = 0; - } - - if (cngPacket) - { - /* signed difference between wanted and available TS */ - int32_t diffTS = (inst->uw32_CNGplayedTS + targetTS) - availableTS; - int32_t optimal_level_samp = (inst->Automode_inst.optBufLevel * - inst->Automode_inst.packetSpeechLenSamp) >> 8; - int32_t excess_waiting_time_samp = -diffTS - optimal_level_samp; - - if (excess_waiting_time_samp > optimal_level_samp / 2) - { - /* The waiting time for this packet will be longer than 1.5 - * times the wanted buffer delay. Advance the clock to cut - * waiting time down to the optimal. - */ - inst->uw32_CNGplayedTS += excess_waiting_time_samp; - diffTS += excess_waiting_time_samp; - } - - if ((diffTS) < 0 && (prevPlayMode == MODE_RFC3389CNG)) - { - /* Not time to play this packet yet. Wait another round before using this - * packet. Keep on playing CNG from previous CNG parameters. */ - return BUFSTATS_DO_RFC3389CNG_NOPACKET; - } - - /* otherwise, go for the CNG packet now */ - return BUFSTATS_DO_RFC3389CNG_PACKET; - } - - /*Check for expand/cng */ - if (noPacket) - { - if (inst->w16_cngOn == CNG_RFC3389_ON) - { - /* keep on playing CNG */ - return BUFSTATS_DO_RFC3389CNG_NOPACKET; - } - else if (inst->w16_cngOn == CNG_INTERNAL_ON) - { - /* keep on playing internal CNG */ - return BUFSTATS_DO_INTERNAL_CNG_NOPACKET; - } - else if (playDtmf == 1) - { - /* we have not audio data, but can play DTMF */ - return BUFSTATS_DO_DTMF_ONLY; - } - else - { - /* nothing to play => do Expand */ - return BUFSTATS_DO_EXPAND; - } - } - - /* - * If the expand period was very long, reset NetEQ since it is likely that the - * sender was restarted. - */ - if (NoOfExpandCalls > REINIT_AFTER_EXPANDS) return BUFSTAT_REINIT_DECODER; - - /* Calculate extra delay in Q8 packets */ - if (inst->Automode_inst.extraDelayMs > 0 && inst->Automode_inst.packetSpeechLenSamp - > 0) - { - - /* (extra delay in samples in Q8) */ - extraDelayPacketsQ8 = - ((inst->Automode_inst.extraDelayMs * 8 * fs_mult) << 8) / - inst->Automode_inst.packetSpeechLenSamp; - } - - /* Check if needed packet is available */ - if (targetTS == availableTS) - { - - /* If last mode was not expand, and there is no DTMF to play */ - if (inst->w16_noExpand == 1 && playDtmf == 0) - { - /* If so check for accelerate */ - - level_limit_lo = ((inst->Automode_inst.optBufLevel) >> 1) /* 50 % */ - + ((inst->Automode_inst.optBufLevel) >> 2); /* ... + 25% = 75% */ - - /* set upper limit to optBufLevel, but make sure that window is at least 20ms */ - level_limit_hi = WEBRTC_SPL_MAX(inst->Automode_inst.optBufLevel, - level_limit_lo + - WebRtcSpl_DivW32W16ResW16((WEBRTC_SPL_MUL(20*8, fs_mult) << 8), - inst->Automode_inst.packetSpeechLenSamp)); - - /* if extra delay is non-zero, add it */ - if (extraDelayPacketsQ8 > 0) - { - level_limit_hi += extraDelayPacketsQ8; - level_limit_lo += extraDelayPacketsQ8; - } - - if (((inst->Automode_inst.buffLevelFilt >= level_limit_hi) && - (inst->Automode_inst.timescaleHoldOff == 0)) || - (inst->Automode_inst.buffLevelFilt >= level_limit_hi << 2)) - { - /* - * Buffer level higher than limit and time-scaling allowed, - * OR buffer level _really_ high. - */ - return BUFSTATS_DO_ACCELERATE; - } - else if ((inst->Automode_inst.buffLevelFilt < level_limit_lo) - && (inst->Automode_inst.timescaleHoldOff == 0)) - { - return BUFSTATS_DO_PREEMPTIVE_EXPAND; - } - } - return BUFSTATS_DO_NORMAL; - } - - /* Check for Merge */ - else if (availableTS > targetTS) - { - - /* Check that we do not play a packet "too early" */ - if ((prevPlayMode == MODE_EXPAND) - && (availableTS - targetTS - < (uint32_t) WEBRTC_SPL_MUL_16_16((int16_t)timestampsPerCall, - (int16_t)REINIT_AFTER_EXPANDS)) - && (NoOfExpandCalls < MAX_WAIT_FOR_PACKET) - && (availableTS - > targetTS - + WEBRTC_SPL_MUL_16_16((int16_t)timestampsPerCall, - (int16_t)NoOfExpandCalls)) - && (inst->Automode_inst.buffLevelFilt <= inst->Automode_inst.optBufLevel - + extraDelayPacketsQ8)) - { - if (playDtmf == 1) - { - /* we still have DTMF to play, so do not perform expand */ - return BUFSTATS_DO_DTMF_ONLY; - } - else - { - /* nothing to play */ - return BUFSTATS_DO_EXPAND; - } - } - - /* If previous was CNG period or BGNonly then no merge is needed */ - if ((prevPlayMode == MODE_RFC3389CNG) || (prevPlayMode == MODE_CODEC_INTERNAL_CNG) - || lastModeBGNonly) - { - /* - * 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. - */ - int32_t diffTS = (inst->uw32_CNGplayedTS + targetTS) - availableTS; - int val = ((inst->Automode_inst.optBufLevel + - extraDelayPacketsQ8) * - inst->Automode_inst.packetSpeechLenSamp) >> 6; - if (diffTS >= 0 || val < currSizeSamples) - { - /* it is time to play this new packet */ - return BUFSTATS_DO_NORMAL; - } - else - { - /* it is too early to play this new packet => keep on playing CNG */ - if (prevPlayMode == MODE_RFC3389CNG) - { - return BUFSTATS_DO_RFC3389CNG_NOPACKET; - } - else if (prevPlayMode == MODE_CODEC_INTERNAL_CNG) - { - return BUFSTATS_DO_INTERNAL_CNG_NOPACKET; - } - else if (playDtmf == 1) - { - /* we have not audio data, but can play DTMF */ - return BUFSTATS_DO_DTMF_ONLY; - } - else /* lastModeBGNonly */ - { - /* signal expand, but this will result in BGN again */ - return BUFSTATS_DO_EXPAND; - } - } - } - - /* Do not merge unless we have done a Expand before (for complexity reasons) */ - if ((inst->w16_noExpand == 0) || ((frameSize < timestampsPerCall) && (cur_size - > NETEQ_BUFSTAT_20MS_Q7))) - { - return BUFSTATS_DO_MERGE; - } - else if (playDtmf == 1) - { - /* play DTMF instead of expand */ - return BUFSTATS_DO_DTMF_ONLY; - } - else - { - return BUFSTATS_DO_EXPAND; - } - } - } - else - { /* kPlayoutOff or kPlayoutFax */ - if (cngPacket) - { - if (((int32_t) ((inst->uw32_CNGplayedTS + targetTS) - availableTS)) >= 0) - { - /* time to play this packet now */ - return BUFSTATS_DO_RFC3389CNG_PACKET; - } - else - { - /* wait before playing this packet */ - return BUFSTATS_DO_RFC3389CNG_NOPACKET; - } - } - if (noPacket) - { - /* - * No packet => - * 1. If in CNG mode play as usual - * 2. Otherwise use other method to generate data and hold TS value - */ - if (inst->w16_cngOn == CNG_RFC3389_ON) - { - /* keep on playing CNG */ - return BUFSTATS_DO_RFC3389CNG_NOPACKET; - } - else if (inst->w16_cngOn == CNG_INTERNAL_ON) - { - /* keep on playing internal CNG */ - return BUFSTATS_DO_INTERNAL_CNG_NOPACKET; - } - else - { - /* nothing to play => invent some data to play out */ - if (playoutMode == kPlayoutOff) - { - return BUFSTATS_DO_ALTERNATIVE_PLC; - } - else if (playoutMode == kPlayoutFax) - { - return BUFSTATS_DO_AUDIO_REPETITION; - } - else - { - /* UNDEFINED, should not get here... */ - assert(0); - return BUFSTAT_REINIT; - } - } - } - else if (targetTS == availableTS) - { - return BUFSTATS_DO_NORMAL; - } - else - { - if (((int32_t) ((inst->uw32_CNGplayedTS + targetTS) - availableTS)) >= 0) - { - return BUFSTATS_DO_NORMAL; - } - else if (playoutMode == kPlayoutOff) - { - /* - * If currently playing CNG, continue with that. Don't increase TS - * since uw32_CNGplayedTS will be increased. - */ - if (inst->w16_cngOn == CNG_RFC3389_ON) - { - return BUFSTATS_DO_RFC3389CNG_NOPACKET; - } - else if (inst->w16_cngOn == CNG_INTERNAL_ON) - { - return BUFSTATS_DO_INTERNAL_CNG_NOPACKET; - } - else - { - /* - * Otherwise, do PLC and increase TS while waiting for the time to - * play this packet. - */ - return BUFSTATS_DO_ALTERNATIVE_PLC_INC_TS; - } - } - else if (playoutMode == kPlayoutFax) - { - /* - * If currently playing CNG, continue with that don't increase TS since - * uw32_CNGplayedTS will be increased. - */ - if (inst->w16_cngOn == CNG_RFC3389_ON) - { - return BUFSTATS_DO_RFC3389CNG_NOPACKET; - } - else if (inst->w16_cngOn == CNG_INTERNAL_ON) - { - return BUFSTATS_DO_INTERNAL_CNG_NOPACKET; - } - else - { - /* - * Otherwise, do audio repetition and increase TS while waiting for the - * time to play this packet. - */ - return BUFSTATS_DO_AUDIO_REPETITION_INC_TS; - } - } - else - { - /* UNDEFINED, should not get here... */ - assert(0); - return BUFSTAT_REINIT; - } - } - } - /* We should not get here (but sometimes we do anyway...) */ - return BUFSTAT_REINIT; -} - |