Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / audio_coding / codecs / pcm16b / pcm16b.c
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 }