1 /* 2 * Copyright (c) 2011 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 #include "pcm16b.h" 13 14 #include <stdlib.h> 15 #ifdef WEBRTC_ARCH_BIG_ENDIAN 16 #include <string.h> 17 #endif 18 19 #include "webrtc/typedefs.h" 20 21 #define HIGHEND 0xFF00 22 #define LOWEND 0xFF 23 24 25 26 /* Encoder with int16_t Output */ 27 int16_t WebRtcPcm16b_EncodeW16(const int16_t* speechIn16b, 28 int16_t length_samples, 29 int16_t* speechOut16b) 30 { 31 #ifdef WEBRTC_ARCH_BIG_ENDIAN 32 memcpy(speechOut16b, speechIn16b, length_samples * sizeof(int16_t)); 33 #else 34 int i; 35 for (i = 0; i < length_samples; i++) { 36 speechOut16b[i]=(((uint16_t)speechIn16b[i])>>8)|((((uint16_t)speechIn16b[i])<<8)&0xFF00); 37 } 38 #endif 39 return length_samples << 1; 40 } 41 42 43 /* Encoder with char Output (old version) */ 44 int16_t WebRtcPcm16b_Encode(int16_t *speech16b, 45 int16_t len, 46 unsigned char *speech8b) 47 { 48 int16_t samples=len*2; 49 int16_t pos; 50 int16_t short1; 51 int16_t short2; 52 for (pos=0;pos<len;pos++) { 53 short1=HIGHEND & speech16b[pos]; 54 short2=LOWEND & speech16b[pos]; 55 short1=short1>>8; 56 speech8b[pos*2]=(unsigned char) short1; 57 speech8b[pos*2+1]=(unsigned char) short2; 58 } 59 return(samples); 60 } 61 62 63 /* Decoder with int16_t Input instead of char when the int16_t Encoder is used */ 64 int16_t WebRtcPcm16b_DecodeW16(void *inst, 65 int16_t *speechIn16b, 66 int16_t length_bytes, 67 int16_t *speechOut16b, 68 int16_t* speechType) 69 { 70 #ifdef WEBRTC_ARCH_BIG_ENDIAN 71 memcpy(speechOut16b, speechIn16b, length_bytes); 72 #else 73 int i; 74 int samples = length_bytes >> 1; 75 76 for (i=0;i<samples;i++) { 77 speechOut16b[i]=(((uint16_t)speechIn16b[i])>>8)|(((uint16_t)(speechIn16b[i]&0xFF))<<8); 78 } 79 #endif 80 81 *speechType=1; 82 83 // Avoid warning. 84 (void)(inst = NULL); 85 86 return length_bytes >> 1; 87 } 88 89 /* "old" version of the decoder that uses char as input (not used in NetEq any more) */ 90 int16_t WebRtcPcm16b_Decode(unsigned char *speech8b, 91 int16_t len, 92 int16_t *speech16b) 93 { 94 int16_t samples=len>>1; 95 int16_t pos; 96 int16_t shortval; 97 for (pos=0;pos<samples;pos++) { 98 shortval=((unsigned short) speech8b[pos*2]); 99 shortval=(shortval<<8)&HIGHEND; 100 shortval=shortval|(((unsigned short) speech8b[pos*2+1])&LOWEND); 101 speech16b[pos]=shortval; 102 } 103 return(samples); 104 } 105