API to control target delay in NetEq jitter buffer. NetEq maintains the given delay unless channel conditions require a higher delay.
TEST=unit-test, manual, trybots.
R=henrik.lundin@webrtc.org, henrika@webrtc.org, mflodman@webrtc.org, mikhal@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/1384005
git-svn-id: http://webrtc.googlecode.com/svn/trunk@4087 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_coding/neteq/webrtc_neteq.c b/webrtc/modules/audio_coding/neteq/webrtc_neteq.c
index 31940c8..8347925 100644
--- a/webrtc/modules/audio_coding/neteq/webrtc_neteq.c
+++ b/webrtc/modules/audio_coding/neteq/webrtc_neteq.c
@@ -437,6 +437,7 @@
NetEqMainInst->MCUinst.first_packet = 1;
NetEqMainInst->MCUinst.one_desc = 0;
NetEqMainInst->MCUinst.BufferStat_inst.Automode_inst.extraDelayMs = 0;
+ NetEqMainInst->MCUinst.BufferStat_inst.Automode_inst.minimum_delay_ms = 0;
NetEqMainInst->MCUinst.NoOfExpandCalls = 0;
NetEqMainInst->MCUinst.fs = fs;
@@ -529,6 +530,19 @@
return (0);
}
+int WebRtcNetEQ_SetMinimumDelay(void *inst, int minimum_delay_ms) {
+ MainInst_t *NetEqMainInst = (MainInst_t*) inst;
+ if (NetEqMainInst == NULL)
+ return -1;
+ if (minimum_delay_ms < 0 || minimum_delay_ms > 10000) {
+ NetEqMainInst->ErrorCode = -FAULTY_DELAYVALUE;
+ return -1;
+ }
+ NetEqMainInst->MCUinst.BufferStat_inst.Automode_inst.minimum_delay_ms =
+ minimum_delay_ms;
+ return 0;
+}
+
int WebRtcNetEQ_SetPlayoutMode(void *inst, enum WebRtcNetEQPlayoutMode playoutMode)
{
MainInst_t *NetEqMainInst = (MainInst_t*) inst;
@@ -1213,7 +1227,7 @@
/* Get optimal buffer size */
/***************************/
- if (NetEqMainInst->MCUinst.fs != 0 && NetEqMainInst->MCUinst.fs <= WEBRTC_SPL_WORD16_MAX)
+ if (NetEqMainInst->MCUinst.fs != 0)
{
/* preferredBufferSize = Bopt * packSizeSamples / (fs/1000) */
stats->preferredBufferSize
@@ -1693,3 +1707,25 @@
}
return SYNC_PAYLOAD_LEN_BYTES;
}
+
+int WebRtcNetEQ_GetRequiredDelayMs(const void* inst) {
+ const MainInst_t* NetEqMainInst = (MainInst_t*)inst;
+ const AutomodeInst_t* auto_mode = (NetEqMainInst == NULL) ? NULL :
+ &NetEqMainInst->MCUinst.BufferStat_inst.Automode_inst;
+
+ /* Instance sanity */
+ if (NetEqMainInst == NULL || auto_mode == NULL)
+ return 0;
+
+ if (NetEqMainInst->MCUinst.fs == 0)
+ return 0; // Sampling rate not initialized.
+
+ /* |required_delay_q8| has the unit of packets in Q8 domain, therefore,
+ * the corresponding delay is
+ * required_delay_ms = (1000 * required_delay_q8 * samples_per_packet /
+ * sample_rate_hz) / 256;
+ */
+ return (auto_mode->required_delay_q8 *
+ ((auto_mode->packetSpeechLenSamp * 1000) / NetEqMainInst->MCUinst.fs) +
+ 128) >> 8;
+}