1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "pcm16b.h" 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdlib.h> 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "typedefs.h" 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 18d7e904161d5c59c61cbf094b16bca6e79ada713aandrew@webrtc.org#ifdef WEBRTC_ARCH_BIG_ENDIAN 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "signal_processing_library.h" 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define HIGHEND 0xFF00 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define LOWEND 0xFF 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 27fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org/* Encoder with int16_t Output */ 28fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgint16_t WebRtcPcm16b_EncodeW16(int16_t *speechIn16b, 29fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t len, 30fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *speechOut16b) 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 32d7e904161d5c59c61cbf094b16bca6e79ada713aandrew@webrtc.org#ifdef WEBRTC_ARCH_BIG_ENDIAN 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_SPL_MEMCPY_W16(speechOut16b, speechIn16b, len); 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int i; 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (i=0;i<len;i++) { 37fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org speechOut16b[i]=(((uint16_t)speechIn16b[i])>>8)|((((uint16_t)speechIn16b[i])<<8)&0xFF00); 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return(len<<1); 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* Encoder with char Output (old version) */ 45fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgint16_t WebRtcPcm16b_Encode(int16_t *speech16b, 46fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t len, 47fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org unsigned char *speech8b) 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 49fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t samples=len*2; 50fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t pos; 51fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t short1; 52fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t short2; 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (pos=0;pos<len;pos++) { 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org short1=HIGHEND & speech16b[pos]; 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org short2=LOWEND & speech16b[pos]; 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org short1=short1>>8; 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org speech8b[pos*2]=(unsigned char) short1; 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org speech8b[pos*2+1]=(unsigned char) short2; 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return(samples); 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 64fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org/* Decoder with int16_t Input instead of char when the int16_t Encoder is used */ 65fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgint16_t WebRtcPcm16b_DecodeW16(void *inst, 66fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *speechIn16b, 67fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t len, 68fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *speechOut16b, 69fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t* speechType) 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 71d7e904161d5c59c61cbf094b16bca6e79ada713aandrew@webrtc.org#ifdef WEBRTC_ARCH_BIG_ENDIAN 72fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org WEBRTC_SPL_MEMCPY_W8(speechOut16b, speechIn16b, ((len*sizeof(int16_t)+1)>>1)); 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int i; 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int samples=len>>1; 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (i=0;i<samples;i++) { 78fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org speechOut16b[i]=(((uint16_t)speechIn16b[i])>>8)|(((uint16_t)(speechIn16b[i]&0xFF))<<8); 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *speechType=1; 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Avoid warning. 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (void)(inst = NULL); 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return(len>>1); 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* "old" version of the decoder that uses char as input (not used in NetEq any more) */ 91fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgint16_t WebRtcPcm16b_Decode(unsigned char *speech8b, 92fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t len, 93fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *speech16b) 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 95fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t samples=len>>1; 96fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t pos; 97fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t shortval; 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (pos=0;pos<samples;pos++) { 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org shortval=((unsigned short) speech8b[pos*2]); 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org shortval=(shortval<<8)&HIGHEND; 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org shortval=shortval|(((unsigned short) speech8b[pos*2+1])&LOWEND); 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org speech16b[pos]=shortval; 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return(samples); 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 106