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 Filename: /audio/gsm-amr/c/src/sid_sync.c 35 Functions: sid_sync_init 36 sid_sync_reset 37 sid_sync_exit 38 sid_sync_set_handover_debt 39 sid_sync 40 41 Date: 03/13/2002 42 43 ------------------------------------------------------------------------------ 44 REVISION HISTORY 45 46 Description: Changed type definition of state pointer to 'void' for 47 sid_sync_init, sid_sync_reset, sid_sync_exit, and sid_sync. 48 Updated to PV coding template. 49 50 Description: Replaced OSCL mem type functions and eliminated include 51 files that now are chosen by OSCL definitions 52 53 Description: Replaced "int" and/or "char" with OSCL defined types. 54 55 Description: 56 57 ------------------------------------------------------------------------------ 58 MODULE DESCRIPTION 59 60 This file contains the functions that initialize, reset, exit, and perform 61 SID synchronization. 62 63 ------------------------------------------------------------------------------ 64 */ 65 66 67 /*---------------------------------------------------------------------------- 68 ; INCLUDES 69 ----------------------------------------------------------------------------*/ 70 #include <stdlib.h> 71 72 #include "typedef.h" 73 #include "basic_op.h" 74 #include "mode.h" 75 #include "sid_sync.h" 76 77 /*---------------------------------------------------------------------------- 78 ; MACROS 79 ; [Define module specific macros here] 80 ----------------------------------------------------------------------------*/ 81 82 83 /*---------------------------------------------------------------------------- 84 ; DEFINES 85 ; [Include all pre-processor statements here. Include conditional 86 ; compile variables also.] 87 ----------------------------------------------------------------------------*/ 88 89 /*---------------------------------------------------------------------------- 90 ; LOCAL FUNCTION DEFINITIONS 91 ; [List function prototypes here] 92 ----------------------------------------------------------------------------*/ 93 94 /*---------------------------------------------------------------------------- 95 ; LOCAL VARIABLE DEFINITIONS 96 ; [Variable declaration - defined here and used outside this module] 97 ----------------------------------------------------------------------------*/ 98 99 100 /* 101 ------------------------------------------------------------------------------ 102 FUNCTION NAME: sid_sync_init 103 ------------------------------------------------------------------------------ 104 INPUT AND OUTPUT DEFINITIONS 105 106 Inputs: 107 state = pointer containing a pointer to the state structure used for 108 SID synchronization (void) 109 110 Outputs: 111 None 112 113 Returns: 114 return_value = status of sid_sync_reset function; -1, if state is pointing 115 to a NULL address (int) 116 117 Global Variables Used: 118 None 119 120 Local Variables Needed: 121 None 122 123 ------------------------------------------------------------------------------ 124 FUNCTION DESCRIPTION 125 126 This function initialize one instance of the sid_sync module. It stores 127 the pointer to state struct in *st. This pointer has to be passed to sid_sync 128 in each call. This function returns 0 on success, otherwise, -1. 129 130 ------------------------------------------------------------------------------ 131 REQUIREMENTS 132 133 None 134 135 ------------------------------------------------------------------------------ 136 REFERENCES 137 138 sid_sync.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 139 140 ------------------------------------------------------------------------------ 141 PSEUDO-CODE 142 143 ------------------------------------------------------------------------------ 144 RESOURCES USED [optional] 145 146 When the code is written for a specific target processor the 147 the resources used should be documented below. 148 149 HEAP MEMORY USED: x bytes 150 151 STACK MEMORY USED: x bytes 152 153 CLOCK CYCLES: (cycle count equation for this function) + (variable 154 used to represent cycle count for each subroutine 155 called) 156 where: (cycle count variable) = cycle count for [subroutine 157 name] 158 159 ------------------------------------------------------------------------------ 160 CAUTION [optional] 161 [State any special notes, constraints or cautions for users of this function] 162 163 ------------------------------------------------------------------------------ 164 */ 165 166 Word16 sid_sync_init(void **state) 167 { 168 sid_syncState* s; 169 170 if (state == NULL) 171 { 172 /* fprintf(stderr, "sid_sync_init:invalid state parameter\n"); */ 173 return -1; 174 } 175 176 *state = NULL; 177 178 /* allocate memory */ 179 if ((s = (sid_syncState *) 180 malloc(sizeof(sid_syncState))) == NULL) 181 { 182 /* fprintf(stderr, 183 "sid_sync_init: " 184 "can not malloc state structure\n"); */ 185 return -1; 186 } 187 s->sid_update_rate = 8; 188 189 *state = (void *)s; 190 191 return(sid_sync_reset(s)); 192 } 193 194 /****************************************************************************/ 195 196 /* 197 ------------------------------------------------------------------------------ 198 FUNCTION NAME: sid_sync_reset 199 ------------------------------------------------------------------------------ 200 INPUT AND OUTPUT DEFINITIONS 201 202 Inputs: 203 state = pointer to the state structure used for SID synchronization (void) 204 205 Outputs: 206 None 207 208 Returns: 209 return_value = 0 (int) 210 211 Global Variables Used: 212 None 213 214 Local Variables Needed: 215 None 216 217 ------------------------------------------------------------------------------ 218 FUNCTION DESCRIPTION 219 220 This function performs a reset of the sid_sync module by setting the state 221 memory to zero. 222 223 ------------------------------------------------------------------------------ 224 REQUIREMENTS 225 226 None 227 228 ------------------------------------------------------------------------------ 229 REFERENCES 230 231 sid_sync.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 232 233 ------------------------------------------------------------------------------ 234 PSEUDO-CODE 235 236 ------------------------------------------------------------------------------ 237 RESOURCES USED [optional] 238 239 When the code is written for a specific target processor the 240 the resources used should be documented below. 241 242 HEAP MEMORY USED: x bytes 243 244 STACK MEMORY USED: x bytes 245 246 CLOCK CYCLES: (cycle count equation for this function) + (variable 247 used to represent cycle count for each subroutine 248 called) 249 where: (cycle count variable) = cycle count for [subroutine 250 name] 251 252 ------------------------------------------------------------------------------ 253 CAUTION [optional] 254 [State any special notes, constraints or cautions for users of this function] 255 256 ------------------------------------------------------------------------------ 257 */ 258 Word16 sid_sync_reset(void *st) 259 { 260 sid_syncState *state = (sid_syncState *) st; 261 262 state->sid_update_counter = 3; 263 state->sid_handover_debt = 0; 264 state->prev_ft = TX_SPEECH_GOOD; 265 266 return 0; 267 } 268 269 270 /****************************************************************************/ 271 272 /* 273 ------------------------------------------------------------------------------ 274 FUNCTION NAME: sid_sync_exit 275 ------------------------------------------------------------------------------ 276 INPUT AND OUTPUT DEFINITIONS 277 278 Inputs: 279 state = pointer containing a pointer to the state structure used for 280 SID synchronization (void) 281 282 Outputs: 283 None 284 285 Returns: 286 None 287 288 Global Variables Used: 289 None 290 291 Local Variables Needed: 292 None 293 294 ------------------------------------------------------------------------------ 295 FUNCTION DESCRIPTION 296 297 This function frees up the state structure used by sid_sync function. It 298 stores NULL in *state. 299 300 ------------------------------------------------------------------------------ 301 REQUIREMENTS 302 303 None 304 305 ------------------------------------------------------------------------------ 306 REFERENCES 307 308 sid_sync.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 309 310 ------------------------------------------------------------------------------ 311 PSEUDO-CODE 312 313 ------------------------------------------------------------------------------ 314 RESOURCES USED [optional] 315 316 When the code is written for a specific target processor the 317 the resources used should be documented below. 318 319 HEAP MEMORY USED: x bytes 320 321 STACK MEMORY USED: x bytes 322 323 CLOCK CYCLES: (cycle count equation for this function) + (variable 324 used to represent cycle count for each subroutine 325 called) 326 where: (cycle count variable) = cycle count for [subroutine 327 name] 328 329 ------------------------------------------------------------------------------ 330 CAUTION [optional] 331 [State any special notes, constraints or cautions for users of this function] 332 333 ------------------------------------------------------------------------------ 334 */ 335 void sid_sync_exit(void **state) 336 { 337 sid_syncState **st = (sid_syncState **) state; 338 339 if (st == NULL || *st == NULL) 340 { 341 return; 342 } 343 344 /* deallocate memory */ 345 free(*st); 346 *st = NULL; 347 348 return; 349 350 } 351 352 /****************************************************************************/ 353 354 /* 355 ------------------------------------------------------------------------------ 356 FUNCTION NAME: sid_sync_set_handover_debt 357 ------------------------------------------------------------------------------ 358 INPUT AND OUTPUT DEFINITIONS 359 360 Inputs: 361 st = pointer to the state structure used for SID synchronization 362 (sid_syncState) 363 debtFrames = number of handover debt frames (Word16) 364 365 Outputs: 366 st->sid_handover_debt is set to debtFrames 367 368 Returns: 369 return_value = 0 370 371 Global Variables Used: 372 None 373 374 Local Variables Needed: 375 None 376 377 ------------------------------------------------------------------------------ 378 FUNCTION DESCRIPTION 379 380 This function updates the handover debt to debtFrames. Extra SID_UPD are 381 scheduled to update remote decoder CNI states, right after an handover. 382 This is primarily for use on MS UL side. 383 384 ------------------------------------------------------------------------------ 385 REQUIREMENTS 386 387 None 388 389 ------------------------------------------------------------------------------ 390 REFERENCES 391 392 sid_sync.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 393 394 ------------------------------------------------------------------------------ 395 PSEUDO-CODE 396 397 ------------------------------------------------------------------------------ 398 RESOURCES USED [optional] 399 400 When the code is written for a specific target processor the 401 the resources used should be documented below. 402 403 HEAP MEMORY USED: x bytes 404 405 STACK MEMORY USED: x bytes 406 407 CLOCK CYCLES: (cycle count equation for this function) + (variable 408 used to represent cycle count for each subroutine 409 called) 410 where: (cycle count variable) = cycle count for [subroutine 411 name] 412 413 ------------------------------------------------------------------------------ 414 CAUTION [optional] 415 [State any special notes, constraints or cautions for users of this function] 416 417 ------------------------------------------------------------------------------ 418 */ 419 void sid_sync_set_handover_debt(sid_syncState *st, 420 Word16 debtFrames) 421 { 422 /* debtFrames >= 0 */ 423 st->sid_handover_debt = debtFrames; 424 return; 425 } 426 427 428 /****************************************************************************/ 429 430 /* 431 ------------------------------------------------------------------------------ 432 FUNCTION NAME: sid_sync 433 ------------------------------------------------------------------------------ 434 INPUT AND OUTPUT DEFINITIONS 435 436 Inputs: 437 state = pointer to the state structure used for SID synchronization 438 (sid_syncState) 439 mode = codec mode (enum Mode) 440 tx_frame_type = pointer to TX frame type store (enum TXFrameType) 441 442 Outputs: 443 tx_frame_type contains the new TX frame type 444 445 Returns: 446 None 447 448 Global Variables Used: 449 None 450 451 Local Variables Needed: 452 None 453 454 ------------------------------------------------------------------------------ 455 FUNCTION DESCRIPTION 456 457 This function performs SID frame synchronization to ensure that the mode 458 only switches to a neighbouring mode. 459 460 ------------------------------------------------------------------------------ 461 REQUIREMENTS 462 463 None 464 465 ------------------------------------------------------------------------------ 466 REFERENCES 467 468 sid_sync.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 469 470 ------------------------------------------------------------------------------ 471 PSEUDO-CODE 472 473 ------------------------------------------------------------------------------ 474 RESOURCES USED [optional] 475 476 When the code is written for a specific target processor the 477 the resources used should be documented below. 478 479 HEAP MEMORY USED: x bytes 480 481 STACK MEMORY USED: x bytes 482 483 CLOCK CYCLES: (cycle count equation for this function) + (variable 484 used to represent cycle count for each subroutine 485 called) 486 where: (cycle count variable) = cycle count for [subroutine 487 name] 488 489 ------------------------------------------------------------------------------ 490 CAUTION [optional] 491 [State any special notes, constraints or cautions for users of this function] 492 493 ------------------------------------------------------------------------------ 494 */ 495 void sid_sync(void *state, 496 enum Mode mode, 497 enum TXFrameType *tx_frame_type) 498 { 499 500 sid_syncState *st = (sid_syncState *) state; 501 502 if (mode == MRDTX) 503 { 504 505 st->sid_update_counter--; 506 507 if (st->prev_ft == TX_SPEECH_GOOD) 508 { 509 *tx_frame_type = TX_SID_FIRST; 510 st->sid_update_counter = 3; 511 } 512 else 513 { 514 /* TX_SID_UPDATE or TX_NO_DATA */ 515 if ((st->sid_handover_debt > 0) && 516 (st->sid_update_counter > 2)) 517 { 518 /* ensure extra updates are properly delayed after 519 a possible SID_FIRST */ 520 *tx_frame_type = TX_SID_UPDATE; 521 st->sid_handover_debt--; 522 } 523 else 524 { 525 if (st->sid_update_counter == 0) 526 { 527 *tx_frame_type = TX_SID_UPDATE; 528 st->sid_update_counter = st->sid_update_rate; 529 } 530 else 531 { 532 *tx_frame_type = TX_NO_DATA; 533 } 534 } 535 } 536 } 537 else 538 { 539 st->sid_update_counter = st->sid_update_rate ; 540 *tx_frame_type = TX_SPEECH_GOOD; 541 } 542 st->prev_ft = *tx_frame_type; 543 } 544 545