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.173 22 ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec 23 Available from http://www.3gpp.org 24 25 (C) 2007, 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: ./src/pvamrwbdecoder_basic_op_cequivalent.h 35 36 Date: 05/07/2007 37 38 ------------------------------------------------------------------------------ 39 REVISION HISTORY 40 41 Description: 42 ------------------------------------------------------------------------------ 43 INCLUDE DESCRIPTION 44 45 ------------------------------------------------------------------------------ 46 */ 47 #ifndef PVAMRWBDECODER_BASIC_OP_CEQUIVALENT_H 48 #define PVAMRWBDECODER_BASIC_OP_CEQUIVALENT_H 49 50 #ifdef __cplusplus 51 extern "C" 52 { 53 #endif 54 55 56 #include "normalize_amr_wb.h" 57 58 #if defined(C_EQUIVALENT) 59 60 61 /*---------------------------------------------------------------------------- 62 63 Function Name : add_int16 64 65 Purpose : 66 67 Performs the addition (var1+var2) with overflow control and saturation; 68 the 16 bit result is set at +32767 when overflow occurs or at -32768 69 when underflow occurs. 70 71 Inputs : 72 var1 73 16 bit short signed integer (int16) whose value falls in the 74 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 75 76 var2 77 16 bit short signed integer (int16) whose value falls in the 78 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 79 80 Outputs : 81 none 82 83 Return Value : 84 16 bit short signed integer (int16) whose value falls in the 85 range : 0xffff 8000 <= var_out <= 0x0000 7fff. 86 87 ----------------------------------------------------------------------------*/ 88 __inline int16 add_int16(int16 var1, int16 var2) 89 { 90 int32 L_sum; 91 92 L_sum = (int32) var1 + var2; 93 if ((L_sum >> 15) != (L_sum >> 31)) 94 { 95 L_sum = (L_sum >> 31) ^ MAX_16; 96 } 97 return ((int16)(L_sum)); 98 } 99 100 101 /*---------------------------------------------------------------------------- 102 103 Function Name : sub_int16 104 105 Performs the subtraction (var1+var2) with overflow control and satu- 106 ration; the 16 bit result is set at +32767 when overflow occurs or at 107 -32768 when underflow occurs. 108 109 Inputs : 110 111 var1 112 16 bit short signed integer (int16) whose value falls in the 113 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 114 115 var2 116 16 bit short signed integer (int16) whose value falls in the 117 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 118 119 Outputs : 120 none 121 122 Return Value : 123 16 bit short signed integer (int16) whose value falls in the 124 range : 0xffff 8000 <= var_out <= 0x0000 7fff. 125 126 ----------------------------------------------------------------------------*/ 127 __inline int16 sub_int16(int16 var1, int16 var2) 128 { 129 int32 L_diff; 130 131 L_diff = (int32) var1 - var2; 132 if ((L_diff >> 15) != (L_diff >> 31)) 133 { 134 L_diff = (L_diff >> 31) ^ MAX_16; 135 } 136 return ((int16)(L_diff)); 137 } 138 139 140 /*---------------------------------------------------------------------------- 141 142 Function Name : mult_int16 143 144 Performs the multiplication of var1 by var2 and gives a 16 bit result 145 which is scaled i.e.: 146 mult_int16(var1,var2) = extract_l(L_shr((var1 times var2),15)) and 147 mult_int16(-32768,-32768) = 32767. 148 149 Inputs : 150 var1 151 16 bit short signed integer (int16) whose value falls in the 152 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 153 154 var2 155 16 bit short signed integer (int16) whose value falls in the 156 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 157 158 159 Return Value : 160 16 bit short signed integer (int16) whose value falls in the 161 range : 0xffff 8000 <= var_out <= 0x0000 7fff. 162 163 ----------------------------------------------------------------------------*/ 164 165 __inline int16 mult_int16(int16 var1, int16 var2) 166 { 167 int32 L_product; 168 169 L_product = ((int32) var1 * (int32) var2) >> 15; 170 171 if ((L_product >> 15) != (L_product >> 31)) 172 { 173 L_product = (L_product >> 31) ^ MAX_16; 174 } 175 176 return ((int16)L_product); 177 } 178 179 180 /*---------------------------------------------------------------------------- 181 182 Function Name : add_int32 183 184 32 bits addition of the two 32 bits variables (L_var1+L_var2) with 185 overflow control and saturation; the result is set at +2147483647 when 186 overflow occurs or at -2147483648 when underflow occurs. 187 188 Inputs : 189 190 L_var1 32 bit long signed integer (int32) whose value falls in the 191 range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. 192 193 L_var2 32 bit long signed integer (int32) whose value falls in the 194 range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. 195 196 197 Return Value : 198 L_var_out 199 32 bit long signed integer (int32) whose value falls in the 200 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. 201 202 ----------------------------------------------------------------------------*/ 203 204 205 __inline int32 add_int32(int32 L_var1, int32 L_var2) 206 { 207 int32 L_var_out; 208 209 L_var_out = L_var1 + L_var2; 210 211 if (((L_var1 ^ L_var2) & MIN_32) == 0) /* same sign ? */ 212 { 213 if ((L_var_out ^ L_var1) & MIN_32) /* addition matches sign ? */ 214 { 215 L_var_out = (L_var1 >> 31) ^ MAX_32; 216 } 217 } 218 return (L_var_out); 219 } 220 221 222 223 224 /*---------------------------------------------------------------------------- 225 226 Function Name : sub_int32 227 228 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with 229 overflow control and saturation; the result is set at +2147483647 when 230 overflow occurs or at -2147483648 when underflow occurs. 231 232 Inputs : 233 234 L_var1 32 bit long signed integer (int32) whose value falls in the 235 range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. 236 237 L_var2 32 bit long signed integer (int32) whose value falls in the 238 range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. 239 240 241 Return Value : 242 L_var_out 243 32 bit long signed integer (int32) whose value falls in the 244 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. 245 246 ----------------------------------------------------------------------------*/ 247 248 249 __inline int32 sub_int32(int32 L_var1, int32 L_var2) 250 { 251 int32 L_var_out; 252 253 L_var_out = L_var1 - L_var2; 254 255 if (((L_var1 ^ L_var2) & MIN_32) != 0) /* different sign ? */ 256 { 257 if ((L_var_out ^ L_var1) & MIN_32) /* difference matches sign ? */ 258 { 259 L_var_out = (L_var1 >> 31) ^ MAX_32; 260 } 261 } 262 return (L_var_out); 263 } 264 265 266 267 /*---------------------------------------------------------------------------- 268 269 Function Name : mac_16by16_to_int32 270 271 Multiply var1 by var2 and shift the result left by 1. Add the 32 bit 272 result to L_var3 with saturation, return a 32 bit result: 273 L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). 274 275 Inputs : 276 277 L_var3 32 bit long signed integer (int32) whose value falls in the 278 range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. 279 280 var1 281 16 bit short signed integer (int16) whose value falls in the 282 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 283 284 var2 285 16 bit short signed integer (int16) whose value falls in the 286 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 287 288 289 Return Value : 290 32 bit long signed integer (int32) whose value falls in the 291 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. 292 293 ----------------------------------------------------------------------------*/ 294 295 296 __inline int32 mac_16by16_to_int32(int32 L_var3, int16 var1, int16 var2) 297 { 298 int32 L_var_out; 299 int32 L_mul; 300 301 L_mul = ((int32) var1 * (int32) var2); 302 303 if (L_mul != 0x40000000) 304 { 305 L_mul <<= 1; 306 } 307 else 308 { 309 L_mul = MAX_32; /* saturation */ 310 } 311 312 L_var_out = L_var3 + L_mul; 313 314 if (((L_mul ^ L_var3) & MIN_32) == 0) /* same sign ? */ 315 { 316 if ((L_var_out ^ L_var3) & MIN_32) /* addition matches sign ? */ 317 { 318 L_var_out = (L_var3 >> 31) ^ MAX_32; 319 } 320 } 321 322 return (L_var_out); 323 } 324 325 326 327 /*---------------------------------------------------------------------------- 328 329 Function Name : msu_16by16_from_int32 330 331 Multiply var1 by var2 and shift the result left by 1. Subtract the 32 bit 332 result to L_var3 with saturation, return a 32 bit result: 333 L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). 334 335 Inputs : 336 337 L_var3 32 bit long signed integer (int32) whose value falls in the 338 range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. 339 340 var1 341 16 bit short signed integer (int16) whose value falls in the 342 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 343 344 var2 345 16 bit short signed integer (int16) whose value falls in the 346 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 347 348 349 Return Value : 350 32 bit long signed integer (int32) whose value falls in the 351 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. 352 353 ----------------------------------------------------------------------------*/ 354 355 __inline int32 msu_16by16_from_int32(int32 L_var3, int16 var1, int16 var2) 356 { 357 int32 L_var_out; 358 int32 L_mul; 359 360 L_mul = ((int32) var1 * (int32) var2); 361 362 if (L_mul != 0x40000000) 363 { 364 L_mul <<= 1; 365 } 366 else 367 { 368 L_mul = MAX_32; /* saturation */ 369 } 370 371 L_var_out = L_var3 - L_mul; 372 373 if (((L_mul ^ L_var3) & MIN_32) != 0) /* different sign ? */ 374 { 375 if ((L_var_out ^ L_var3) & MIN_32) /* difference matches sign ? */ 376 { 377 L_var_out = (L_var3 >> 31) ^ MAX_32; 378 } 379 } 380 381 return (L_var_out); 382 } 383 384 385 /*---------------------------------------------------------------------------- 386 387 Function Name : mul_16by16_to_int32 388 389 mul_16by16_to_int32 is the 32 bit result of the multiplication of var1 390 times var2 with one shift left i.e.: 391 L_mult(var1,var2) = L_shl((var1 times var2),1) and 392 L_mult(-32768,-32768) = 2147483647. 393 394 Inputs : 395 var1 396 16 bit short signed integer (int16) whose value falls in the 397 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 398 399 var2 400 16 bit short signed integer (int16) whose value falls in the 401 range : 0xffff 8000 <= var1 <= 0x0000 7fff. 402 403 Return Value : 404 32 bit long signed integer (int32) whose value falls in the 405 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. 406 407 ----------------------------------------------------------------------------*/ 408 409 410 __inline int32 mul_16by16_to_int32(int16 var1, int16 var2) 411 { 412 int32 L_mul; 413 414 L_mul = ((int32) var1 * (int32) var2); 415 416 if (L_mul != 0x40000000) 417 { 418 L_mul <<= 1; 419 } 420 else 421 { 422 L_mul = MAX_32; /* saturation */ 423 } 424 425 return (L_mul); 426 427 } 428 429 /*---------------------------------------------------------------------------- 430 431 Function Name : amr_wb_round 432 433 Round the lower 16 bits of the 32 bit input number into the MS 16 bits 434 with saturation. Shift the resulting bits right by 16 and return the 16 435 bit number: 436 round(L_var1) = extract_h(L_add(L_var1,32768)) 437 438 Inputs : 439 L_var1 440 32 bit long signed integer (int32 ) whose value falls in the 441 range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. 442 443 Return Value : 444 16 bit short signed integer (int16) whose value falls in the 445 range : 0xffff 8000 <= var_out <= 0x0000 7fff. 446 447 ----------------------------------------------------------------------------*/ 448 __inline int16 amr_wb_round(int32 L_var1) 449 { 450 if (L_var1 != MAX_32) 451 { 452 L_var1 += 0x00008000L; 453 } 454 return ((int16)(L_var1 >> 16)); 455 } 456 457 458 /*---------------------------------------------------------------------------- 459 460 Function Name : amr_wb_shl1_round 461 462 Shift the 32 bit input number to the left by 1, round up the result and 463 shift down by 16 464 amr_wb_shl1_round(L_var1) = round(L_shl(L_var1,1)) 465 466 Inputs : 467 L_var1 468 32 bit long signed integer (int32 ) whose value falls in the 469 range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. 470 471 Return Value : 472 16 bit short signed integer (int16) whose value falls in the 473 range : 0xffff 8000 <= var_out <= 0x0000 7fff. 474 475 ----------------------------------------------------------------------------*/ 476 __inline int16 amr_wb_shl1_round(int32 L_var1) 477 { 478 int16 var_out; 479 480 if ((L_var1 << 1) >> 1 == L_var1) 481 { 482 var_out = (int16)((L_var1 + 0x00004000) >> 15); 483 } 484 else 485 { 486 var_out = (int16)(((L_var1 >> 31) ^ MAX_32) >> 16); 487 } 488 489 return (var_out); 490 } 491 492 /*---------------------------------------------------------------------------- 493 Function Name : mul_32by16 494 495 Multiply a 16 bit integer by a 32 bit (DPF). The result is divided 496 by 2^15 497 498 L_32 = (hi1*lo2)<<1 + ((lo1*lo2)>>15)<<1 499 500 Inputs : 501 502 hi hi part of 32 bit number. 503 lo lo part of 32 bit number. 504 n 16 bit number. 505 506 ----------------------------------------------------------------------------*/ 507 508 509 __inline int32 mul_32by16(int16 hi, int16 lo, int16 n) 510 { 511 return (((((int32)hi*n)) + ((((int32)lo*n) >> 15))) << 1); 512 } 513 514 __inline int32 fxp_mac_16by16(int16 var1, int16 var2, int32 L_add) 515 { 516 517 L_add += (int32)var1 * var2; 518 519 return L_add; 520 } 521 522 __inline int32 fxp_mul_16by16(int16 var1, const int16 var2) 523 { 524 int32 L_mul = (int32)var1 * var2; 525 526 return L_mul; 527 } 528 529 __inline int32 fxp_mul32_by_16b(int32 L_var1, const int32 L_var2) 530 { 531 532 int32 L_mul = (int32)(((int64)L_var1 * (L_var2 << 16)) >> 32); 533 534 return L_mul; 535 } 536 537 538 #ifdef __cplusplus 539 } 540 #endif 541 542 #endif 543 544 #endif /* PVAMRWBDECODER_BASIC_OP_CEQUIVALENT_H */ 545 546