1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 /*
12 * isac.c
13 *
14 * This C file contains the functions for the ISAC API
15 *
16 */
17
18 #include "webrtc/modules/audio_coding/codecs/isac/main/include/isac.h"
19
20 #include <assert.h>
21 #include <math.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25
26 #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
27 #include "webrtc/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.h"
28 #include "webrtc/modules/audio_coding/codecs/isac/main/source/codec.h"
29 #include "webrtc/modules/audio_coding/codecs/isac/main/source/crc.h"
30 #include "webrtc/modules/audio_coding/codecs/isac/main/source/entropy_coding.h"
31 #include "webrtc/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.h"
32 #include "webrtc/modules/audio_coding/codecs/isac/main/source/os_specific_inline.h"
33 #include "webrtc/modules/audio_coding/codecs/isac/main/source/structs.h"
34
35 #define BIT_MASK_DEC_INIT 0x0001
36 #define BIT_MASK_ENC_INIT 0x0002
37
38 #define LEN_CHECK_SUM_WORD8 4
39 #define MAX_NUM_LAYERS 10
40
41
42 /****************************************************************************
43 * UpdatePayloadSizeLimit(...)
44 *
45 * Call this function to update the limit on the payload size. The limit on
46 * payload size might change i) if a user ''directly changes the limit by
47 * calling xxx_setMaxPayloadSize() or xxx_setMaxRate(), or ii) indirectly
48 * when bandwidth is changing. The latter might be the result of bandwidth
49 * adaptation, or direct change of the bottleneck in instantaneous mode.
50 *
51 * This function takes the current overall limit on payload, and translates it
52 * to the limits on lower and upper-band. If the codec is in wideband mode,
53 * then the overall limit and the limit on the lower-band is the same.
54 * Otherwise, a fraction of the limit should be allocated to lower-band
55 * leaving some room for the upper-band bit-stream. That is why an update
56 * of limit is required every time that the bandwidth is changing.
57 *
58 */
UpdatePayloadSizeLimit(ISACMainStruct * instISAC)59 static void UpdatePayloadSizeLimit(ISACMainStruct* instISAC) {
60 int16_t lim30MsPayloadBytes = WEBRTC_SPL_MIN(
61 (instISAC->maxPayloadSizeBytes),
62 (instISAC->maxRateBytesPer30Ms));
63 int16_t lim60MsPayloadBytes = WEBRTC_SPL_MIN(
64 (instISAC->maxPayloadSizeBytes),
65 (instISAC->maxRateBytesPer30Ms << 1));
66
67 /* The only time that iSAC will have 60 ms
68 * frame-size is when operating in wideband, so
69 * there is no upper-band bit-stream. */
70
71 if (instISAC->bandwidthKHz == isac8kHz) {
72 /* At 8 kHz there is no upper-band bit-stream,
73 * therefore, the lower-band limit is the overall limit. */
74 instISAC->instLB.ISACencLB_obj.payloadLimitBytes60 =
75 lim60MsPayloadBytes;
76 instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 =
77 lim30MsPayloadBytes;
78 } else {
79 /* When in super-wideband, we only have 30 ms frames.
80 * Do a rate allocation for the given limit. */
81 if (lim30MsPayloadBytes > 250) {
82 /* 4/5 to lower-band the rest for upper-band. */
83 instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 =
84 (lim30MsPayloadBytes << 2) / 5;
85 } else if (lim30MsPayloadBytes > 200) {
86 /* For the interval of 200 to 250 the share of
87 * upper-band linearly grows from 20 to 50. */
88 instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 =
89 (lim30MsPayloadBytes << 1) / 5 + 100;
90 } else {
91 /* Allocate only 20 for upper-band. */
92 instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 =
93 lim30MsPayloadBytes - 20;
94 }
95 instISAC->instUB.ISACencUB_obj.maxPayloadSizeBytes =
96 lim30MsPayloadBytes;
97 }
98 }
99
100
101 /****************************************************************************
102 * UpdateBottleneck(...)
103 *
104 * This function updates the bottleneck only if the codec is operating in
105 * channel-adaptive mode. Furthermore, as the update of bottleneck might
106 * result in an update of bandwidth, therefore, the bottlenech should be
107 * updated just right before the first 10ms of a frame is pushed into encoder.
108 *
109 */
UpdateBottleneck(ISACMainStruct * instISAC)110 static void UpdateBottleneck(ISACMainStruct* instISAC) {
111 /* Read the bottleneck from bandwidth estimator for the
112 * first 10 ms audio. This way, if there is a change
113 * in bandwidth, upper and lower-band will be in sync. */
114 if ((instISAC->codingMode == 0) &&
115 (instISAC->instLB.ISACencLB_obj.buffer_index == 0) &&
116 (instISAC->instLB.ISACencLB_obj.frame_nb == 0)) {
117 int32_t bottleneck =
118 WebRtcIsac_GetUplinkBandwidth(&instISAC->bwestimator_obj);
119
120 /* Adding hysteresis when increasing signal bandwidth. */
121 if ((instISAC->bandwidthKHz == isac8kHz)
122 && (bottleneck > 37000)
123 && (bottleneck < 41000)) {
124 bottleneck = 37000;
125 }
126
127 /* Switching from 12 kHz to 16 kHz is not allowed at this revision.
128 * If we let this happen, we have to take care of buffer_index and
129 * the last LPC vector. */
130 if ((instISAC->bandwidthKHz != isac16kHz) &&
131 (bottleneck > 46000)) {
132 bottleneck = 46000;
133 }
134
135 /* We might need a rate allocation. */
136 if (instISAC->encoderSamplingRateKHz == kIsacWideband) {
137 /* Wideband is the only choice we have here. */
138 instISAC->instLB.ISACencLB_obj.bottleneck =
139 (bottleneck > 32000) ? 32000 : bottleneck;
140 instISAC->bandwidthKHz = isac8kHz;
141 } else {
142 /* Do the rate-allocation and get the new bandwidth. */
143 enum ISACBandwidth bandwidth;
144 WebRtcIsac_RateAllocation(bottleneck,
145 &(instISAC->instLB.ISACencLB_obj.bottleneck),
146 &(instISAC->instUB.ISACencUB_obj.bottleneck),
147 &bandwidth);
148 if (bandwidth != isac8kHz) {
149 instISAC->instLB.ISACencLB_obj.new_framelength = 480;
150 }
151 if (bandwidth != instISAC->bandwidthKHz) {
152 /* Bandwidth is changing. */
153 instISAC->bandwidthKHz = bandwidth;
154 UpdatePayloadSizeLimit(instISAC);
155 if (bandwidth == isac12kHz) {
156 instISAC->instLB.ISACencLB_obj.buffer_index = 0;
157 }
158 /* Currently we don't let the bandwidth to switch to 16 kHz
159 * if in adaptive mode. If we let this happen, we have to take
160 * care of buffer_index and the last LPC vector. */
161 }
162 }
163 }
164 }
165
166
167 /****************************************************************************
168 * GetSendBandwidthInfo(...)
169 *
170 * This is called to get the bandwidth info. This info is the bandwidth and
171 * the jitter of 'there-to-here' channel, estimated 'here.' These info
172 * is signaled in an in-band fashion to the other side.
173 *
174 * The call to the bandwidth estimator triggers a recursive averaging which
175 * has to be synchronized between encoder & decoder, therefore, the call to
176 * BWE should be once per packet. As the BWE info is inserted into bit-stream
177 * We need a valid info right before the encodeLB function is going to
178 * generate a bit-stream. That is when lower-band buffer has already 20ms
179 * of audio, and the 3rd block of 10ms is going to be injected into encoder.
180 *
181 * Inputs:
182 * - instISAC : iSAC instance.
183 *
184 * Outputs:
185 * - bandwidthIndex : an index which has to be encoded in
186 * lower-band bit-stream, indicating the
187 * bandwidth of there-to-here channel.
188 * - jitterInfo : this indicates if the jitter is high
189 * or low and it is encoded in upper-band
190 * bit-stream.
191 *
192 */
GetSendBandwidthInfo(ISACMainStruct * instISAC,int16_t * bandwidthIndex,int16_t * jitterInfo)193 static void GetSendBandwidthInfo(ISACMainStruct* instISAC,
194 int16_t* bandwidthIndex,
195 int16_t* jitterInfo) {
196 if ((instISAC->instLB.ISACencLB_obj.buffer_index ==
197 (FRAMESAMPLES_10ms << 1)) &&
198 (instISAC->instLB.ISACencLB_obj.frame_nb == 0)) {
199 /* Bandwidth estimation and coding. */
200 WebRtcIsac_GetDownlinkBwJitIndexImpl(&(instISAC->bwestimator_obj),
201 bandwidthIndex, jitterInfo,
202 instISAC->decoderSamplingRateKHz);
203 }
204 }
205
206
207 /****************************************************************************
208 * WebRtcIsac_AssignSize(...)
209 *
210 * This function returns the size of the ISAC instance, so that the instance
211 * can be created out side iSAC.
212 *
213 * Output:
214 * - sizeinbytes : number of bytes needed to allocate for the
215 * instance.
216 *
217 * Return value : 0 - Ok
218 * -1 - Error
219 */
WebRtcIsac_AssignSize(int * sizeInBytes)220 int16_t WebRtcIsac_AssignSize(int* sizeInBytes) {
221 *sizeInBytes = sizeof(ISACMainStruct) * 2 / sizeof(int16_t);
222 return 0;
223 }
224
225
226 /****************************************************************************
227 * WebRtcIsac_Assign(...)
228 *
229 * This function assigns the memory already created to the ISAC instance.
230 *
231 * Input:
232 * - ISAC_main_inst : address of the pointer to the coder instance.
233 * - instISAC_Addr : the already allocated memory, where we put the
234 * iSAC structure.
235 *
236 * Return value : 0 - Ok
237 * -1 - Error
238 */
WebRtcIsac_Assign(ISACStruct ** ISAC_main_inst,void * instISAC_Addr)239 int16_t WebRtcIsac_Assign(ISACStruct** ISAC_main_inst,
240 void* instISAC_Addr) {
241 if (instISAC_Addr != NULL) {
242 ISACMainStruct* instISAC = (ISACMainStruct*)instISAC_Addr;
243 instISAC->errorCode = 0;
244 instISAC->initFlag = 0;
245
246 /* Assign the address. */
247 *ISAC_main_inst = (ISACStruct*)instISAC_Addr;
248
249 /* Default is wideband. */
250 instISAC->encoderSamplingRateKHz = kIsacWideband;
251 instISAC->decoderSamplingRateKHz = kIsacWideband;
252 instISAC->bandwidthKHz = isac8kHz;
253 instISAC->in_sample_rate_hz = 16000;
254
255 WebRtcIsac_InitTransform(&instISAC->transform_tables);
256 return 0;
257 } else {
258 return -1;
259 }
260 }
261
262
263 /****************************************************************************
264 * WebRtcIsac_Create(...)
265 *
266 * This function creates an ISAC instance, which will contain the state
267 * information for one coding/decoding channel.
268 *
269 * Input:
270 * - ISAC_main_inst : address of the pointer to the coder instance.
271 *
272 * Return value : 0 - Ok
273 * -1 - Error
274 */
WebRtcIsac_Create(ISACStruct ** ISAC_main_inst)275 int16_t WebRtcIsac_Create(ISACStruct** ISAC_main_inst) {
276 ISACMainStruct* instISAC;
277
278 if (ISAC_main_inst != NULL) {
279 instISAC = (ISACMainStruct*)malloc(sizeof(ISACMainStruct));
280 *ISAC_main_inst = (ISACStruct*)instISAC;
281 if (*ISAC_main_inst != NULL) {
282 instISAC->errorCode = 0;
283 instISAC->initFlag = 0;
284 /* Default is wideband. */
285 instISAC->bandwidthKHz = isac8kHz;
286 instISAC->encoderSamplingRateKHz = kIsacWideband;
287 instISAC->decoderSamplingRateKHz = kIsacWideband;
288 instISAC->in_sample_rate_hz = 16000;
289
290 WebRtcIsac_InitTransform(&instISAC->transform_tables);
291 return 0;
292 } else {
293 return -1;
294 }
295 } else {
296 return -1;
297 }
298 }
299
300
301 /****************************************************************************
302 * WebRtcIsac_Free(...)
303 *
304 * This function frees the ISAC instance created at the beginning.
305 *
306 * Input:
307 * - ISAC_main_inst : a ISAC instance.
308 *
309 * Return value : 0 - Ok
310 * -1 - Error
311 */
WebRtcIsac_Free(ISACStruct * ISAC_main_inst)312 int16_t WebRtcIsac_Free(ISACStruct* ISAC_main_inst) {
313 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
314 free(instISAC);
315 return 0;
316 }
317
318
319 /****************************************************************************
320 * EncoderInitLb(...) - internal function for initialization of
321 * Lower Band
322 * EncoderInitUb(...) - internal function for initialization of
323 * Upper Band
324 * WebRtcIsac_EncoderInit(...) - API function
325 *
326 * This function initializes a ISAC instance prior to the encoder calls.
327 *
328 * Input:
329 * - ISAC_main_inst : ISAC instance.
330 * - CodingMode : 0 -> Bit rate and frame length are automatically
331 * adjusted to available bandwidth on
332 * transmission channel, applicable just to
333 * wideband mode.
334 * 1 -> User sets a frame length and a target bit
335 * rate which is taken as the maximum
336 * short-term average bit rate.
337 *
338 * Return value : 0 - Ok
339 * -1 - Error
340 */
EncoderInitLb(ISACLBStruct * instLB,int16_t codingMode,enum IsacSamplingRate sampRate)341 static int16_t EncoderInitLb(ISACLBStruct* instLB,
342 int16_t codingMode,
343 enum IsacSamplingRate sampRate) {
344 int16_t statusInit = 0;
345 int k;
346
347 /* Init stream vector to zero */
348 for (k = 0; k < STREAM_SIZE_MAX_60; k++) {
349 instLB->ISACencLB_obj.bitstr_obj.stream[k] = 0;
350 }
351
352 if ((codingMode == 1) || (sampRate == kIsacSuperWideband)) {
353 /* 30 ms frame-size if either in super-wideband or
354 * instantaneous mode (I-mode). */
355 instLB->ISACencLB_obj.new_framelength = 480;
356 } else {
357 instLB->ISACencLB_obj.new_framelength = INITIAL_FRAMESAMPLES;
358 }
359
360 WebRtcIsac_InitMasking(&instLB->ISACencLB_obj.maskfiltstr_obj);
361 WebRtcIsac_InitPreFilterbank(&instLB->ISACencLB_obj.prefiltbankstr_obj);
362 WebRtcIsac_InitPitchFilter(&instLB->ISACencLB_obj.pitchfiltstr_obj);
363 WebRtcIsac_InitPitchAnalysis(
364 &instLB->ISACencLB_obj.pitchanalysisstr_obj);
365
366 instLB->ISACencLB_obj.buffer_index = 0;
367 instLB->ISACencLB_obj.frame_nb = 0;
368 /* Default for I-mode. */
369 instLB->ISACencLB_obj.bottleneck = 32000;
370 instLB->ISACencLB_obj.current_framesamples = 0;
371 instLB->ISACencLB_obj.s2nr = 0;
372 instLB->ISACencLB_obj.payloadLimitBytes30 = STREAM_SIZE_MAX_30;
373 instLB->ISACencLB_obj.payloadLimitBytes60 = STREAM_SIZE_MAX_60;
374 instLB->ISACencLB_obj.maxPayloadBytes = STREAM_SIZE_MAX_60;
375 instLB->ISACencLB_obj.maxRateInBytes = STREAM_SIZE_MAX_30;
376 instLB->ISACencLB_obj.enforceFrameSize = 0;
377 /* Invalid value prevents getRedPayload to
378 run before encoder is called. */
379 instLB->ISACencLB_obj.lastBWIdx = -1;
380 return statusInit;
381 }
382
EncoderInitUb(ISACUBStruct * instUB,int16_t bandwidth)383 static int16_t EncoderInitUb(ISACUBStruct* instUB,
384 int16_t bandwidth) {
385 int16_t statusInit = 0;
386 int k;
387
388 /* Init stream vector to zero. */
389 for (k = 0; k < STREAM_SIZE_MAX_60; k++) {
390 instUB->ISACencUB_obj.bitstr_obj.stream[k] = 0;
391 }
392
393 WebRtcIsac_InitMasking(&instUB->ISACencUB_obj.maskfiltstr_obj);
394 WebRtcIsac_InitPreFilterbank(&instUB->ISACencUB_obj.prefiltbankstr_obj);
395
396 if (bandwidth == isac16kHz) {
397 instUB->ISACencUB_obj.buffer_index = LB_TOTAL_DELAY_SAMPLES;
398 } else {
399 instUB->ISACencUB_obj.buffer_index = 0;
400 }
401 /* Default for I-mode. */
402 instUB->ISACencUB_obj.bottleneck = 32000;
403 /* These store the limits for the wideband + super-wideband bit-stream. */
404 instUB->ISACencUB_obj.maxPayloadSizeBytes = STREAM_SIZE_MAX_30 << 1;
405 /* This has to be updated after each lower-band encoding to guarantee
406 * a correct payload-limitation. */
407 instUB->ISACencUB_obj.numBytesUsed = 0;
408 memset(instUB->ISACencUB_obj.data_buffer_float, 0,
409 (MAX_FRAMESAMPLES + LB_TOTAL_DELAY_SAMPLES) * sizeof(float));
410
411 memcpy(&(instUB->ISACencUB_obj.lastLPCVec),
412 WebRtcIsac_kMeanLarUb16, sizeof(double) * UB_LPC_ORDER);
413
414 return statusInit;
415 }
416
417
WebRtcIsac_EncoderInit(ISACStruct * ISAC_main_inst,int16_t codingMode)418 int16_t WebRtcIsac_EncoderInit(ISACStruct* ISAC_main_inst,
419 int16_t codingMode) {
420 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
421 int16_t status;
422
423 if ((codingMode != 0) && (codingMode != 1)) {
424 instISAC->errorCode = ISAC_DISALLOWED_CODING_MODE;
425 return -1;
426 }
427 /* Default bottleneck. */
428 instISAC->bottleneck = MAX_ISAC_BW;
429
430 if (instISAC->encoderSamplingRateKHz == kIsacWideband) {
431 instISAC->bandwidthKHz = isac8kHz;
432 instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX_60;
433 instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX_30;
434 } else {
435 instISAC->bandwidthKHz = isac16kHz;
436 instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX;
437 instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX;
438 }
439
440 /* Channel-adaptive = 0; Instantaneous (Channel-independent) = 1. */
441 instISAC->codingMode = codingMode;
442
443 WebRtcIsac_InitBandwidthEstimator(&instISAC->bwestimator_obj,
444 instISAC->encoderSamplingRateKHz,
445 instISAC->decoderSamplingRateKHz);
446
447 WebRtcIsac_InitRateModel(&instISAC->rate_data_obj);
448 /* Default for I-mode. */
449 instISAC->MaxDelay = 10.0;
450
451 status = EncoderInitLb(&instISAC->instLB, codingMode,
452 instISAC->encoderSamplingRateKHz);
453 if (status < 0) {
454 instISAC->errorCode = -status;
455 return -1;
456 }
457
458 if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) {
459 /* Initialize encoder filter-bank. */
460 memset(instISAC->analysisFBState1, 0,
461 FB_STATE_SIZE_WORD32 * sizeof(int32_t));
462 memset(instISAC->analysisFBState2, 0,
463 FB_STATE_SIZE_WORD32 * sizeof(int32_t));
464
465 status = EncoderInitUb(&(instISAC->instUB),
466 instISAC->bandwidthKHz);
467 if (status < 0) {
468 instISAC->errorCode = -status;
469 return -1;
470 }
471 }
472 /* Initialization is successful, set the flag. */
473 instISAC->initFlag |= BIT_MASK_ENC_INIT;
474 return 0;
475 }
476
477
478 /****************************************************************************
479 * WebRtcIsac_Encode(...)
480 *
481 * This function encodes 10ms frame(s) and inserts it into a package.
482 * Input speech length has to be 160 samples (10ms). The encoder buffers those
483 * 10ms frames until it reaches the chosen Framesize (480 or 960 samples
484 * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
485 *
486 * Input:
487 * - ISAC_main_inst : ISAC instance.
488 * - speechIn : input speech vector.
489 *
490 * Output:
491 * - encoded : the encoded data vector
492 *
493 * Return value:
494 * : >0 - Length (in bytes) of coded data
495 * : 0 - The buffer didn't reach the chosen
496 * frameSize so it keeps buffering speech
497 * samples.
498 * : -1 - Error
499 */
WebRtcIsac_Encode(ISACStruct * ISAC_main_inst,const int16_t * speechIn,uint8_t * encoded)500 int WebRtcIsac_Encode(ISACStruct* ISAC_main_inst,
501 const int16_t* speechIn,
502 uint8_t* encoded) {
503 float inFrame[FRAMESAMPLES_10ms];
504 int16_t speechInLB[FRAMESAMPLES_10ms];
505 int16_t speechInUB[FRAMESAMPLES_10ms];
506 int streamLenLB = 0;
507 int streamLenUB = 0;
508 int streamLen = 0;
509 size_t k = 0;
510 uint8_t garbageLen = 0;
511 int32_t bottleneck = 0;
512 int16_t bottleneckIdx = 0;
513 int16_t jitterInfo = 0;
514
515 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
516 ISACLBStruct* instLB = &(instISAC->instLB);
517 ISACUBStruct* instUB = &(instISAC->instUB);
518
519 /* Check if encoder initiated. */
520 if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
521 BIT_MASK_ENC_INIT) {
522 instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
523 return -1;
524 }
525
526 if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) {
527 WebRtcSpl_AnalysisQMF(speechIn, SWBFRAMESAMPLES_10ms, speechInLB,
528 speechInUB, instISAC->analysisFBState1,
529 instISAC->analysisFBState2);
530
531 /* Convert from fixed to floating point. */
532 for (k = 0; k < FRAMESAMPLES_10ms; k++) {
533 inFrame[k] = (float)speechInLB[k];
534 }
535 } else {
536 for (k = 0; k < FRAMESAMPLES_10ms; k++) {
537 inFrame[k] = (float) speechIn[k];
538 }
539 }
540
541 /* Add some noise to avoid denormal numbers. */
542 inFrame[0] += (float)1.23455334e-3;
543 inFrame[1] -= (float)2.04324239e-3;
544 inFrame[2] += (float)1.90854954e-3;
545 inFrame[9] += (float)1.84854878e-3;
546
547 /* This function will update the bottleneck if required. */
548 UpdateBottleneck(instISAC);
549
550 /* Get the bandwith information which has to be sent to the other side. */
551 GetSendBandwidthInfo(instISAC, &bottleneckIdx, &jitterInfo);
552
553 /* Encode lower-band. */
554 streamLenLB = WebRtcIsac_EncodeLb(&instISAC->transform_tables,
555 inFrame, &instLB->ISACencLB_obj,
556 instISAC->codingMode, bottleneckIdx);
557 if (streamLenLB < 0) {
558 return -1;
559 }
560
561 if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) {
562 instUB = &(instISAC->instUB);
563
564 /* Convert to float. */
565 for (k = 0; k < FRAMESAMPLES_10ms; k++) {
566 inFrame[k] = (float) speechInUB[k];
567 }
568
569 /* Add some noise to avoid denormal numbers. */
570 inFrame[0] += (float)1.23455334e-3;
571 inFrame[1] -= (float)2.04324239e-3;
572 inFrame[2] += (float)1.90854954e-3;
573 inFrame[9] += (float)1.84854878e-3;
574
575 /* Tell to upper-band the number of bytes used so far.
576 * This is for payload limitation. */
577 instUB->ISACencUB_obj.numBytesUsed =
578 (int16_t)(streamLenLB + 1 + LEN_CHECK_SUM_WORD8);
579 /* Encode upper-band. */
580 switch (instISAC->bandwidthKHz) {
581 case isac12kHz: {
582 streamLenUB = WebRtcIsac_EncodeUb12(&instISAC->transform_tables,
583 inFrame, &instUB->ISACencUB_obj,
584 jitterInfo);
585 break;
586 }
587 case isac16kHz: {
588 streamLenUB = WebRtcIsac_EncodeUb16(&instISAC->transform_tables,
589 inFrame, &instUB->ISACencUB_obj,
590 jitterInfo);
591 break;
592 }
593 case isac8kHz: {
594 streamLenUB = 0;
595 break;
596 }
597 }
598
599 if ((streamLenUB < 0) && (streamLenUB != -ISAC_PAYLOAD_LARGER_THAN_LIMIT)) {
600 /* An error has happened but this is not the error due to a
601 * bit-stream larger than the limit. */
602 return -1;
603 }
604
605 if (streamLenLB == 0) {
606 return 0;
607 }
608
609 /* One byte is allocated for the length. According to older decoders
610 so the length bit-stream plus one byte for size and
611 LEN_CHECK_SUM_WORD8 for the checksum should be less than or equal
612 to 255. */
613 if ((streamLenUB > (255 - (LEN_CHECK_SUM_WORD8 + 1))) ||
614 (streamLenUB == -ISAC_PAYLOAD_LARGER_THAN_LIMIT)) {
615 /* We have got a too long bit-stream we skip the upper-band
616 * bit-stream for this frame. */
617 streamLenUB = 0;
618 }
619
620 memcpy(encoded, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB);
621 streamLen = streamLenLB;
622 if (streamLenUB > 0) {
623 encoded[streamLenLB] = (uint8_t)(streamLenUB + 1 + LEN_CHECK_SUM_WORD8);
624 memcpy(&encoded[streamLenLB + 1],
625 instUB->ISACencUB_obj.bitstr_obj.stream,
626 streamLenUB);
627 streamLen += encoded[streamLenLB];
628 } else {
629 encoded[streamLenLB] = 0;
630 }
631 } else {
632 if (streamLenLB == 0) {
633 return 0;
634 }
635 memcpy(encoded, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB);
636 streamLenUB = 0;
637 streamLen = streamLenLB;
638 }
639
640 /* Add Garbage if required. */
641 bottleneck = WebRtcIsac_GetUplinkBandwidth(&instISAC->bwestimator_obj);
642 if (instISAC->codingMode == 0) {
643 int minBytes;
644 int limit;
645 uint8_t* ptrGarbage;
646
647 instISAC->MaxDelay = (double)WebRtcIsac_GetUplinkMaxDelay(
648 &instISAC->bwestimator_obj);
649
650 /* Update rate model and get minimum number of bytes in this packet. */
651 minBytes = WebRtcIsac_GetMinBytes(
652 &(instISAC->rate_data_obj), streamLen,
653 instISAC->instLB.ISACencLB_obj.current_framesamples, bottleneck,
654 instISAC->MaxDelay, instISAC->bandwidthKHz);
655
656 /* Make sure MinBytes does not exceed packet size limit. */
657 if (instISAC->bandwidthKHz == isac8kHz) {
658 if (instLB->ISACencLB_obj.current_framesamples == FRAMESAMPLES) {
659 limit = instLB->ISACencLB_obj.payloadLimitBytes30;
660 } else {
661 limit = instLB->ISACencLB_obj.payloadLimitBytes60;
662 }
663 } else {
664 limit = instUB->ISACencUB_obj.maxPayloadSizeBytes;
665 }
666 minBytes = (minBytes > limit) ? limit : minBytes;
667
668 /* Make sure we don't allow more than 255 bytes of garbage data.
669 * We store the length of the garbage data in 8 bits in the bitstream,
670 * 255 is the max garbage length we can signal using 8 bits. */
671 if ((instISAC->bandwidthKHz == isac8kHz) ||
672 (streamLenUB == 0)) {
673 ptrGarbage = &encoded[streamLenLB];
674 limit = streamLen + 255;
675 } else {
676 ptrGarbage = &encoded[streamLenLB + 1 + streamLenUB];
677 limit = streamLen + (255 - encoded[streamLenLB]);
678 }
679 minBytes = (minBytes > limit) ? limit : minBytes;
680
681 garbageLen = (minBytes > streamLen) ? (uint8_t)(minBytes - streamLen) : 0;
682
683 /* Save data for creation of multiple bit-streams. */
684 /* If bit-stream too short then add garbage at the end. */
685 if (garbageLen > 0) {
686 /* Overwrite the garbage area to avoid leaking possibly sensitive data
687 over the network. This also makes the output deterministic. */
688 memset(ptrGarbage, 0, garbageLen);
689
690 /* For a correct length of the upper-band bit-stream together
691 * with the garbage. Garbage is embeded in upper-band bit-stream.
692 * That is the only way to preserve backward compatibility. */
693 if ((instISAC->bandwidthKHz == isac8kHz) ||
694 (streamLenUB == 0)) {
695 encoded[streamLenLB] = garbageLen;
696 } else {
697 encoded[streamLenLB] += garbageLen;
698 /* Write the length of the garbage at the end of the upper-band
699 * bit-stream, if exists. This helps for sanity check. */
700 encoded[streamLenLB + 1 + streamLenUB] = garbageLen;
701
702 }
703 streamLen += garbageLen;
704 }
705 } else {
706 /* update rate model */
707 WebRtcIsac_UpdateRateModel(
708 &instISAC->rate_data_obj, streamLen,
709 instISAC->instLB.ISACencLB_obj.current_framesamples, bottleneck);
710 garbageLen = 0;
711 }
712
713 /* Generate CRC if required. */
714 if ((instISAC->bandwidthKHz != isac8kHz) && (streamLenUB > 0)) {
715 uint32_t crc;
716
717 WebRtcIsac_GetCrc((int16_t*)(&(encoded[streamLenLB + 1])),
718 streamLenUB + garbageLen, &crc);
719 #ifndef WEBRTC_ARCH_BIG_ENDIAN
720 for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) {
721 encoded[streamLen - LEN_CHECK_SUM_WORD8 + k] =
722 (uint8_t)(crc >> (24 - k * 8));
723 }
724 #else
725 memcpy(&encoded[streamLenLB + streamLenUB + 1], &crc, LEN_CHECK_SUM_WORD8);
726 #endif
727 }
728 return streamLen;
729 }
730
731
732 /******************************************************************************
733 * WebRtcIsac_GetNewBitStream(...)
734 *
735 * This function returns encoded data, with the recieved bwe-index in the
736 * stream. If the rate is set to a value less than bottleneck of codec
737 * the new bistream will be re-encoded with the given target rate.
738 * It should always return a complete packet, i.e. only called once
739 * even for 60 msec frames.
740 *
741 * NOTE 1! This function does not write in the ISACStruct, it is not allowed.
742 * NOTE 2! Rates larger than the bottleneck of the codec will be limited
743 * to the current bottleneck.
744 *
745 * Input:
746 * - ISAC_main_inst : ISAC instance.
747 * - bweIndex : Index of bandwidth estimate to put in new
748 * bitstream
749 * - rate : target rate of the transcoder is bits/sec.
750 * Valid values are the accepted rate in iSAC,
751 * i.e. 10000 to 56000.
752 *
753 * Output:
754 * - encoded : The encoded data vector
755 *
756 * Return value : >0 - Length (in bytes) of coded data
757 * -1 - Error or called in SWB mode
758 * NOTE! No error code is written to
759 * the struct since it is only allowed to read
760 * the struct.
761 */
WebRtcIsac_GetNewBitStream(ISACStruct * ISAC_main_inst,int16_t bweIndex,int16_t jitterInfo,int32_t rate,uint8_t * encoded,int16_t isRCU)762 int16_t WebRtcIsac_GetNewBitStream(ISACStruct* ISAC_main_inst,
763 int16_t bweIndex,
764 int16_t jitterInfo,
765 int32_t rate,
766 uint8_t* encoded,
767 int16_t isRCU) {
768 Bitstr iSACBitStreamInst; /* Local struct for bitstream handling */
769 int16_t streamLenLB;
770 int16_t streamLenUB;
771 int16_t totalStreamLen;
772 double gain2;
773 double gain1;
774 float scale;
775 enum ISACBandwidth bandwidthKHz;
776 double rateLB;
777 double rateUB;
778 int32_t currentBN;
779 uint32_t crc;
780 #ifndef WEBRTC_ARCH_BIG_ENDIAN
781 int16_t k;
782 #endif
783 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
784
785 if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
786 BIT_MASK_ENC_INIT) {
787 return -1;
788 }
789
790 /* Get the bottleneck of this iSAC and limit the
791 * given rate to the current bottleneck. */
792 WebRtcIsac_GetUplinkBw(ISAC_main_inst, ¤tBN);
793 if (rate > currentBN) {
794 rate = currentBN;
795 }
796
797 if (WebRtcIsac_RateAllocation(rate, &rateLB, &rateUB, &bandwidthKHz) < 0) {
798 return -1;
799 }
800
801 /* Cannot transcode from 16 kHz to 12 kHz. */
802 if ((bandwidthKHz == isac12kHz) &&
803 (instISAC->bandwidthKHz == isac16kHz)) {
804 return -1;
805 }
806
807 /* A gain [dB] for the given rate. */
808 gain1 = WebRtcIsac_GetSnr(
809 rateLB, instISAC->instLB.ISACencLB_obj.current_framesamples);
810 /* The gain [dB] of this iSAC. */
811 gain2 = WebRtcIsac_GetSnr(
812 instISAC->instLB.ISACencLB_obj.bottleneck,
813 instISAC->instLB.ISACencLB_obj.current_framesamples);
814
815 /* Scale is the ratio of two gains in normal domain. */
816 scale = (float)pow(10, (gain1 - gain2) / 20.0);
817 /* Change the scale if this is a RCU bit-stream. */
818 scale = (isRCU) ? (scale * RCU_TRANSCODING_SCALE) : scale;
819
820 streamLenLB = WebRtcIsac_EncodeStoredDataLb(
821 &instISAC->instLB.ISACencLB_obj.SaveEnc_obj,
822 &iSACBitStreamInst, bweIndex, scale);
823
824 if (streamLenLB < 0) {
825 return -1;
826 }
827
828 /* Convert from bytes to int16_t. */
829 memcpy(encoded, iSACBitStreamInst.stream, streamLenLB);
830
831 if (bandwidthKHz == isac8kHz) {
832 return streamLenLB;
833 }
834
835 totalStreamLen = streamLenLB;
836 /* super-wideband is always at 30ms.
837 * These gains are in dB.
838 * Gain for the given rate. */
839 gain1 = WebRtcIsac_GetSnr(rateUB, FRAMESAMPLES);
840 /* Gain of this iSAC */
841 gain2 = WebRtcIsac_GetSnr(instISAC->instUB.ISACencUB_obj.bottleneck,
842 FRAMESAMPLES);
843
844 /* Scale is the ratio of two gains in normal domain. */
845 scale = (float)pow(10, (gain1 - gain2) / 20.0);
846
847 /* Change the scale if this is a RCU bit-stream. */
848 scale = (isRCU)? (scale * RCU_TRANSCODING_SCALE_UB) : scale;
849
850 streamLenUB = WebRtcIsac_EncodeStoredDataUb(
851 &(instISAC->instUB.ISACencUB_obj.SaveEnc_obj),
852 &iSACBitStreamInst, jitterInfo, scale,
853 instISAC->bandwidthKHz);
854
855 if (streamLenUB < 0) {
856 return -1;
857 }
858
859 if (streamLenUB + 1 + LEN_CHECK_SUM_WORD8 > 255) {
860 return streamLenLB;
861 }
862
863 totalStreamLen = streamLenLB + streamLenUB + 1 + LEN_CHECK_SUM_WORD8;
864 encoded[streamLenLB] = streamLenUB + 1 + LEN_CHECK_SUM_WORD8;
865
866 memcpy(&encoded[streamLenLB + 1], iSACBitStreamInst.stream,
867 streamLenUB);
868
869 WebRtcIsac_GetCrc((int16_t*)(&(encoded[streamLenLB + 1])),
870 streamLenUB, &crc);
871 #ifndef WEBRTC_ARCH_BIG_ENDIAN
872 for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) {
873 encoded[totalStreamLen - LEN_CHECK_SUM_WORD8 + k] =
874 (uint8_t)((crc >> (24 - k * 8)) & 0xFF);
875 }
876 #else
877 memcpy(&encoded[streamLenLB + streamLenUB + 1], &crc,
878 LEN_CHECK_SUM_WORD8);
879 #endif
880 return totalStreamLen;
881 }
882
883
884 /****************************************************************************
885 * DecoderInitLb(...) - internal function for initialization of
886 * Lower Band
887 * DecoderInitUb(...) - internal function for initialization of
888 * Upper Band
889 * WebRtcIsac_DecoderInit(...) - API function
890 *
891 * This function initializes a ISAC instance prior to the decoder calls.
892 *
893 * Input:
894 * - ISAC_main_inst : ISAC instance.
895 */
DecoderInitLb(ISACLBStruct * instISAC)896 static void DecoderInitLb(ISACLBStruct* instISAC) {
897 int i;
898 /* Initialize stream vector to zero. */
899 for (i = 0; i < STREAM_SIZE_MAX_60; i++) {
900 instISAC->ISACdecLB_obj.bitstr_obj.stream[i] = 0;
901 }
902
903 WebRtcIsac_InitMasking(&instISAC->ISACdecLB_obj.maskfiltstr_obj);
904 WebRtcIsac_InitPostFilterbank(
905 &instISAC->ISACdecLB_obj.postfiltbankstr_obj);
906 WebRtcIsac_InitPitchFilter(&instISAC->ISACdecLB_obj.pitchfiltstr_obj);
907 }
908
DecoderInitUb(ISACUBStruct * instISAC)909 static void DecoderInitUb(ISACUBStruct* instISAC) {
910 int i;
911 /* Init stream vector to zero */
912 for (i = 0; i < STREAM_SIZE_MAX_60; i++) {
913 instISAC->ISACdecUB_obj.bitstr_obj.stream[i] = 0;
914 }
915
916 WebRtcIsac_InitMasking(&instISAC->ISACdecUB_obj.maskfiltstr_obj);
917 WebRtcIsac_InitPostFilterbank(
918 &instISAC->ISACdecUB_obj.postfiltbankstr_obj);
919 }
920
WebRtcIsac_DecoderInit(ISACStruct * ISAC_main_inst)921 void WebRtcIsac_DecoderInit(ISACStruct* ISAC_main_inst) {
922 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
923
924 DecoderInitLb(&instISAC->instLB);
925 if (instISAC->decoderSamplingRateKHz == kIsacSuperWideband) {
926 memset(instISAC->synthesisFBState1, 0,
927 FB_STATE_SIZE_WORD32 * sizeof(int32_t));
928 memset(instISAC->synthesisFBState2, 0,
929 FB_STATE_SIZE_WORD32 * sizeof(int32_t));
930 DecoderInitUb(&(instISAC->instUB));
931 }
932 if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != BIT_MASK_ENC_INIT) {
933 WebRtcIsac_InitBandwidthEstimator(&instISAC->bwestimator_obj,
934 instISAC->encoderSamplingRateKHz,
935 instISAC->decoderSamplingRateKHz);
936 }
937 instISAC->initFlag |= BIT_MASK_DEC_INIT;
938 instISAC->resetFlag_8kHz = 0;
939 }
940
941
942 /****************************************************************************
943 * WebRtcIsac_UpdateBwEstimate(...)
944 *
945 * This function updates the estimate of the bandwidth.
946 *
947 * NOTE:
948 * The estimates of bandwidth is not valid if the sample rate of the far-end
949 * encoder is set to 48 kHz and send timestamps are increamented according to
950 * 48 kHz sampling rate.
951 *
952 * Input:
953 * - ISAC_main_inst : ISAC instance.
954 * - encoded : encoded ISAC frame(s).
955 * - packet_size : size of the packet.
956 * - rtp_seq_number : the RTP number of the packet.
957 * - arr_ts : the arrival time of the packet (from NetEq)
958 * in samples.
959 *
960 * Return value : 0 - Ok
961 * -1 - Error
962 */
WebRtcIsac_UpdateBwEstimate(ISACStruct * ISAC_main_inst,const uint8_t * encoded,size_t packet_size,uint16_t rtp_seq_number,uint32_t send_ts,uint32_t arr_ts)963 int16_t WebRtcIsac_UpdateBwEstimate(ISACStruct* ISAC_main_inst,
964 const uint8_t* encoded,
965 size_t packet_size,
966 uint16_t rtp_seq_number,
967 uint32_t send_ts,
968 uint32_t arr_ts) {
969 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
970 Bitstr streamdata;
971 #ifndef WEBRTC_ARCH_BIG_ENDIAN
972 int k;
973 #endif
974 int16_t err;
975
976 /* Check if decoder initiated. */
977 if ((instISAC->initFlag & BIT_MASK_DEC_INIT) != BIT_MASK_DEC_INIT) {
978 instISAC->errorCode = ISAC_DECODER_NOT_INITIATED;
979 return -1;
980 }
981
982 /* Check that the size of the packet is valid, and if not return without
983 * updating the bandwidth estimate. A valid size is at least 10 bytes. */
984 if (packet_size < 10) {
985 /* Return error code if the packet length is null. */
986 instISAC->errorCode = ISAC_EMPTY_PACKET;
987 return -1;
988 }
989
990 WebRtcIsac_ResetBitstream(&(streamdata));
991
992 #ifndef WEBRTC_ARCH_BIG_ENDIAN
993 for (k = 0; k < 10; k++) {
994 uint16_t ek = ((const uint16_t*)encoded)[k >> 1];
995 streamdata.stream[k] = (uint8_t)((ek >> ((k & 1) << 3)) & 0xff);
996 }
997 #else
998 memcpy(streamdata.stream, encoded, 10);
999 #endif
1000
1001 err = WebRtcIsac_EstimateBandwidth(&instISAC->bwestimator_obj, &streamdata,
1002 packet_size, rtp_seq_number, send_ts,
1003 arr_ts, instISAC->encoderSamplingRateKHz,
1004 instISAC->decoderSamplingRateKHz);
1005 if (err < 0) {
1006 /* Return error code if something went wrong. */
1007 instISAC->errorCode = -err;
1008 return -1;
1009 }
1010 return 0;
1011 }
1012
Decode(ISACStruct * ISAC_main_inst,const uint8_t * encoded,size_t lenEncodedBytes,int16_t * decoded,int16_t * speechType,int16_t isRCUPayload)1013 static int Decode(ISACStruct* ISAC_main_inst,
1014 const uint8_t* encoded,
1015 size_t lenEncodedBytes,
1016 int16_t* decoded,
1017 int16_t* speechType,
1018 int16_t isRCUPayload) {
1019 /* Number of samples (480 or 960), output from decoder
1020 that were actually used in the encoder/decoder
1021 (determined on the fly). */
1022 int16_t numSamplesLB;
1023 int16_t numSamplesUB;
1024 int16_t speechIdx;
1025 float outFrame[MAX_FRAMESAMPLES];
1026 int16_t outFrameLB[MAX_FRAMESAMPLES];
1027 int16_t outFrameUB[MAX_FRAMESAMPLES];
1028 int numDecodedBytesLBint;
1029 size_t numDecodedBytesLB;
1030 int numDecodedBytesUB;
1031 size_t lenEncodedLBBytes;
1032 int16_t validChecksum = 1;
1033 int16_t k;
1034 uint16_t numLayer;
1035 size_t totSizeBytes;
1036 int16_t err;
1037
1038 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
1039 ISACUBDecStruct* decInstUB = &(instISAC->instUB.ISACdecUB_obj);
1040 ISACLBDecStruct* decInstLB = &(instISAC->instLB.ISACdecLB_obj);
1041
1042 /* Check if decoder initiated. */
1043 if ((instISAC->initFlag & BIT_MASK_DEC_INIT) !=
1044 BIT_MASK_DEC_INIT) {
1045 instISAC->errorCode = ISAC_DECODER_NOT_INITIATED;
1046 return -1;
1047 }
1048
1049 if (lenEncodedBytes == 0) {
1050 /* return error code if the packet length is null. */
1051 instISAC->errorCode = ISAC_EMPTY_PACKET;
1052 return -1;
1053 }
1054
1055 /* The size of the encoded lower-band is bounded by
1056 * STREAM_SIZE_MAX. If a payload with the size larger than STREAM_SIZE_MAX
1057 * is received, it is not considered erroneous. */
1058 lenEncodedLBBytes = (lenEncodedBytes > STREAM_SIZE_MAX) ?
1059 STREAM_SIZE_MAX : lenEncodedBytes;
1060
1061 /* Copy to lower-band bit-stream structure. */
1062 memcpy(instISAC->instLB.ISACdecLB_obj.bitstr_obj.stream, encoded,
1063 lenEncodedLBBytes);
1064
1065 /* We need to initialize numSamplesLB to something; otherwise, in the test
1066 for whether we should return -1 below, the compiler might generate code
1067 that fools Memcheck (Valgrind) into thinking that the control flow depends
1068 on the uninitialized value in numSamplesLB (since WebRtcIsac_DecodeLb will
1069 not fill it in if it fails and returns -1). */
1070 numSamplesLB = 0;
1071
1072 /* Regardless of that the current codec is setup to work in
1073 * wideband or super-wideband, the decoding of the lower-band
1074 * has to be performed. */
1075 numDecodedBytesLBint = WebRtcIsac_DecodeLb(&instISAC->transform_tables,
1076 outFrame, decInstLB,
1077 &numSamplesLB, isRCUPayload);
1078 numDecodedBytesLB = (size_t)numDecodedBytesLBint;
1079 if ((numDecodedBytesLBint < 0) ||
1080 (numDecodedBytesLB > lenEncodedLBBytes) ||
1081 (numSamplesLB > MAX_FRAMESAMPLES)) {
1082 instISAC->errorCode = ISAC_LENGTH_MISMATCH;
1083 return -1;
1084 }
1085
1086 /* Error Check, we accept multi-layer bit-stream This will limit number
1087 * of iterations of the while loop. Even without this the number
1088 * of iterations is limited. */
1089 numLayer = 1;
1090 totSizeBytes = numDecodedBytesLB;
1091 while (totSizeBytes != lenEncodedBytes) {
1092 if ((totSizeBytes > lenEncodedBytes) ||
1093 (encoded[totSizeBytes] == 0) ||
1094 (numLayer > MAX_NUM_LAYERS)) {
1095 instISAC->errorCode = ISAC_LENGTH_MISMATCH;
1096 return -1;
1097 }
1098 totSizeBytes += encoded[totSizeBytes];
1099 numLayer++;
1100 }
1101
1102 if (instISAC->decoderSamplingRateKHz == kIsacWideband) {
1103 for (k = 0; k < numSamplesLB; k++) {
1104 if (outFrame[k] > 32767) {
1105 decoded[k] = 32767;
1106 } else if (outFrame[k] < -32768) {
1107 decoded[k] = -32768;
1108 } else {
1109 decoded[k] = (int16_t)WebRtcIsac_lrint(outFrame[k]);
1110 }
1111 }
1112 numSamplesUB = 0;
1113 } else {
1114 uint32_t crc;
1115 /* We don't accept larger than 30ms (480 samples at lower-band)
1116 * frame-size. */
1117 for (k = 0; k < numSamplesLB; k++) {
1118 if (outFrame[k] > 32767) {
1119 outFrameLB[k] = 32767;
1120 } else if (outFrame[k] < -32768) {
1121 outFrameLB[k] = -32768;
1122 } else {
1123 outFrameLB[k] = (int16_t)WebRtcIsac_lrint(outFrame[k]);
1124 }
1125 }
1126
1127 /* Check for possible error, and if upper-band stream exists. */
1128 if (numDecodedBytesLB == lenEncodedBytes) {
1129 /* Decoding was successful. No super-wideband bit-stream exists. */
1130 numSamplesUB = numSamplesLB;
1131 memset(outFrameUB, 0, sizeof(int16_t) * numSamplesUB);
1132
1133 /* Prepare for the potential increase of signal bandwidth. */
1134 instISAC->resetFlag_8kHz = 2;
1135 } else {
1136 /* This includes the checksum and the bytes that stores the length. */
1137 int16_t lenNextStream = encoded[numDecodedBytesLB];
1138
1139 /* Is this garbage or valid super-wideband bit-stream?
1140 * Check if checksum is valid. */
1141 if (lenNextStream <= (LEN_CHECK_SUM_WORD8 + 1)) {
1142 /* Such a small second layer cannot be super-wideband layer.
1143 * It must be a short garbage. */
1144 validChecksum = 0;
1145 } else {
1146 /* Run CRC to see if the checksum match. */
1147 WebRtcIsac_GetCrc((int16_t*)(&encoded[numDecodedBytesLB + 1]),
1148 lenNextStream - LEN_CHECK_SUM_WORD8 - 1, &crc);
1149
1150 validChecksum = 1;
1151 for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) {
1152 validChecksum &= (((crc >> (24 - k * 8)) & 0xFF) ==
1153 encoded[numDecodedBytesLB + lenNextStream -
1154 LEN_CHECK_SUM_WORD8 + k]);
1155 }
1156 }
1157
1158 if (!validChecksum) {
1159 /* This is a garbage, we have received a wideband
1160 * bit-stream with garbage. */
1161 numSamplesUB = numSamplesLB;
1162 memset(outFrameUB, 0, sizeof(int16_t) * numSamplesUB);
1163 } else {
1164 /* A valid super-wideband biststream exists. */
1165 enum ISACBandwidth bandwidthKHz;
1166 int32_t maxDelayBit;
1167
1168 /* If we have super-wideband bit-stream, we cannot
1169 * have 60 ms frame-size. */
1170 if (numSamplesLB > FRAMESAMPLES) {
1171 instISAC->errorCode = ISAC_LENGTH_MISMATCH;
1172 return -1;
1173 }
1174
1175 /* The rest of the bit-stream contains the upper-band
1176 * bit-stream curently this is the only thing there,
1177 * however, we might add more layers. */
1178
1179 /* Have to exclude one byte where the length is stored
1180 * and last 'LEN_CHECK_SUM_WORD8' bytes where the
1181 * checksum is stored. */
1182 lenNextStream -= (LEN_CHECK_SUM_WORD8 + 1);
1183
1184 memcpy(decInstUB->bitstr_obj.stream,
1185 &encoded[numDecodedBytesLB + 1], lenNextStream);
1186
1187 /* Reset bit-stream object, this is the first decoding. */
1188 WebRtcIsac_ResetBitstream(&(decInstUB->bitstr_obj));
1189
1190 /* Decode jitter information. */
1191 err = WebRtcIsac_DecodeJitterInfo(&decInstUB->bitstr_obj, &maxDelayBit);
1192 if (err < 0) {
1193 instISAC->errorCode = -err;
1194 return -1;
1195 }
1196
1197 /* Update jitter info which is in the upper-band bit-stream
1198 * only if the encoder is in super-wideband. Otherwise,
1199 * the jitter info is already embedded in bandwidth index
1200 * and has been updated. */
1201 if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) {
1202 err = WebRtcIsac_UpdateUplinkJitter(
1203 &(instISAC->bwestimator_obj), maxDelayBit);
1204 if (err < 0) {
1205 instISAC->errorCode = -err;
1206 return -1;
1207 }
1208 }
1209
1210 /* Decode bandwidth information. */
1211 err = WebRtcIsac_DecodeBandwidth(&decInstUB->bitstr_obj,
1212 &bandwidthKHz);
1213 if (err < 0) {
1214 instISAC->errorCode = -err;
1215 return -1;
1216 }
1217
1218 switch (bandwidthKHz) {
1219 case isac12kHz: {
1220 numDecodedBytesUB = WebRtcIsac_DecodeUb12(
1221 &instISAC->transform_tables, outFrame, decInstUB, isRCUPayload);
1222
1223 /* Hang-over for transient alleviation -
1224 * wait two frames to add the upper band going up from 8 kHz. */
1225 if (instISAC->resetFlag_8kHz > 0) {
1226 if (instISAC->resetFlag_8kHz == 2) {
1227 /* Silence first and a half frame. */
1228 memset(outFrame, 0, MAX_FRAMESAMPLES *
1229 sizeof(float));
1230 } else {
1231 const float rampStep = 2.0f / MAX_FRAMESAMPLES;
1232 float rampVal = 0;
1233 memset(outFrame, 0, (MAX_FRAMESAMPLES >> 1) *
1234 sizeof(float));
1235
1236 /* Ramp up second half of second frame. */
1237 for (k = MAX_FRAMESAMPLES / 2; k < MAX_FRAMESAMPLES; k++) {
1238 outFrame[k] *= rampVal;
1239 rampVal += rampStep;
1240 }
1241 }
1242 instISAC->resetFlag_8kHz -= 1;
1243 }
1244
1245 break;
1246 }
1247 case isac16kHz: {
1248 numDecodedBytesUB = WebRtcIsac_DecodeUb16(
1249 &instISAC->transform_tables, outFrame, decInstUB, isRCUPayload);
1250 break;
1251 }
1252 default:
1253 return -1;
1254 }
1255
1256 /* It might be less due to garbage. */
1257 if ((numDecodedBytesUB != lenNextStream) &&
1258 (numDecodedBytesUB != (lenNextStream -
1259 encoded[numDecodedBytesLB + 1 + numDecodedBytesUB]))) {
1260 instISAC->errorCode = ISAC_LENGTH_MISMATCH;
1261 return -1;
1262 }
1263
1264 /* If there is no error Upper-band always decodes
1265 * 30 ms (480 samples). */
1266 numSamplesUB = FRAMESAMPLES;
1267
1268 /* Convert to W16. */
1269 for (k = 0; k < numSamplesUB; k++) {
1270 if (outFrame[k] > 32767) {
1271 outFrameUB[k] = 32767;
1272 } else if (outFrame[k] < -32768) {
1273 outFrameUB[k] = -32768;
1274 } else {
1275 outFrameUB[k] = (int16_t)WebRtcIsac_lrint(
1276 outFrame[k]);
1277 }
1278 }
1279 }
1280 }
1281
1282 speechIdx = 0;
1283 while (speechIdx < numSamplesLB) {
1284 WebRtcSpl_SynthesisQMF(&outFrameLB[speechIdx], &outFrameUB[speechIdx],
1285 FRAMESAMPLES_10ms, &decoded[(speechIdx << 1)],
1286 instISAC->synthesisFBState1,
1287 instISAC->synthesisFBState2);
1288
1289 speechIdx += FRAMESAMPLES_10ms;
1290 }
1291 }
1292 *speechType = 0;
1293 return (numSamplesLB + numSamplesUB);
1294 }
1295
1296
1297
1298
1299
1300
1301
1302 /****************************************************************************
1303 * WebRtcIsac_Decode(...)
1304 *
1305 * This function decodes a ISAC frame. Output speech length
1306 * will be a multiple of 480 samples: 480 or 960 samples,
1307 * depending on the frameSize (30 or 60 ms).
1308 *
1309 * Input:
1310 * - ISAC_main_inst : ISAC instance.
1311 * - encoded : encoded ISAC frame(s)
1312 * - len : bytes in encoded vector
1313 *
1314 * Output:
1315 * - decoded : The decoded vector
1316 *
1317 * Return value : >0 - number of samples in decoded vector
1318 * -1 - Error
1319 */
1320
WebRtcIsac_Decode(ISACStruct * ISAC_main_inst,const uint8_t * encoded,size_t lenEncodedBytes,int16_t * decoded,int16_t * speechType)1321 int WebRtcIsac_Decode(ISACStruct* ISAC_main_inst,
1322 const uint8_t* encoded,
1323 size_t lenEncodedBytes,
1324 int16_t* decoded,
1325 int16_t* speechType) {
1326 int16_t isRCUPayload = 0;
1327 return Decode(ISAC_main_inst, encoded, lenEncodedBytes, decoded,
1328 speechType, isRCUPayload);
1329 }
1330
1331 /****************************************************************************
1332 * WebRtcIsac_DecodeRcu(...)
1333 *
1334 * This function decodes a redundant (RCU) iSAC frame. Function is called in
1335 * NetEq with a stored RCU payload in case of packet loss. Output speech length
1336 * will be a multiple of 480 samples: 480 or 960 samples,
1337 * depending on the framesize (30 or 60 ms).
1338 *
1339 * Input:
1340 * - ISAC_main_inst : ISAC instance.
1341 * - encoded : encoded ISAC RCU frame(s)
1342 * - len : bytes in encoded vector
1343 *
1344 * Output:
1345 * - decoded : The decoded vector
1346 *
1347 * Return value : >0 - number of samples in decoded vector
1348 * -1 - Error
1349 */
1350
1351
1352
WebRtcIsac_DecodeRcu(ISACStruct * ISAC_main_inst,const uint8_t * encoded,size_t lenEncodedBytes,int16_t * decoded,int16_t * speechType)1353 int WebRtcIsac_DecodeRcu(ISACStruct* ISAC_main_inst,
1354 const uint8_t* encoded,
1355 size_t lenEncodedBytes,
1356 int16_t* decoded,
1357 int16_t* speechType) {
1358 int16_t isRCUPayload = 1;
1359 return Decode(ISAC_main_inst, encoded, lenEncodedBytes, decoded,
1360 speechType, isRCUPayload);
1361 }
1362
1363
1364 /****************************************************************************
1365 * WebRtcIsac_DecodePlc(...)
1366 *
1367 * This function conducts PLC for ISAC frame(s). Output speech length
1368 * will be a multiple of 480 samples: 480 or 960 samples,
1369 * depending on the frameSize (30 or 60 ms).
1370 *
1371 * Input:
1372 * - ISAC_main_inst : ISAC instance.
1373 * - noOfLostFrames : Number of PLC frames to produce
1374 *
1375 * Output:
1376 * - decoded : The decoded vector
1377 *
1378 * Return value : Number of samples in decoded PLC vector
1379 */
WebRtcIsac_DecodePlc(ISACStruct * ISAC_main_inst,int16_t * decoded,size_t noOfLostFrames)1380 size_t WebRtcIsac_DecodePlc(ISACStruct* ISAC_main_inst,
1381 int16_t* decoded,
1382 size_t noOfLostFrames) {
1383 size_t numSamples = 0;
1384 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
1385
1386 /* Limit number of frames to two = 60 millisecond.
1387 * Otherwise we exceed data vectors. */
1388 if (noOfLostFrames > 2) {
1389 noOfLostFrames = 2;
1390 }
1391
1392 /* Get the number of samples per frame */
1393 switch (instISAC->decoderSamplingRateKHz) {
1394 case kIsacWideband: {
1395 numSamples = 480 * noOfLostFrames;
1396 break;
1397 }
1398 case kIsacSuperWideband: {
1399 numSamples = 960 * noOfLostFrames;
1400 break;
1401 }
1402 }
1403
1404 /* Set output samples to zero. */
1405 memset(decoded, 0, numSamples * sizeof(int16_t));
1406 return numSamples;
1407 }
1408
1409
1410 /****************************************************************************
1411 * ControlLb(...) - Internal function for controlling Lower Band
1412 * ControlUb(...) - Internal function for controlling Upper Band
1413 * WebRtcIsac_Control(...) - API function
1414 *
1415 * This function sets the limit on the short-term average bit rate and the
1416 * frame length. Should be used only in Instantaneous mode.
1417 *
1418 * Input:
1419 * - ISAC_main_inst : ISAC instance.
1420 * - rate : limit on the short-term average bit rate,
1421 * in bits/second (between 10000 and 32000)
1422 * - frameSize : number of milliseconds per frame (30 or 60)
1423 *
1424 * Return value : 0 - ok
1425 * -1 - Error
1426 */
ControlLb(ISACLBStruct * instISAC,double rate,int16_t frameSize)1427 static int16_t ControlLb(ISACLBStruct* instISAC, double rate,
1428 int16_t frameSize) {
1429 if ((rate >= 10000) && (rate <= 32000)) {
1430 instISAC->ISACencLB_obj.bottleneck = rate;
1431 } else {
1432 return -ISAC_DISALLOWED_BOTTLENECK;
1433 }
1434
1435 if ((frameSize == 30) || (frameSize == 60)) {
1436 instISAC->ISACencLB_obj.new_framelength = (FS / 1000) * frameSize;
1437 } else {
1438 return -ISAC_DISALLOWED_FRAME_LENGTH;
1439 }
1440
1441 return 0;
1442 }
1443
ControlUb(ISACUBStruct * instISAC,double rate)1444 static int16_t ControlUb(ISACUBStruct* instISAC, double rate) {
1445 if ((rate >= 10000) && (rate <= 32000)) {
1446 instISAC->ISACencUB_obj.bottleneck = rate;
1447 } else {
1448 return -ISAC_DISALLOWED_BOTTLENECK;
1449 }
1450 return 0;
1451 }
1452
WebRtcIsac_Control(ISACStruct * ISAC_main_inst,int32_t bottleneckBPS,int frameSize)1453 int16_t WebRtcIsac_Control(ISACStruct* ISAC_main_inst,
1454 int32_t bottleneckBPS,
1455 int frameSize) {
1456 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
1457 int16_t status;
1458 double rateLB;
1459 double rateUB;
1460 enum ISACBandwidth bandwidthKHz;
1461
1462 if (instISAC->codingMode == 0) {
1463 /* In adaptive mode. */
1464 instISAC->errorCode = ISAC_MODE_MISMATCH;
1465 return -1;
1466 }
1467
1468 /* Check if encoder initiated */
1469 if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
1470 BIT_MASK_ENC_INIT) {
1471 instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
1472 return -1;
1473 }
1474
1475 if (instISAC->encoderSamplingRateKHz == kIsacWideband) {
1476 /* If the sampling rate is 16kHz then bandwith should be 8kHz,
1477 * regardless of bottleneck. */
1478 bandwidthKHz = isac8kHz;
1479 rateLB = (bottleneckBPS > 32000) ? 32000 : bottleneckBPS;
1480 rateUB = 0;
1481 } else {
1482 if (WebRtcIsac_RateAllocation(bottleneckBPS, &rateLB, &rateUB,
1483 &bandwidthKHz) < 0) {
1484 return -1;
1485 }
1486 }
1487
1488 if ((instISAC->encoderSamplingRateKHz == kIsacSuperWideband) &&
1489 (frameSize != 30) &&
1490 (bandwidthKHz != isac8kHz)) {
1491 /* Cannot have 60 ms in super-wideband. */
1492 instISAC->errorCode = ISAC_DISALLOWED_FRAME_LENGTH;
1493 return -1;
1494 }
1495
1496 status = ControlLb(&instISAC->instLB, rateLB, (int16_t)frameSize);
1497 if (status < 0) {
1498 instISAC->errorCode = -status;
1499 return -1;
1500 }
1501 if (bandwidthKHz != isac8kHz) {
1502 status = ControlUb(&(instISAC->instUB), rateUB);
1503 if (status < 0) {
1504 instISAC->errorCode = -status;
1505 return -1;
1506 }
1507 }
1508
1509
1510 /* Check if bandwidth is changing from wideband to super-wideband
1511 * then we have to synch data buffer of lower & upper-band. Also
1512 * clean up the upper-band data buffer. */
1513
1514 if ((instISAC->bandwidthKHz == isac8kHz) && (bandwidthKHz != isac8kHz)) {
1515 memset(instISAC->instUB.ISACencUB_obj.data_buffer_float, 0,
1516 sizeof(float) * (MAX_FRAMESAMPLES + LB_TOTAL_DELAY_SAMPLES));
1517
1518 if (bandwidthKHz == isac12kHz) {
1519 instISAC->instUB.ISACencUB_obj.buffer_index =
1520 instISAC->instLB.ISACencLB_obj.buffer_index;
1521 } else {
1522 instISAC->instUB.ISACencUB_obj.buffer_index =
1523 LB_TOTAL_DELAY_SAMPLES + instISAC->instLB.ISACencLB_obj.buffer_index;
1524
1525 memcpy(&(instISAC->instUB.ISACencUB_obj.lastLPCVec),
1526 WebRtcIsac_kMeanLarUb16, sizeof(double) * UB_LPC_ORDER);
1527 }
1528 }
1529
1530 /* Update the payload limit if the bandwidth is changing. */
1531 if (instISAC->bandwidthKHz != bandwidthKHz) {
1532 instISAC->bandwidthKHz = bandwidthKHz;
1533 UpdatePayloadSizeLimit(instISAC);
1534 }
1535 instISAC->bottleneck = bottleneckBPS;
1536 return 0;
1537 }
1538
WebRtcIsac_SetInitialBweBottleneck(ISACStruct * ISAC_main_inst,int bottleneck_bits_per_second)1539 void WebRtcIsac_SetInitialBweBottleneck(ISACStruct* ISAC_main_inst,
1540 int bottleneck_bits_per_second) {
1541 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
1542 assert(bottleneck_bits_per_second >= 10000 &&
1543 bottleneck_bits_per_second <= 32000);
1544 instISAC->bwestimator_obj.send_bw_avg = (float)bottleneck_bits_per_second;
1545 }
1546
1547 /****************************************************************************
1548 * WebRtcIsac_ControlBwe(...)
1549 *
1550 * This function sets the initial values of bottleneck and frame-size if
1551 * iSAC is used in channel-adaptive mode. Through this API, users can
1552 * enforce a frame-size for all values of bottleneck. Then iSAC will not
1553 * automatically change the frame-size.
1554 *
1555 *
1556 * Input:
1557 * - ISAC_main_inst : ISAC instance.
1558 * - rateBPS : initial value of bottleneck in bits/second
1559 * 10000 <= rateBPS <= 32000 is accepted
1560 * For default bottleneck set rateBPS = 0
1561 * - frameSizeMs : number of milliseconds per frame (30 or 60)
1562 * - enforceFrameSize : 1 to enforce the given frame-size through out
1563 * the adaptation process, 0 to let iSAC change
1564 * the frame-size if required.
1565 *
1566 * Return value : 0 - ok
1567 * -1 - Error
1568 */
WebRtcIsac_ControlBwe(ISACStruct * ISAC_main_inst,int32_t bottleneckBPS,int frameSizeMs,int16_t enforceFrameSize)1569 int16_t WebRtcIsac_ControlBwe(ISACStruct* ISAC_main_inst,
1570 int32_t bottleneckBPS,
1571 int frameSizeMs,
1572 int16_t enforceFrameSize) {
1573 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
1574 enum ISACBandwidth bandwidth;
1575
1576 /* Check if encoder initiated */
1577 if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
1578 BIT_MASK_ENC_INIT) {
1579 instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
1580 return -1;
1581 }
1582
1583 /* Check that we are in channel-adaptive mode, otherwise, return (-1) */
1584 if (instISAC->codingMode != 0) {
1585 instISAC->errorCode = ISAC_MODE_MISMATCH;
1586 return -1;
1587 }
1588 if ((frameSizeMs != 30) &&
1589 (instISAC->encoderSamplingRateKHz == kIsacSuperWideband)) {
1590 return -1;
1591 }
1592
1593 /* Set structure variable if enforceFrameSize is set. ISAC will then
1594 * keep the chosen frame size. */
1595 if (enforceFrameSize != 0) {
1596 instISAC->instLB.ISACencLB_obj.enforceFrameSize = 1;
1597 } else {
1598 instISAC->instLB.ISACencLB_obj.enforceFrameSize = 0;
1599 }
1600
1601 /* Set the initial rate. If the input value is zero then the default intial
1602 * rate is used. Otehrwise, values between 10 to 32 kbps are accepted. */
1603 if (bottleneckBPS != 0) {
1604 double rateLB;
1605 double rateUB;
1606 if (WebRtcIsac_RateAllocation(bottleneckBPS, &rateLB, &rateUB,
1607 &bandwidth) < 0) {
1608 return -1;
1609 }
1610 instISAC->bwestimator_obj.send_bw_avg = (float)bottleneckBPS;
1611 instISAC->bandwidthKHz = bandwidth;
1612 }
1613
1614 /* Set the initial frame-size. If 'enforceFrameSize' is set, the frame-size
1615 * will not change */
1616 if (frameSizeMs != 0) {
1617 if ((frameSizeMs == 30) || (frameSizeMs == 60)) {
1618 instISAC->instLB.ISACencLB_obj.new_framelength =
1619 (int16_t)((FS / 1000) * frameSizeMs);
1620 } else {
1621 instISAC->errorCode = ISAC_DISALLOWED_FRAME_LENGTH;
1622 return -1;
1623 }
1624 }
1625 return 0;
1626 }
1627
1628
1629 /****************************************************************************
1630 * WebRtcIsac_GetDownLinkBwIndex(...)
1631 *
1632 * This function returns index representing the Bandwidth estimate from
1633 * the other side to this side.
1634 *
1635 * Input:
1636 * - ISAC_main_inst : iSAC structure
1637 *
1638 * Output:
1639 * - bweIndex : Bandwidth estimate to transmit to other side.
1640 *
1641 */
WebRtcIsac_GetDownLinkBwIndex(ISACStruct * ISAC_main_inst,int16_t * bweIndex,int16_t * jitterInfo)1642 int16_t WebRtcIsac_GetDownLinkBwIndex(ISACStruct* ISAC_main_inst,
1643 int16_t* bweIndex,
1644 int16_t* jitterInfo) {
1645 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
1646
1647 /* Check if encoder initialized. */
1648 if ((instISAC->initFlag & BIT_MASK_DEC_INIT) !=
1649 BIT_MASK_DEC_INIT) {
1650 instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
1651 return -1;
1652 }
1653
1654 /* Call function to get Bandwidth Estimate. */
1655 WebRtcIsac_GetDownlinkBwJitIndexImpl(&(instISAC->bwestimator_obj), bweIndex,
1656 jitterInfo,
1657 instISAC->decoderSamplingRateKHz);
1658 return 0;
1659 }
1660
1661
1662 /****************************************************************************
1663 * WebRtcIsac_UpdateUplinkBw(...)
1664 *
1665 * This function takes an index representing the Bandwidth estimate from
1666 * this side to other side and updates BWE.
1667 *
1668 * Input:
1669 * - ISAC_main_inst : iSAC structure
1670 * - rateIndex : Bandwidth estimate from other side.
1671 *
1672 * Return value : 0 - ok
1673 * -1 - index out of range
1674 */
WebRtcIsac_UpdateUplinkBw(ISACStruct * ISAC_main_inst,int16_t bweIndex)1675 int16_t WebRtcIsac_UpdateUplinkBw(ISACStruct* ISAC_main_inst,
1676 int16_t bweIndex) {
1677 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
1678 int16_t returnVal;
1679
1680 /* Check if encoder initiated. */
1681 if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
1682 BIT_MASK_ENC_INIT) {
1683 instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
1684 return -1;
1685 }
1686
1687 /* Call function to get Bandwidth Estimate. */
1688 returnVal = WebRtcIsac_UpdateUplinkBwImpl(
1689 &(instISAC->bwestimator_obj), bweIndex,
1690 instISAC->encoderSamplingRateKHz);
1691
1692 if (returnVal < 0) {
1693 instISAC->errorCode = -returnVal;
1694 return -1;
1695 } else {
1696 return 0;
1697 }
1698 }
1699
1700
1701 /****************************************************************************
1702 * WebRtcIsac_ReadBwIndex(...)
1703 *
1704 * This function returns the index of the Bandwidth estimate from the
1705 * bit-stream.
1706 *
1707 * Input:
1708 * - encoded : Encoded bit-stream
1709 *
1710 * Output:
1711 * - frameLength : Length of frame in packet (in samples)
1712 * - bweIndex : Bandwidth estimate in bit-stream
1713 *
1714 */
WebRtcIsac_ReadBwIndex(const uint8_t * encoded,int16_t * bweIndex)1715 int16_t WebRtcIsac_ReadBwIndex(const uint8_t* encoded,
1716 int16_t* bweIndex) {
1717 Bitstr streamdata;
1718 #ifndef WEBRTC_ARCH_BIG_ENDIAN
1719 int k;
1720 #endif
1721 int16_t err;
1722
1723 WebRtcIsac_ResetBitstream(&(streamdata));
1724
1725 #ifndef WEBRTC_ARCH_BIG_ENDIAN
1726 for (k = 0; k < 10; k++) {
1727 int16_t ek2 = ((const int16_t*)encoded)[k >> 1];
1728 streamdata.stream[k] = (uint8_t)((ek2 >> ((k & 1) << 3)) & 0xff);
1729 }
1730 #else
1731 memcpy(streamdata.stream, encoded, 10);
1732 #endif
1733
1734 /* Decode frame length. */
1735 err = WebRtcIsac_DecodeFrameLen(&streamdata, bweIndex);
1736 if (err < 0) {
1737 return err;
1738 }
1739
1740 /* Decode BW estimation. */
1741 err = WebRtcIsac_DecodeSendBW(&streamdata, bweIndex);
1742 if (err < 0) {
1743 return err;
1744 }
1745
1746 return 0;
1747 }
1748
1749
1750 /****************************************************************************
1751 * WebRtcIsac_ReadFrameLen(...)
1752 *
1753 * This function returns the number of samples the decoder will generate if
1754 * the given payload is decoded.
1755 *
1756 * Input:
1757 * - encoded : Encoded bitstream
1758 *
1759 * Output:
1760 * - frameLength : Length of frame in packet (in samples)
1761 *
1762 */
WebRtcIsac_ReadFrameLen(ISACStruct * ISAC_main_inst,const uint8_t * encoded,int16_t * frameLength)1763 int16_t WebRtcIsac_ReadFrameLen(ISACStruct* ISAC_main_inst,
1764 const uint8_t* encoded,
1765 int16_t* frameLength) {
1766 Bitstr streamdata;
1767 #ifndef WEBRTC_ARCH_BIG_ENDIAN
1768 int k;
1769 #endif
1770 int16_t err;
1771 ISACMainStruct* instISAC;
1772
1773 WebRtcIsac_ResetBitstream(&(streamdata));
1774
1775 #ifndef WEBRTC_ARCH_BIG_ENDIAN
1776 for (k = 0; k < 10; k++) {
1777 int16_t ek2 = ((const int16_t*)encoded)[k >> 1];
1778 streamdata.stream[k] = (uint8_t)((ek2 >> ((k & 1) << 3)) & 0xff);
1779 }
1780 #else
1781 memcpy(streamdata.stream, encoded, 10);
1782 #endif
1783
1784 /* Decode frame length. */
1785 err = WebRtcIsac_DecodeFrameLen(&streamdata, frameLength);
1786 if (err < 0) {
1787 return -1;
1788 }
1789 instISAC = (ISACMainStruct*)ISAC_main_inst;
1790
1791 if (instISAC->decoderSamplingRateKHz == kIsacSuperWideband) {
1792 /* The decoded frame length indicates the number of samples in
1793 * lower-band in this case, multiply by 2 to get the total number
1794 * of samples. */
1795 *frameLength <<= 1;
1796 }
1797 return 0;
1798 }
1799
1800
1801 /*******************************************************************************
1802 * WebRtcIsac_GetNewFrameLen(...)
1803 *
1804 * This function returns the frame length (in samples) of the next packet.
1805 * In the case of channel-adaptive mode, iSAC decides on its frame length based
1806 * on the estimated bottleneck, this AOI allows a user to prepare for the next
1807 * packet (at the encoder).
1808 *
1809 * The primary usage is in CE to make the iSAC works in channel-adaptive mode
1810 *
1811 * Input:
1812 * - ISAC_main_inst : iSAC struct
1813 *
1814 * Return Value : frame lenght in samples
1815 *
1816 */
WebRtcIsac_GetNewFrameLen(ISACStruct * ISAC_main_inst)1817 int16_t WebRtcIsac_GetNewFrameLen(ISACStruct* ISAC_main_inst) {
1818 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
1819
1820 /* Return new frame length. */
1821 if (instISAC->in_sample_rate_hz == 16000)
1822 return (instISAC->instLB.ISACencLB_obj.new_framelength);
1823 else /* 32000 Hz */
1824 return ((instISAC->instLB.ISACencLB_obj.new_framelength) * 2);
1825 }
1826
1827
1828 /****************************************************************************
1829 * WebRtcIsac_GetErrorCode(...)
1830 *
1831 * This function can be used to check the error code of an iSAC instance.
1832 * When a function returns -1 an error code will be set for that instance.
1833 * The function below extracts the code of the last error that occurred in
1834 * the specified instance.
1835 *
1836 * Input:
1837 * - ISAC_main_inst : ISAC instance
1838 *
1839 * Return value : Error code
1840 */
WebRtcIsac_GetErrorCode(ISACStruct * ISAC_main_inst)1841 int16_t WebRtcIsac_GetErrorCode(ISACStruct* ISAC_main_inst) {
1842 return ((ISACMainStruct*)ISAC_main_inst)->errorCode;
1843 }
1844
1845
1846 /****************************************************************************
1847 * WebRtcIsac_GetUplinkBw(...)
1848 *
1849 * This function outputs the target bottleneck of the codec. In
1850 * channel-adaptive mode, the target bottleneck is specified through an in-band
1851 * signalling retrieved by bandwidth estimator.
1852 * In channel-independent, also called instantaneous mode, the target
1853 * bottleneck is provided to the encoder by calling xxx_control(...) (if
1854 * xxx_control is never called, the default values are used.).
1855 * Note that the output is the iSAC internal operating bottleneck which might
1856 * differ slightly from the one provided through xxx_control().
1857 *
1858 * Input:
1859 * - ISAC_main_inst : iSAC instance
1860 *
1861 * Output:
1862 * - *bottleneck : bottleneck in bits/sec
1863 *
1864 * Return value : -1 if error happens
1865 * 0 bit-rates computed correctly.
1866 */
WebRtcIsac_GetUplinkBw(ISACStruct * ISAC_main_inst,int32_t * bottleneck)1867 int16_t WebRtcIsac_GetUplinkBw(ISACStruct* ISAC_main_inst,
1868 int32_t* bottleneck) {
1869 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
1870
1871 if (instISAC->codingMode == 0) {
1872 /* We are in adaptive mode then get the bottleneck from BWE. */
1873 *bottleneck = (int32_t)instISAC->bwestimator_obj.send_bw_avg;
1874 } else {
1875 *bottleneck = instISAC->bottleneck;
1876 }
1877
1878 if ((*bottleneck > 32000) && (*bottleneck < 38000)) {
1879 *bottleneck = 32000;
1880 } else if ((*bottleneck > 45000) && (*bottleneck < 50000)) {
1881 *bottleneck = 45000;
1882 } else if (*bottleneck > 56000) {
1883 *bottleneck = 56000;
1884 }
1885 return 0;
1886 }
1887
1888
1889 /******************************************************************************
1890 * WebRtcIsac_SetMaxPayloadSize(...)
1891 *
1892 * This function sets a limit for the maximum payload size of iSAC. The same
1893 * value is used both for 30 and 60 ms packets. If the encoder sampling rate
1894 * is 16 kHz the maximum payload size is between 120 and 400 bytes. If the
1895 * encoder sampling rate is 32 kHz the maximum payload size is between 120
1896 * and 600 bytes.
1897 *
1898 * ---------------
1899 * IMPORTANT NOTES
1900 * ---------------
1901 * The size of a packet is limited to the minimum of 'max-payload-size' and
1902 * 'max-rate.' For instance, let's assume the max-payload-size is set to
1903 * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
1904 * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
1905 * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
1906 * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
1907 * 170 bytes, i.e. min(170, 300).
1908 *
1909 * Input:
1910 * - ISAC_main_inst : iSAC instance
1911 * - maxPayloadBytes : maximum size of the payload in bytes
1912 * valid values are between 100 and 400 bytes
1913 * if encoder sampling rate is 16 kHz. For
1914 * 32 kHz encoder sampling rate valid values
1915 * are between 100 and 600 bytes.
1916 *
1917 * Return value : 0 if successful
1918 * -1 if error happens
1919 */
WebRtcIsac_SetMaxPayloadSize(ISACStruct * ISAC_main_inst,int16_t maxPayloadBytes)1920 int16_t WebRtcIsac_SetMaxPayloadSize(ISACStruct* ISAC_main_inst,
1921 int16_t maxPayloadBytes) {
1922 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
1923 int16_t status = 0;
1924
1925 /* Check if encoder initiated */
1926 if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
1927 BIT_MASK_ENC_INIT) {
1928 instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
1929 return -1;
1930 }
1931
1932 if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) {
1933 /* Sanity check. */
1934 if (maxPayloadBytes < 120) {
1935 /* 'maxRate' is out of valid range
1936 * set to the acceptable value and return -1. */
1937 maxPayloadBytes = 120;
1938 status = -1;
1939 }
1940
1941 /* sanity check */
1942 if (maxPayloadBytes > STREAM_SIZE_MAX) {
1943 /* maxRate is out of valid range,
1944 * set to the acceptable value and return -1. */
1945 maxPayloadBytes = STREAM_SIZE_MAX;
1946 status = -1;
1947 }
1948 } else {
1949 if (maxPayloadBytes < 120) {
1950 /* Max payload-size is out of valid range
1951 * set to the acceptable value and return -1. */
1952 maxPayloadBytes = 120;
1953 status = -1;
1954 }
1955 if (maxPayloadBytes > STREAM_SIZE_MAX_60) {
1956 /* Max payload-size is out of valid range
1957 * set to the acceptable value and return -1. */
1958 maxPayloadBytes = STREAM_SIZE_MAX_60;
1959 status = -1;
1960 }
1961 }
1962 instISAC->maxPayloadSizeBytes = maxPayloadBytes;
1963 UpdatePayloadSizeLimit(instISAC);
1964 return status;
1965 }
1966
1967
1968 /******************************************************************************
1969 * WebRtcIsac_SetMaxRate(...)
1970 *
1971 * This function sets the maximum rate which the codec may not exceed for
1972 * any signal packet. The maximum rate is defined and payload-size per
1973 * frame-size in bits per second.
1974 *
1975 * The codec has a maximum rate of 53400 bits per second (200 bytes per 30
1976 * ms) if the encoder sampling rate is 16kHz, and 160 kbps (600 bytes/30 ms)
1977 * if the encoder sampling rate is 32 kHz.
1978 *
1979 * It is possible to set a maximum rate between 32000 and 53400 bits/sec
1980 * in wideband mode, and 32000 to 160000 bits/sec in super-wideband mode.
1981 *
1982 * ---------------
1983 * IMPORTANT NOTES
1984 * ---------------
1985 * The size of a packet is limited to the minimum of 'max-payload-size' and
1986 * 'max-rate.' For instance, let's assume the max-payload-size is set to
1987 * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
1988 * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
1989 * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
1990 * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
1991 * 170 bytes, min(170, 300).
1992 *
1993 * Input:
1994 * - ISAC_main_inst : iSAC instance
1995 * - maxRate : maximum rate in bits per second,
1996 * valid values are 32000 to 53400 bits/sec in
1997 * wideband mode, and 32000 to 160000 bits/sec in
1998 * super-wideband mode.
1999 *
2000 * Return value : 0 if successful
2001 * -1 if error happens
2002 */
WebRtcIsac_SetMaxRate(ISACStruct * ISAC_main_inst,int32_t maxRate)2003 int16_t WebRtcIsac_SetMaxRate(ISACStruct* ISAC_main_inst,
2004 int32_t maxRate) {
2005 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
2006 int16_t maxRateInBytesPer30Ms;
2007 int16_t status = 0;
2008
2009 /* check if encoder initiated */
2010 if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != BIT_MASK_ENC_INIT) {
2011 instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
2012 return -1;
2013 }
2014 /* Calculate maximum number of bytes per 30 msec packets for the
2015 given maximum rate. Multiply with 30/1000 to get number of
2016 bits per 30 ms, divide by 8 to get number of bytes per 30 ms:
2017 maxRateInBytes = floor((maxRate * 30/1000) / 8); */
2018 maxRateInBytesPer30Ms = (int16_t)(maxRate * 3 / 800);
2019
2020 if (instISAC->encoderSamplingRateKHz == kIsacWideband) {
2021 if (maxRate < 32000) {
2022 /* 'maxRate' is out of valid range.
2023 * Set to the acceptable value and return -1. */
2024 maxRateInBytesPer30Ms = 120;
2025 status = -1;
2026 }
2027
2028 if (maxRate > 53400) {
2029 /* 'maxRate' is out of valid range.
2030 * Set to the acceptable value and return -1. */
2031 maxRateInBytesPer30Ms = 200;
2032 status = -1;
2033 }
2034 } else {
2035 if (maxRateInBytesPer30Ms < 120) {
2036 /* 'maxRate' is out of valid range
2037 * Set to the acceptable value and return -1. */
2038 maxRateInBytesPer30Ms = 120;
2039 status = -1;
2040 }
2041
2042 if (maxRateInBytesPer30Ms > STREAM_SIZE_MAX) {
2043 /* 'maxRate' is out of valid range.
2044 * Set to the acceptable value and return -1. */
2045 maxRateInBytesPer30Ms = STREAM_SIZE_MAX;
2046 status = -1;
2047 }
2048 }
2049 instISAC->maxRateBytesPer30Ms = maxRateInBytesPer30Ms;
2050 UpdatePayloadSizeLimit(instISAC);
2051 return status;
2052 }
2053
2054
2055 /****************************************************************************
2056 * WebRtcIsac_GetRedPayload(...)
2057 *
2058 * This function populates "encoded" with the redundant payload of the recently
2059 * encodedframe. This function has to be called once that WebRtcIsac_Encode(...)
2060 * returns a positive value. Regardless of the frame-size this function will
2061 * be called only once after encoding is completed. The bit-stream is
2062 * targeted for 16000 bit/sec.
2063 *
2064 * Input:
2065 * - ISAC_main_inst : iSAC struct
2066 *
2067 * Output:
2068 * - encoded : the encoded data vector
2069 *
2070 *
2071 * Return value : >0 - Length (in bytes) of coded data
2072 * : -1 - Error
2073 */
WebRtcIsac_GetRedPayload(ISACStruct * ISAC_main_inst,uint8_t * encoded)2074 int16_t WebRtcIsac_GetRedPayload(ISACStruct* ISAC_main_inst,
2075 uint8_t* encoded) {
2076 Bitstr iSACBitStreamInst;
2077 int16_t streamLenLB;
2078 int16_t streamLenUB;
2079 int16_t streamLen;
2080 int16_t totalLenUB;
2081 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
2082 #ifndef WEBRTC_ARCH_BIG_ENDIAN
2083 int k;
2084 #endif
2085
2086 if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
2087 BIT_MASK_ENC_INIT) {
2088 instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
2089 }
2090
2091 WebRtcIsac_ResetBitstream(&(iSACBitStreamInst));
2092
2093 streamLenLB = WebRtcIsac_EncodeStoredDataLb(
2094 &instISAC->instLB.ISACencLB_obj.SaveEnc_obj,
2095 &iSACBitStreamInst,
2096 instISAC->instLB.ISACencLB_obj.lastBWIdx,
2097 RCU_TRANSCODING_SCALE);
2098 if (streamLenLB < 0) {
2099 return -1;
2100 }
2101
2102 /* convert from bytes to int16_t. */
2103 memcpy(encoded, iSACBitStreamInst.stream, streamLenLB);
2104 streamLen = streamLenLB;
2105 if (instISAC->bandwidthKHz == isac8kHz) {
2106 return streamLenLB;
2107 }
2108
2109 streamLenUB = WebRtcIsac_GetRedPayloadUb(
2110 &instISAC->instUB.ISACencUB_obj.SaveEnc_obj,
2111 &iSACBitStreamInst, instISAC->bandwidthKHz);
2112 if (streamLenUB < 0) {
2113 /* An error has happened but this is not the error due to a
2114 * bit-stream larger than the limit. */
2115 return -1;
2116 }
2117
2118 /* We have one byte to write the total length of the upper-band.
2119 * The length includes the bit-stream length, check-sum and the
2120 * single byte where the length is written to. This is according to
2121 * iSAC wideband and how the "garbage" is dealt. */
2122 totalLenUB = streamLenUB + 1 + LEN_CHECK_SUM_WORD8;
2123 if (totalLenUB > 255) {
2124 streamLenUB = 0;
2125 }
2126
2127 /* Generate CRC if required. */
2128 if ((instISAC->bandwidthKHz != isac8kHz) &&
2129 (streamLenUB > 0)) {
2130 uint32_t crc;
2131 streamLen += totalLenUB;
2132 encoded[streamLenLB] = (uint8_t)totalLenUB;
2133 memcpy(&encoded[streamLenLB + 1], iSACBitStreamInst.stream,
2134 streamLenUB);
2135
2136 WebRtcIsac_GetCrc((int16_t*)(&(encoded[streamLenLB + 1])),
2137 streamLenUB, &crc);
2138 #ifndef WEBRTC_ARCH_BIG_ENDIAN
2139 for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) {
2140 encoded[streamLen - LEN_CHECK_SUM_WORD8 + k] =
2141 (uint8_t)((crc >> (24 - k * 8)) & 0xFF);
2142 }
2143 #else
2144 memcpy(&encoded[streamLenLB + streamLenUB + 1], &crc,
2145 LEN_CHECK_SUM_WORD8);
2146 #endif
2147 }
2148 return streamLen;
2149 }
2150
2151
2152 /****************************************************************************
2153 * WebRtcIsac_version(...)
2154 *
2155 * This function returns the version number.
2156 *
2157 * Output:
2158 * - version : Pointer to character string
2159 *
2160 */
WebRtcIsac_version(char * version)2161 void WebRtcIsac_version(char* version) {
2162 strcpy(version, "4.3.0");
2163 }
2164
2165
2166 /******************************************************************************
2167 * WebRtcIsac_SetEncSampRate()
2168 * This function sets the sampling rate of the encoder. Initialization of the
2169 * encoder WILL NOT overwrite the sampling rate of the encoder. The default
2170 * value is 16 kHz which is set when the instance is created. The encoding-mode
2171 * and the bottleneck remain unchanged by this call, however, the maximum rate
2172 * and maximum payload-size will be reset to their default values.
2173 *
2174 * Input:
2175 * - ISAC_main_inst : iSAC instance
2176 * - sample_rate_hz : sampling rate in Hertz, valid values are 16000
2177 * and 32000.
2178 *
2179 * Return value : 0 if successful
2180 * -1 if failed.
2181 */
WebRtcIsac_SetEncSampRate(ISACStruct * ISAC_main_inst,uint16_t sample_rate_hz)2182 int16_t WebRtcIsac_SetEncSampRate(ISACStruct* ISAC_main_inst,
2183 uint16_t sample_rate_hz) {
2184 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
2185 enum IsacSamplingRate encoder_operational_rate;
2186
2187 if ((sample_rate_hz != 16000) && (sample_rate_hz != 32000)) {
2188 /* Sampling Frequency is not supported. */
2189 instISAC->errorCode = ISAC_UNSUPPORTED_SAMPLING_FREQUENCY;
2190 return -1;
2191 }
2192 if (sample_rate_hz == 16000) {
2193 encoder_operational_rate = kIsacWideband;
2194 } else {
2195 encoder_operational_rate = kIsacSuperWideband;
2196 }
2197
2198 if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
2199 BIT_MASK_ENC_INIT) {
2200 if (encoder_operational_rate == kIsacWideband) {
2201 instISAC->bandwidthKHz = isac8kHz;
2202 } else {
2203 instISAC->bandwidthKHz = isac16kHz;
2204 }
2205 } else {
2206 ISACUBStruct* instUB = &(instISAC->instUB);
2207 ISACLBStruct* instLB = &(instISAC->instLB);
2208 int32_t bottleneck = instISAC->bottleneck;
2209 int16_t codingMode = instISAC->codingMode;
2210 int16_t frameSizeMs = instLB->ISACencLB_obj.new_framelength /
2211 (FS / 1000);
2212
2213 if ((encoder_operational_rate == kIsacWideband) &&
2214 (instISAC->encoderSamplingRateKHz == kIsacSuperWideband)) {
2215 /* Changing from super-wideband to wideband.
2216 * we don't need to re-initialize the encoder of the lower-band. */
2217 instISAC->bandwidthKHz = isac8kHz;
2218 if (codingMode == 1) {
2219 ControlLb(instLB,
2220 (bottleneck > 32000) ? 32000 : bottleneck, FRAMESIZE);
2221 }
2222 instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX_60;
2223 instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX_30;
2224 } else if ((encoder_operational_rate == kIsacSuperWideband) &&
2225 (instISAC->encoderSamplingRateKHz == kIsacWideband)) {
2226 double bottleneckLB = 0;
2227 double bottleneckUB = 0;
2228 if (codingMode == 1) {
2229 WebRtcIsac_RateAllocation(bottleneck, &bottleneckLB, &bottleneckUB,
2230 &(instISAC->bandwidthKHz));
2231 }
2232
2233 instISAC->bandwidthKHz = isac16kHz;
2234 instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX;
2235 instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX;
2236
2237 EncoderInitLb(instLB, codingMode, encoder_operational_rate);
2238 EncoderInitUb(instUB, instISAC->bandwidthKHz);
2239
2240 memset(instISAC->analysisFBState1, 0,
2241 FB_STATE_SIZE_WORD32 * sizeof(int32_t));
2242 memset(instISAC->analysisFBState2, 0,
2243 FB_STATE_SIZE_WORD32 * sizeof(int32_t));
2244
2245 if (codingMode == 1) {
2246 instISAC->bottleneck = bottleneck;
2247 ControlLb(instLB, bottleneckLB,
2248 (instISAC->bandwidthKHz == isac8kHz) ? frameSizeMs:FRAMESIZE);
2249 if (instISAC->bandwidthKHz > isac8kHz) {
2250 ControlUb(instUB, bottleneckUB);
2251 }
2252 } else {
2253 instLB->ISACencLB_obj.enforceFrameSize = 0;
2254 instLB->ISACencLB_obj.new_framelength = FRAMESAMPLES;
2255 }
2256 }
2257 }
2258 instISAC->encoderSamplingRateKHz = encoder_operational_rate;
2259 instISAC->in_sample_rate_hz = sample_rate_hz;
2260 return 0;
2261 }
2262
2263
2264 /******************************************************************************
2265 * WebRtcIsac_SetDecSampRate()
2266 * This function sets the sampling rate of the decoder. Initialization of the
2267 * decoder WILL NOT overwrite the sampling rate of the encoder. The default
2268 * value is 16 kHz which is set when the instance is created.
2269 *
2270 * Input:
2271 * - ISAC_main_inst : iSAC instance
2272 * - sample_rate_hz : sampling rate in Hertz, valid values are 16000
2273 * and 32000.
2274 *
2275 * Return value : 0 if successful
2276 * -1 if failed.
2277 */
WebRtcIsac_SetDecSampRate(ISACStruct * ISAC_main_inst,uint16_t sample_rate_hz)2278 int16_t WebRtcIsac_SetDecSampRate(ISACStruct* ISAC_main_inst,
2279 uint16_t sample_rate_hz) {
2280 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
2281 enum IsacSamplingRate decoder_operational_rate;
2282
2283 if (sample_rate_hz == 16000) {
2284 decoder_operational_rate = kIsacWideband;
2285 } else if (sample_rate_hz == 32000) {
2286 decoder_operational_rate = kIsacSuperWideband;
2287 } else {
2288 /* Sampling Frequency is not supported. */
2289 instISAC->errorCode = ISAC_UNSUPPORTED_SAMPLING_FREQUENCY;
2290 return -1;
2291 }
2292
2293 if ((instISAC->decoderSamplingRateKHz == kIsacWideband) &&
2294 (decoder_operational_rate == kIsacSuperWideband)) {
2295 /* Switching from wideband to super-wideband at the decoder
2296 * we need to reset the filter-bank and initialize upper-band decoder. */
2297 memset(instISAC->synthesisFBState1, 0,
2298 FB_STATE_SIZE_WORD32 * sizeof(int32_t));
2299 memset(instISAC->synthesisFBState2, 0,
2300 FB_STATE_SIZE_WORD32 * sizeof(int32_t));
2301
2302 DecoderInitUb(&instISAC->instUB);
2303 }
2304 instISAC->decoderSamplingRateKHz = decoder_operational_rate;
2305 return 0;
2306 }
2307
2308
2309 /******************************************************************************
2310 * WebRtcIsac_EncSampRate()
2311 *
2312 * Input:
2313 * - ISAC_main_inst : iSAC instance
2314 *
2315 * Return value : sampling rate in Hertz. The input to encoder
2316 * is expected to be sampled in this rate.
2317 *
2318 */
WebRtcIsac_EncSampRate(ISACStruct * ISAC_main_inst)2319 uint16_t WebRtcIsac_EncSampRate(ISACStruct* ISAC_main_inst) {
2320 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
2321 return instISAC->in_sample_rate_hz;
2322 }
2323
2324
2325 /******************************************************************************
2326 * WebRtcIsac_DecSampRate()
2327 * Return the sampling rate of the decoded audio.
2328 *
2329 * Input:
2330 * - ISAC_main_inst : iSAC instance
2331 *
2332 * Return value : sampling rate in Hertz. Decoder output is
2333 * sampled at this rate.
2334 *
2335 */
WebRtcIsac_DecSampRate(ISACStruct * ISAC_main_inst)2336 uint16_t WebRtcIsac_DecSampRate(ISACStruct* ISAC_main_inst) {
2337 ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
2338 return instISAC->decoderSamplingRateKHz == kIsacWideband ? 16000 : 32000;
2339 }
2340
WebRtcIsac_GetBandwidthInfo(ISACStruct * inst,IsacBandwidthInfo * bwinfo)2341 void WebRtcIsac_GetBandwidthInfo(ISACStruct* inst,
2342 IsacBandwidthInfo* bwinfo) {
2343 ISACMainStruct* instISAC = (ISACMainStruct*)inst;
2344 assert(instISAC->initFlag & BIT_MASK_DEC_INIT);
2345 WebRtcIsacBw_GetBandwidthInfo(&instISAC->bwestimator_obj,
2346 instISAC->decoderSamplingRateKHz, bwinfo);
2347 }
2348
WebRtcIsac_SetBandwidthInfo(ISACStruct * inst,const IsacBandwidthInfo * bwinfo)2349 void WebRtcIsac_SetBandwidthInfo(ISACStruct* inst,
2350 const IsacBandwidthInfo* bwinfo) {
2351 ISACMainStruct* instISAC = (ISACMainStruct*)inst;
2352 assert(instISAC->initFlag & BIT_MASK_ENC_INIT);
2353 WebRtcIsacBw_SetBandwidthInfo(&instISAC->bwestimator_obj, bwinfo);
2354 }
2355
WebRtcIsac_SetEncSampRateInDecoder(ISACStruct * inst,int sample_rate_hz)2356 void WebRtcIsac_SetEncSampRateInDecoder(ISACStruct* inst,
2357 int sample_rate_hz) {
2358 ISACMainStruct* instISAC = (ISACMainStruct*)inst;
2359 assert(instISAC->initFlag & BIT_MASK_DEC_INIT);
2360 assert(!(instISAC->initFlag & BIT_MASK_ENC_INIT));
2361 assert(sample_rate_hz == 16000 || sample_rate_hz == 32000);
2362 instISAC->encoderSamplingRateKHz = sample_rate_hz / 1000;
2363 }
2364