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 * isacfix.c 13 * 14 * This C file contains the functions for the ISAC API 15 * 16 */ 17 18#include "modules/audio_coding/codecs/isac/fix/interface/isacfix.h" 19 20#include <stdlib.h> 21 22#include "modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h" 23#include "modules/audio_coding/codecs/isac/fix/source/codec.h" 24#include "modules/audio_coding/codecs/isac/fix/source/entropy_coding.h" 25#include "modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.h" 26#include "modules/audio_coding/codecs/isac/fix/source/structs.h" 27#include "system_wrappers/interface/cpu_features_wrapper.h" 28 29 30/************************************************************************** 31 * WebRtcIsacfix_AssignSize(...) 32 * 33 * Functions used when malloc is not allowed 34 * Returns number of bytes needed to allocate for iSAC struct. 35 * 36 */ 37 38WebRtc_Word16 WebRtcIsacfix_AssignSize(int *sizeinbytes) { 39 *sizeinbytes=sizeof(ISACFIX_SubStruct)*2/sizeof(WebRtc_Word16); 40 return(0); 41} 42 43/*************************************************************************** 44 * WebRtcIsacfix_Assign(...) 45 * 46 * Functions used when malloc is not allowed 47 * Place struct at given address 48 * 49 * If successful, Return 0, else Return -1 50 */ 51 52WebRtc_Word16 WebRtcIsacfix_Assign(ISACFIX_MainStruct **inst, void *ISACFIX_inst_Addr) { 53 if (ISACFIX_inst_Addr!=NULL) { 54 *inst = (ISACFIX_MainStruct*)ISACFIX_inst_Addr; 55 (*(ISACFIX_SubStruct**)inst)->errorcode = 0; 56 (*(ISACFIX_SubStruct**)inst)->initflag = 0; 57 (*(ISACFIX_SubStruct**)inst)->ISACenc_obj.SaveEnc_ptr = NULL; 58 return(0); 59 } else { 60 return(-1); 61 } 62} 63 64 65#ifndef ISACFIX_NO_DYNAMIC_MEM 66 67/**************************************************************************** 68 * WebRtcIsacfix_Create(...) 69 * 70 * This function creates a ISAC instance, which will contain the state 71 * information for one coding/decoding channel. 72 * 73 * Input: 74 * - *ISAC_main_inst : a pointer to the coder instance. 75 * 76 * Return value : 0 - Ok 77 * -1 - Error 78 */ 79 80WebRtc_Word16 WebRtcIsacfix_Create(ISACFIX_MainStruct **ISAC_main_inst) 81{ 82 ISACFIX_SubStruct *tempo; 83 tempo = malloc(1 * sizeof(ISACFIX_SubStruct)); 84 *ISAC_main_inst = (ISACFIX_MainStruct *)tempo; 85 if (*ISAC_main_inst!=NULL) { 86 (*(ISACFIX_SubStruct**)ISAC_main_inst)->errorcode = 0; 87 (*(ISACFIX_SubStruct**)ISAC_main_inst)->initflag = 0; 88 (*(ISACFIX_SubStruct**)ISAC_main_inst)->ISACenc_obj.SaveEnc_ptr = NULL; 89 return(0); 90 } else { 91 return(-1); 92 } 93} 94 95 96/**************************************************************************** 97 * WebRtcIsacfix_CreateInternal(...) 98 * 99 * This function creates the memory that is used to store data in the encoder 100 * 101 * Input: 102 * - *ISAC_main_inst : a pointer to the coder instance. 103 * 104 * Return value : 0 - Ok 105 * -1 - Error 106 */ 107 108WebRtc_Word16 WebRtcIsacfix_CreateInternal(ISACFIX_MainStruct *ISAC_main_inst) 109{ 110 ISACFIX_SubStruct *ISAC_inst; 111 112 /* typecast pointer to real structure */ 113 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 114 115 /* Allocate memory for storing encoder data */ 116 ISAC_inst->ISACenc_obj.SaveEnc_ptr = malloc(1 * sizeof(ISAC_SaveEncData_t)); 117 118 if (ISAC_inst->ISACenc_obj.SaveEnc_ptr!=NULL) { 119 return(0); 120 } else { 121 return(-1); 122 } 123} 124 125 126#endif 127 128 129 130/**************************************************************************** 131 * WebRtcIsacfix_Free(...) 132 * 133 * This function frees the ISAC instance created at the beginning. 134 * 135 * Input: 136 * - ISAC_main_inst : a ISAC instance. 137 * 138 * Return value : 0 - Ok 139 * -1 - Error 140 */ 141 142WebRtc_Word16 WebRtcIsacfix_Free(ISACFIX_MainStruct *ISAC_main_inst) 143{ 144 free(ISAC_main_inst); 145 return(0); 146} 147 148/**************************************************************************** 149 * WebRtcIsacfix_FreeInternal(...) 150 * 151 * This function frees the internal memory for storing encoder data. 152 * 153 * Input: 154 * - ISAC_main_inst : a ISAC instance. 155 * 156 * Return value : 0 - Ok 157 * -1 - Error 158 */ 159 160WebRtc_Word16 WebRtcIsacfix_FreeInternal(ISACFIX_MainStruct *ISAC_main_inst) 161{ 162 ISACFIX_SubStruct *ISAC_inst; 163 164 /* typecast pointer to real structure */ 165 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 166 167 /* Release memory */ 168 free(ISAC_inst->ISACenc_obj.SaveEnc_ptr); 169 170 return(0); 171} 172 173/**************************************************************************** 174 * WebRtcAecm_InitNeon(...) 175 * 176 * This function initializes function pointers for ARM Neon platform. 177 */ 178 179#if (defined WEBRTC_DETECT_ARM_NEON || defined WEBRTC_ARCH_ARM_NEON) 180static void WebRtcIsacfix_InitNeon(void) { 181 WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrNeon; 182 WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopNeon; 183 WebRtcIsacfix_CalculateResidualEnergy = 184 WebRtcIsacfix_CalculateResidualEnergyNeon; 185} 186#endif 187 188/**************************************************************************** 189 * WebRtcIsacfix_EncoderInit(...) 190 * 191 * This function initializes a ISAC instance prior to the encoder calls. 192 * 193 * Input: 194 * - ISAC_main_inst : ISAC instance. 195 * - CodingMode : 0 -> Bit rate and frame length are automatically 196 * adjusted to available bandwidth on 197 * transmission channel. 198 * 1 -> User sets a frame length and a target bit 199 * rate which is taken as the maximum short-term 200 * average bit rate. 201 * 202 * Return value : 0 - Ok 203 * -1 - Error 204 */ 205 206WebRtc_Word16 WebRtcIsacfix_EncoderInit(ISACFIX_MainStruct *ISAC_main_inst, 207 WebRtc_Word16 CodingMode) 208{ 209 int k; 210 WebRtc_Word16 statusInit; 211 ISACFIX_SubStruct *ISAC_inst; 212 213 statusInit = 0; 214 /* typecast pointer to rela structure */ 215 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 216 217 /* flag encoder init */ 218 ISAC_inst->initflag |= 2; 219 220 if (CodingMode == 0) 221 /* Adaptive mode */ 222 ISAC_inst->ISACenc_obj.new_framelength = INITIAL_FRAMESAMPLES; 223 else if (CodingMode == 1) 224 /* Instantaneous mode */ 225 ISAC_inst->ISACenc_obj.new_framelength = 480; /* default for I-mode */ 226 else { 227 ISAC_inst->errorcode = ISAC_DISALLOWED_CODING_MODE; 228 statusInit = -1; 229 } 230 231 ISAC_inst->CodingMode = CodingMode; 232 233 WebRtcIsacfix_InitMaskingEnc(&ISAC_inst->ISACenc_obj.maskfiltstr_obj); 234 WebRtcIsacfix_InitPreFilterbank(&ISAC_inst->ISACenc_obj.prefiltbankstr_obj); 235 WebRtcIsacfix_InitPitchFilter(&ISAC_inst->ISACenc_obj.pitchfiltstr_obj); 236 WebRtcIsacfix_InitPitchAnalysis(&ISAC_inst->ISACenc_obj.pitchanalysisstr_obj); 237 238 239 WebRtcIsacfix_InitBandwidthEstimator(&ISAC_inst->bwestimator_obj); 240 WebRtcIsacfix_InitRateModel(&ISAC_inst->ISACenc_obj.rate_data_obj); 241 242 243 ISAC_inst->ISACenc_obj.buffer_index = 0; 244 ISAC_inst->ISACenc_obj.frame_nb = 0; 245 ISAC_inst->ISACenc_obj.BottleNeck = 32000; /* default for I-mode */ 246 ISAC_inst->ISACenc_obj.MaxDelay = 10; /* default for I-mode */ 247 ISAC_inst->ISACenc_obj.current_framesamples = 0; 248 ISAC_inst->ISACenc_obj.s2nr = 0; 249 ISAC_inst->ISACenc_obj.MaxBits = 0; 250 ISAC_inst->ISACenc_obj.bitstr_seed = 4447; 251 ISAC_inst->ISACenc_obj.payloadLimitBytes30 = STREAM_MAXW16_30MS << 1; 252 ISAC_inst->ISACenc_obj.payloadLimitBytes60 = STREAM_MAXW16_60MS << 1; 253 ISAC_inst->ISACenc_obj.maxPayloadBytes = STREAM_MAXW16_60MS << 1; 254 ISAC_inst->ISACenc_obj.maxRateInBytes = STREAM_MAXW16_30MS << 1; 255 ISAC_inst->ISACenc_obj.enforceFrameSize = 0; 256 257 /* Init the bistream data area to zero */ 258 for (k=0; k<STREAM_MAXW16_60MS; k++){ 259 ISAC_inst->ISACenc_obj.bitstr_obj.stream[k] = 0; 260 } 261 262#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED 263 WebRtcIsacfix_InitPostFilterbank(&ISAC_inst->ISACenc_obj.interpolatorstr_obj); 264#endif 265 266 // Initiaze function pointers. 267 WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrC; 268 WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopC; 269 WebRtcIsacfix_CalculateResidualEnergy = 270 WebRtcIsacfix_CalculateResidualEnergyC; 271 272#ifdef WEBRTC_DETECT_ARM_NEON 273 if ((WebRtc_GetCPUFeaturesARM() & kCPUFeatureNEON) != 0) { 274 WebRtcIsacfix_InitNeon(); 275 } 276#elif defined(WEBRTC_ARCH_ARM_NEON) 277 WebRtcIsacfix_InitNeon(); 278#endif 279 280 return statusInit; 281} 282 283/**************************************************************************** 284 * WebRtcIsacfix_Encode(...) 285 * 286 * This function encodes 10ms frame(s) and inserts it into a package. 287 * Input speech length has to be 160 samples (10ms). The encoder buffers those 288 * 10ms frames until it reaches the chosen Framesize (480 or 960 samples 289 * corresponding to 30 or 60 ms frames), and then proceeds to the encoding. 290 * 291 * Input: 292 * - ISAC_main_inst : ISAC instance. 293 * - speechIn : input speech vector. 294 * 295 * Output: 296 * - encoded : the encoded data vector 297 * 298 * Return value: 299 * : >0 - Length (in bytes) of coded data 300 * : 0 - The buffer didn't reach the chosen framesize 301 * so it keeps buffering speech samples. 302 * : -1 - Error 303 */ 304 305WebRtc_Word16 WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst, 306 const WebRtc_Word16 *speechIn, 307 WebRtc_Word16 *encoded) 308{ 309 ISACFIX_SubStruct *ISAC_inst; 310 WebRtc_Word16 stream_len; 311#ifndef WEBRTC_BIG_ENDIAN 312 int k; 313#endif 314 315 /* typecast pointer to rela structure */ 316 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 317 318 319 /* check if encoder initiated */ 320 if ((ISAC_inst->initflag & 2) != 2) { 321 ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED; 322 return (-1); 323 } 324 325 stream_len = WebRtcIsacfix_EncodeImpl((WebRtc_Word16*)speechIn, 326 &ISAC_inst->ISACenc_obj, 327 &ISAC_inst->bwestimator_obj, 328 ISAC_inst->CodingMode); 329 if (stream_len<0) { 330 ISAC_inst->errorcode = - stream_len; 331 return -1; 332 } 333 334 335 /* convert from bytes to WebRtc_Word16 */ 336#ifndef WEBRTC_BIG_ENDIAN 337 for (k=0;k<(stream_len+1)>>1;k++) { 338 encoded[k] = (WebRtc_Word16)( ( (WebRtc_UWord16)(ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] >> 8 ) 339 | (((ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] & 0x00FF) << 8)); 340 } 341 342#else 343 WEBRTC_SPL_MEMCPY_W16(encoded, (ISAC_inst->ISACenc_obj.bitstr_obj).stream, (stream_len + 1)>>1); 344#endif 345 346 347 348 return stream_len; 349 350} 351 352 353 354 355/**************************************************************************** 356 * WebRtcIsacfix_EncodeNb(...) 357 * 358 * This function encodes 10ms narrow band (8 kHz sampling) frame(s) and inserts 359 * it into a package. Input speech length has to be 80 samples (10ms). The encoder 360 * interpolates into wide-band (16 kHz sampling) buffers those 361 * 10ms frames until it reaches the chosen Framesize (480 or 960 wide-band samples 362 * corresponding to 30 or 60 ms frames), and then proceeds to the encoding. 363 * 364 * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined 365 * 366 * Input: 367 * - ISAC_main_inst : ISAC instance. 368 * - speechIn : input speech vector. 369 * 370 * Output: 371 * - encoded : the encoded data vector 372 * 373 * Return value: 374 * : >0 - Length (in bytes) of coded data 375 * : 0 - The buffer didn't reach the chosen framesize 376 * so it keeps buffering speech samples. 377 * : -1 - Error 378 */ 379#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED 380WebRtc_Word16 WebRtcIsacfix_EncodeNb(ISACFIX_MainStruct *ISAC_main_inst, 381 const WebRtc_Word16 *speechIn, 382 WebRtc_Word16 *encoded) 383{ 384 ISACFIX_SubStruct *ISAC_inst; 385 WebRtc_Word16 stream_len; 386 WebRtc_Word16 speechInWB[FRAMESAMPLES_10ms]; 387 WebRtc_Word16 Vector_Word16_1[FRAMESAMPLES_10ms/2]; 388 WebRtc_Word16 Vector_Word16_2[FRAMESAMPLES_10ms/2]; 389 390 int k; 391 392 393 /* typecast pointer to rela structure */ 394 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 395 396 397 /* check if encoder initiated */ 398 if ((ISAC_inst->initflag & 2) != 2) { 399 ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED; 400 return (-1); 401 } 402 403 404 /* Oversample to WB */ 405 406 /* Form polyphase signals, and compensate for DC offset */ 407 for (k=0;k<FRAMESAMPLES_10ms/2;k++) { 408 Vector_Word16_1[k] = speechIn[k] + 1; 409 Vector_Word16_2[k] = speechIn[k]; 410 } 411 WebRtcIsacfix_FilterAndCombine2(Vector_Word16_1, Vector_Word16_2, speechInWB, &ISAC_inst->ISACenc_obj.interpolatorstr_obj, FRAMESAMPLES_10ms); 412 413 414 /* Encode WB signal */ 415 stream_len = WebRtcIsacfix_EncodeImpl((WebRtc_Word16*)speechInWB, 416 &ISAC_inst->ISACenc_obj, 417 &ISAC_inst->bwestimator_obj, 418 ISAC_inst->CodingMode); 419 if (stream_len<0) { 420 ISAC_inst->errorcode = - stream_len; 421 return -1; 422 } 423 424 425 /* convert from bytes to WebRtc_Word16 */ 426#ifndef WEBRTC_BIG_ENDIAN 427 for (k=0;k<(stream_len+1)>>1;k++) { 428 encoded[k] = (WebRtc_Word16)(((WebRtc_UWord16)(ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] >> 8) 429 | (((ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] & 0x00FF) << 8)); 430 } 431 432#else 433 WEBRTC_SPL_MEMCPY_W16(encoded, (ISAC_inst->ISACenc_obj.bitstr_obj).stream, (stream_len + 1)>>1); 434#endif 435 436 437 438 return stream_len; 439} 440#endif /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */ 441 442 443/**************************************************************************** 444 * WebRtcIsacfix_GetNewBitStream(...) 445 * 446 * This function returns encoded data, with the recieved bwe-index in the 447 * stream. It should always return a complete packet, i.e. only called once 448 * even for 60 msec frames 449 * 450 * Input: 451 * - ISAC_main_inst : ISAC instance. 452 * - bweIndex : index of bandwidth estimate to put in new bitstream 453 * 454 * Output: 455 * - encoded : the encoded data vector 456 * 457 * Return value: 458 * : >0 - Length (in bytes) of coded data 459 * : -1 - Error 460 */ 461 462WebRtc_Word16 WebRtcIsacfix_GetNewBitStream(ISACFIX_MainStruct *ISAC_main_inst, 463 WebRtc_Word16 bweIndex, 464 float scale, 465 WebRtc_Word16 *encoded) 466{ 467 ISACFIX_SubStruct *ISAC_inst; 468 WebRtc_Word16 stream_len; 469#ifndef WEBRTC_BIG_ENDIAN 470 int k; 471#endif 472 473 /* typecast pointer to rela structure */ 474 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 475 476 477 /* check if encoder initiated */ 478 if ((ISAC_inst->initflag & 2) != 2) { 479 ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED; 480 return (-1); 481 } 482 483 stream_len = WebRtcIsacfix_EncodeStoredData(&ISAC_inst->ISACenc_obj, 484 bweIndex, 485 scale); 486 if (stream_len<0) { 487 ISAC_inst->errorcode = - stream_len; 488 return -1; 489 } 490 491#ifndef WEBRTC_BIG_ENDIAN 492 for (k=0;k<(stream_len+1)>>1;k++) { 493 encoded[k] = (WebRtc_Word16)( ( (WebRtc_UWord16)(ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] >> 8 ) 494 | (((ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] & 0x00FF) << 8)); 495 } 496 497#else 498 WEBRTC_SPL_MEMCPY_W16(encoded, (ISAC_inst->ISACenc_obj.bitstr_obj).stream, (stream_len + 1)>>1); 499#endif 500 501 return stream_len; 502 503} 504 505 506 507/**************************************************************************** 508 * WebRtcIsacfix_DecoderInit(...) 509 * 510 * This function initializes a ISAC instance prior to the decoder calls. 511 * 512 * Input: 513 * - ISAC_main_inst : ISAC instance. 514 * 515 * Return value 516 * : 0 - Ok 517 * -1 - Error 518 */ 519 520WebRtc_Word16 WebRtcIsacfix_DecoderInit(ISACFIX_MainStruct *ISAC_main_inst) 521{ 522 ISACFIX_SubStruct *ISAC_inst; 523 524 /* typecast pointer to real structure */ 525 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 526 527 /* flag decoder init */ 528 ISAC_inst->initflag |= 1; 529 530 531 WebRtcIsacfix_InitMaskingDec(&ISAC_inst->ISACdec_obj.maskfiltstr_obj); 532 WebRtcIsacfix_InitPostFilterbank(&ISAC_inst->ISACdec_obj.postfiltbankstr_obj); 533 WebRtcIsacfix_InitPitchFilter(&ISAC_inst->ISACdec_obj.pitchfiltstr_obj); 534 535 /* TS */ 536 WebRtcIsacfix_InitPlc( &ISAC_inst->ISACdec_obj.plcstr_obj ); 537 538 539#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED 540 WebRtcIsacfix_InitPreFilterbank(&ISAC_inst->ISACdec_obj.decimatorstr_obj); 541#endif 542 543 return 0; 544} 545 546 547/**************************************************************************** 548 * WebRtcIsacfix_UpdateBwEstimate1(...) 549 * 550 * This function updates the estimate of the bandwidth. 551 * 552 * Input: 553 * - ISAC_main_inst : ISAC instance. 554 * - encoded : encoded ISAC frame(s). 555 * - packet_size : size of the packet. 556 * - rtp_seq_number : the RTP number of the packet. 557 * - arr_ts : the arrival time of the packet (from NetEq) 558 * in samples. 559 * 560 * Return value : 0 - Ok 561 * -1 - Error 562 */ 563 564WebRtc_Word16 WebRtcIsacfix_UpdateBwEstimate1(ISACFIX_MainStruct *ISAC_main_inst, 565 const WebRtc_UWord16 *encoded, 566 WebRtc_Word32 packet_size, 567 WebRtc_UWord16 rtp_seq_number, 568 WebRtc_UWord32 arr_ts) 569{ 570 ISACFIX_SubStruct *ISAC_inst; 571 Bitstr_dec streamdata; 572 WebRtc_UWord16 partOfStream[5]; 573#ifndef WEBRTC_BIG_ENDIAN 574 int k; 575#endif 576 WebRtc_Word16 err; 577 578 /* Set stream pointer to point at partOfStream */ 579 streamdata.stream = (WebRtc_UWord16 *)partOfStream; 580 581 /* typecast pointer to real structure */ 582 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 583 584 /* Sanity check of packet length */ 585 if (packet_size <= 0) { 586 /* return error code if the packet length is null or less */ 587 ISAC_inst->errorcode = ISAC_EMPTY_PACKET; 588 return -1; 589 } else if (packet_size > (STREAM_MAXW16<<1)) { 590 /* return error code if length of stream is too long */ 591 ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH; 592 return -1; 593 } 594 595 /* check if decoder initiated */ 596 if ((ISAC_inst->initflag & 1) != 1) { 597 ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED; 598 return (-1); 599 } 600 601 streamdata.W_upper = 0xFFFFFFFF; 602 streamdata.streamval = 0; 603 streamdata.stream_index = 0; 604 streamdata.full = 1; 605 606#ifndef WEBRTC_BIG_ENDIAN 607 for (k=0; k<5; k++) { 608 streamdata.stream[k] = (WebRtc_UWord16) (((WebRtc_UWord16)encoded[k] >> 8)|((encoded[k] & 0xFF)<<8)); 609 } 610#else 611 memcpy(streamdata.stream, encoded, 5); 612#endif 613 614 if (packet_size == 0) 615 { 616 /* return error code if the packet length is null */ 617 ISAC_inst->errorcode = ISAC_EMPTY_PACKET; 618 return -1; 619 } 620 621 err = WebRtcIsacfix_EstimateBandwidth(&ISAC_inst->bwestimator_obj, 622 &streamdata, 623 packet_size, 624 rtp_seq_number, 625 0, 626 arr_ts); 627 628 629 if (err < 0) 630 { 631 /* return error code if something went wrong */ 632 ISAC_inst->errorcode = -err; 633 return -1; 634 } 635 636 637 return 0; 638} 639 640/**************************************************************************** 641 * WebRtcIsacfix_UpdateBwEstimate(...) 642 * 643 * This function updates the estimate of the bandwidth. 644 * 645 * Input: 646 * - ISAC_main_inst : ISAC instance. 647 * - encoded : encoded ISAC frame(s). 648 * - packet_size : size of the packet. 649 * - rtp_seq_number : the RTP number of the packet. 650 * - send_ts : Send Time Stamp from RTP header 651 * - arr_ts : the arrival time of the packet (from NetEq) 652 * in samples. 653 * 654 * Return value : 0 - Ok 655 * -1 - Error 656 */ 657 658WebRtc_Word16 WebRtcIsacfix_UpdateBwEstimate(ISACFIX_MainStruct *ISAC_main_inst, 659 const WebRtc_UWord16 *encoded, 660 WebRtc_Word32 packet_size, 661 WebRtc_UWord16 rtp_seq_number, 662 WebRtc_UWord32 send_ts, 663 WebRtc_UWord32 arr_ts) 664{ 665 ISACFIX_SubStruct *ISAC_inst; 666 Bitstr_dec streamdata; 667 WebRtc_UWord16 partOfStream[5]; 668#ifndef WEBRTC_BIG_ENDIAN 669 int k; 670#endif 671 WebRtc_Word16 err; 672 673 /* Set stream pointer to point at partOfStream */ 674 streamdata.stream = (WebRtc_UWord16 *)partOfStream; 675 676 /* typecast pointer to real structure */ 677 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 678 679 /* Sanity check of packet length */ 680 if (packet_size <= 0) { 681 /* return error code if the packet length is null or less */ 682 ISAC_inst->errorcode = ISAC_EMPTY_PACKET; 683 return -1; 684 } else if (packet_size > (STREAM_MAXW16<<1)) { 685 /* return error code if length of stream is too long */ 686 ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH; 687 return -1; 688 } 689 690 /* check if decoder initiated */ 691 if ((ISAC_inst->initflag & 1) != 1) { 692 ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED; 693 return (-1); 694 } 695 696 streamdata.W_upper = 0xFFFFFFFF; 697 streamdata.streamval = 0; 698 streamdata.stream_index = 0; 699 streamdata.full = 1; 700 701#ifndef WEBRTC_BIG_ENDIAN 702 for (k=0; k<5; k++) { 703 streamdata.stream[k] = (WebRtc_UWord16) ((encoded[k] >> 8)|((encoded[k] & 0xFF)<<8)); 704 } 705#else 706 memcpy(streamdata.stream, encoded, 5); 707#endif 708 709 if (packet_size == 0) 710 { 711 /* return error code if the packet length is null */ 712 ISAC_inst->errorcode = ISAC_EMPTY_PACKET; 713 return -1; 714 } 715 716 err = WebRtcIsacfix_EstimateBandwidth(&ISAC_inst->bwestimator_obj, 717 &streamdata, 718 packet_size, 719 rtp_seq_number, 720 send_ts, 721 arr_ts); 722 723 if (err < 0) 724 { 725 /* return error code if something went wrong */ 726 ISAC_inst->errorcode = -err; 727 return -1; 728 } 729 730 731 return 0; 732} 733 734/**************************************************************************** 735 * WebRtcIsacfix_Decode(...) 736 * 737 * This function decodes a ISAC frame. Output speech length 738 * will be a multiple of 480 samples: 480 or 960 samples, 739 * depending on the framesize (30 or 60 ms). 740 * 741 * Input: 742 * - ISAC_main_inst : ISAC instance. 743 * - encoded : encoded ISAC frame(s) 744 * - len : bytes in encoded vector 745 * 746 * Output: 747 * - decoded : The decoded vector 748 * 749 * Return value : >0 - number of samples in decoded vector 750 * -1 - Error 751 */ 752 753 754WebRtc_Word16 WebRtcIsacfix_Decode(ISACFIX_MainStruct *ISAC_main_inst, 755 const WebRtc_UWord16 *encoded, 756 WebRtc_Word16 len, 757 WebRtc_Word16 *decoded, 758 WebRtc_Word16 *speechType) 759{ 760 ISACFIX_SubStruct *ISAC_inst; 761 /* number of samples (480 or 960), output from decoder */ 762 /* that were actually used in the encoder/decoder (determined on the fly) */ 763 WebRtc_Word16 number_of_samples; 764#ifndef WEBRTC_BIG_ENDIAN 765 int k; 766#endif 767 WebRtc_Word16 declen = 0; 768 769 /* typecast pointer to real structure */ 770 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 771 772 /* check if decoder initiated */ 773 if ((ISAC_inst->initflag & 1) != 1) { 774 ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED; 775 return (-1); 776 } 777 778 /* Sanity check of packet length */ 779 if (len <= 0) { 780 /* return error code if the packet length is null or less */ 781 ISAC_inst->errorcode = ISAC_EMPTY_PACKET; 782 return -1; 783 } else if (len > (STREAM_MAXW16<<1)) { 784 /* return error code if length of stream is too long */ 785 ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH; 786 return -1; 787 } 788 789 (ISAC_inst->ISACdec_obj.bitstr_obj).stream = (WebRtc_UWord16 *)encoded; 790 791 /* convert bitstream from WebRtc_Word16 to bytes */ 792#ifndef WEBRTC_BIG_ENDIAN 793 for (k=0; k<(len>>1); k++) { 794 (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (WebRtc_UWord16) ((encoded[k] >> 8)|((encoded[k] & 0xFF)<<8)); 795 } 796 if (len & 0x0001) 797 (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (WebRtc_UWord16) ((encoded[k] & 0xFF)<<8); 798#endif 799 800 /* added for NetEq purposes (VAD/DTX related) */ 801 *speechType=1; 802 803 declen = WebRtcIsacfix_DecodeImpl(decoded,&ISAC_inst->ISACdec_obj, &number_of_samples); 804 805 if (declen < 0) { 806 /* Some error inside the decoder */ 807 ISAC_inst->errorcode = -declen; 808 memset(decoded, 0, sizeof(WebRtc_Word16) * MAX_FRAMESAMPLES); 809 return -1; 810 } 811 812 /* error check */ 813 814 if (declen & 0x0001) { 815 if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) & 0x00FF) ) { 816 ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH; 817 memset(decoded, 0, sizeof(WebRtc_Word16) * number_of_samples); 818 return -1; 819 } 820 } else { 821 if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) >> 8) ) { 822 ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH; 823 memset(decoded, 0, sizeof(WebRtc_Word16) * number_of_samples); 824 return -1; 825 } 826 } 827 828 return number_of_samples; 829} 830 831 832 833 834 835/**************************************************************************** 836 * WebRtcIsacfix_DecodeNb(...) 837 * 838 * This function decodes a ISAC frame in narrow-band (8 kHz sampling). 839 * Output speech length will be a multiple of 240 samples: 240 or 480 samples, 840 * depending on the framesize (30 or 60 ms). 841 * 842 * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined 843 * 844 * Input: 845 * - ISAC_main_inst : ISAC instance. 846 * - encoded : encoded ISAC frame(s) 847 * - len : bytes in encoded vector 848 * 849 * Output: 850 * - decoded : The decoded vector 851 * 852 * Return value : >0 - number of samples in decoded vector 853 * -1 - Error 854 */ 855 856#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED 857WebRtc_Word16 WebRtcIsacfix_DecodeNb(ISACFIX_MainStruct *ISAC_main_inst, 858 const WebRtc_UWord16 *encoded, 859 WebRtc_Word16 len, 860 WebRtc_Word16 *decoded, 861 WebRtc_Word16 *speechType) 862{ 863 ISACFIX_SubStruct *ISAC_inst; 864 /* twice the number of samples (480 or 960), output from decoder */ 865 /* that were actually used in the encoder/decoder (determined on the fly) */ 866 WebRtc_Word16 number_of_samples; 867#ifndef WEBRTC_BIG_ENDIAN 868 int k; 869#endif 870 WebRtc_Word16 declen = 0; 871 WebRtc_Word16 dummy[FRAMESAMPLES/2]; 872 873 874 /* typecast pointer to real structure */ 875 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 876 877 /* check if decoder initiated */ 878 if ((ISAC_inst->initflag & 1) != 1) { 879 ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED; 880 return (-1); 881 } 882 883 if (len == 0) 884 { /* return error code if the packet length is null */ 885 886 ISAC_inst->errorcode = ISAC_EMPTY_PACKET; 887 return -1; 888 } 889 890 (ISAC_inst->ISACdec_obj.bitstr_obj).stream = (WebRtc_UWord16 *)encoded; 891 892 /* convert bitstream from WebRtc_Word16 to bytes */ 893#ifndef WEBRTC_BIG_ENDIAN 894 for (k=0; k<(len>>1); k++) { 895 (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (WebRtc_UWord16) ((encoded[k] >> 8)|((encoded[k] & 0xFF)<<8)); 896 } 897 if (len & 0x0001) 898 (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (WebRtc_UWord16) ((encoded[k] & 0xFF)<<8); 899#endif 900 901 /* added for NetEq purposes (VAD/DTX related) */ 902 *speechType=1; 903 904 declen = WebRtcIsacfix_DecodeImpl(decoded,&ISAC_inst->ISACdec_obj, &number_of_samples); 905 906 if (declen < 0) { 907 /* Some error inside the decoder */ 908 ISAC_inst->errorcode = -declen; 909 memset(decoded, 0, sizeof(WebRtc_Word16) * FRAMESAMPLES); 910 return -1; 911 } 912 913 /* error check */ 914 915 if (declen & 0x0001) { 916 if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) & 0x00FF) ) { 917 ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH; 918 memset(decoded, 0, sizeof(WebRtc_Word16) * number_of_samples); 919 return -1; 920 } 921 } else { 922 if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) >> 8) ) { 923 ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH; 924 memset(decoded, 0, sizeof(WebRtc_Word16) * number_of_samples); 925 return -1; 926 } 927 } 928 929 WebRtcIsacfix_SplitAndFilter2(decoded, decoded, dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj); 930 931 if (number_of_samples>FRAMESAMPLES) { 932 WebRtcIsacfix_SplitAndFilter2(decoded + FRAMESAMPLES, decoded + FRAMESAMPLES/2, 933 dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj); 934 } 935 936 return number_of_samples/2; 937} 938#endif /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */ 939 940 941/**************************************************************************** 942 * WebRtcIsacfix_DecodePlcNb(...) 943 * 944 * This function conducts PLC for ISAC frame(s) in narrow-band (8kHz sampling). 945 * Output speech length will be "240*noOfLostFrames" samples 946 * that is equevalent of "30*noOfLostFrames" millisecond. 947 * 948 * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined 949 * 950 * Input: 951 * - ISAC_main_inst : ISAC instance. 952 * - noOfLostFrames : Number of PLC frames (240 sample=30ms) to produce 953 * 954 * Output: 955 * - decoded : The decoded vector 956 * 957 * Return value : >0 - number of samples in decoded PLC vector 958 * -1 - Error 959 */ 960 961#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED 962WebRtc_Word16 WebRtcIsacfix_DecodePlcNb(ISACFIX_MainStruct *ISAC_main_inst, 963 WebRtc_Word16 *decoded, 964 WebRtc_Word16 noOfLostFrames ) 965{ 966 WebRtc_Word16 no_of_samples, declen, k, ok; 967 WebRtc_Word16 outframeNB[FRAMESAMPLES]; 968 WebRtc_Word16 outframeWB[FRAMESAMPLES]; 969 WebRtc_Word16 dummy[FRAMESAMPLES/2]; 970 971 972 ISACFIX_SubStruct *ISAC_inst; 973 /* typecast pointer to real structure */ 974 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 975 976 /* Limit number of frames to two = 60 msec. Otherwise we exceed data vectors */ 977 if (noOfLostFrames > 2){ 978 noOfLostFrames = 2; 979 } 980 981 k = 0; 982 declen = 0; 983 while( noOfLostFrames > 0 ) 984 { 985 ok = WebRtcIsacfix_DecodePlcImpl( outframeWB, &ISAC_inst->ISACdec_obj, &no_of_samples ); 986 if(ok) 987 return -1; 988 989 WebRtcIsacfix_SplitAndFilter2(outframeWB, &(outframeNB[k*240]), dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj); 990 991 declen += no_of_samples; 992 noOfLostFrames--; 993 k++; 994 } 995 996 declen>>=1; 997 998 for (k=0;k<declen;k++) { 999 decoded[k] = outframeNB[k]; 1000 } 1001 1002 return declen; 1003} 1004#endif /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */ 1005 1006 1007 1008 1009/**************************************************************************** 1010 * WebRtcIsacfix_DecodePlc(...) 1011 * 1012 * This function conducts PLC for ISAC frame(s) in wide-band (16kHz sampling). 1013 * Output speech length will be "480*noOfLostFrames" samples 1014 * that is equevalent of "30*noOfLostFrames" millisecond. 1015 * 1016 * Input: 1017 * - ISAC_main_inst : ISAC instance. 1018 * - noOfLostFrames : Number of PLC frames (480sample = 30ms) 1019 * to produce 1020 * 1021 * Output: 1022 * - decoded : The decoded vector 1023 * 1024 * Return value : >0 - number of samples in decoded PLC vector 1025 * -1 - Error 1026 */ 1027 1028WebRtc_Word16 WebRtcIsacfix_DecodePlc(ISACFIX_MainStruct *ISAC_main_inst, 1029 WebRtc_Word16 *decoded, 1030 WebRtc_Word16 noOfLostFrames) 1031{ 1032 1033 WebRtc_Word16 no_of_samples, declen, k, ok; 1034 WebRtc_Word16 outframe16[MAX_FRAMESAMPLES]; 1035 1036 ISACFIX_SubStruct *ISAC_inst; 1037 /* typecast pointer to real structure */ 1038 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 1039 1040 /* Limit number of frames to two = 60 msec. Otherwise we exceed data vectors */ 1041 if (noOfLostFrames > 2) { 1042 noOfLostFrames = 2; 1043 } 1044 k = 0; 1045 declen = 0; 1046 while( noOfLostFrames > 0 ) 1047 { 1048 ok = WebRtcIsacfix_DecodePlcImpl( &(outframe16[k*480]), &ISAC_inst->ISACdec_obj, &no_of_samples ); 1049 if(ok) 1050 return -1; 1051 declen += no_of_samples; 1052 noOfLostFrames--; 1053 k++; 1054 } 1055 1056 for (k=0;k<declen;k++) { 1057 decoded[k] = outframe16[k]; 1058 } 1059 1060 return declen; 1061} 1062 1063 1064/**************************************************************************** 1065 * WebRtcIsacfix_Control(...) 1066 * 1067 * This function sets the limit on the short-term average bit rate and the 1068 * frame length. Should be used only in Instantaneous mode. 1069 * 1070 * Input: 1071 * - ISAC_main_inst : ISAC instance. 1072 * - rate : limit on the short-term average bit rate, 1073 * in bits/second (between 10000 and 32000) 1074 * - framesize : number of milliseconds per frame (30 or 60) 1075 * 1076 * Return value : 0 - ok 1077 * -1 - Error 1078 */ 1079 1080WebRtc_Word16 WebRtcIsacfix_Control(ISACFIX_MainStruct *ISAC_main_inst, 1081 WebRtc_Word16 rate, 1082 WebRtc_Word16 framesize) 1083{ 1084 ISACFIX_SubStruct *ISAC_inst; 1085 /* typecast pointer to real structure */ 1086 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 1087 1088 if (ISAC_inst->CodingMode == 0) 1089 { 1090 /* in adaptive mode */ 1091 ISAC_inst->errorcode = ISAC_MODE_MISMATCH; 1092 return -1; 1093 } 1094 1095 1096 if (rate >= 10000 && rate <= 32000) 1097 ISAC_inst->ISACenc_obj.BottleNeck = rate; 1098 else { 1099 ISAC_inst->errorcode = ISAC_DISALLOWED_BOTTLENECK; 1100 return -1; 1101 } 1102 1103 1104 1105 if (framesize == 30 || framesize == 60) 1106 ISAC_inst->ISACenc_obj.new_framelength = (FS/1000) * framesize; 1107 else { 1108 ISAC_inst->errorcode = ISAC_DISALLOWED_FRAME_LENGTH; 1109 return -1; 1110 } 1111 1112 return 0; 1113} 1114 1115 1116/**************************************************************************** 1117 * WebRtcIsacfix_ControlBwe(...) 1118 * 1119 * This function sets the initial values of bottleneck and frame-size if 1120 * iSAC is used in channel-adaptive mode. Through this API, users can 1121 * enforce a frame-size for all values of bottleneck. Then iSAC will not 1122 * automatically change the frame-size. 1123 * 1124 * 1125 * Input: 1126 * - ISAC_main_inst : ISAC instance. 1127 * - rateBPS : initial value of bottleneck in bits/second 1128 * 10000 <= rateBPS <= 32000 is accepted 1129 * For default bottleneck set rateBPS = 0 1130 * - frameSizeMs : number of milliseconds per frame (30 or 60) 1131 * - enforceFrameSize : 1 to enforce the given frame-size through out 1132 * the adaptation process, 0 to let iSAC change 1133 * the frame-size if required. 1134 * 1135 * Return value : 0 - ok 1136 * -1 - Error 1137 */ 1138 1139WebRtc_Word16 WebRtcIsacfix_ControlBwe(ISACFIX_MainStruct *ISAC_main_inst, 1140 WebRtc_Word16 rateBPS, 1141 WebRtc_Word16 frameSizeMs, 1142 WebRtc_Word16 enforceFrameSize) 1143{ 1144 ISACFIX_SubStruct *ISAC_inst; 1145 /* Typecast pointer to real structure */ 1146 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 1147 1148 /* check if encoder initiated */ 1149 if ((ISAC_inst->initflag & 2) != 2) { 1150 ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED; 1151 return (-1); 1152 } 1153 1154 /* Check that we are in channel-adaptive mode, otherwise, return -1 */ 1155 if (ISAC_inst->CodingMode != 0) { 1156 ISAC_inst->errorcode = ISAC_MODE_MISMATCH; 1157 return (-1); 1158 } 1159 1160 /* Set struct variable if enforceFrameSize is set. ISAC will then keep the */ 1161 /* chosen frame size. */ 1162 ISAC_inst->ISACenc_obj.enforceFrameSize = (enforceFrameSize != 0)? 1:0; 1163 1164 /* Set initial rate, if value between 10000 and 32000, */ 1165 /* if rateBPS is 0, keep the default initial bottleneck value (15000) */ 1166 if ((rateBPS >= 10000) && (rateBPS <= 32000)) { 1167 ISAC_inst->bwestimator_obj.sendBwAvg = (((WebRtc_UWord32)rateBPS) << 7); 1168 } else if (rateBPS != 0) { 1169 ISAC_inst->errorcode = ISAC_DISALLOWED_BOTTLENECK; 1170 return -1; 1171 } 1172 1173 /* Set initial framesize. If enforceFrameSize is set the frame size will not change */ 1174 if ((frameSizeMs == 30) || (frameSizeMs == 60)) { 1175 ISAC_inst->ISACenc_obj.new_framelength = (FS/1000) * frameSizeMs; 1176 } else { 1177 ISAC_inst->errorcode = ISAC_DISALLOWED_FRAME_LENGTH; 1178 return -1; 1179 } 1180 1181 return 0; 1182} 1183 1184 1185 1186 1187 1188/**************************************************************************** 1189 * WebRtcIsacfix_GetDownLinkBwIndex(...) 1190 * 1191 * This function returns index representing the Bandwidth estimate from 1192 * other side to this side. 1193 * 1194 * Input: 1195 * - ISAC_main_inst: iSAC struct 1196 * 1197 * Output: 1198 * - rateIndex : Bandwidth estimate to transmit to other side. 1199 * 1200 */ 1201 1202WebRtc_Word16 WebRtcIsacfix_GetDownLinkBwIndex(ISACFIX_MainStruct* ISAC_main_inst, 1203 WebRtc_Word16* rateIndex) 1204{ 1205 ISACFIX_SubStruct *ISAC_inst; 1206 1207 /* typecast pointer to real structure */ 1208 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 1209 1210 /* Call function to get Bandwidth Estimate */ 1211 *rateIndex = WebRtcIsacfix_GetDownlinkBwIndexImpl(&ISAC_inst->bwestimator_obj); 1212 1213 return 0; 1214} 1215 1216 1217/**************************************************************************** 1218 * WebRtcIsacfix_UpdateUplinkBw(...) 1219 * 1220 * This function takes an index representing the Bandwidth estimate from 1221 * this side to other side and updates BWE. 1222 * 1223 * Input: 1224 * - ISAC_main_inst: iSAC struct 1225 * - rateIndex : Bandwidth estimate from other side. 1226 * 1227 */ 1228 1229WebRtc_Word16 WebRtcIsacfix_UpdateUplinkBw(ISACFIX_MainStruct* ISAC_main_inst, 1230 WebRtc_Word16 rateIndex) 1231{ 1232 WebRtc_Word16 err = 0; 1233 ISACFIX_SubStruct *ISAC_inst; 1234 1235 /* typecast pointer to real structure */ 1236 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 1237 1238 /* Call function to update BWE with received Bandwidth Estimate */ 1239 err = WebRtcIsacfix_UpdateUplinkBwRec(&ISAC_inst->bwestimator_obj, rateIndex); 1240 if (err < 0) { 1241 ISAC_inst->errorcode = -err; 1242 return (-1); 1243 } 1244 1245 return 0; 1246} 1247 1248/**************************************************************************** 1249 * WebRtcIsacfix_ReadFrameLen(...) 1250 * 1251 * This function returns the length of the frame represented in the packet. 1252 * 1253 * Input: 1254 * - encoded : Encoded bitstream 1255 * 1256 * Output: 1257 * - frameLength : Length of frame in packet (in samples) 1258 * 1259 */ 1260 1261WebRtc_Word16 WebRtcIsacfix_ReadFrameLen(const WebRtc_Word16* encoded, 1262 WebRtc_Word16* frameLength) 1263{ 1264 Bitstr_dec streamdata; 1265 WebRtc_UWord16 partOfStream[5]; 1266#ifndef WEBRTC_BIG_ENDIAN 1267 int k; 1268#endif 1269 WebRtc_Word16 err; 1270 1271 /* Set stream pointer to point at partOfStream */ 1272 streamdata.stream = (WebRtc_UWord16 *)partOfStream; 1273 1274 streamdata.W_upper = 0xFFFFFFFF; 1275 streamdata.streamval = 0; 1276 streamdata.stream_index = 0; 1277 streamdata.full = 1; 1278 1279#ifndef WEBRTC_BIG_ENDIAN 1280 for (k=0; k<5; k++) { 1281 streamdata.stream[k] = (WebRtc_UWord16) (((WebRtc_UWord16)encoded[k] >> 8)|((encoded[k] & 0xFF)<<8)); 1282 } 1283#else 1284 memcpy(streamdata.stream, encoded, 5); 1285#endif 1286 1287 /* decode frame length */ 1288 err = WebRtcIsacfix_DecodeFrameLen(&streamdata, frameLength); 1289 if (err<0) // error check 1290 return err; 1291 1292 return 0; 1293} 1294 1295 1296/**************************************************************************** 1297 * WebRtcIsacfix_ReadBwIndex(...) 1298 * 1299 * This function returns the index of the Bandwidth estimate from the bitstream. 1300 * 1301 * Input: 1302 * - encoded : Encoded bitstream 1303 * 1304 * Output: 1305 * - frameLength : Length of frame in packet (in samples) 1306 * - rateIndex : Bandwidth estimate in bitstream 1307 * 1308 */ 1309 1310WebRtc_Word16 WebRtcIsacfix_ReadBwIndex(const WebRtc_Word16* encoded, 1311 WebRtc_Word16* rateIndex) 1312{ 1313 Bitstr_dec streamdata; 1314 WebRtc_UWord16 partOfStream[5]; 1315#ifndef WEBRTC_BIG_ENDIAN 1316 int k; 1317#endif 1318 WebRtc_Word16 err; 1319 1320 /* Set stream pointer to point at partOfStream */ 1321 streamdata.stream = (WebRtc_UWord16 *)partOfStream; 1322 1323 streamdata.W_upper = 0xFFFFFFFF; 1324 streamdata.streamval = 0; 1325 streamdata.stream_index = 0; 1326 streamdata.full = 1; 1327 1328#ifndef WEBRTC_BIG_ENDIAN 1329 for (k=0; k<5; k++) { 1330 streamdata.stream[k] = (WebRtc_UWord16) (((WebRtc_UWord16)encoded[k] >> 8)|((encoded[k] & 0xFF)<<8)); 1331 } 1332#else 1333 memcpy(streamdata.stream, encoded, 5); 1334#endif 1335 1336 /* decode frame length, needed to get to the rateIndex in the bitstream */ 1337 err = WebRtcIsacfix_DecodeFrameLen(&streamdata, rateIndex); 1338 if (err<0) // error check 1339 return err; 1340 1341 /* decode BW estimation */ 1342 err = WebRtcIsacfix_DecodeSendBandwidth(&streamdata, rateIndex); 1343 if (err<0) // error check 1344 return err; 1345 1346 return 0; 1347} 1348 1349 1350 1351 1352/**************************************************************************** 1353 * WebRtcIsacfix_GetErrorCode(...) 1354 * 1355 * This function can be used to check the error code of an iSAC instance. When 1356 * a function returns -1 a error code will be set for that instance. The 1357 * function below extract the code of the last error that occured in the 1358 * specified instance. 1359 * 1360 * Input: 1361 * - ISAC_main_inst : ISAC instance 1362 * 1363 * Return value : Error code 1364 */ 1365 1366WebRtc_Word16 WebRtcIsacfix_GetErrorCode(ISACFIX_MainStruct *ISAC_main_inst) 1367{ 1368 ISACFIX_SubStruct *ISAC_inst; 1369 /* typecast pointer to real structure */ 1370 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 1371 1372 return ISAC_inst->errorcode; 1373} 1374 1375 1376 1377/**************************************************************************** 1378 * WebRtcIsacfix_GetUplinkBw(...) 1379 * 1380 * This function returns the inst quantized iSAC send bitrate 1381 * 1382 * Input: 1383 * - ISAC_main_inst : iSAC instance 1384 * 1385 * Return value : bitrate 1386 */ 1387 1388WebRtc_Word32 WebRtcIsacfix_GetUplinkBw(ISACFIX_MainStruct *ISAC_main_inst) 1389{ 1390 ISACFIX_SubStruct *ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 1391 BwEstimatorstr * bw = (BwEstimatorstr*)&(ISAC_inst->bwestimator_obj); 1392 1393 return (WebRtc_Word32) WebRtcIsacfix_GetUplinkBandwidth(bw); 1394} 1395 1396/**************************************************************************** 1397 * WebRtcIsacfix_GetNewFrameLen(...) 1398 * 1399 * This function return the next frame length (in samples) of iSAC. 1400 * 1401 * Input: 1402 * - ISAC_main_inst : iSAC instance 1403 * 1404 * Return value : frame lenght in samples 1405 */ 1406 1407WebRtc_Word16 WebRtcIsacfix_GetNewFrameLen(ISACFIX_MainStruct *ISAC_main_inst) 1408{ 1409 ISACFIX_SubStruct *ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 1410 return ISAC_inst->ISACenc_obj.new_framelength; 1411} 1412 1413 1414/**************************************************************************** 1415 * WebRtcIsacfix_SetMaxPayloadSize(...) 1416 * 1417 * This function sets a limit for the maximum payload size of iSAC. The same 1418 * value is used both for 30 and 60 msec packets. 1419 * The absolute max will be valid until next time the function is called. 1420 * NOTE! This function may override the function WebRtcIsacfix_SetMaxRate() 1421 * 1422 * Input: 1423 * - ISAC_main_inst : iSAC instance 1424 * - maxPayloadBytes : maximum size of the payload in bytes 1425 * valid values are between 100 and 400 bytes 1426 * 1427 * 1428 * Return value : 0 if sucessful 1429 * -1 if error happens 1430 */ 1431 1432WebRtc_Word16 WebRtcIsacfix_SetMaxPayloadSize(ISACFIX_MainStruct *ISAC_main_inst, 1433 WebRtc_Word16 maxPayloadBytes) 1434{ 1435 ISACFIX_SubStruct *ISAC_inst; 1436 1437 /* typecast pointer to real structure */ 1438 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 1439 1440 if((maxPayloadBytes < 100) || (maxPayloadBytes > 400)) 1441 { 1442 /* maxPayloadBytes is out of valid range */ 1443 return -1; 1444 } 1445 else 1446 { 1447 /* Set new absolute max, which will not change unless this function 1448 is called again with a new value */ 1449 ISAC_inst->ISACenc_obj.maxPayloadBytes = maxPayloadBytes; 1450 1451 /* Set new maximum values for 30 and 60 msec packets */ 1452 if (maxPayloadBytes < ISAC_inst->ISACenc_obj.maxRateInBytes) { 1453 ISAC_inst->ISACenc_obj.payloadLimitBytes30 = maxPayloadBytes; 1454 } else { 1455 ISAC_inst->ISACenc_obj.payloadLimitBytes30 = ISAC_inst->ISACenc_obj.maxRateInBytes; 1456 } 1457 1458 if ( maxPayloadBytes < (ISAC_inst->ISACenc_obj.maxRateInBytes << 1)) { 1459 ISAC_inst->ISACenc_obj.payloadLimitBytes60 = maxPayloadBytes; 1460 } else { 1461 ISAC_inst->ISACenc_obj.payloadLimitBytes60 = (ISAC_inst->ISACenc_obj.maxRateInBytes << 1); 1462 } 1463 } 1464 return 0; 1465} 1466 1467 1468/**************************************************************************** 1469 * WebRtcIsacfix_SetMaxRate(...) 1470 * 1471 * This function sets the maximum rate which the codec may not exceed for a 1472 * singel packet. The maximum rate is set in bits per second. 1473 * The codec has an absolute maximum rate of 53400 bits per second (200 bytes 1474 * per 30 msec). 1475 * It is possible to set a maximum rate between 32000 and 53400 bits per second. 1476 * 1477 * The rate limit is valid until next time the function is called. 1478 * 1479 * NOTE! Packet size will never go above the value set if calling 1480 * WebRtcIsacfix_SetMaxPayloadSize() (default max packet size is 400 bytes). 1481 * 1482 * Input: 1483 * - ISAC_main_inst : iSAC instance 1484 * - maxRateInBytes : maximum rate in bits per second, 1485 * valid values are 32000 to 53400 bits 1486 * 1487 * Return value : 0 if sucessful 1488 * -1 if error happens 1489 */ 1490 1491WebRtc_Word16 WebRtcIsacfix_SetMaxRate(ISACFIX_MainStruct *ISAC_main_inst, 1492 WebRtc_Word32 maxRate) 1493{ 1494 ISACFIX_SubStruct *ISAC_inst; 1495 WebRtc_Word16 maxRateInBytes; 1496 1497 /* typecast pointer to real structure */ 1498 ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst; 1499 1500 if((maxRate < 32000) || (maxRate > 53400)) 1501 { 1502 /* maxRate is out of valid range */ 1503 return -1; 1504 } 1505 else 1506 { 1507 /* Calculate maximum number of bytes per 30 msec packets for the given 1508 maximum rate. Multiply with 30/1000 to get number of bits per 30 msec, 1509 divide by 8 to get number of bytes per 30 msec: 1510 maxRateInBytes = floor((maxRate * 30/1000) / 8); */ 1511 maxRateInBytes = (WebRtc_Word16)( WebRtcSpl_DivW32W16ResW16(WEBRTC_SPL_MUL(maxRate, 3), 800) ); 1512 1513 /* Store the value for usage in the WebRtcIsacfix_SetMaxPayloadSize-function */ 1514 ISAC_inst->ISACenc_obj.maxRateInBytes = maxRateInBytes; 1515 1516 /* For 30 msec packets: if the new limit is below the maximum 1517 payload size, set a new limit */ 1518 if (maxRateInBytes < ISAC_inst->ISACenc_obj.maxPayloadBytes) { 1519 ISAC_inst->ISACenc_obj.payloadLimitBytes30 = maxRateInBytes; 1520 } else { 1521 ISAC_inst->ISACenc_obj.payloadLimitBytes30 = ISAC_inst->ISACenc_obj.maxPayloadBytes; 1522 } 1523 1524 /* For 60 msec packets: if the new limit (times 2) is below the 1525 maximum payload size, set a new limit */ 1526 if ( (maxRateInBytes << 1) < ISAC_inst->ISACenc_obj.maxPayloadBytes) { 1527 ISAC_inst->ISACenc_obj.payloadLimitBytes60 = (maxRateInBytes << 1); 1528 } else { 1529 ISAC_inst->ISACenc_obj.payloadLimitBytes60 = ISAC_inst->ISACenc_obj.maxPayloadBytes; 1530 } 1531 } 1532 1533 return 0; 1534} 1535 1536 1537 1538/**************************************************************************** 1539 * WebRtcIsacfix_version(...) 1540 * 1541 * This function returns the version number. 1542 * 1543 * Output: 1544 * - version : Pointer to character string 1545 * 1546 */ 1547 1548void WebRtcIsacfix_version(char *version) 1549{ 1550 strcpy(version, "3.6.0"); 1551} 1552