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