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