Home | History | Annotate | Download | only in pcm16b
      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