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