1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 /**************************************************************************************** 19 Portions of this file are derived from the following 3GPP standard: 20 21 3GPP TS 26.073 22 ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23 Available from http://www.3gpp.org 24 25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26 Permission to distribute, modify and use this file under the standard license 27 terms listed above has been obtained from the copyright holder. 28 ****************************************************************************************/ 29 /* 30 ------------------------------------------------------------------------------ 31 32 33 34 Pathname: ./audio/gsm-amr/c/src/sp_enc.c 35 Funtions: GSMInitEncode 36 Speech_Encode_Frame_reset 37 GSMEncodeFrameExit 38 Speech_Encode_Frame_First 39 GSMEncodeFrame 40 41 Date: 02/07/2002 42 43 ------------------------------------------------------------------------------ 44 REVISION HISTORY 45 46 Description: Cleaned up INCLUDES. removed inclusion of basic_op.h and count.h. 47 48 49 Description: Revert back to Speech_Encode_Frame_reset() and 50 Speech_Encode_Frame_First 51 52 Description: Replaced OSCL mem type functions and eliminated include 53 files that now are chosen by OSCL definitions 54 55 Description: Replaced "int" and/or "char" with OSCL defined types. 56 57 Description: 58 59 ------------------------------------------------------------------------------ 60 MODULE DESCRIPTION 61 62 These functions comprise the pre filtering and encoding of one speech frame. 63 64 ------------------------------------------------------------------------------ 65 */ 66 67 68 /*---------------------------------------------------------------------------- 69 ; INCLUDES 70 ----------------------------------------------------------------------------*/ 71 #include <stdlib.h> 72 73 #include "sp_enc.h" 74 #include "typedef.h" 75 #include "cnst.h" 76 #include "set_zero.h" 77 #include "pre_proc.h" 78 #include "prm2bits.h" 79 #include "mode.h" 80 #include "cod_amr.h" 81 82 /*---------------------------------------------------------------------------- 83 ; MACROS 84 ; Define module specific macros here 85 ----------------------------------------------------------------------------*/ 86 87 88 /*---------------------------------------------------------------------------- 89 ; DEFINES 90 ; Include all pre-processor statements here. Include conditional 91 ; compile variables also. 92 ----------------------------------------------------------------------------*/ 93 94 /*---------------------------------------------------------------------------- 95 ; LOCAL FUNCTION DEFINITIONS 96 ; Function Prototype declaration 97 ----------------------------------------------------------------------------*/ 98 99 /*---------------------------------------------------------------------------- 100 ; LOCAL VARIABLE DEFINITIONS 101 ; Variable declaration - defined here and used outside this module 102 ----------------------------------------------------------------------------*/ 103 104 /* 105 ------------------------------------------------------------------------------ 106 FUNCTION NAME: GSMInitEncode 107 ------------------------------------------------------------------------------ 108 INPUT AND OUTPUT DEFINITIONS 109 Inputs: 110 state = pointer to an array of pointers to structures of type 111 Speech_Decode_FrameState 112 dtx = flag to turn off or turn on DTX (Flag) 113 id = pointer to an array whose contents are of type char 114 115 Outputs: 116 pre_state field of the structure pointed to by the pointer pointed to 117 by state is set to NULL 118 cod_amr_state field of the structure pointed to by the pointer pointed to 119 by state is set to NULL 120 dtx field of the structure pointed to by the pointer pointed to by state 121 is set to the input dtx 122 123 Returns: 124 return_value = set to zero, if initialization was successful; -1, 125 otherwise (int) 126 127 Global Variables Used: 128 None 129 130 Local Variables Needed: 131 None 132 133 ------------------------------------------------------------------------------ 134 FUNCTION DESCRIPTION 135 136 This function allocates memory for filter structure and initializes state 137 memory 138 139 ------------------------------------------------------------------------------ 140 REQUIREMENTS 141 142 None. 143 144 ------------------------------------------------------------------------------ 145 REFERENCES 146 147 sp_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 148 149 ------------------------------------------------------------------------------ 150 PSEUDO-CODE 151 Note: Original function name of Speech_Encode_Frame_init was changed to 152 GSMInitEncode in the Code section. 153 154 int Speech_Encode_Frame_init (void **state_data, 155 Flag dtx, 156 char *id) 157 { 158 Speech_Encode_FrameState* s; 159 160 if (state_data == NULL){ 161 fprintf(stderr, "Speech_Encode_Frame_init: invalid parameter\n"); 162 return -1; 163 } 164 *state_data = NULL; 165 166 // allocate memory 167 if ((s= (Speech_Encode_FrameState *) malloc(sizeof(Speech_Encode_FrameState))) == NULL){ 168 fprintf(stderr, "Speech_Encode_Frame_init: can not malloc state " 169 "structure\n"); 170 return -1; 171 } 172 173 s->complexityCounter = getCounterId(id); 174 175 s->pre_state = NULL; 176 s->cod_amr_state = NULL; 177 s->dtx = dtx; 178 179 if (Pre_Process_init(&s->pre_state) || 180 cod_amr_init(&s->cod_amr_state, s->dtx)) { 181 GSMEncodeFrameExit(&s); 182 return -1; 183 } 184 185 Speech_Encode_Frame_reset(s); 186 *state_data = (void *)s; 187 188 return 0; 189 } 190 191 192 ------------------------------------------------------------------------------ 193 RESOURCES USED [optional] 194 195 When the code is written for a specific target processor the 196 the resources used should be documented below. 197 198 HEAP MEMORY USED: x bytes 199 200 STACK MEMORY USED: x bytes 201 202 CLOCK CYCLES: (cycle count equation for this function) + (variable 203 used to represent cycle count for each subroutine 204 called) 205 where: (cycle count variable) = cycle count for [subroutine 206 name] 207 208 ------------------------------------------------------------------------------ 209 CAUTION [optional] 210 [State any special notes, constraints or cautions for users of this function] 211 212 ------------------------------------------------------------------------------ 213 */ 214 215 Word16 GSMInitEncode(void **state_data, 216 Flag dtx, 217 Word8 *id) 218 { 219 Speech_Encode_FrameState* s; 220 221 OSCL_UNUSED_ARG(id); 222 223 if (state_data == NULL) 224 { 225 /* fprintf(stderr, "Speech_Encode_Frame_init: invalid parameter\n"); */ 226 return -1; 227 } 228 *state_data = NULL; 229 230 /* allocate memory */ 231 if ((s = (Speech_Encode_FrameState *) malloc(sizeof(Speech_Encode_FrameState))) == NULL) 232 { 233 /* fprintf(stderr, "Speech_Encode_Frame_init: can not malloc state " 234 "structure\n"); */ 235 return -1; 236 } 237 238 s->pre_state = NULL; 239 s->cod_amr_state = NULL; 240 s->dtx = dtx; 241 242 if (Pre_Process_init(&s->pre_state) || 243 cod_amr_init(&s->cod_amr_state, s->dtx)) 244 { 245 Speech_Encode_FrameState** temp = &s; 246 GSMEncodeFrameExit((void**)temp); 247 return -1; 248 } 249 250 Speech_Encode_Frame_reset(s); 251 *state_data = (void *)s; 252 253 return 0; 254 } 255 256 257 /* 258 ------------------------------------------------------------------------------ 259 FUNCTION NAME: Speech_Encode_Frame_reset 260 ------------------------------------------------------------------------------ 261 INPUT AND OUTPUT DEFINITIONS 262 263 Inputs: 264 state = pointer to structures of type Speech_Decode_FrameState 265 266 Outputs: 267 None 268 269 Returns: 270 return_value = set to zero if reset was successful; -1, otherwise (int) 271 272 Global Variables Used: 273 None 274 275 Local Variables Needed: 276 None 277 278 ------------------------------------------------------------------------------ 279 FUNCTION DESCRIPTION 280 281 This function resets state memory 282 283 ------------------------------------------------------------------------------ 284 REQUIREMENTS 285 286 None. 287 288 ------------------------------------------------------------------------------ 289 REFERENCES 290 291 sp_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 292 293 ------------------------------------------------------------------------------ 294 PSEUDO-CODE 295 296 int Speech_Encode_Frame_reset (void *state_data) 297 { 298 299 Speech_Encode_FrameState *state = 300 (Speech_Encode_FrameState *) state_data; 301 302 if (state_data == NULL){ 303 fprintf(stderr, "Speech_Encode_Frame_reset 304 : invalid parameter\n"); 305 return -1; 306 } 307 308 Pre_Process_reset(state->pre_state); 309 cod_amr_reset(state->cod_amr_state); 310 311 setCounter(state->complexityCounter); 312 Init_WMOPS_counter(); 313 setCounter(0); // set counter to global counter 314 315 return 0; 316 } 317 318 ------------------------------------------------------------------------------ 319 RESOURCES USED [optional] 320 321 When the code is written for a specific target processor the 322 the resources used should be documented below. 323 324 HEAP MEMORY USED: x bytes 325 326 STACK MEMORY USED: x bytes 327 328 CLOCK CYCLES: (cycle count equation for this function) + (variable 329 used to represent cycle count for each subroutine 330 called) 331 where: (cycle count variable) = cycle count for [subroutine 332 name] 333 334 ------------------------------------------------------------------------------ 335 CAUTION [optional] 336 [State any special notes, constraints or cautions for users of this function] 337 338 ------------------------------------------------------------------------------ 339 */ 340 341 Word16 Speech_Encode_Frame_reset(void *state_data) 342 { 343 344 Speech_Encode_FrameState *state = 345 (Speech_Encode_FrameState *) state_data; 346 347 if (state_data == NULL) 348 { 349 /* fprintf(stderr, "Speech_Encode_Frame_reset 350 : invalid parameter\n"); */ 351 return -1; 352 } 353 354 Pre_Process_reset(state->pre_state); 355 cod_amr_reset(state->cod_amr_state); 356 357 return 0; 358 } 359 360 /****************************************************************************/ 361 362 /* 363 ------------------------------------------------------------------------------ 364 FUNCTION NAME: GSMEncodeFrameExit 365 ------------------------------------------------------------------------------ 366 INPUT AND OUTPUT DEFINITIONS 367 368 Inputs: 369 state = pointer to a pointer to a structure of type cod_amrState 370 371 Outputs: 372 state points to a NULL address 373 374 Returns: 375 None. 376 377 Global Variables Used: 378 None. 379 380 Local Variables Needed: 381 None. 382 383 ------------------------------------------------------------------------------ 384 FUNCTION DESCRIPTION 385 386 This function frees the memory used for state memory. 387 388 ------------------------------------------------------------------------------ 389 REQUIREMENTS 390 391 None. 392 393 ------------------------------------------------------------------------------ 394 REFERENCES 395 396 sp_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 397 398 ------------------------------------------------------------------------------ 399 PSEUDO-CODE 400 401 Note: Original function name of Speech_Encode_Frame_exit was changed to 402 GSMEncodeFrameExit in the Code section. 403 404 void Speech_Encode_Frame_exit (void **state_data) 405 { 406 407 Speech_Encode_FrameState **state = 408 (Speech_Encode_FrameState **) state_data; 409 410 if (state == NULL || *state == NULL) 411 return; 412 413 Pre_Process_exit(&(*state)->pre_state); 414 cod_amr_exit(&(*state)->cod_amr_state); 415 416 setCounter((*state)->complexityCounter); 417 WMOPS_output(0); 418 setCounter(0); // set counter to global counter 419 420 // deallocate memory 421 free(*state); 422 *state = NULL; 423 424 return; 425 } 426 427 ------------------------------------------------------------------------------ 428 RESOURCES USED [optional] 429 430 When the code is written for a specific target processor the 431 the resources used should be documented below. 432 433 HEAP MEMORY USED: x bytes 434 435 STACK MEMORY USED: x bytes 436 437 CLOCK CYCLES: (cycle count equation for this function) + (variable 438 used to represent cycle count for each subroutine 439 called) 440 where: (cycle count variable) = cycle count for [subroutine 441 name] 442 443 ------------------------------------------------------------------------------ 444 CAUTION [optional] 445 [State any special notes, constraints or cautions for users of this function] 446 447 ------------------------------------------------------------------------------ 448 */ 449 450 void GSMEncodeFrameExit(void **state_data) 451 { 452 453 Speech_Encode_FrameState **state = 454 (Speech_Encode_FrameState **) state_data; 455 456 if (state == NULL || *state == NULL) 457 return; 458 459 Pre_Process_exit(&(*state)->pre_state); 460 cod_amr_exit(&(*state)->cod_amr_state); 461 462 /* deallocate memory */ 463 free(*state); 464 *state = NULL; 465 466 return; 467 } 468 469 /****************************************************************************/ 470 471 /* 472 ------------------------------------------------------------------------------ 473 FUNCTION NAME: Speech_Encode_Frame_First 474 ------------------------------------------------------------------------------ 475 476 INPUT AND OUTPUT DEFINITIONS 477 478 Inputs: 479 st = pointer to a structure of type Speech_Encode_FrameState that contains 480 the post filter states 481 new_speech = pointer to buffer of length L_FRAME that contains 482 the speech input (Word16) 483 484 Outputs: 485 The structure of type Speech_Encode_FrameState pointed to by st is updated. 486 487 Returns: 488 return_value = 0 (int) 489 490 Global Variables Used: 491 None. 492 493 Local Variables Needed: 494 None. 495 496 ------------------------------------------------------------------------------ 497 FUNCTION DESCRIPTION 498 499 This function encodes the first frame of speech. It calls the pre-processing 500 filter and the first frame encoder. 501 502 ------------------------------------------------------------------------------ 503 REQUIREMENTS 504 505 None. 506 507 ------------------------------------------------------------------------------ 508 REFERENCES 509 510 sp_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 511 512 ------------------------------------------------------------------------------ 513 PSEUDO-CODE 514 515 int Speech_Encode_Frame_First ( 516 Speech_Encode_FrameState *st, // i/o : post filter states 517 Word16 *new_speech) // i : speech input 518 { 519 #if !defined(NO13BIT) 520 Word16 i; 521 #endif 522 523 setCounter(st->complexityCounter); 524 525 #if !defined(NO13BIT) 526 // Delete the 3 LSBs (13-bit input) 527 for (i = 0; i < L_NEXT; i++) 528 { 529 new_speech[i] = new_speech[i] & 0xfff8; 530 } 531 #endif 532 533 // filter + downscaling 534 Pre_Process (st->pre_state, new_speech, L_NEXT); 535 536 cod_amr_first(st->cod_amr_state, new_speech); 537 538 Init_WMOPS_counter (); // reset WMOPS counter for the new frame 539 540 return 0; 541 } 542 543 544 ------------------------------------------------------------------------------ 545 RESOURCES USED [optional] 546 547 When the code is written for a specific target processor the 548 the resources used should be documented below. 549 550 HEAP MEMORY USED: x bytes 551 552 STACK MEMORY USED: x bytes 553 554 CLOCK CYCLES: (cycle count equation for this function) + (variable 555 used to represent cycle count for each subroutine 556 called) 557 where: (cycle count variable) = cycle count for [subroutine 558 name] 559 560 ------------------------------------------------------------------------------ 561 CAUTION [optional] 562 [State any special notes, constraints or cautions for users of this function] 563 564 ------------------------------------------------------------------------------ 565 */ 566 567 void Speech_Encode_Frame_First( 568 Speech_Encode_FrameState *st, /* i/o : post filter states */ 569 Word16 *new_speech) /* i : speech input */ 570 { 571 #if !defined(NO13BIT) 572 Word16 i; 573 #endif 574 575 #if !defined(NO13BIT) 576 /* Delete the 3 LSBs (13-bit input) */ 577 for (i = 0; i < L_NEXT; i++) 578 { 579 new_speech[i] = new_speech[i] & 0xfff8; 580 } 581 #endif 582 583 /* filter + downscaling */ 584 Pre_Process(st->pre_state, new_speech, L_NEXT); 585 586 cod_amr_first(st->cod_amr_state, new_speech); 587 588 return; 589 } 590 591 /* 592 ------------------------------------------------------------------------------ 593 FUNCTION NAME: cod_amr 594 ------------------------------------------------------------------------------ 595 INPUT AND OUTPUT DEFINITIONS 596 597 Inputs: 598 state_data = a void pointer to the post filter states 599 mode = AMR mode of type enum Mode 600 new_speech = pointer to buffer of length L_FRAME that contains 601 the speech input of type Word16 602 serial = pointer to the serial bit stream of type Word16 603 usedMode = pointer to the used mode of type enum Mode 604 605 Outputs: 606 serial -> encoded serial bit stream 607 The value pointed to by usedMode is updated. 608 609 Returns: 610 return_value = 0 (int) 611 612 Global Variables Used: 613 None. 614 615 Local Variables Needed: 616 None. 617 618 ------------------------------------------------------------------------------ 619 FUNCTION DESCRIPTION 620 621 This function is the entry point to the GSM AMR encoder. The following 622 operations are performed to generate one encoded frame: First, the incoming 623 audio samples are passed through the pre-processing filter where they are 624 filtered and downscaled. A call is then made to the main encoder cod_amr(). 625 This generates the set of encoded parameters which include the LSP, adaptive 626 codebook, and fixed codebook quantization indices (addresses and gains). The 627 generated parameters are then converted to serial bits. 628 629 ------------------------------------------------------------------------------ 630 REQUIREMENTS 631 632 None. 633 634 ------------------------------------------------------------------------------ 635 REFERENCES 636 637 sp_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 638 639 ------------------------------------------------------------------------------ 640 PSEUDO-CODE 641 Note: Original function name of Speech_Encode_Frame was changed to 642 GSMEncodeFrame in the Code section. 643 644 int Speech_Encode_Frame ( 645 void *state_data, // i/o : post filter states 646 enum Mode mode, // i : speech coder mode 647 Word16 *new_speech, // i : speech input 648 Word16 *serial, // o : serial bit stream 649 enum Mode *usedMode // o : used speech coder mode 650 ) 651 { 652 653 Speech_Encode_FrameState *st = 654 (Speech_Encode_FrameState *) state_data; 655 656 Word16 prm[MAX_PRM_SIZE]; // Analysis parameters 657 Word16 syn[L_FRAME]; // Buffer for synthesis speech 658 Word16 i; 659 660 setCounter(st->complexityCounter); 661 Reset_WMOPS_counter (); // reset WMOPS counter for the new frame 662 // initialize the serial output frame to zero 663 for (i = 0; i < MAX_SERIAL_SIZE; i++) 664 { 665 serial[i] = 0; 666 } 667 #if !defined(NO13BIT) 668 // Delete the 3 LSBs (13-bit input) 669 for (i = 0; i < L_FRAME; i++) 670 { 671 new_speech[i] = new_speech[i] & 0xfff8; 672 673 674 } 675 #endif 676 677 // filter + downscaling 678 Pre_Process (st->pre_state, new_speech, L_FRAME); 679 680 // Call the speech encoder 681 cod_amr(st->cod_amr_state, mode, new_speech, prm, usedMode, syn); 682 683 // Parameters to serial bits 684 Prm2bits (*usedMode, prm, &serial[0]); 685 686 fwc(); 687 setCounter(0); // set counter to global counter 688 689 return 0; 690 } 691 692 ------------------------------------------------------------------------------ 693 RESOURCES USED [optional] 694 695 When the code is written for a specific target processor the 696 the resources used should be documented below. 697 698 HEAP MEMORY USED: x bytes 699 700 STACK MEMORY USED: x bytes 701 702 CLOCK CYCLES: (cycle count equation for this function) + (variable 703 used to represent cycle count for each subroutine 704 called) 705 where: (cycle count variable) = cycle count for [subroutine 706 name] 707 708 ------------------------------------------------------------------------------ 709 CAUTION [optional] 710 [State any special notes, constraints or cautions for users of this function] 711 712 ------------------------------------------------------------------------------ 713 */ 714 715 void GSMEncodeFrame( 716 void *state_data, /* i/o : post filter states */ 717 enum Mode mode, /* i : speech coder mode */ 718 Word16 *new_speech, /* i : speech input */ 719 Word16 *serial, /* o : serial bit stream */ 720 enum Mode *usedMode /* o : used speech coder mode */ 721 ) 722 { 723 724 Speech_Encode_FrameState *st = 725 (Speech_Encode_FrameState *) state_data; 726 727 Word16 prm[MAX_PRM_SIZE]; /* Analysis parameters. */ 728 Word16 syn[L_FRAME]; /* Buffer for synthesis speech */ 729 Word16 i; 730 731 /* initialize the serial output frame to zero */ 732 for (i = 0; i < MAX_SERIAL_SIZE; i++) 733 { 734 serial[i] = 0; 735 } 736 #if !defined(NO13BIT) 737 /* Delete the 3 LSBs (13-bit input) */ 738 for (i = 0; i < L_FRAME; i++) 739 { 740 new_speech[i] = new_speech[i] & 0xfff8; 741 } 742 #endif 743 744 /* filter + downscaling */ 745 Pre_Process(st->pre_state, new_speech, L_FRAME); 746 747 /* Call the speech encoder */ 748 cod_amr(st->cod_amr_state, mode, new_speech, prm, usedMode, syn); 749 750 /* Parameters to serial bits */ 751 Prm2bits(*usedMode, prm, &serial[0]); 752 753 return; 754 } 755