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