blob: bc7a4747a3ca90b7a383a8b542dc00bfc4bda69b [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
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
turajs@google.com74c640a2011-08-30 20:44:24 +000014#include <stdlib.h>
bjornv@webrtc.orgd32c4382014-08-25 11:19:05 +000015#ifdef WEBRTC_ARCH_BIG_ENDIAN
16#include <string.h>
17#endif
turajs@google.com74c640a2011-08-30 20:44:24 +000018
andresp@webrtc.org262e6762014-09-04 13:28:48 +000019#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000020
niklase@google.com470e71d2011-07-07 08:21:25 +000021#define HIGHEND 0xFF00
22#define LOWEND 0xFF
23
24
25
pbos@webrtc.org0946a562013-04-09 00:28:06 +000026/* Encoder with int16_t Output */
bjornv@webrtc.org4a616be2014-08-25 10:32:22 +000027int16_t WebRtcPcm16b_EncodeW16(const int16_t* speechIn16b,
bjornv@webrtc.orgd32c4382014-08-25 11:19:05 +000028 int16_t length_samples,
bjornv@webrtc.org4a616be2014-08-25 10:32:22 +000029 int16_t* speechOut16b)
niklase@google.com470e71d2011-07-07 08:21:25 +000030{
andrew@webrtc.org621df672013-10-22 10:27:23 +000031#ifdef WEBRTC_ARCH_BIG_ENDIAN
bjornv@webrtc.orgd32c4382014-08-25 11:19:05 +000032 memcpy(speechOut16b, speechIn16b, length_samples * sizeof(int16_t));
niklase@google.com470e71d2011-07-07 08:21:25 +000033#else
34 int i;
bjornv@webrtc.orgd32c4382014-08-25 11:19:05 +000035 for (i = 0; i < length_samples; i++) {
pbos@webrtc.org0946a562013-04-09 00:28:06 +000036 speechOut16b[i]=(((uint16_t)speechIn16b[i])>>8)|((((uint16_t)speechIn16b[i])<<8)&0xFF00);
niklase@google.com470e71d2011-07-07 08:21:25 +000037 }
38#endif
bjornv@webrtc.orgd32c4382014-08-25 11:19:05 +000039 return length_samples << 1;
niklase@google.com470e71d2011-07-07 08:21:25 +000040}
41
42
43/* Encoder with char Output (old version) */
henrik.lundin@webrtc.orgfcbe36a2014-12-08 18:26:49 +000044int16_t WebRtcPcm16b_Encode(const int16_t *speech16b,
pbos@webrtc.org0946a562013-04-09 00:28:06 +000045 int16_t len,
46 unsigned char *speech8b)
niklase@google.com470e71d2011-07-07 08:21:25 +000047{
pbos@webrtc.org0946a562013-04-09 00:28:06 +000048 int16_t samples=len*2;
49 int16_t pos;
50 int16_t short1;
51 int16_t short2;
niklase@google.com470e71d2011-07-07 08:21:25 +000052 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
pbos@webrtc.org0946a562013-04-09 00:28:06 +000063/* Decoder with int16_t Input instead of char when the int16_t Encoder is used */
kwiberg@webrtc.org6de75ca2014-11-04 13:29:24 +000064int16_t WebRtcPcm16b_DecodeW16(int16_t *speechIn16b,
bjornv@webrtc.orgd32c4382014-08-25 11:19:05 +000065 int16_t length_bytes,
pbos@webrtc.org0946a562013-04-09 00:28:06 +000066 int16_t *speechOut16b,
67 int16_t* speechType)
niklase@google.com470e71d2011-07-07 08:21:25 +000068{
andrew@webrtc.org621df672013-10-22 10:27:23 +000069#ifdef WEBRTC_ARCH_BIG_ENDIAN
bjornv@webrtc.orgd32c4382014-08-25 11:19:05 +000070 memcpy(speechOut16b, speechIn16b, length_bytes);
niklase@google.com470e71d2011-07-07 08:21:25 +000071#else
72 int i;
bjornv@webrtc.orgd32c4382014-08-25 11:19:05 +000073 int samples = length_bytes >> 1;
niklase@google.com470e71d2011-07-07 08:21:25 +000074
75 for (i=0;i<samples;i++) {
pbos@webrtc.org0946a562013-04-09 00:28:06 +000076 speechOut16b[i]=(((uint16_t)speechIn16b[i])>>8)|(((uint16_t)(speechIn16b[i]&0xFF))<<8);
niklase@google.com470e71d2011-07-07 08:21:25 +000077 }
78#endif
79
80 *speechType=1;
tommi@webrtc.orgc7d5f622011-08-31 12:11:24 +000081
bjornv@webrtc.orgd32c4382014-08-25 11:19:05 +000082 return length_bytes >> 1;
niklase@google.com470e71d2011-07-07 08:21:25 +000083}
84
85/* "old" version of the decoder that uses char as input (not used in NetEq any more) */
pbos@webrtc.org0946a562013-04-09 00:28:06 +000086int16_t WebRtcPcm16b_Decode(unsigned char *speech8b,
87 int16_t len,
88 int16_t *speech16b)
niklase@google.com470e71d2011-07-07 08:21:25 +000089{
pbos@webrtc.org0946a562013-04-09 00:28:06 +000090 int16_t samples=len>>1;
91 int16_t pos;
92 int16_t shortval;
niklase@google.com470e71d2011-07-07 08:21:25 +000093 for (pos=0;pos<samples;pos++) {
94 shortval=((unsigned short) speech8b[pos*2]);
95 shortval=(shortval<<8)&HIGHEND;
96 shortval=shortval|(((unsigned short) speech8b[pos*2+1])&LOWEND);
97 speech16b[pos]=shortval;
98 }
99 return(samples);
100}