/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_PCM16B_MAIN_INTERFACE_PCM16B_H_
#define WEBRTC_MODULES_AUDIO_CODING_CODECS_PCM16B_MAIN_INTERFACE_PCM16B_H_
/*
 * Define the fixpoint numeric formats
 */

#include "typedefs.h"

#ifdef __cplusplus
extern "C" {
#endif

/****************************************************************************
 * WebRtcPcm16b_EncodeW16(...)
 *
 * "Encode" a sample vector to 16 bit linear (Encoded standard is big endian)
 *
 * Input:
 *		- speechIn16b	: Input speech vector
 *		- len			: Number of samples in speech vector
 *
 * Output:
 *		- speechOut16b	: Encoded data vector (big endian 16 bit)
 *
 * Returned value		: Size in bytes of speechOut16b
 */

WebRtc_Word16 WebRtcPcm16b_EncodeW16(WebRtc_Word16 *speechIn16b,
                                     WebRtc_Word16 len,
                                     WebRtc_Word16 *speechOut16b);

/****************************************************************************
 * WebRtcPcm16b_Encode(...)
 *
 * "Encode" a sample vector to 16 bit linear (Encoded standard is big endian)
 *
 * Input:
 *		- speech16b		: Input speech vector
 *		- len			: Number of samples in speech vector
 *
 * Output:
 *		- speech8b		: Encoded data vector (big endian 16 bit)
 *
 * Returned value		: Size in bytes of speech8b
 */

WebRtc_Word16 WebRtcPcm16b_Encode(WebRtc_Word16 *speech16b,
                                  WebRtc_Word16 len,
                                  unsigned char *speech8b);

/****************************************************************************
 * WebRtcPcm16b_DecodeW16(...)
 *
 * "Decode" a vector to 16 bit linear (Encoded standard is big endian)
 *
 * Input:
 *		- speechIn16b	: Encoded data vector (big endian 16 bit)
 *		- len			: Number of bytes in speechIn16b
 *
 * Output:
 *		- speechOut16b	: Decoded speech vector
 *
 * Returned value		: Samples in speechOut16b
 */

WebRtc_Word16 WebRtcPcm16b_DecodeW16(void *inst,
                                     WebRtc_Word16 *speechIn16b,
                                     WebRtc_Word16 len,
                                     WebRtc_Word16 *speechOut16b,
                                     WebRtc_Word16* speechType);

/****************************************************************************
 * WebRtcPcm16b_Decode(...)
 *
 * "Decode" a vector to 16 bit linear (Encoded standard is big endian)
 *
 * Input:
 *		- speech8b		: Encoded data vector (big endian 16 bit)
 *		- len			: Number of bytes in speech8b
 *
 * Output:
 *		- speech16b		: Decoded speech vector
 *
 * Returned value		: Samples in speech16b
 */


WebRtc_Word16 WebRtcPcm16b_Decode(unsigned char *speech8b,
                                  WebRtc_Word16 len,
                                  WebRtc_Word16 *speech16b);

#ifdef __cplusplus
}
#endif

#endif /* PCM16B */
