OI_CODEC_SBC_DECODER_CONTEXT context;
OI_UINT32 contextData[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
OI_INT16 pcmData[15*SBC_MAX_SAMPLES_PER_FRAME*SBC_MAX_CHANNELS];
-void *dlhandle = NULL;
-oi_sbc_decoder_vendor_interface_t *oi_sbc_decode_vnd_if = NULL;
#endif
/*****************************************************************************
static void btif_a2dp_encoder_update(void);
const char* dump_media_event(UINT16 event);
#ifdef BTA_AVK_INCLUDED
-void btif_load_decoder_library();
+extern OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ unsigned long *frameBytes,
+ OI_INT16 *pcmData,
+ unsigned long *pcmBytes);
+extern OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ unsigned long *decoderData,
+ unsigned long decoderDataBytes,
+ OI_UINT8 maxChannels,
+ OI_UINT8 pcmStride,
+ OI_BOOL enhanced);
#endif
static void btif_media_flush_q(BUFFER_Q *p_q);
static void btif_media_task_aa_handle_stop_decoding(void );
for(count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++)
{
pcmBytes = availPcmBytes;
- status = oi_sbc_decode_vnd_if->OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE**)&sbc_start_frame,
- &sbc_frame_len, pcmDataPointer, &pcmBytes);
+ status = OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE**)&sbc_start_frame,
+ (OI_UINT32 *)&sbc_frame_len,
+ (OI_INT16 *)pcmDataPointer,
+ (OI_UINT32 *)&pcmBytes);
if (!OI_SUCCESS(status)) {
APPL_TRACE_ERROR1("Decoding failure: %d\n", status);
break;
APPL_TRACE_DEBUG0("btif_media_task_aa_handle_clear_track");
btStopTrack();
btDeleteTrack();
- if (dlhandle)
- {
- APPL_TRACE_DEBUG0("Unload Decoder lib");
- dlclose(dlhandle);
- dlhandle = NULL;
- oi_sbc_decode_vnd_if = NULL;
- }
}
/*******************************************************************************
tA2D_STATUS a2d_status;
tA2D_SBC_CIE sbc_cie;
OI_STATUS status;
- UINT32 freq_multiple; /* frequency multiple for 20ms of data */
- UINT32 num_blocks;
- UINT32 num_subbands;
- UINT32 num_channel;
+ UINT32 freq_multiple = 48*20; /* frequency multiple for 20ms of data , initialize with 48K*/
+ UINT32 num_blocks = 16;
+ UINT32 num_subbands = 8;
APPL_TRACE_DEBUG6("btif_media_task_aa_handle_decoder_reset p_codec_info[%x:%x:%x:%x:%x:%x]",
p_buf->codec_info[1], p_buf->codec_info[2], p_buf->codec_info[3],
btif_media_cb.is_source = FALSE;
btif_media_cb.rx_flush = FALSE;
APPL_TRACE_DEBUG0("Reset to sink role");
- btif_load_decoder_library();
- status = oi_sbc_decode_vnd_if->OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE);
+ status = OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE);
if (!OI_SUCCESS(status)) {
APPL_TRACE_ERROR1("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status);
}
}
-#ifdef BTA_AVK_INCLUDED
-void btif_load_decoder_library()
-{
- dlhandle = dlopen("liboi_sbc_decoder.so", RTLD_NOW);
- APPL_TRACE_DEBUG0("Load decoder library");
- if (!dlhandle)
- {
- APPL_TRACE_ERROR0("!!! Failed to load oi_sbc_decoder.so !!!");
- return;
- }
-
- oi_sbc_decode_vnd_if = (oi_sbc_decoder_vendor_interface_t *) dlsym(dlhandle, "OI_SBC_DECODER_VENDOR_LIB_INTERFACE");
- if (!oi_sbc_decode_vnd_if)
- {
- APPL_TRACE_ERROR0("!!! Failed to get oi sbc decode vendor interface !!!");
- return;
- }
-}
-#endif
--- /dev/null
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
+
+# Cleanup our locals
+#bdroid_C_INCLUDES :=
+#bdroid_CFLaGS :=
--- /dev/null
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
+
+# Cleanup our locals
+#bdroid_C_INCLUDES :=
+#bdroid_CFLaGS :=
--- /dev/null
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# sbc decoder
+LOCAL_SRC_FILES+= \
+ ./srce/alloc.c \
+ ./srce/bitalloc.c \
+ ./srce/bitalloc-sbc.c \
+ ./srce/bitstream-decode.c \
+ ./srce/decoder-oina.c \
+ ./srce/decoder-private.c \
+ ./srce/decoder-sbc.c \
+ ./srce/dequant.c \
+ ./srce/framing.c \
+ ./srce/framing-sbc.c \
+ ./srce/oi_codec_version.c \
+ ./srce/synthesis-sbc.c \
+ ./srce/synthesis-dct8.c \
+ ./srce/synthesis-8-generated.c \
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/srce
+
+LOCAL_MODULE:= libbt-qcom_sbc_decoder
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+
+include $(BUILD_STATIC_LIBRARY)
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_ASSERT_H
+#define _OI_ASSERT_H
+/** @file
+ This file provides macros and functions for compile-time and run-time assertions.
+
+ When the OI_DEBUG preprocessor value is defined, the macro OI_ASSERT is compiled into
+ the program, providing for a runtime assertion failure check.
+ C_ASSERT is a macro that can be used to perform compile time checks.
+*/
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+
+/** \addtogroup Debugging Debugging APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifdef OI_DEBUG
+
+/** The macro OI_ASSERT takes a condition argument. If the asserted condition
+ does not evaluate to true, the OI_ASSERT macro calls the host-dependent function,
+ OI_AssertFail(), which reports the failure and generates a runtime error.
+*/
+void OI_AssertFail(char* file, int line, char* reason);
+
+
+#define OI_ASSERT(condition) \
+ { if (!(condition)) OI_AssertFail(__FILE__, __LINE__, #condition); }
+
+#define OI_ASSERT_FAIL(msg) \
+ { OI_AssertFail(__FILE__, __LINE__, msg); }
+
+#else
+
+
+#define OI_ASSERT(condition)
+#define OI_ASSERT_FAIL(msg)
+
+#endif
+
+
+/**
+ C_ASSERT() can be used to perform many compile-time assertions: type sizes, field offsets, etc.
+ An assertion failure results in compile time error C2118: negative subscript.
+ Unfortunately, this elegant macro doesn't work with GCC, so it's all commented out
+ for now. Perhaps later.....
+*/
+
+#ifndef C_ASSERT
+// #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
+// #define C_ASSERT(e)
+#endif
+
+
+/*****************************************************************************/
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_ASSERT_H */
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_BITSTREAM_H
+#define _OI_BITSTREAM_H
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+
+/**
+@file
+Function prototypes and macro definitions for manipulating input and output
+bitstreams.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_stddefs.h"
+
+INLINE void OI_BITSTREAM_ReadInit(OI_BITSTREAM *bs, const OI_BYTE *buffer);
+
+INLINE void OI_BITSTREAM_WriteInit(OI_BITSTREAM *bs, OI_BYTE *buffer);
+
+INLINE OI_UINT32 OI_BITSTREAM_ReadUINT(OI_BITSTREAM *bs, OI_UINT bits);
+
+INLINE OI_UINT8 OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM *bs);
+
+INLINE OI_UINT8 OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM *bs);
+
+INLINE void OI_BITSTREAM_WriteUINT(OI_BITSTREAM *bs,
+ OI_UINT16 value,
+ OI_UINT bits);
+
+/*
+ * Use knowledge that the bitstream is aligned to optimize the write of a byte
+ */
+PRIVATE void OI_BITSTREAM_WriteUINT8Aligned(OI_BITSTREAM *bs,
+ OI_UINT8 datum);
+
+/*
+ * Use knowledge that the bitstream is aligned to optimize the write pair of nibbles
+ */
+PRIVATE void OI_BITSTREAM_Write2xUINT4Aligned(OI_BITSTREAM *bs,
+ OI_UINT8 datum1,
+ OI_UINT8 datum2);
+
+/** Internally the bitstream looks ahead in the stream. When
+ * OI_SBC_ReadScalefactors() goes to temporarily break the abstraction, it will
+ * need to know where the "logical" pointer is in the stream.
+ */
+#define OI_BITSTREAM_GetWritePtr(bs) ((bs)->ptr.w - 3)
+#define OI_BITSTREAM_GetReadPtr(bs) ((bs)->ptr.r - 3)
+
+/** This is declared here as a macro because decoder.c breaks the bitsream
+ * encapsulation for efficiency reasons.
+ */
+#define OI_BITSTREAM_READUINT(result, bits, ptr, value, bitPtr) \
+do { \
+ OI_ASSERT((bits) <= 16); \
+ OI_ASSERT((bitPtr) < 16); \
+ OI_ASSERT((bitPtr) >= 8); \
+ \
+ result = (value) << (bitPtr); \
+ result >>= 32 - (bits); \
+ \
+ bitPtr += (bits); \
+ while (bitPtr >= 16) { \
+ value = ((value) << 8) | *ptr++; \
+ bitPtr -= 8; \
+ } \
+ OI_ASSERT((bits == 0) || (result < (1u << (bits)))); \
+} while (0)
+
+
+#define OI_BITSTREAM_WRITEUINT(ptr, value, bitPtr, datum, bits) \
+do {\
+ bitPtr -= bits;\
+ value |= datum << bitPtr;\
+ \
+ while (bitPtr <= 16) {\
+ bitPtr += 8;\
+ *ptr++ = (OI_UINT8)(value >> 24);\
+ value <<= 8;\
+ }\
+} while (0)
+
+#define OI_BITSTREAM_WRITEFLUSH(ptr, value, bitPtr) \
+do {\
+ while (bitPtr < 32) {\
+ bitPtr += 8;\
+ *ptr++ = (OI_UINT8)(value >> 24);\
+ value <<= 8;\
+ }\
+} while (0)
+
+/**
+@}
+*/
+
+#endif /* _OI_BITSTREAM_H */
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_BT_SPEC_H
+#define _OI_BT_SPEC_H
+/**
+ * @file
+ *
+ * This file contains common definitions from the Bluetooth specification.
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** The maximum number of active slaves in a piconet. */
+#define OI_BT_MAX_ACTIVE_SLAVES 7
+
+/** the number of bytes in a Bluetooth device address (BD_ADDR) */
+#define OI_BD_ADDR_BYTE_SIZE 6
+
+/**
+ * 48-bit Bluetooth device address
+ *
+ * Because 48-bit integers may not be supported on all platforms, the
+ * address is defined as an array of bytes. This array is big-endian,
+ * meaning that
+ * - array[0] contains bits 47-40,
+ * - array[1] contains bits 39-32,
+ * - array[2] contains bits 31-24,
+ * - array[3] contains bits 23-16,
+ * - array[4] contains bits 15-8, and
+ * - array[5] contains bits 7-0.
+ */
+typedef struct {
+ OI_UINT8 addr[OI_BD_ADDR_BYTE_SIZE] ; /**< Bluetooth device address represented as an array of 8-bit values */
+} OI_BD_ADDR ;
+
+/**
+ * @name Data types for working with UUIDs
+ * UUIDs are 16 bytes (128 bits).
+ *
+ * To avoid having to pass around 128-bit values all the time, 32-bit and 16-bit
+ * UUIDs are defined, along with a mapping from the shorter versions to the full
+ * version.
+ *
+ * @{
+ */
+
+/**
+ * 16-bit representation of a 128-bit UUID
+ */
+typedef OI_UINT16 OI_UUID16;
+
+/**
+ * 32-bit representation of a 128-bit UUID
+ */
+typedef OI_UINT32 OI_UUID32;
+
+/**
+ * number of bytes in a 128 bit UUID
+ */
+#define OI_BT_UUID128_SIZE 16
+
+/**
+ * number of bytes in IPv6 style addresses
+ */
+#define OI_BT_IPV6ADDR_SIZE 16
+
+/**
+ * type definition for a 128-bit UUID
+ *
+ * To simplify conversion between 128-bit UUIDs and 16-bit and 32-bit UUIDs,
+ * the most significant 32 bits are stored with the same endian-ness as is
+ * native on the target (local) device. The remainder of the 128-bit UUID is
+ * stored as bytes in big-endian order.
+ */
+typedef struct {
+ OI_UINT32 ms32bits; /**< most significant 32 bits of 128-bit UUID */
+ OI_UINT8 base[OI_BT_UUID128_SIZE - sizeof(OI_UINT32)]; /**< remainder of 128-bit UUID, array of 8-bit values */
+} OI_UUID128;
+
+/** @} */
+
+/** number of bytes in a link key */
+#define OI_BT_LINK_KEY_SIZE 16
+
+/**
+ * type definition for a baseband link key
+ *
+ * Because 128-bit integers may not be supported on all platforms, we define
+ * link keys as an array of bytes. Unlike the Bluetooth device address,
+ * the link key is stored in little-endian order, meaning that
+ * - array[0] contains bits 0 - 7,
+ * - array[1] contains bits 8 - 15,
+ * - array[2] contains bits 16 - 23,
+ * - array[3] contains bits 24 - 31,
+ * - array[4] contains bits 32 - 39,
+ * - array[5] contains bits 40 - 47,
+ * - array[6] contains bits 48 - 55,
+ * - array[7] contains bits 56 - 63,
+ * - array[8] contains bits 64 - 71,
+ * - array[9] contains bits 72 - 79,
+ * - array[10] contains bits 80 - 87,
+ * - array[11] contains bits 88 - 95,
+ * - array[12] contains bits 96 - 103,
+ * - array[13] contains bits 104- 111,
+ * - array[14] contains bits 112- 119, and
+ * - array[15] contains bits 120- 127.
+ */
+typedef struct {
+ OI_UINT8 key[OI_BT_LINK_KEY_SIZE] ; /**< link key represented as an array of 8-bit values */
+} OI_LINK_KEY ;
+
+
+/** Out-of-band data size - C and R values are 16-bytes each */
+#define OI_BT_OOB_NUM_BYTES 16
+
+typedef struct {
+ OI_UINT8 value[OI_BT_OOB_NUM_BYTES] ; /**< same struct used for C and R values */
+} OI_OOB_DATA ;
+
+
+/**
+ * link key types
+ */
+typedef enum {
+ OI_LINK_KEY_TYPE_COMBO = 0, /**< combination key */
+ OI_LINK_KEY_TYPE_LOCAL_UNIT = 1, /**< local unit key */
+ OI_LINK_KEY_TYPE_REMOTE_UNIT = 2, /**< remote unit key */
+ OI_LINK_KEY_TYPE_DEBUG_COMBO = 3, /**< debug combination key */
+ OI_LINK_KEY_TYPE_UNAUTHENTICATED = 4, /**< Unauthenticated */
+ OI_LINK_KEY_TYPE_AUTHENTICATED = 5, /**< Authenticated */
+ OI_LINK_KEY_TYPE_CHANGED_COMBO = 6 /**< Changed */
+
+} OI_BT_LINK_KEY_TYPE ;
+
+
+/** amount of space allocated for a PIN (personal indentification number) in bytes */
+#define OI_BT_PIN_CODE_SIZE 16
+
+/** data type for a PIN (PINs are treated as strings, so endianness does not apply.) */
+typedef struct {
+ OI_UINT8 pin[OI_BT_PIN_CODE_SIZE] ; /**< PIN represented as an array of 8-bit values */
+} OI_PIN_CODE ;
+
+/** maximum number of SCO connections per device, which is 3 as of version 2.0+EDR
+ of the Bluetooth specification (see sec 4.3 of vol 2 part B) */
+#define OI_BT_MAX_SCO_CONNECTIONS 3
+
+/** data type for clock offset */
+typedef OI_UINT16 OI_BT_CLOCK_OFFSET ;
+
+/** data type for a LM handle */
+typedef OI_UINT16 OI_HCI_LM_HANDLE;
+
+/** opaque data type for a SCO or ACL connection handle */
+typedef struct _OI_HCI_CONNECTION *OI_HCI_CONNECTION_HANDLE;
+
+/** data type for HCI Error Code, as defined in oi_hcispec.h */
+typedef OI_UINT8 OI_HCI_ERROR_CODE ;
+
+/**
+ * The Bluetooth device type is indicated by a 24-bit bitfield, represented as a
+ * 32-bit number in the stack. The bit layout and values for device class are specified
+ * in the file oi_bt_assigned_nos.h and in the Bluetooth "Assigned Numbers" specification
+ * at http://www.bluetooth.org/assigned-numbers/.
+ */
+typedef OI_UINT32 OI_BT_DEVICE_CLASS ;
+
+#define OI_BT_DEV_CLASS_FORMAT_MASK 0x000003 /**< Bits 0-1 contain format type. */
+#define OI_BT_DEV_CLASS_MINOR_DEVICE_MASK 0x0000FC /**< Bits 2-7 contain minor device class value. */
+#define OI_BT_DEV_CLASS_MAJOR_DEVICE_MASK 0x001F00 /**< Bits 8-12 contain major device class value. */
+#define OI_BT_DEV_CLASS_MAJOR_SERVICE_MASK 0xFFE000 /**< Bits 13-23 contain major service class value. */
+
+/** There is currently only one device class format defined, type 00. */
+#define OI_BT_DEV_CLASS_FORMAT_TYPE 00
+
+/** Bit 13 in device class indicates limited discoverability mode (GAP v2.0+EDR, section 4.1.2.2) */
+#define OI_BT_DEV_CLASS_LIMITED_DISCO_BIT BIT13
+
+/** macro to test validity of the Device Class Format */
+#define OI_BT_VALID_DEVICE_CLASS_FORMAT(class) (OI_BT_DEV_CLASS_FORMAT_TYPE == ((class) & OI_BT_DEV_CLASS_FORMAT_MASK))
+
+/** the time between baseband clock ticks, currently 625 microseconds (one slot) */
+#define OI_BT_TICK 625
+/** some macros to convert to/from baseband clock ticks - use no floating point! */
+#define OI_SECONDS_TO_BT_TICKS(secs) ((secs)*1600)
+#define OI_BT_TICKS_TO_SECONDS(ticks) ((ticks)/1600)
+#define OI_MSECS_TO_BT_TICKS(msecs) (((msecs)*8)/5)
+#define OI_BT_TICKS_TO_MSECS(ticks) (((ticks)*5)/8)
+
+/** EIR byte order */
+#define OI_EIR_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+/*****************************************************************************/
+#endif /* _OI_BT_SPEC_H */
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#ifndef _OI_CODEC_SBC_CORE_H
+#define _OI_CODEC_SBC_CORE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+@file
+Declarations of codec functions, data types, and macros.
+
+@ingroup codec_lib
+*/
+
+/**
+@addtogroup codec_lib
+@{
+*/
+
+/* Non-BM3 users of of the codec must include oi_codec_sbc_bm3defs.h prior to
+ * including this file, or else these includes will fail because the BM3 SDK is
+ * not in the include path */
+#ifndef _OI_CODEC_SBC_BM3DEFS_H
+#include "oi_stddefs.h"
+#include "oi_status.h"
+#endif
+
+#include <stdint.h>
+
+#define SBC_MAX_CHANNELS 2
+#define SBC_MAX_BANDS 8
+#define SBC_MAX_BLOCKS 16
+#define SBC_MIN_BITPOOL 2 /**< Minimum size of the bit allocation pool used to encode the stream */
+#define SBC_MAX_BITPOOL 250 /**< Maximum size of the bit allocation pool used to encode the stream */
+#define SBC_MAX_ONE_CHANNEL_BPS 320000
+#define SBC_MAX_TWO_CHANNEL_BPS 512000
+
+
+#define SBC_WBS_BITRATE 62000
+#define SBC_WBS_BITPOOL 27
+#define SBC_WBS_NROF_BLOCKS 16
+#define SBC_WBS_FRAME_LEN 62
+#define SBC_WBS_SAMPLES_PER_FRAME 128
+
+
+#define SBC_HEADER_LEN 4
+#define SBC_MAX_FRAME_LEN (SBC_HEADER_LEN + \
+ ((SBC_MAX_BANDS * SBC_MAX_CHANNELS / 2) + \
+ (SBC_MAX_BANDS + SBC_MAX_BLOCKS * SBC_MAX_BITPOOL + 7)/8))
+#define SBC_MAX_SAMPLES_PER_FRAME (SBC_MAX_BANDS * SBC_MAX_BLOCKS)
+
+#define SBC_MAX_SCALEFACTOR_BYTES ((4*(SBC_MAX_CHANNELS * SBC_MAX_BANDS) + 7)/8)
+
+#define OI_SBC_SYNCWORD 0x9c
+#define OI_SBC_ENHANCED_SYNCWORD 0x9d
+
+/**@name Sampling frequencies */
+/**@{*/
+#define SBC_FREQ_16000 0 /**< The sampling frequency is 16 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_FREQ_32000 1 /**< The sampling frequency is 32 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_FREQ_44100 2 /**< The sampling frequency is 44.1 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_FREQ_48000 3 /**< The sampling frequency is 48 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Channel modes */
+/**@{*/
+#define SBC_MONO 0 /**< The mode of the encoded channel is mono. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_DUAL_CHANNEL 1 /**< The mode of the encoded channel is dual-channel. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_STEREO 2 /**< The mode of the encoded channel is stereo. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_JOINT_STEREO 3 /**< The mode of the encoded channel is joint stereo. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Subbands */
+/**@{*/
+#define SBC_SUBBANDS_4 0 /**< The encoded stream has 4 subbands. One possible value for the @a subbands parameter of OI_CODEC_SBC_EncoderConfigure()*/
+#define SBC_SUBBANDS_8 1 /**< The encoded stream has 8 subbands. One possible value for the @a subbands parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Block lengths */
+/**@{*/
+#define SBC_BLOCKS_4 0 /**< A block size of 4 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_BLOCKS_8 1 /**< A block size of 8 blocks was used to encode the stream is. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_BLOCKS_12 2 /**< A block size of 12 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_BLOCKS_16 3 /**< A block size of 16 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Bit allocation methods */
+/**@{*/
+#define SBC_LOUDNESS 0 /**< The bit allocation method. One possible value for the @a loudness parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_SNR 1 /**< The bit allocation method. One possible value for the @a loudness parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**
+@}
+
+@addtogroup codec_internal
+@{
+*/
+
+typedef OI_INT16 SBC_BUFFER_T;
+
+
+/** Used internally. */
+typedef struct {
+ OI_UINT16 frequency; /**< The sampling frequency. Input parameter. */
+ OI_UINT8 freqIndex;
+
+ OI_UINT8 nrof_blocks; /**< The block size used to encode the stream. Input parameter. */
+ OI_UINT8 blocks;
+
+
+ OI_UINT8 nrof_subbands; /**< The number of subbands of the encoded stream. Input parameter. */
+ OI_UINT8 subbands;
+
+ OI_UINT8 mode; /**< The mode of the encoded channel. Input parameter. */
+ OI_UINT8 nrof_channels; /**< The number of channels of the encoded stream. */
+
+ OI_UINT8 alloc; /**< The bit allocation method. Input parameter. */
+ OI_UINT8 bitpool; /**< Size of the bit allocation pool used to encode the stream. Input parameter. */
+ OI_UINT8 crc; /**< Parity check byte used for error detection. */
+ OI_UINT8 join; /**< Whether joint stereo has been used. */
+ OI_UINT8 enhanced;
+ OI_UINT8 min_bitpool; /**< This value is only used when encoding. SBC_MAX_BITPOOL if variable
+ bitpools are disallowed, otherwise the minimum bitpool size that will
+ be used by the bit allocator. */
+
+ OI_UINT8 cachedInfo; /**< Information about the previous frame */
+} OI_CODEC_SBC_FRAME_INFO;
+
+/** Used internally. */
+typedef struct {
+ const OI_CHAR *codecInfo;
+ OI_CODEC_SBC_FRAME_INFO frameInfo;
+ OI_INT8 scale_factor[SBC_MAX_CHANNELS*SBC_MAX_BANDS];
+ OI_UINT32 frameCount;
+ OI_INT32 *subdata;
+
+ SBC_BUFFER_T *filterBuffer[SBC_MAX_CHANNELS];
+ OI_INT32 filterBufferLen;
+ OI_UINT filterBufferOffset;
+
+ union {
+ OI_UINT8 uint8[SBC_MAX_CHANNELS*SBC_MAX_BANDS];
+ OI_UINT32 uint32[SBC_MAX_CHANNELS*SBC_MAX_BANDS/4];
+ } bits;
+ OI_UINT8 maxBitneed; /**< Running maximum bitneed */
+ OI_BYTE formatByte;
+ OI_UINT8 pcmStride;
+ OI_UINT8 maxChannels;
+} OI_CODEC_SBC_COMMON_CONTEXT;
+
+
+/*
+ * A smaller value reduces RAM usage at the expense of increased CPU usage. Values in the range
+ * 27..50 are recommended, beyond 50 there is a diminishing return on reduced CPU usage.
+ */
+#define SBC_CODEC_MIN_FILTER_BUFFERS 16
+#define SBC_CODEC_FAST_FILTER_BUFFERS 27
+
+/* Expands to the number of OI_UINT32s needed to ensure enough memory to encode
+ * or decode streams of numChannels channels, using numBuffers buffers.
+ * Example:
+ * OI_UINT32 decoderData[CODEC_DATA_WORDS(SBC_MAX_CHANNELS, SBC_DECODER_FAST_SYNTHESIS_BUFFERS)];
+ * */
+#define CODEC_DATA_WORDS(numChannels, numBuffers) \
+ ((\
+ (sizeof(OI_INT32) * SBC_MAX_BLOCKS * numChannels * SBC_MAX_BANDS) \
+ + (sizeof(SBC_BUFFER_T) * SBC_MAX_CHANNELS * SBC_MAX_BANDS * numBuffers) \
+ + (sizeof (OI_UINT32) - 1) \
+ ) / sizeof(OI_UINT32))
+
+/** Opaque parameter to decoding functions; maintains decoder context. */
+typedef struct {
+ OI_CODEC_SBC_COMMON_CONTEXT common;
+ OI_UINT8 limitFrameFormat; /* Boolean, set by OI_CODEC_SBC_DecoderLimit() */
+ OI_UINT8 restrictSubbands;
+ OI_UINT8 enhancedEnabled;
+ OI_UINT8 bufferedBlocks;
+} OI_CODEC_SBC_DECODER_CONTEXT;
+
+typedef struct {
+ OI_UINT32 data[CODEC_DATA_WORDS(1, SBC_CODEC_FAST_FILTER_BUFFERS)];
+} OI_CODEC_SBC_CODEC_DATA_MONO;
+
+typedef struct {
+ OI_UINT32 data[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
+} OI_CODEC_SBC_CODEC_DATA_STEREO;
+
+/**
+@}
+
+@addtogroup codec_lib
+@{
+*/
+
+/**
+ * This function resets the decoder. The context must be reset when
+ * changing streams, or if the following stream parameters change:
+ * number of subbands, stereo mode, or frequency.
+ *
+ * @param context Pointer to the decoder context structure to be reset.
+ *
+ * @param enhanced If true, enhanced SBC operation is enabled. If enabled,
+ * the codec will recognize the alternative syncword for
+ * decoding an enhanced SBC stream. Enhancements should not
+ * be enabled unless the stream is known to be generated
+ * by an enhanced encoder, or there is a small possibility
+ * for decoding glitches if synchronization were to be lost.
+ */
+OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT32 *decoderData,
+ OI_UINT32 decoderDataBytes,
+ OI_UINT8 maxChannels,
+ OI_UINT8 pcmStride,
+ OI_BOOL enhanced);
+
+/**
+ * This function restricts the kind of SBC frames that the Decoder will
+ * process. Its use is optional. If used, it must be called after
+ * calling OI_CODEC_SBC_DecoderReset(). After it is called, any calls
+ * to OI_CODEC_SBC_DecodeFrame() with SBC frames that do not conform
+ * to the Subband and Enhanced SBC setting will be rejected with an
+ * OI_STATUS_INVALID_PARAMETERS return.
+ *
+ * @param context Pointer to the decoder context structure to be limited.
+ *
+ * @param enhanced If true, all frames passed to the decoder must be
+ * Enhanced SBC frames. If false, all frames must be
+ * standard SBC frames.
+ *
+ * @param subbands May be set to SBC_SUBBANDS_4 or SBC_SUBBANDS_8. All
+ * frames passed to the decoder must be encoded with
+ * the requested number of subbands.
+ *
+ */
+OI_STATUS OI_CODEC_SBC_DecoderLimit(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_BOOL enhanced,
+ OI_UINT8 subbands);
+
+/**
+ * This function sets the decoder parameters for a raw decode where the decoder parameters are not
+ * available in the sbc data stream. OI_CODEC_SBC_DecoderReset must be called
+ * prior to calling this function.
+ *
+ * @param context Decoder context structure. This must be the context must be
+ * used each time a frame is decoded.
+ *
+ * @param enhanced Set to TRUE to enable Qualcomm proprietary
+ * quality enhancements.
+ *
+ * @param frequency One of SBC_FREQ_16000, SBC_FREQ_32000, SBC_FREQ_44100,
+ * SBC_FREQ_48000
+ *
+ * @param mode One of SBC_MONO, SBC_DUAL_CHANNEL, SBC_STEREO,
+ * SBC_JOINT_STEREO
+ *
+ * @param subbands One of SBC_SUBBANDS_4, SBC_SUBBANDS_8
+ *
+ * @param blocks One of SBC_BLOCKS_4, SBC_BLOCKS_8, SBC_BLOCKS_12,
+ * SBC_BLOCKS_16
+ *
+ * @param alloc One of SBC_LOUDNESS, SBC_SNR
+ *
+ * @param maxBitpool The maximum bitpool size for this context
+ */
+OI_STATUS OI_CODEC_SBC_DecoderConfigureRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_BOOL enhanced,
+ OI_UINT8 frequency,
+ OI_UINT8 mode,
+ OI_UINT8 subbands,
+ OI_UINT8 blocks,
+ OI_UINT8 alloc,
+ OI_UINT8 maxBitpool);
+
+/**
+ * Decode one SBC frame. The frame has no header bytes. The context must have been previously
+ * initialized by calling OI_CODEC_SBC_DecoderConfigureRaw().
+ *
+ * @param context Pointer to a decoder context structure. The same context
+ * must be used each time when decoding from the same stream.
+ *
+ * @param bitpool The actual bitpool size for this frame. Must be <= the maxbitpool specified
+ * in the call to OI_CODEC_SBC_DecoderConfigureRaw(),
+ *
+ * @param frameData Address of a pointer to the SBC data to decode. This
+ * value will be updated to point to the next frame after
+ * successful decoding.
+ *
+ * @param frameBytes Pointer to a UINT32 containing the number of available
+ * bytes of frame data. This value will be updated to reflect
+ * the number of bytes remaining after a decoding operation.
+ *
+ * @param pcmData Address of an array of OI_INT16 pairs, which will be
+ * populated with the decoded audio data. This address
+ * is not updated.
+ *
+ * @param pcmBytes Pointer to a UINT32 in/out parameter. On input, it
+ * should contain the number of bytes available for pcm
+ * data. On output, it will contain the number of bytes
+ * written. Note that this differs from the semantics of
+ * frameBytes.
+ */
+OI_STATUS OI_CODEC_SBC_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT8 bitpool,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes);
+
+/**
+ * Decode one SBC frame.
+ *
+ * @param context Pointer to a decoder context structure. The same context
+ * must be used each time when decoding from the same stream.
+ *
+ * @param frameData Address of a pointer to the SBC data to decode. This
+ * value will be updated to point to the next frame after
+ * successful decoding.
+ *
+ * @param frameBytes Pointer to a UINT32 containing the number of available
+ * bytes of frame data. This value will be updated to reflect
+ * the number of bytes remaining after a decoding operation.
+ *
+ * @param pcmData Address of an array of OI_INT16 pairs, which will be
+ * populated with the decoded audio data. This address
+ * is not updated.
+ *
+ * @param pcmBytes Pointer to a UINT32 in/out parameter. On input, it
+ * should contain the number of bytes available for pcm
+ * data. On output, it will contain the number of bytes
+ * written. Note that this differs from the semantics of
+ * frameBytes.
+ */
+OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes);
+
+/**
+ * Calculate the number of SBC frames but don't decode. CRC's are not checked,
+ * but the Sync word is found prior to count calculation.
+ *
+ * @param frameData Pointer to the SBC data.
+ *
+ * @param frameBytes Number of bytes avaiable in the frameData buffer
+ *
+ */
+OI_UINT8 OI_CODEC_SBC_FrameCount(OI_BYTE *frameData,
+ OI_UINT32 frameBytes);
+
+/**
+ * Analyze an SBC frame but don't do the decode.
+ *
+ * @param context Pointer to a decoder context structure. The same context
+ * must be used each time when decoding from the same stream.
+ *
+ * @param frameData Address of a pointer to the SBC data to decode. This
+ * value will be updated to point to the next frame after
+ * successful decoding.
+ *
+ * @param frameBytes Pointer to a UINT32 containing the number of available
+ * bytes of frame data. This value will be updated to reflect
+ * the number of bytes remaining after a decoding operation.
+ *
+ */
+OI_STATUS OI_CODEC_SBC_SkipFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes);
+
+/* Common functions */
+
+/**
+ Calculate the frame length.
+
+ @param frame The frame whose length to calculate
+
+ @return the length of an individual encoded frame in
+ bytes
+ */
+OI_UINT16 OI_CODEC_SBC_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame);
+
+
+/**
+ * Calculate the maximum bitpool size that fits within a given frame length.
+ *
+ * @param frame The frame to calculate the bitpool size for
+ * @param frameLen The frame length to fit the bitpool to
+ *
+ * @return the maximum bitpool that will fit in the specified frame length
+ */
+OI_UINT16 OI_CODEC_SBC_CalculateBitpool(OI_CODEC_SBC_FRAME_INFO *frame,
+ OI_UINT16 frameLen);
+
+/**
+ Calculate the bit rate.
+
+ @param frame The frame whose bit rate to calculate
+
+ @return the approximate bit rate in bits per second,
+ assuming that stream parameters are constant
+ */
+OI_UINT32 OI_CODEC_SBC_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame);
+
+/**
+ Calculate decoded audio data length for one frame.
+
+ @param frame The frame whose audio data length to calculate
+
+ @return length of decoded audio data for a
+ single frame, in bytes
+ */
+OI_UINT16 OI_CODEC_SBC_CalculatePcmBytes(OI_CODEC_SBC_COMMON_CONTEXT *common);
+
+/**
+ * Get the codec version text.
+ *
+ * @return pointer to text string containing codec version text
+ *
+ */
+OI_CHAR *OI_CODEC_Version(void);
+
+
+/**
+@}
+
+@addtogroup codec_internal
+@{
+*/
+
+extern const OI_CHAR* const OI_CODEC_SBC_FreqText[];
+extern const OI_CHAR* const OI_CODEC_SBC_ModeText[];
+extern const OI_CHAR* const OI_CODEC_SBC_SubbandsText[];
+extern const OI_CHAR* const OI_CODEC_SBC_BlocksText[];
+extern const OI_CHAR* const OI_CODEC_SBC_AllocText[];
+
+/**
+@}
+
+@addtogroup codec_lib
+@{
+*/
+
+#ifdef OI_DEBUG
+void OI_CODEC_SBC_DumpConfig(OI_CODEC_SBC_FRAME_INFO *frameInfo);
+#else
+#define OI_CODEC_SBC_DumpConfig(f)
+#endif
+
+/**
+@}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _OI_CODEC_SBC_CORE_H */
+
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_CODEC_SBC_PRIVATE_H
+#define _OI_CODEC_SBC_PRIVATE_H
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/**
+@file
+Function prototypes and macro definitions used internally by the codec.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#ifdef USE_RESTRICT_KEYWORD
+#define RESTRICT restrict
+#else
+#define RESTRICT
+#endif
+
+#ifdef CODEC_DEBUG
+#include <stdio.h>
+#define ERROR(x) do { printf x; printf("\n"); } while (0)
+#else
+#define ERROR(x)
+#endif
+
+#ifdef TRACE_EXECUTION
+#define TRACE(x) do { printf x; printf("\n"); } while (0)
+#else
+#define TRACE(x)
+#endif
+
+#ifndef PRIVATE
+#define PRIVATE
+#endif
+
+#ifndef INLINE
+#define INLINE
+#endif
+
+#include "oi_assert.h"
+#include "oi_codec_sbc.h"
+
+#ifndef OI_SBC_SYNCWORD
+#define OI_SBC_SYNCWORD 0x9c
+#endif
+
+#ifndef DIVIDE
+#define DIVIDE(a, b) ((a) / (b))
+#endif
+
+typedef union {
+ OI_UINT8 uint8[SBC_MAX_BANDS];
+ OI_UINT32 uint32[SBC_MAX_BANDS / 4];
+} BITNEED_UNION1;
+
+typedef union {
+ OI_UINT8 uint8[2 * SBC_MAX_BANDS];
+ OI_UINT32 uint32[2 * SBC_MAX_BANDS / 4];
+} BITNEED_UNION2;
+
+static const OI_UINT16 freq_values[] = { 16000, 32000, 44100, 48000 };
+static const OI_UINT8 block_values[] = { 4, 8, 12, 16 };
+static const OI_UINT8 channel_values[] = { 1, 2, 2, 2 };
+static const OI_UINT8 band_values[] = { 4, 8 };
+
+
+#define TEST_MODE_SENTINEL "OINA"
+#define TEST_MODE_SENTINEL_LENGTH 4
+
+/** Used internally. */
+typedef struct {
+ union {
+ const OI_UINT8 *r;
+ OI_UINT8 *w;
+ } ptr;
+ OI_UINT32 value;
+ OI_UINT bitPtr;
+} OI_BITSTREAM;
+
+
+#define VALID_INT16(x) (((x) >= OI_INT16_MIN) && ((x) <= OI_INT16_MAX))
+#define VALID_INT32(x) (((x) >= OI_INT32_MIN) && ((x) <= OI_INT32_MAX))
+
+#define DCTII_8_SHIFT_IN 0
+#define DCTII_8_SHIFT_OUT 16-DCTII_8_SHIFT_IN
+
+#define DCTII_8_SHIFT_0 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_1 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_2 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_3 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_4 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_5 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_6 (DCTII_8_SHIFT_OUT-1)
+#define DCTII_8_SHIFT_7 (DCTII_8_SHIFT_OUT-2)
+
+#define DCT_SHIFT 15
+
+#define DCTIII_4_SHIFT_IN 2
+#define DCTIII_4_SHIFT_OUT 15
+
+#define DCTIII_8_SHIFT_IN 3
+#define DCTIII_8_SHIFT_OUT 14
+
+OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ OI_UINT8 *bitneeds,
+ OI_UINT ch,
+ OI_UINT *preferredBitpool);
+
+void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ BITNEED_UNION1 *bitneeds,
+ OI_UINT ch,
+ OI_UINT bitcount);
+
+
+OI_INT adjustToFitBitpool(const OI_UINT bitpool,
+ OI_UINT32 *bitneeds,
+ const OI_UINT subbands,
+ OI_UINT bitcount,
+ OI_UINT *excess);
+
+INLINE OI_INT allocAdjustedBits(OI_UINT8 *dest,
+ OI_INT bits,
+ OI_INT excess);
+
+INLINE OI_INT allocExcessBits(OI_UINT8 *dest,
+ OI_INT excess);
+
+PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame);
+
+PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame);
+
+void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common);
+
+typedef void (*BIT_ALLOC)(OI_CODEC_SBC_COMMON_CONTEXT *common);
+
+PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT8 bitpool,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes);
+
+INLINE OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT32 *decoderData,
+ OI_UINT32 decoderDataBytes,
+ OI_BYTE maxChannels,
+ OI_BYTE pcmStride,
+ OI_BOOL enhanced);
+
+INLINE OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_);
+
+PRIVATE OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame);
+
+PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *frame);
+PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data);
+
+/* Transform functions */
+PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount);
+PRIVATE void cosineModulateSynth4(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT in);
+PRIVATE void SynthWindow40_int32_int32_symmetry_with_sum(OI_INT16 *pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift);
+
+INLINE void dct3_4(OI_INT32 * RESTRICT out, OI_INT32 const * RESTRICT in);
+PRIVATE void analyze4_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 40],
+ OI_INT16 *pcm,
+ OI_UINT strideShift,
+ OI_INT32 subband[4]);
+
+INLINE void dct3_8(OI_INT32 * RESTRICT out, OI_INT32 const * RESTRICT in);
+
+PRIVATE void analyze8_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 80],
+ OI_INT16 *pcm,
+ OI_UINT strideShift,
+ OI_INT32 subband[8]);
+
+#ifdef SBC_ENHANCED
+PRIVATE void analyze8_enhanced_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 112],
+ OI_INT16 *pcm,
+ OI_UINT strideShift,
+ OI_INT32 subband[8]);
+#endif
+
+/* Decoder functions */
+
+INLINE void OI_SBC_ReadHeader(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data);
+PRIVATE void OI_SBC_ReadScalefactors(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *b, OI_BITSTREAM *bs);
+PRIVATE void OI_SBC_ReadSamples(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *ob);
+PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *global_bs);
+PRIVATE void OI_SBC_SynthFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT start_block, OI_UINT nrof_blocks);
+INLINE OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits);
+PRIVATE OI_BOOL OI_SBC_ExamineCommandPacket(OI_CODEC_SBC_DECODER_CONTEXT *context, const OI_BYTE *data, OI_UINT32 len);
+PRIVATE void OI_SBC_GenerateTestSignal(OI_INT16 pcmData[][2], OI_UINT32 sampleCount);
+
+PRIVATE void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame);
+PRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ OI_UINT32 *codecDataAligned,
+ OI_UINT32 codecDataBytes,
+ OI_UINT8 maxChannels,
+ OI_UINT8 pcmStride);
+/**
+@}
+*/
+
+#endif /* _OI_CODEC_SBC_PRIVATE_H */
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_COMMON_H
+#define _OI_COMMON_H
+/**
+ * @file
+ *
+ * This file is used to group commonly used BLUEmagic 3.0 software
+ * header files.
+ *
+ * This file should be included in application source code along with the header
+ * files for the specific modules of the protocol stack being used.
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_bt_spec.h"
+#include "oi_stddefs.h"
+#include "oi_status.h"
+#include "oi_time.h"
+#include "oi_osinterface.h"
+
+
+/*****************************************************************************/
+#endif /* _OI_COMMON_H */
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_CPU_DEP_H
+#define _OI_CPU_DEP_H
+/**
+ * @file
+ * This file contains definitions for characteristics of the target CPU and
+ * compiler, including primitive data types and endianness.
+ *
+ * This file defines the byte order and primitive data types for various
+ * CPU families. The preprocessor symbol 'CPU' must be defined to be an
+ * appropriate value or this header will generate a compile-time error.
+ *
+ * @note The documentation for this header file uses the x86 family of processors
+ * as an illustrative example for CPU/compiler-dependent data type definitions.
+ * Go to the source code of this header file to see the details of primitive type
+ * definitions for each platform.
+ *
+ * Additional information is available in the @ref data_types_docpage section.
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+/** @name Definitions indicating family of target OI_CPU_TYPE
+ * @{
+ */
+
+#define OI_CPU_X86 1 /**< x86 processor family */
+#define OI_CPU_ARM 2 /**< ARM processor family.
+ @deprecated Use #OI_CPU_ARM7_LEND or
+ #OI_CPU_ARM7_BEND. */
+#define OI_CPU_ARC 3 /**< ARC processor family.
+ @deprecated Use #OI_CPU_ARC_LEND or
+ #OI_CPU_ARC_BEND. */
+#define OI_CPU_SH3 4 /**< Hitachi SH-3 processor family */
+#define OI_CPU_H8 5 /**< Hitachi H8 processor family */
+#define OI_CPU_MIPS 6 /**< MIPS processor family */
+#define OI_CPU_SPARC 7 /**< SPARC processor family */
+#define OI_CPU_M68000 8 /**< Motorola M68000 processor family */
+#define OI_CPU_PPC 9 /**< PowerPC (PPC) processor family */
+#define OI_CPU_SH4_7750 10 /**< Hitachi SH7750 series in SH-4 processor family */
+#define OI_CPU_SH2 11 /**< Hitachi SH-2 processor family */
+#define OI_CPU_ARM7_LEND 12 /**< ARM7, little-endian */
+#define OI_CPU_ARM7_BEND 13 /**< ARM7, big-endian */
+#define OI_CPU_GDM1202 14 /**< GCT GDM1202 */
+#define OI_CPU_ARC_LEND 15 /**< ARC processor family, little-endian */
+#define OI_CPU_ARC_BEND 16 /**< ARC processor family, big-endian */
+#define OI_CPU_M30833F 17 /**< Mitsubishi M308 processor family */
+#define OI_CPU_CR16C 18 /**< National Semiconductor 16 bit processor family */
+#define OI_CPU_M64111 19 /**< Renesas M64111 processor (M32R family) */
+#define OI_CPU_ARMV5_LEND 20 //*< ARM5, little-endian */
+
+#define OI_CPU_TYPE 12
+
+#ifndef OI_CPU_TYPE
+ #error "OI_CPU_TYPE type not defined"
+#endif
+
+/**@}*/
+
+
+/** @name Definitions indicating byte-wise endianness of target CPU
+ * @{
+ */
+
+#define OI_BIG_ENDIAN_BYTE_ORDER 0 /**< Multiple-byte values are stored in memory beginning with the most significant byte at the lowest address. */
+#define OI_LITTLE_ENDIAN_BYTE_ORDER 1 /**< Multiple-byte values are stored in memory beginning with the least significant byte at the lowest address. */
+
+/**@}*/
+
+
+/** @name CPU/compiler-independent primitive data type definitions
+ * @{
+ */
+
+typedef int OI_BOOL; /**< Boolean values use native integer data type for target CPU. */
+typedef int OI_INT; /**< Integer values use native integer data type for target CPU. */
+typedef unsigned int OI_UINT; /**< Unsigned integer values use native unsigned integer data type for target CPU. */
+typedef unsigned char OI_BYTE; /**< Raw bytes type uses native character data type for target CPU. */
+
+/**@}*/
+
+
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_X86
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER /**< x86 platform byte ordering is little-endian */
+
+/** @name CPU/compiler-dependent primitive data type definitions for x86 processor family
+ * @{
+ */
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for x86 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for x86 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for x86 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for x86 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for x86 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for x86 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARM
+/* This CPU type is deprecated (removed from use). Instead, use OI_CPU_ARM7_LEND or OI_CPU_ARM7_BEND for
+ little-endian or big-endian configurations of the ARM7, respectively. */
+#error OI_CPU_ARM is deprecated
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARC
+/* This CPU type is deprecated (removed from use). Instead, use OI_CPU_ARC_LEND or OI_CPU_ARC_BEND for
+ little-endian or big-endian configurations of the ARC, respectively. */
+#error OI_CPU_ARC is deprecated
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SH3
+/* The Hitachi SH C compiler defines _LIT or _BIG, depending on the endianness
+ specified to the compiler on the command line. */
+#if defined(_LIT)
+ #define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER /**< If _LIT is defined, SH-3 platform byte ordering is little-endian. */
+#elif defined(_BIG)
+ #define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< If _BIG is defined, SH-3 platform byte ordering is big-endian. */
+#else
+ #error SH compiler endianness undefined
+#endif
+
+/** @name CPU/compiler-dependent primitive data type definitions for SH-3 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for SH-3 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for SH-3 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for SH-3 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for SH-3 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH-3 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH-3 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SH2
+
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< SH-2 platform byte ordering is big-endian. */
+
+/** @name CPU/compiler-dependent primitive data type definitions for SH-2 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for SH-2 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for SH-2 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for SH-2 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for SH-2 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH-2 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH-2 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_H8
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+#error basic types not defined
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_MIPS
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+/** @name CPU/compiler-dependent primitive data type definitions for MIPS processor family
+ * @{
+ */
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SPARC
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+#error basic types not defined
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_M68000
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< M68000 platform byte ordering is big-endian. */
+
+/** @name CPU/compiler-dependent primitive data type definitions for M68000 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for M68000 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for M68000 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for M68000 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for M68000 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M68000 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M68000 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_PPC
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+
+/** @name CPU/compiler-dependent primitive data type definitions for PPC 8XX processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for PPC8XX processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for PPC8XX processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for PPC8XX processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for PPC8XX processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for PPC8XX processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for PPC8XX processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SH4_7750
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< SH7750 platform byte ordering is big-endian. */
+
+/** @name CPU/compiler-dependent primitive data type definitions for SH7750 processor series of the SH-4 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for SH7750 SH-4 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for SH7750 SH-4 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for SH7750 SH-4 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for SH7750 SH-4 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH7750 SH-4 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH7750 SH-4 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARM7_LEND
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name little-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef void * OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARM7_BEND
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+/** @name big-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family
+ * @{
+ */
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef void * OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_GDM1202
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+typedef signed char OI_INT8; /**< 8-bit signed integer. */
+typedef signed short OI_INT16; /**< 16-bit signed integer. */
+typedef signed long OI_INT32; /**< 32-bit signed integer. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARC_LEND
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for ARC processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARC processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARC processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARC processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARC processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARC processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARC processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARC_BEND
+
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for ARC processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARC processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARC processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARC processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARC processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARC processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARC processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_M30833F
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for Mitsubishi M308 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for M308 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for M308 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for M308 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for M308 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M308 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M308 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_CR16C
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for National Semicnductor processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for CR16C processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for CR16C processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for CR16C processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for CR16C processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for CR16C processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for CR16C processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_M64111
+
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for Renesas M32R processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for M64111 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for M64111 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for M64111 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for M64111 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M64111 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M64111 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARMV5_LEND
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name little-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family
+ * @{
+ */
+
+typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+
+#ifndef OI_CPU_BYTE_ORDER
+ #error "Byte order (endian-ness) not defined"
+#endif
+
+
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/*********************************************************************************/
+#endif /* _OI_CPU_DEP_H */
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_MODULES_H
+#define _OI_MODULES_H
+/**
+ * @file
+ *
+ * Enumeration type defining the inidivual stack components.
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * This enumeration lists constants for referencing the components of
+ * the BLUEmagic 3.0 protocol stack, profiles, and other functionalities.
+ *
+ * In order to distinguish types of modules, items are grouped with markers to
+ * delineate start and end of the groups
+ *
+ * The module type is used for various purposes:
+ * identification in debug print statements
+ * access to initialization flags
+ * access to the configuration table
+ */
+
+typedef enum {
+ /* profiles and protocols --> Updates to oi_debug.c and oi_config_table.c */
+
+ /* XX --> Keep Enum values up-to-date! */
+ OI_MODULE_AT, /**< 00 AT command processing */
+ OI_MODULE_A2DP, /**< 01 Advanced Audio Distribution Profile */
+ OI_MODULE_AVCTP, /**< 02 Audio-Visual Control Transport Profile */
+ OI_MODULE_AVDTP, /**< 03 Audio-Visual Distribution Protocol */
+ OI_MODULE_AVRCP, /**< 04 Audio-Visual Remote Control Profile */
+ OI_MODULE_BIP_CLI, /**< 05 Basic Imaging Profile protocol client */
+ OI_MODULE_BIP_SRV, /**< 06 Basic Imaging Profile protocol server */
+ OI_MODULE_BNEP, /**< 07 Bluetooth Network Encapsulation Protocol */
+ OI_MODULE_BPP_SENDER, /**< 08 Basic Printing Profile */
+ OI_MODULE_BPP_PRINTER, /**< 09 Basic Printing Profile */
+ OI_MODULE_CTP, /**< 10 Cordless Telephony Profile */
+ OI_MODULE_DUN, /**< 11 Dial-Up Networking Profile */
+ OI_MODULE_FAX, /**< 12 Fax Profile */
+ OI_MODULE_FTP_CLI, /**< 13 File Transfer Profile protocol client */
+ OI_MODULE_FTP_SRV, /**< 14 File Transfer Profile protocol server */
+ OI_MODULE_HANDSFREE, /**< 15 Hands-Free Profile */
+ OI_MODULE_HANDSFREE_AG, /**< 16 Hands-Free Profile */
+ OI_MODULE_HCRP_CLI, /**< 17 Hardcopy Cable Replacement Profile */
+ OI_MODULE_HCRP_SRV, /**< 18 Hardcopy Cable Replacement Profile */
+ OI_MODULE_HEADSET, /**< 19 Headset Profile */
+ OI_MODULE_HEADSET_AG, /**< 20 Headset Profile */
+ OI_MODULE_HID, /**< 21 Human Interface Device profile */
+ OI_MODULE_INTERCOM, /**< 22 Intercom Profile */
+ OI_MODULE_OBEX_CLI, /**< 23 OBEX protocol client, Generic Object Exchange Profile */
+ OI_MODULE_OBEX_SRV, /**< 24 OBEX protocol server, Generic Object Exchange Profile */
+ OI_MODULE_OPP_CLI, /**< 25 Object Push Profile protocol client */
+ OI_MODULE_OPP_SRV, /**< 26 Object Push Profile protocol server */
+ OI_MODULE_PAN, /**< 27 PAN profile */
+ OI_MODULE_PBAP_CLI, /**< 28 Phonebook Access Profile client */
+ OI_MODULE_PBAP_SRV, /**< 29 Phonebook Access Profile server */
+ OI_MODULE_SAP_CLI, /**< 30 SIM Access Profile */
+ OI_MODULE_SAP_SRV, /**< 31 SIM Access Profile */
+ OI_MODULE_SPP, /**< 32 Serial Port Profile */
+ OI_MODULE_SYNC_CLI, /**< 33 Synchronization Profile */
+ OI_MODULE_SYNC_SRV, /**< 34 Synchronization Profile */
+ OI_MODULE_SYNC_CMD_CLI, /**< 35 Synchronization Profile */
+ OI_MODULE_SYNC_CMD_SRV, /**< 36 Synchronization Profile */
+ OI_MODULE_SYNCML, /**< 37 SyncML Profile */
+ OI_MODULE_TCS, /**< 38 TCS Binary */
+ OI_MODULE_VDP, /**< 39 Video Distribution Profile */
+
+ /* corestack components --> Updates to oi_debug.c and oi_config_table.c */
+
+ OI_MODULE_COMMON_CONFIG, /**< 40 Common configuration, module has no meaning other than for config struct */
+ OI_MODULE_CMDCHAIN, /**< 41 Command chaining utility */
+ OI_MODULE_DISPATCH, /**< 42 Dispatcher */
+ OI_MODULE_DATAELEM, /**< 43 Data Elements, marshaller */
+ OI_MODULE_DEVMGR, /**< 44 Device Manager */
+ OI_MODULE_DEVMGR_MODES, /**< 45 Device Manager connectability/discoverability modes */
+ OI_MODULE_HCI, /**< 46 Host Controller Interface command layer */
+ OI_MODULE_L2CAP, /**< 47 L2CAP */
+ OI_MODULE_MEMMGR, /**< 48 modules that do memory management */
+ OI_MODULE_POLICYMGR, /**< 49 Policy Manager */
+ OI_MODULE_RFCOMM, /**< 50 RFCOMM */
+ OI_MODULE_RFCOMM_SD, /**< 51 RFCOMM Service discovery */
+ OI_MODULE_SDP_CLI, /**< 52 Service Discovery Protocol client */
+ OI_MODULE_SDP_SRV, /**< 53 Service Discovery Protocol server */
+ OI_MODULE_SDPDB, /**< 54 Service Discovery Protocol database */
+ OI_MODULE_SECMGR, /**< 55 Security Manager */
+ OI_MODULE_SNIFFLOG, /**< 56 sniff log */
+ OI_MODULE_SUPPORT, /**< 57 support functions, including CThru Dispatcher, time functions, and stack initialization */
+ OI_MODULE_TRANSPORT, /**< 58 transport layer between HCI command layer and driver */
+ OI_MODULE_TEST, /**< 59 used to debug output from internal test programs */
+ OI_MODULE_XML, /**< 60 XML/CSS parser */
+
+ OI_MODULE_DI, /**< 61 Device Identification Profile */
+
+ // bhapi components --> Updates to oi_debug.c
+
+ OI_MODULE_BHAPI, /**< 62 BLUEmagic Host API generic */
+ OI_MODULE_BHCLI, /**< 63 BLUEmagic Host API client side */
+ OI_MODULE_BHSRV, /**< 64 BLUEmagic Host API server side */
+ OI_MODULE_MSGQ, /**< 65 module that handles message queuing */
+ OI_MODULE_BHAPI_TRANSPORT, /**< 66 module that handles message queuing */
+ OI_MODULE_BLST_SRV, /**< 67 module that provides server side BHAPI Lightweight Serial Transport */
+ OI_MODULE_BLST_CLI, /**< 68 module that provides client side BHAPI Lightweight Serial Transport */
+
+ // OEM files --> Updates to oi_debug.c
+ OI_MODULE_OEM, /**< 69 Application Memory allocation */
+
+ // Application glue --> Updates to oi_debug.c
+ OI_MODULE_APP, /**< 70 Application Memory allocation */
+
+ /* various pieces of code depend on these last 2 elements occuring in a specific order:
+ OI_MODULE_ALL must be the 2nd to last element
+ OI_MODULE_UNKNOWN must be the last element
+ */
+ OI_MODULE_ALL, /**< 71 special value identifying all modules - used for control of debug print statements */
+ OI_MODULE_UNKNOWN /**< 72 special value - used for debug print statements */
+} OI_MODULE;
+
+/**
+ * This constant is the number of actual modules in the list. ALL and UNKNOWN are
+ * special values that are not actually modules.
+ * Used for debug print and memmgr profiling
+ */
+#define OI_NUM_MODULES OI_MODULE_ALL
+
+
+/**
+ * This constant is the number of profile and core components. It is used to size
+ * the initialization and configuration tables.
+ */
+#define OI_NUM_STACK_MODULES OI_MODULE_BHAPI
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_MODULES_H */
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_OSINTERFACE_H
+#define _OI_OSINTERFACE_H
+/**
+ @file
+ * This file provides the platform-independent interface for functions for which
+ * implementation is platform-specific.
+ *
+ * The functions in this header file define the operating system or hardware
+ * services needed by the BLUEmagic 3.0 protocol stack. The
+ * actual implementation of these services is platform-dependent.
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+#include "oi_time.h"
+#include "oi_status.h"
+#include "oi_modules.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * Terminates execution.
+ *
+ * @param reason Reason for termination
+ */
+void OI_FatalError(OI_STATUS reason);
+
+/**
+ * This function logs an error.
+ *
+ * When built for release mode, BLUEmagic 3 errors are logged to
+ * this function. (in debug mode, errors are logged via
+ * OI_Print()).
+ *
+ * @param module Module in which the error was detected (see
+ * oi_modules.h)
+ * @param lineno Line number of the C file OI_SLOG_ERROR called
+ * @param status Status code associated with the error event
+ */
+void OI_LogError(OI_MODULE module, OI_INT lineno, OI_STATUS status);
+
+/**
+ * This function initializes the debug code handling.
+ *
+ * When built for debug mode, this function performs platform
+ * dependent initialization to handle message codes passed in
+ * via OI_SetMsgCode().
+ */
+void OI_InitDebugCodeHandler(void);
+
+
+/**
+ * This function reads the time from the real time clock.
+ *
+ * All timing in BM3 is relative, typically a granularity
+ * of 5 or 10 msecs is adequate.
+ *
+ * @param[out] now Pointer to the buffer to which the current
+ * time will be returned
+ */
+void OI_Time_Now(OI_TIME *now);
+
+/**
+ * This function causes the current thread to sleep for the
+ * specified amount of time. This function must be called
+ * without the stack access token.
+ *
+ * @note BM3 corestack and profiles never suspend and never call
+ * OI_Sleep. The use of OI_Sleep is limited to applications and
+ * platform-specific code.
+ *
+ * If your port and applications never use OI_Sleep, this function can be left unimplemented.
+ *
+ * @param milliseconds Number of milliseconds to sleep
+ */
+void OI_Sleep(OI_UINT32 milliseconds);
+
+
+/**
+ * Defines for message type codes.
+ */
+#define OI_MSG_CODE_APPLICATION 0 /**< Application output */
+#define OI_MSG_CODE_ERROR 1 /**< Error message output */
+#define OI_MSG_CODE_WARNING 2 /**< Warning message output */
+#define OI_MSG_CODE_TRACE 3 /**< User API function trace output */
+#define OI_MSG_CODE_PRINT1 4 /**< Catagory 1 debug print output */
+#define OI_MSG_CODE_PRINT2 5 /**< Catagory 2 debug print output */
+#define OI_MSG_CODE_HEADER 6 /**< Error/Debug output header */
+
+/**
+ * This function is used to indicate the type of text being output with
+ * OI_Print(). For the Linux and Win32 platforms, it will set
+ * the color of the text. Other possible uses could be to insert
+ * HTML style tags, add some other message type indication, or
+ * be completely ignored altogether.
+ *
+ * @param code OI_MSG_CODE_* indicating setting the message type.
+ */
+void OI_SetMsgCode(OI_UINT8 code);
+
+/**
+ * All output from OI_Printf() and all debug output is sent to OI_Print.
+ * Typically, if the platform has a console, OI_Print() is sent to stdout.
+ * Embedded platforms typically send OI_Print() output to a serial port.
+ *
+ * @param str String to print
+ */
+void OI_Print(OI_CHAR const *str);
+
+/**
+ * In cases where OI_Print() is sending output to a logfile in addition to console,
+ * it is desirable to also put console input into the logfile.
+ * This function can be called by the console input process.
+ *
+ * @note This is an optional API which is strictly
+ * between the platform-specific stack_console and osinterface
+ * modules. This API need only be implemented on those
+ * platforms where is serves a useful purpose, e.g., win32.
+ *
+ * @param str Console input string
+ */
+
+void OI_Print_ConsoleInput(OI_CHAR const *str);
+
+/**
+ * This function computes the CRC16 of the program image.
+ */
+OI_UINT16 OI_ProgramImageCRC16(void);
+
+/**
+ * Writes an integer to stdout in hex. This macro is intended
+ * for selective use when debugging in small memory
+ * configurations or other times when it is not possible to use
+ * OI_DBGPRINT.
+ *
+ * @param n the integer to print
+ */
+
+#define OI_Print_Int(n) \
+{ \
+ static const OI_CHAR _digits[] = "0123456789ABCDEF"; \
+ OI_CHAR _buf[9]; \
+ OI_CHAR *_str = &_buf[8]; \
+ OI_UINT32 _i = n; \
+ *_str = 0; \
+ do { *(--_str) = _digits[(_i & 0xF)]; _i >>= 4; } while (_i); \
+ OI_Print(_str); \
+}
+
+/**
+ * Application Dynamic Memory allocation.
+ *
+ * These APIs are provided for application use on those
+ * platforms which have no dynamic memory support. Memory is
+ * allocated from the pool-based heap managed by the stack's
+ * internal memory manager.
+ */
+void *OI_APP_Malloc(OI_INT32 size);
+void OI_APP_Free(void *ptr);
+
+/*****************************************************************************/
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_OSINTERFACE_H */
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_STATUS_H
+#define _OI_STATUS_H
+/**
+ * @file
+ * This file contains status codes for BLUEmagic 3.0 software.
+ */
+
+#include "oi_stddefs.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+ /** test it **/
+
+/**
+ * OI_STATUS must fit in 16 bits, so status codes can range from 0 to 66535, inclusive.
+ */
+
+typedef enum {
+ OI_STATUS_SUCCESS = 0, /**< function call succeeded alias for #OI_OK */
+ OI_OK = 0, /**< function call succeeded alias for #OI_STATUS_SUCCESS */
+ OI_STATUS_INVALID_PARAMETERS = 101, /**< invalid function input parameters */
+ OI_STATUS_NOT_IMPLEMENTED = 102, /**< attempt to use an unimplemented function */
+ OI_STATUS_NOT_INITIALIZED = 103, /**< data not initialized */
+ OI_STATUS_NO_RESOURCES = 104, /**< generic resource allocation failure status */
+ OI_STATUS_INTERNAL_ERROR = 105, /**< internal inconsistency */
+ OI_STATUS_OUT_OF_MEMORY = 106, /**< generally, OI_Malloc failed */
+ OI_ILLEGAL_REENTRANT_CALL = 107, /**< violation of non-reentrant module policy */
+ OI_STATUS_INITIALIZATION_FAILED = 108, /**< module initialization failed */
+ OI_STATUS_INITIALIZATION_PENDING = 109, /**< inititialization not yet complete */
+ OI_STATUS_NO_SCO_SUPPORT = 110, /**< SCO operation rejected; system not configured for SCO */
+ OI_STATUS_OUT_OF_STATIC_MEMORY = 111, /**< static malloc failed */
+ OI_TIMEOUT = 112, /**< generic timeout */
+ OI_OS_ERROR = 113, /**< some operating system error */
+ OI_FAIL = 114, /**< generic failure */
+ OI_STRING_FORMAT_ERROR = 115, /**< error in VarString formatting string */
+ OI_STATUS_PENDING = 116, /**< The operation is pending. */
+ OI_STATUS_INVALID_COMMAND = 117, /**< The command was invalid. */
+ OI_BUSY_FAIL = 118, /**< command rejected due to busy */
+ OI_STATUS_ALREADY_REGISTERED = 119, /**< The registration has already been performed. */
+ OI_STATUS_NOT_FOUND = 120, /**< The referenced resource was not found. */
+ OI_STATUS_NOT_REGISTERED = 121, /**< not registered */
+ OI_STATUS_NOT_CONNECTED = 122, /**< not connected */
+ OI_CALLBACK_FUNCTION_REQUIRED = 123, /**< A callback function parameter was required. */
+ OI_STATUS_MBUF_OVERFLOW = 124, /**< There is no room to add another buffer to an mbuf. */
+ OI_STATUS_MBUF_UNDERFLOW = 125, /**< There was an attempt to pull too many bytes from an mbuf. */
+ OI_STATUS_CONNECTION_EXISTS = 126, /**< connection exists */
+ OI_STATUS_NOT_CONFIGURED = 127, /**< module not configured */
+ OI_LOWER_STACK_ERROR = 128, /**< An error was reported by lower stack API. This is used for embedded platforms. */
+ OI_STATUS_RESET_IN_PROGRESS = 129, /**< Request failed/rejected because we're busy resetting. */
+ OI_STATUS_ACCESS_DENIED = 130, /**< Generic access denied error. */
+ OI_STATUS_DATA_ERROR = 131, /**< Generic data error. */
+ OI_STATUS_INVALID_ROLE = 132, /**< The requested role was invalid. */
+ OI_STATUS_ALREADY_CONNECTED = 133, /**< The requested connection is already established. */
+ OI_STATUS_PARSE_ERROR = 134, /**< Parse error */
+ OI_STATUS_END_OF_FILE = 135, /**< End of file */
+ OI_STATUS_READ_ERROR = 136, /**< Generic read error */
+ OI_STATUS_WRITE_ERROR = 137, /**< Generic write error */
+ OI_STATUS_NEGOTIATION_FAILURE = 138, /**< Error in negotiation */
+ OI_STATUS_READ_IN_PROGRESS = 139, /**< A read is already in progress */
+ OI_STATUS_ALREADY_INITIALIZED = 140, /**< Initialization has already been done */
+ OI_STATUS_STILL_CONNECTED = 141, /**< The service cannot be shutdown because there are still active connections. */
+ OI_STATUS_MTU_EXCEEDED = 142, /**< The packet is too big */
+ OI_STATUS_LINK_TERMINATED = 143, /**< The link was terminated */
+ OI_STATUS_PIN_CODE_TOO_LONG = 144, /**< Application gave us a pin code that is too long */
+ OI_STATUS_STILL_REGISTERED = 145, /**< The service cannot be shutdown because there are still active registrations. */
+ OI_STATUS_SPEC_VIOLATION = 146, /**< Some application behavior contrary to BT specifications */
+
+
+ OI_STATUS_PSM_ALREADY_REGISTERED = 402, /**< L2CAP: The specified PSM has already been registered. */
+ OI_STATUS_INVALID_CID = 403, /**< L2CAP: CID is invalid or no longer valid (connection terminated) */
+ OI_STATUS_CID_NOT_FOUND = 404, /**< L2CAP: CID does not represent a current connection */
+ OI_STATUS_CHANNEL_NOT_FOUND = 406, /**< L2CAP: CID does not represent a current connection */
+ OI_STATUS_PSM_NOT_FOUND = 407, /**< L2CAP: PSM not found */
+ OI_STATUS_INVALID_STATE = 408, /**< L2CAP: invalid state */
+ OI_STATUS_WRITE_IN_PROGRESS = 410, /**< L2CAP: write in progress */
+ OI_STATUS_INVALID_PACKET = 411, /**< L2CAP: invalid packet */
+ OI_STATUS_SEND_COMPLETE = 412, /**< L2CAP: send is complete */
+ OI_STATUS_INVALID_HANDLE = 414, /**< L2CAP: handle is invalid */
+ OI_STATUS_GROUP_FULL = 418, /**< L2CAP: No more members can be added to the specified group. */
+ OI_STATUS_DEVICE_ALREADY_IN_GROUP = 423, /**< L2CAP: The device already exists in the group. */
+ OI_STATUS_DUPLICATE_GROUP = 425, /**< L2CAP: attempt to add more than one group */
+ OI_STATUS_EMPTY_GROUP = 426, /**< L2CAP: group is empty */
+ OI_STATUS_PACKET_NOT_FOUND = 427, /**< L2CAP: packet not found */
+ OI_STATUS_BUFFER_TOO_SMALL = 428, /**< L2CAP: The buffer size is too small. */
+ OI_STATUS_IDENTIFIER_NOT_FOUND = 429, /**< L2CAP: identifier not found */
+
+ OI_L2CAP_DISCONNECT_LOWER_LAYER = 430, /**< L2CAP: The lower level forced a disconnect. */
+ OI_L2CAP_DISCONNECT_REMOTE_REQUEST = 431, /**< L2CAP: The remote device requested a disconnect. */
+ OI_L2CAP_GROUP_ADD_CONNECT_FAIL = 433, /**< L2CAP: Group add connect faiL */
+ OI_L2CAP_GROUP_REMOVE_FAILURE = 434, /**< L2CAP: Group remove failure */
+ OI_L2CAP_DATA_WRITE_ERROR_LINK_TERM = 435, /**< L2CAP: Data write error LINK_TERM */
+ OI_L2CAP_DISCONNECT_LOCAL_REQUEST = 436, /**< L2CAP: Disconnect local request */
+
+ OI_L2CAP_CONNECT_TIMEOUT = 437, /**< L2CAP: Connect timeout */
+ OI_L2CAP_DISCONNECT_TIMEOUT = 439, /**< L2CAP: Disconnect timeout */
+ OI_L2CAP_PING_TIMEOUT = 440, /**< L2CAP: Ping timeout */
+ OI_L2CAP_GET_INFO_TIMEOUT = 441, /**< L2CAP: Get info timeout */
+ OI_L2CAP_INVALID_ADDRESS = 444, /**< L2CAP: Invalid address */
+ OI_L2CAP_CMD_REJECT_RCVD = 445, /**< L2CAP: remote sent us 'command reject' response */
+
+ OI_L2CAP_CONNECT_BASE = 450, /**< L2CAP: Connect base */
+ OI_L2CAP_CONNECT_PENDING = 451, /**< L2CAP: Connect pending */
+ OI_L2CAP_CONNECT_REFUSED_INVALID_PSM = 452, /**< L2CAP: Connect refused invalid PSM */
+ OI_L2CAP_CONNECT_REFUSED_SECURITY = 453, /**< L2CAP: Connect refused security */
+ OI_L2CAP_CONNECT_REFUSED_NO_RESOURCES = 454, /**< L2CAP: Connect refused no resources */
+
+ OI_L2CAP_CONFIG_BASE = 460, /**< L2CAP: Config base */
+ OI_L2CAP_CONFIG_FAIL_INVALID_PARAMETERS= 461, /**< L2CAP: Config fail invalid parameters */
+ OI_L2CAP_CONFIG_FAIL_NO_REASON = 462, /**< L2CAP: Config fail no reason */
+ OI_L2CAP_CONFIG_FAIL_UNKNOWN_OPTIONS = 463, /**< L2CAP: Config fail unknown options */
+
+ OI_L2CAP_GET_INFO_BASE = 470, /**< L2CAP: Get info base */
+ OI_L2CAP_GET_INFO_NOT_SUPPORTED = 471, /**< L2CAP: Get info not supported */
+ OI_L2CAP_MTU_EXCEEDED = 472, /**< L2CAP: The MTU of the channel was exceeded */
+ OI_L2CAP_INVALID_PSM = 482, /**< L2CAP: Invalid PSM */
+ OI_L2CAP_INVALID_MTU = 483, /**< L2CAP: Invalid MTU */
+ OI_L2CAP_INVALID_FLUSHTO = 484, /**< L2CAP: Invalid flush timeout */
+
+ OI_HCI_NO_SUCH_CONNECTION = 601, /**< HCI: caller specified a non-existent connection handle */
+ OI_HCI_CB_LIST_FULL = 603, /**< HCI: callback list is full, cannot attempt to send command */
+ OI_HCI_EVENT_UNDERRUN = 605, /**< HCI: parsing event packet, premature end-of-parameters */
+ OI_HCI_UNKNOWN_EVENT_CODE = 607, /**< HCI: event received - event code is unknown */
+ OI_HCI_BAD_EVENT_PARM_LEN = 608, /**< HCI: event - parameter length is incorrect */
+ OI_HCI_CMD_QUEUE_FULL = 611, /**< HCI: command queue is full */
+ OI_HCI_SHORT_EVENT = 612, /**< HCI: event received, missing event code and/or parm len */
+ OI_HCI_TRANSMIT_NOT_READY = 613, /**< HCI: ACL/SCO transmit request failed - busy or no buffers available */
+ OI_HCI_ORPHAN_SENT_EVENT = 614, /**< HCI: got spurious 'sent' event from transport layer */
+ OI_HCI_CMD_TABLE_ERROR = 615, /**< HCI: inconsistency in the internal command table */
+ OI_HCI_UNKNOWN_CMD_ID = 616, /**< HCI: HciApi Command - unknown command id */
+ OI_HCI_UNEXPECTED_EVENT = 619, /**< HCI: event received which only occurs in response to our cmd */
+ OI_HCI_EVENT_TABLE_ERROR = 620, /**< HCI: inconsistency in the internal event table */
+ OI_HCI_EXPECTED_EVENT_TIMOUT = 621, /**< HCI: timed out waiting for an expected event */
+ OI_HCI_NO_CMD_DESC_FOR_OPCODE = 622, /**< HCI: event opcode is not known */
+ OI_HCI_INVALID_OPCODE_ERROR = 623, /**< HCI: command opcode is invalid */
+ OI_HCI_FLOW_CONTROL_DISABLED = 624, /**< HCI: can not use host flow control APIs if disabled in configuration */
+ OI_HCI_TX_COMPLETE = 625, /**< HCI: packet delivery to Host Controler complete */
+ OI_HCI_TX_ERROR = 626, /**< HCI: failed to deliver packet to Host Controler */
+ OI_HCI_DEVICE_NOT_INITIALIZED = 627, /**< HCI: commands from upper layers disallowed until device is up and running */
+ OI_HCI_UNSUPPORTED_COMMAND = 628, /**< HCI: command requested is not supported by local device */
+ OI_HCI_PASSTHROUGH_ERROR = 629, /**< HCI: Error processing passthrough command */
+ OI_HCI_PASSTHROUGH_ALREADY_SET = 630, /**< HCI: Passthrough mode already enabled */
+ OI_HCI_RESET_FAILURE = 631, /**< HCI: failed to reset the device/baseband */
+ OI_HCI_TRANSPORT_RESET = 632, /**< HCI: some operation failed because of a reset in the transport */
+ OI_HCIERR_HCIIFC_INIT_FAILURE = 633, /**< HCI: failed to initialize transport layer interface */
+
+ OI_HCIERR_FIRST_ERROR_VALUE = 701, /**< marker for first HCI protocol error */
+ OI_HCIERR_UNKNOWN_HCI_COMMAND = 701, /**< HCI: protocol error 0x01 */
+ OI_HCIERR_NO_CONNECTION = 702, /**< HCI: protocol error 0x02 */
+ OI_HCIERR_HARDWARE_FAILURE = 703, /**< HCI: protocol error 0x03 */
+ OI_HCIERR_PAGE_TIMEOUT = 704, /**< HCI: protocol error 0x04 */
+ OI_HCIERR_AUTHENTICATION_FAILURE = 705, /**< HCI: protocol error 0x05 */
+ OI_HCIERR_KEY_MISSING = 706, /**< HCI: protocol error 0x06 */
+ OI_HCIERR_MEMORY_FULL = 707, /**< HCI: protocol error 0x07 */
+ OI_HCIERR_CONNECTION_TIMEOUT = 708, /**< HCI: protocol error 0x08 */
+ OI_HCIERR_MAX_NUM_OF_CONNECTIONS = 709, /**< HCI: protocol error 0x09 */
+ OI_HCIERR_MAX_NUM_OF_SCO_CONNECTIONS = 710, /**< HCI: protocol error 0x0A */
+ OI_HCIERR_ACL_CONNECTION_ALREADY_EXISTS = 711, /**< HCI: protocol error 0x0B */
+ OI_HCIERR_COMMAND_DISALLOWED = 712, /**< HCI: protocol error 0x0C */
+ OI_HCIERR_HOST_REJECTED_RESOURCES = 713, /**< HCI: protocol error 0x0D */
+ OI_HCIERR_HOST_REJECTED_SECURITY = 714, /**< HCI: protocol error 0x0E */
+ OI_HCIERR_HOST_REJECTED_PERSONAL_DEVICE = 715, /**< HCI: protocol error 0x0F */
+ OI_HCIERR_HOST_TIMEOUT = 716, /**< HCI: protocol error 0x10 */
+ OI_HCIERR_UNSUPPORTED = 717, /**< HCI: protocol error 0x11 */
+ OI_HCIERR_INVALID_PARAMETERS = 718, /**< HCI: protocol error 0x12 */
+ OI_HCIERR_OTHER_END_USER_DISCONNECT = 719, /**< HCI: protocol error 0x13 */
+ OI_HCIERR_OTHER_END_LOW_RESOURCES = 720, /**< HCI: protocol error 0x14 */
+ OI_HCIERR_OTHER_END_POWERING_OFF = 721, /**< HCI: protocol error 0x15 */
+ OI_HCIERR_CONNECTION_TERMINATED_LOCALLY = 722, /**< HCI: protocol error 0x16 */
+ OI_HCIERR_REPEATED_ATTEMPTS = 723, /**< HCI: protocol error 0x17 */
+ OI_HCIERR_PAIRING_NOT_ALLOWED = 724, /**< HCI: protocol error 0x18 */
+ OI_HCIERR_UNKNOWN_LMP_PDU = 725, /**< HCI: protocol error 0x19 */
+ OI_HCIERR_UNSUPPORTED_REMOTE_FEATURE = 726, /**< HCI: protocol error 0x1A */
+ OI_HCIERR_SCO_OFFSET_REJECTED = 727, /**< HCI: protocol error 0x1B */
+ OI_HCIERR_SCO_INTERVAL_REJECTED = 728, /**< HCI: protocol error 0x1C */
+ OI_HCIERR_SCO_AIR_MODE_REJECTED = 729, /**< HCI: protocol error 0x1D */
+ OI_HCIERR_INVALID_LMP_PARMS = 730, /**< HCI: protocol error 0x1E */
+ OI_HCIERR_UNSPECIFIED_ERROR = 731, /**< HCI: protocol error 0x1F */
+ OI_HCIERR_UNSUPPORTED_LMP_PARAMETERS = 732, /**< HCI: protocol error 0x20 */
+ OI_HCIERR_ROLE_CHANGE_NOT_ALLOWED = 733, /**< HCI: protocol error 0x21 */
+ OI_HCIERR_LMP_RESPONSE_TIMEOUT = 734, /**< HCI: protocol error 0x22 */
+ OI_HCIERR_LMP_ERROR_TRANS_COLLISION = 735, /**< HCI: protocol error 0x23 */
+ OI_HCIERR_LMP_PDU_NOT_ALLOWED = 736, /**< HCI: protocol error 0x24 */
+ OI_HCIERR_ENCRYPTION_MODE_NOT_ACCEPTABLE = 737, /**< HCI: protocol error 0x25 */
+ OI_HCIERR_UNIT_KEY_USED = 738, /**< HCI: protocol error 0x26 */
+ OI_HCIERR_QOS_NOT_SUPPORTED = 739, /**< HCI: protocol error 0x27 */
+ OI_HCIERR_INSTANT_PASSED = 740, /**< HCI: protocol error 0x28 */
+ OI_HCIERR_UNIT_KEY_PAIRING_UNSUPPORTED = 741, /**< HCI: protocol error 0x29 */
+ OI_HCIERR_DIFFERENT_TRANS_COLLISION = 742, /**< HCI: protocol error 0x2A */
+ OI_HCIERR_RESERVED_2B = 743, /**< HCI: protocol error 0x2B */
+ OI_HCIERR_QOS_UNACCEPTABLE_PARAMETER = 744, /**< HCI: protocol error 0x2C */
+ OI_HCIERR_QOS_REJECTED = 745, /**< HCI: protocol error 0x2D */
+ OI_HCIERR_CHANNEL_CLASSIFICATION_NS = 746, /**< HCI: protocol error 0x2E */
+ OI_HCIERR_INSUFFICIENT_SECURITY = 747, /**< HCI: protocol error 0x2F */
+ OI_HCIERR_PARM_OUT_OF_MANDATORY_RANGE = 748, /**< HCI: protocol error 0x30 */
+ OI_HCIERR_RESERVED_31 = 749, /**< HCI: protocol error 0x31 */
+ OI_HCIERR_ROLE_SWITCH_PENDING = 750, /**< HCI: protocol error 0x32 */
+ OI_HCIERR_RESERVED_33 = 751, /**< HCI: protocol error 0x33 */
+ OI_HCIERR_RESERVED_SLOT_VIOLATION = 752, /**< HCI: protocol error 0x34 */
+ OI_HCIERR_ROLE_SWITCH_FAILED = 753, /**< HCI: protocol error 0x35 */
+ OI_HCIERR_EIR_TOO_LARGE = 754, /**< HCI: protocol error 0x36 */
+ OI_HCIERR_SSP_NOT_SUPPORTED_BY_HOST = 755, /**< HCI: protocol error 0x37 */
+ OI_HCIERR_HOST_BUSY_PAIRING = 756, /**< HCI: protocol error 0x38 */
+
+ OI_HCIERR_UNKNOWN_ERROR = 757, /**< HCI: unknown error code */
+ OI_HCIERR_LAST_ERROR_VALUE = 757, /**< marker for last HCI protocol error */
+
+ OI_SDP_SPEC_ERROR = 800, /**< SDP: Base error status for mapping OI_STATUS codes to SDP errors */
+ OI_SDP_INVALID_SERVICE_RECORD_HANDLE = (OI_SDP_SPEC_ERROR + 2), /**< SDP: protocol error Invalid Service Record Handle */
+ OI_SDP_INVALID_REQUEST_SYNTAX = (OI_SDP_SPEC_ERROR + 3), /**< SDP: protocol error Invalid Request Syntax */
+ OI_SDP_INVALID_PDU_SIZE = (OI_SDP_SPEC_ERROR + 4), /**< SDP: protocol error Invalid PDU Size */
+ OI_SDP_INVALID_CONTINUATION_STATE = (OI_SDP_SPEC_ERROR + 5), /**< SDP: protocol error Invalid Continuation State */
+ OI_SDP_INSUFFICIENT_RESOURCES = (OI_SDP_SPEC_ERROR + 6), /**< SDP: protocol error Insufficient Resources */
+ OI_SDP_ERROR = 807, /**< SDP: server returned an error code */
+ OI_SDP_CORRUPT_DATA_ELEMENT = 808, /**< SDP: Invalid or corrupt data element representation */
+ OI_SDP_SERVER_NOT_CONNECTED = 810, /**< SDP: Attempt to disconnect from an unconnected server */
+ OI_SDP_ACCESS_DENIED = 811, /**< SDP: Server denied access to server */
+ OI_SDP_ATTRIBUTES_OUT_OF_ORDER = 812, /**< SDP: Attributes in attribute list not in ascending order */
+ OI_SDP_DEVICE_DOES_NOT_SUPPORT_SDP = 813, /**< SDP: Tried to connect to a device that does not support SDP */
+ OI_SDP_NO_MORE_DATA = 815, /**< SDP: Server does not have more continuation data */
+ OI_SDP_REQUEST_PARAMS_TOO_LONG = 816, /**< SDP: Parameters for a request exceed the L2CAP buffer size */
+ OI_SDP_REQUEST_PENDING = 817, /**< SDP: Cannot make a request when another request is being processed */
+ OI_SDP_SERVER_CONNECT_FAILED = 819, /**< SDP: Failed attempt to connect to an SDP server */
+ OI_SDP_SERVER_TOO_MANY_CONNECTIONS = 821, /**< SDP: Exceeded maximum number of simultaneous server connections */
+ OI_SDP_NO_MATCHING_SERVICE_RECORD = 823, /**< SDP: No service record matched the UUID list */
+ OI_SDP_PARTIAL_RESPONSE = 824, /**< SDP: Internal use only */
+ OI_SDP_ILLEGAL_ARGUMENT = 825, /**< SDP: Illegal argument passed to an SDP function */
+ OI_SDP_ATTRIBUTE_NOT_FOUND = 826, /**< SDP: A requested attribute was not found in a service record */
+ OI_SDP_DATABASE_OUT_OF_RESOURCES = 827, /**< SDP: server database is out of memory */
+ OI_SDP_SHORT_PDU = 829, /**< SDP: Not enough bytes in the packet */
+ OI_SDP_TRANSACTION_ID_MISMATCH = 830, /**< SDP: Transaction Id was not as expected */
+ OI_SDP_UNEXPECTED_RESPONSE_PDU_ID = 831, /**< SDP: Did not expect this response PDU */
+ OI_SDP_REQUEST_TIMEOUT = 832, /**< SDP: Did not get a response within the timeout period */
+ OI_SDP_INVALID_RESPONSE_SYNTAX = 833, /**< SDP: Response is not correctly formatted */
+ OI_SDP_CONNECTION_TIMEOUT = 834, /**< SDP: Connection attempt timed out at a lower layer */
+ OI_SDP_RESPONSE_DATA_ERROR = 835, /**< SDP: Response to a service request appears to be corrupt */
+ OI_SDP_TOO_MANY_ATTRIBUTE_BYTES = 836, /**< SDP: Response contained more bytes than requested. */
+ OI_SDP_TOO_MANY_SERVICE_RECORDS = 837, /**< SDP: Response contained more service records than requested. */
+ OI_SDP_INVALID_CONNECTION_ID = 838, /**< SDP: Invalid connection ID in an SDP request */
+ OI_SDP_CANNOT_SET_ATTRIBUTE = 839, /**< SDP: Attempt to set a dynamic attribute value failed */
+ OI_SDP_BADLY_FORMED_ATTRIBUTE_VALUE = 840, /**< SDP: An attribute value has the wrong type or structure */
+ OI_SDP_NO_ATTRIBUTE_LIST_TO_REMOVE = 841, /**< SDP: Attempt to remove a non-existent attribute list from a service record */
+ OI_SDP_ATTRIBUTE_LIST_ALREADY_ADDED = 842, /**< SDP: An attribute list has already been added to the service record */
+ OI_SDP_DATA_ELEMENT_TRUNCATED = 843, /**< SDP: Data element truncated (too few bytes) */
+
+ OI_RFCOMM_WRITE_IN_PROGRESS = 901, /**< RFCOMM: Write in progress */
+ OI_RFCOMM_INVALID_BAUDRATE = 903, /**< RFCOMM: Invalid baudrate */
+ OI_RFCOMM_INVALID_DATABIT = 904, /**< RFCOMM: Invalid databit */
+ OI_RFCOMM_INVALID_STOPBIT = 905, /**< RFCOMM: Invalid stopbit */
+ OI_RFCOMM_INVALID_PARITY = 906, /**< RFCOMM: Invalid parity */
+ OI_RFCOMM_INVALID_PARITYTYPE = 907, /**< RFCOMM: Invalid paritytype */
+ OI_RFCOMM_INVALID_FLOWCONTROL = 908, /**< RFCOMM: Invalid flowcontrol */
+ OI_RFCOMM_SESSION_EXISTS = 909, /**< RFCOMM: Session exists */
+ OI_RFCOMM_INVALID_CHANNEL = 910, /**< RFCOMM: Invalid channel */
+ OI_RFCOMM_DLCI_EXISTS = 911, /**< RFCOMM: DLCI exists */
+ OI_RFCOMM_LINK_NOT_FOUND = 912, /**< RFCOMM: Link not found */
+ OI_RFCOMM_REMOTE_REJECT = 913, /**< RFCOMM: Remote reject */
+ OI_RFCOMM_TEST_IN_PROGRESS = 915, /**< RFCOMM: Test in progress */
+ OI_RFCOMM_SESSION_NOT_FOUND = 916, /**< RFCOMM: Session not found */
+ OI_RFCOMM_INVALID_PACKET = 917, /**< RFCOMM: Invalid packet */
+ OI_RFCOMM_FRAMESIZE_EXCEEDED = 918, /**< RFCOMM: Framesize exceeded */
+ OI_RFCOMM_INVALID_DLCI = 920, /**< RFCOMM: Invalid dlci */
+ OI_RFCOMM_SERVER_NOT_REGISTERED = 921, /**< RFCOMM: Server not registered */
+ OI_RFCOMM_CREDIT_ERROR = 922, /**< RFCOMM: Credit error */
+ OI_RFCOMM_NO_CHANNEL_NUMBER = 923, /**< RFCOMM: No channel number */
+ OI_RFCOMM_QUERY_IN_PROGRESS = 924, /**< RFCOMM: Query in progress */
+ OI_RFCOMM_SESSION_SHUTDOWN = 925, /**< RFCOMM: Session shutdown */
+ OI_RFCOMM_LOCAL_DEVICE_DISCONNECTED = 926, /**< RFCOMM: Local device disconnected */
+ OI_RFCOMM_REMOTE_DEVICE_DISCONNECTED = 927, /**< RFCOMM: Remote device disconnected */
+ OI_RFCOMM_OUT_OF_SERVER_CHANNELS = 928, /**< RFCOMM: Out of server channels */
+
+ OI_DISPATCH_INVALID_CB_HANDLE = 1001, /**< Dispatcher was handed an invalid callback handle */
+ OI_DISPATCH_TABLE_OVERFLOW = 1002, /**< Dispatcher table is full */
+
+ OI_TEST_UNKNOWN_TEST = 1101, /**< TEST: Unknown test */
+ OI_TEST_FAIL = 1102, /**< TEST: Fail */
+
+ OI_HCITRANS_CANNOT_CONNECT_TO_DEVICE = 1201, /**< TRANSPORT: Cannot connect to device */
+ OI_HCITRANS_BUFFER_TOO_SMALL = 1203, /**< TRANSPORT: Buffer too small */
+ OI_HCITRANS_NULL_DEVICE_HANDLE = 1204, /**< TRANSPORT: Null device handle */
+ OI_HCITRANS_IO_ERROR = 1205, /**< TRANSPORT: IO error */
+ OI_HCITRANS_DEVICE_NOT_READY = 1206, /**< TRANSPORT: Device not ready */
+ OI_HCITRANS_FUNCTION_NOT_SUPPORTED = 1207, /**< TRANSPORT: Function not supporteD */
+ OI_HCITRANS_ACCESS_DENIED = 1209, /**< TRANSPORT: win32 */
+ OI_HCITRANS_ACL_DATA_ERROR = 1210, /**< TRANSPORT: ACL data error */
+ OI_HCITRANS_SCO_DATA_ERROR = 1211, /**< TRANSPORT: SCO data error */
+ OI_HCITRANS_EVENT_DATA_ERROR = 1212, /**< TRANSPORT: HCI event data error */
+ OI_HCITRANS_INTERNAL_ERROR = 1214, /**< TRANSPORT: Internal error in the transport */
+ OI_HCITRANS_LINK_NOT_ACTIVE = 1215, /**< TRANSPORT: Link to the device is not currently active */
+ OI_HCITRANS_INITIALIZING = 1216, /**< TRANSPORT: Transport is initializing */
+
+ OI_DEVMGR_NO_CONNECTION = 1301, /**< DEVMGR: No connection */
+ OI_DEVMGR_HARDWARE_ERROR = 1305, /**< DEVMGR: error reported by HCI */
+ OI_DEVMGR_PENDING_CONNECT_LIST_FULL = 1307, /**< DEVMGR: Pending connect list full */
+ OI_DEVMGR_CONNECTION_LIST_FULL = 1309, /**< DEVMGR: Connection list full */
+ OI_DEVMGR_NO_SUCH_CONNECTION = 1310, /**< DEVMGR: No such connection */
+ OI_DEVMGR_INQUIRY_IN_PROGRESS = 1311, /**< DEVMGR: Inquiry in progress */
+ OI_DEVMGR_PERIODIC_INQUIRY_ACTIVE = 1312, /**< DEVMGR: Periodic inquiry active */
+ OI_DEVMGR_NO_INQUIRIES_ACTIVE = 1313, /**< DEVMGR: can not cancel/exit if not active */
+ OI_DEVMGR_DUPLICATE_CONNECTION = 1314, /**< DEVMGR: internal error */
+ OI_DEVMGR_DUPLICATE_EVENT_CALLBACK = 1316, /**< DEVMGR: attempt to register same callback twice */
+ OI_DEVMGR_EVENT_CALLBACK_LIST_FULL = 1317, /**< DEVMGR: can not register event callback, list is full */
+ OI_DEVMGR_EVENT_CALLBACK_NOT_FOUND = 1318, /**< DEVMGR: attempt to unregister callback failed */
+ OI_DEVMGR_BUSY = 1319, /**< DEVMGR: some operations can only execute one at a time */
+ OI_DEVMGR_ENUM_UNEXPECTED_INQ_COMPLETE = 1320, /**< DEVMGR: inquiry complete event in inappropriate enumeration state */
+ OI_DEVMGR_ENUM_UNEXPECTED_INQ_RESULT = 1321, /**< DEVMGR: inquiry result event in inappropriate enumeration state */
+ OI_DEVMGR_ENUM_DATABASE_FULL = 1322, /**< DEVMGR: device enumeration, database is full, couldn't add a new device */
+ OI_DEVMGR_ENUM_INQUIRIES_OVERLAP = 1323, /**< DEVMGR: device enumeration, periodic inquiries occurring too close together */
+ OI_DEVMGR_UNKNOWN_LINK_TYPE = 1324, /**< DEVMGR: HCI connect request with unkown link type */
+ OI_DEVMGR_PARAM_IO_ACTIVE = 1325, /**< DEVMGR: request for parameter read/write while param read/write active */
+ OI_DEVMGR_UNKNOWN_IAC_LAP = 1326, /**< DEVMGR: unrecognized IAC LAP */
+ OI_DEVMGR_SCO_ALREADY_REGISTERED = 1327, /**< DEVMGR: only one application can use SCO */
+ OI_DEVMGR_SCO_NOT_REGISTERED = 1328, /**< DEVMGR: SCO applications must register before using the API */
+ OI_DEVMGR_SCO_WITHOUT_ACL = 1329, /**< DEVMGR: Got SCO connection but there is no underlying ACL connection */
+ OI_DEVMGR_NO_SUPPORT = 1330, /**< DEVMGR: Request is not supported by the device */
+ OI_DEVMGR_WRITE_POLICY_FAILED = 1331, /**< DEVMGR: connection attempt failed - unable to write link policy */
+ OI_DEVMGR_NOT_IN_MASTER_MODE = 1332, /**< DEVMGR: OI_DEVMGR EndMasterMode without prior OI_DEVMGR_BeginMasterMode */
+ OI_DEVMGR_POLICY_VIOLATION = 1333, /**< DEVMGR: low-power request is rejected - link policy does not allow it */
+ OI_DEVMGR_BUSY_TIMEOUT = 1334, /**< DEVMGR: queued operation timed out while in the queue; \n
+ timeout configurable via @ref OI_CONFIG_DEVMGR::connectQueueTimeoutSecs "connectQueueTimeoutSecs" */
+ OI_DEVMGR_REENCRYPT_FAILED = 1335, /**< DEVMGR: failed to re-encrypt link after role switch */
+ OI_DEVMGR_ROLE_POLICY_CONFLICT = 1336, /**< DEVMGR: requested role conflicts with current policy */
+ OI_DEVMGR_BAD_INTERVAL = 1337, /**< DEVMGR: current linkTO outside range of requested min/max interval */
+ OI_DEVMGR_INVALID_SCO_HANDLE = 1338, /**< DEVMGR: HCI SCO event, invalid handle */
+ OI_DEVMGR_CONNECTION_OVERLAP = 1339, /**< DEVMGR: Connection failed due to race condition with remote side */
+ OI_DEVMGR_ORPHAN_SUBRATE_COMPLETE = 1340, /**< DEVMGR: sniff subrate complete, but no callback */
+ OI_DEVMGR_EIR_RESPONSE_2_LARGE = 1341, /**< DEVMGR: eir builder, response length would exceed spec max */
+
+ OI_SECMGR_NO_POLICY = 1401, /**< SECMGR: no security policy has been established */
+ OI_SECMGR_INTERNAL_ERROR = 1402, /**< SECMGR: internal inconsistency */
+ OI_SECMGR_ORPHANED_CALLBACK = 1403, /**< SECMGR: we've been called back, but CB context is gone */
+ OI_SECMGR_BUSY = 1404, /**< SECMGR: configure and access request cannot be concurrent */
+ OI_SECMGR_DEVICE_NOT_TRUSTED = 1405, /**< SECMGR: l2cap access denied - device is not trusted */
+ OI_SECMGR_DEVICE_ENCRYPT_FAIL = 1407, /**< SECMGR: l2cap access denied - failed to start encryption */
+ OI_SECMGR_DISCONNECTED_FAIL = 1408, /**< SECMGR: l2cap access denied - disconnected */
+ OI_SECMGR_ACCESS_PENDING = 1409, /**< SECMGR: l2cap access request is still pending */
+ OI_SECMGR_PIN_CODE_TOO_SHORT = 1410, /**< SECMGR: Higher-layer process gave us a pin code that is too short */
+ OI_SECMGR_UNKNOWN_ENCRYPT_VALUE = 1411, /**< SECMGR: got EncryptionChange event, unknown encryption enable value */
+ OI_SECMGR_INVALID_POLICY = 1412, /**< SECMGR: the specified security policy is not valid for security mode */
+ OI_SECMGR_AUTHORIZATION_FAILED = 1413, /**< SECMGR: device authorization failed */
+ OI_SECMGR_ENCRYPTION_FAILED = 1414, /**< SECMGR: device encryption failed */
+ OI_SECMGR_UNIT_KEY_UNSUPPORTED = 1415, /**< SECMGR: authentication failed due to non-support of unit keys */
+ OI_SECMGR_NOT_REGISTERED = 1416, /**< SECMGR: required registrations have not yet occurred */
+ OI_SECMGR_ILLEGAL_WRITE_SSP_MODE = 1417, /**< SECMGR: 2.1 HCI spec does not allow SSP mode to be disabled */
+ OI_SECMGR_INVALID_SEC_LEVEL = 1418, /**< SECMGR: security level for a service is not a valid value */
+ OI_SECMGR_INSUFFICIENT_LINK_KEY = 1419, /**< SECMGR: link key type is not sufficient to meet service requirements */
+ OI_SECMGR_INVALID_KEY_TYPE = 1420, /**< SECMGR: link key type is not a valid value */
+ OI_SECMGR_SSP_NOT_ENCRYPTED = 1421, /**< SECMGR: ssp required encryption on incoming link */
+ OI_SECMGR_ORPHAN_EVENT = 1422, /**< SECMGR: some HCI security event unrelated to current processes */
+ OI_SECMGR_NOT_BONDABLE = 1423, /**< SECMGR: not in bondable mode */
+
+ OI_TCS_INVALID_ELEMENT_TYPE = 1602, /**< TCS: element type is invalid */
+ OI_TCS_INVALID_PACKET = 1603, /**< TCS: packet is invalide */
+ OI_TCS_CALL_IN_PROGRESS = 1604, /**< TCS: call is in progress */
+ OI_TCS_NO_CALL_IN_PROGRESS = 1605, /**< TCS: no call in progress */
+
+ OI_OBEX_CONTINUE = 1701, /**< OBEX: Continue processing OBEX request */
+ OI_OBEX_COMMAND_ERROR = 1702, /**< OBEX: An unrecognized OBEX command opcode */
+ OI_OBEX_CONNECTION_TIMEOUT = 1703, /**< OBEX: Timeout waiting for a response to a request */
+ OI_OBEX_CONNECT_FAILED = 1704, /**< OBEX: An OBEX connection request did not succeed */
+ OI_OBEX_DISCONNECT_FAILED = 1705, /**< OBEX: A disconnect failed probably because the connection did not exist */
+ OI_OBEX_ERROR = 1706, /**< OBEX: Unspecified OBEX error */
+ OI_OBEX_INCOMPLETE_PACKET = 1707, /**< OBEX: Packet too short or corrupt */
+ OI_OBEX_LENGTH_REQUIRED = 1708, /**< OBEX: Length header required in OBEX command */
+ OI_OBEX_NOT_CONNECTED = 1709, /**< OBEX: No connection to OBEX server */
+ OI_OBEX_NO_MORE_CONNECTIONS = 1710, /**< OBEX: Reached max connections limit */
+ OI_OBEX_OPERATION_IN_PROGRESS = 1711, /**< OBEX: Another operation is still in progress on a connection */
+ OI_OBEX_PUT_RESPONSE_ERROR = 1712, /**< OBEX: An error in the response to a PUT command */
+ OI_OBEX_GET_RESPONSE_ERROR = 1713, /**< OBEX: An error in the response to a GET command */
+ OI_OBEX_REQUIRED_HEADER_NOT_FOUND = 1714, /**< OBEX: packet was missing a required header */
+ OI_OBEX_SERVICE_UNAVAILABLE = 1715, /**< OBEX: Unown OBEX target or required service */
+ OI_OBEX_TOO_MANY_HEADER_BYTES = 1716, /**< OBEX: Headers will not fit in single OBEX packet */
+ OI_OBEX_UNKNOWN_COMMAND = 1717, /**< OBEX: Unrecognized OBEX command */
+ OI_OBEX_UNSUPPORTED_VERSION = 1718, /**< OBEX: Version mismatch */
+ OI_OBEX_CLIENT_ABORTED_COMMAND = 1719, /**< OBEX: server received abort command */
+ OI_OBEX_BAD_PACKET = 1720, /**< OBEX: Any malformed OBEX packet */
+ OI_OBEX_BAD_REQUEST = 1721, /**< OBEX: Maps to OBEX response of the same name */
+ OI_OBEX_OBJECT_OVERFLOW = 1723, /**< OBEX: Too many bytes received. */
+ OI_OBEX_NOT_FOUND = 1724, /**< OBEX: Maps to obex response of same name */
+ OI_OBEX_ACCESS_DENIED = 1735, /**< OBEX: Object could not be read or written. */
+ OI_OBEX_VALUE_NOT_ACCEPTABLE = 1736, /**< OBEX: Value in a command was not in the acceptable range. */
+ OI_OBEX_PACKET_OVERFLOW = 1737, /**< OBEX: Buffer will not fit in a single OBEX packet. */
+ OI_OBEX_NO_SUCH_FOLDER = 1738, /**< OBEX: Error returned by a setpath operation. */
+ OI_OBEX_NAME_REQUIRED = 1739, /**< OBEX: Name must be non-null and non-empty. */
+ OI_OBEX_PASSWORD_TOO_LONG = 1740, /**< OBEX: Password exceeds implementation imposed length limit. */
+ OI_OBEX_PRECONDITION_FAILED = 1741, /**< OBEX: response Precondition Failed */
+ OI_OBEX_UNAUTHORIZED = 1742, /**< OBEX: authentication was not successful. */
+ OI_OBEX_NOT_IMPLEMENTED = 1743, /**< OBEX: Unimplemented feature. */
+ OI_OBEX_INVALID_AUTH_DIGEST = 1744, /**< OBEX: An authentication digest was bad. */
+ OI_OBEX_INVALID_OPERATION = 1745, /**< OBEX: Operation not allowed at this time. */
+ OI_OBEX_DATABASE_FULL = 1746, /**< OBEX: Sync database full. */
+ OI_OBEX_DATABASE_LOCKED = 1747, /**< OBEX: Sync database locked. */
+ OI_OBEX_INTERNAL_SERVER_ERROR = 1748, /**< OBEX: response Internal Server Error */
+ OI_OBEX_UNSUPPORTED_MEDIA_TYPE = 1749, /**< OBEX: response Unsupported Media Type */
+ OI_OBEX_PARTIAL_CONTENT = 1750, /**< OBEX: response Partial Content */
+ OI_OBEX_METHOD_NOT_ALLOWED = 1751, /**< OBEX: response Method Not Allowed */
+ OI_OBEXSRV_INCOMPLETE_GET = 1752, /**< OBEX: Indicates to a GET handler that the request phase is still in progress */
+ OI_OBEX_FOLDER_BROWSING_NOT_ALLOWED = 1753, /**< OBEX: Indicates that an FTP server does not allow folder browsing */
+ OI_OBEX_SERVER_FORCED_DISCONNECT = 1754, /**< OBEX: connection was forcibly terminated by the server */
+ OI_OBEX_OFS_ERROR = 1755, /**< OBEX: OPP object file system error occurred */
+ OI_OBEX_FILEOP_ERROR = 1756, /**< OBEX: FTP/PBAP file operation system error occurred */
+ OI_OBEX_USERID_TOO_LONG = 1757, /**< OBEX: User Id exceeds spec limited length limit. */
+
+ OI_HANDSFREE_EVENT_REPORTING_DISABLED = 1801, /**< HANDSFREE: Event reporting disabled */
+ OI_HANDSFREE_NOT_CONNECTED = 1802, /**< HANDSFREE: Not connected */
+ OI_HANDSFREE_SERVICE_NOT_STARTED = 1803, /**< HANDSFREE: Cannot connect to handsfree AG if handsfree service not started */
+ OI_HANDSFREE_AG_SERVICE_NOT_STARTED = 1804, /**< HANDSFREE: Cannot connect to handsfree device if handsfree AG service not started */
+ OI_HANDSFREE_COMMAND_IN_PROGRESS = 1805, /**< HANDSFREE: Cannot accept a command at this time */
+ OI_HANDSFREE_AUDIO_ALREADY_CONNECTED = 1806, /**< HANDSFREE: Audio is already connected */
+ OI_HANDSFREE_AUDIO_NOT_CONNECTED = 1807, /**< HANDSFREE: Audio is not connected */
+ OI_HANDSFREE_FEATURE_NOT_SUPPORTED = 1808, /**< HANDSFREE: Local or remote feature not supported for requested command */
+
+ OI_HEADSET_SERVICE_NOT_STARTED = 1901, /**< HEADSET: Cannot connect to headset AG if headset service not started */
+ OI_HEADSET_AG_SERVICE_NOT_STARTED = 1902, /**< HEADSET: Cannot connect to headset device if headset AG service not started */
+ OI_HEADSET_COMMAND_IN_PROGRESS = 1903, /**< HEADSET: Cannot accept a command at this time */
+
+ OI_BNEP_INVALID_MTU = 2001, /**< BNEP: The remote device cannot support the minimum BNEP MTU */
+ OI_BNEP_SETUP_TIMEOUT = 2002, /**< BNEP: The setup request timed out. */
+ OI_BNEP_SERVICE_NOT_REGISTERED = 2003, /**< BNEP: The requested service was not found. */
+ OI_BNEP_INVALID_HANDLE = 2004, /**< BNEP: The specified connection handle is not valid. */
+ OI_BNEP_RESPONSE_TIMEOUT = 2005, /**< BNEP: The timer for receiving a response has expired. */
+ OI_BNEP_INVALID_CONNECTION = 2006, /**< BNEP: Invalid connection */
+ OI_BNEP_INVALID_FILTER = 2007, /**< BNEP: The supplied filter was invalid. */
+ OI_BNEP_CONNECTION_EXISTS = 2008, /**< BNEP: An attempt was made to create a duplicate connection. */
+ OI_BNEP_NOT_INITIALIZED = 2009, /**< BNEP: Init has not been called */
+ OI_BNEP_CONNECT_BASE = 2010, /**< BNEP: connection response codes */
+ OI_BNEP_CONNECT_FAILED_INVALID_DEST_UUID = 2011, /**< BNEP: connect response code Invalid Dest UUID */
+ OI_BNEP_CONNECT_FAILED_INVALID_SOURCE_UUID = 2012, /**< BNEP: connect response code Invalid Source UUID */
+ OI_BNEP_CONNECT_FAILED_INVALID_UUID_SIZE = 2013, /**< BNEP: connect response code Invalid UUID Size */
+ OI_BNEP_CONNECT_FAILED_NOT_ALLOWED = 2014, /**< BNEP: connect response code Not Allowed */
+ OI_BNEP_FILTER_NET_BASE = 2020, /**< BNEP: filter response codes */
+ OI_BNEP_FILTER_NET_UNSUPPORTED_REQUEST = 2021, /**< BNEP: filter response code Unsupported Request */
+ OI_BNEP_FILTER_NET_FAILED_INVALID_PROTOCOL_TYPE = 2022, /**< BNEP: filter response code Invalid Protocol Type */
+ OI_BNEP_FILTER_NET_FAILED_MAX_LIMIT_REACHED = 2023, /**< BNEP: filter response code Max Limit Reached */
+ OI_BNEP_FILTER_NET_FAILED_SECURITY = 2024, /**< BNEP: filter response code Security */
+ OI_BNEP_FILTER_MULTI_BASE = 2030, /**< BNEP: multicast response codes */
+ OI_BNEP_FILTER_MULTI_UNSUPPORTED_REQUEST = 2031, /**< BNEP: multicast response code Unsupported Request */
+ OI_BNEP_FILTER_MULTI_FAILED_INVALID_ADDRESS = 2032, /**< BNEP: multicast response code Invalid Address */
+ OI_BNEP_FILTER_MULTI_FAILED_MAX_LIMIT_REACHED = 2033, /**< BNEP: multicast response code Max Limit Reached */
+ OI_BNEP_FILTER_MULTI_FAILED_SECURITY = 2034, /**< BNEP: multicast response code Security */
+ OI_BNEP_LOCAL_DEVICE_MUST_BE_MASTER = 2040, /**< BNEP: Device must be master of the piconet for this function */
+ OI_BNEP_PACKET_FILTERED_OUT = 2041, /**< BNEP: Packet did not pass current filters */
+
+ OI_NETIFC_UP_FAILED = 2101, /**< NETIFC: Could not bring up network interface */
+ OI_NETIFC_COULD_NOT_CREATE_THREAD = 2102, /**< NETIFC: Network interface could not create a read thread */
+ OI_NETIFC_INITIALIZATION_FAILED = 2103, /**< NETIFC: Error in network interface initialization */
+ OI_NETIFC_INTERFACE_ALREADY_UP = 2104, /**< NETIFC: Network interface is already up */
+ OI_NETIFC_INTERFACE_NOT_UP = 2105, /**< NETIFC: Network interface is not up */
+ OI_NETIFC_PACKET_TOO_BIG = 2106, /**< NETIFC: The packet is too big */
+
+ OI_PAN_ROLE_ALREADY_REGISTERED = 2201, /**< PAN: This PAN role was already registered */
+ OI_PAN_ROLE_NOT_ALLOWED = 2202, /**< PAN: The PAN role is not currently allowed */
+ OI_PAN_INCOMPATIBLE_ROLES = 2203, /**< PAN: Only certain local and remote role combinations are permitted */
+ OI_PAN_INVALID_ROLE = 2204, /**< PAN: Role specified is not one the defined PAN roles */
+ OI_PAN_CONNECTION_IN_PROGRESS = 2205, /**< PAN: A PAN connection is currently being established */
+ OI_PAN_USER_ALREADY_CONNECTED = 2206, /**< PAN: PAN user role only allows a single connection */
+ OI_PAN_DEVICE_CONNECTED = 2207, /**< PAN: A PAN connection already exists to specified device */
+
+ OI_CODEC_SBC_NO_SYNCWORD = 2301, /**< CODEC: Couldn't find an SBC SYNCWORD */
+ OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA = 2302, /**< CODEC: Not enough data provided to decode an SBC header */
+ OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA = 2303, /**< CODEC: Decoded the header, but not enough data to contain the rest of the frame */
+ OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA = 2304, /**< CODEC: Not enough audio data for this frame */
+ OI_CODEC_SBC_CHECKSUM_MISMATCH = 2305, /**< CODEC: The frame header didn't match the checksum */
+ OI_CODEC_SBC_PARTIAL_DECODE = 2306, /**< CODEC: Decoding was successful, but frame data still remains. Next call will provide audio without consuming input data. */
+
+ OI_FIFOQ_QUEUE_NOT_ALIGNED = 2401, /**< FIFOQ: queue must be 32-bit aligned */
+ OI_FIFOQ_INVALID_Q = 2402, /**< FIFOQ: queue parameter is not a valid queue */
+ OI_FIFOQ_BUF_TOO_LARGE = 2403, /**< FIFOQ: attempt to queue a buffer which is too large */
+ OI_FIFOQ_FULL = 2404, /**< FIFOQ: enqueue() failed, queue is full */
+ OI_FIFOQ_NOT_ALLOCATED = 2405, /**< FIFOQ: Enqueue QBuf() failed, buffer not allocated */
+ OI_FIFOQ_INVALID_DATA_PTR = 2406, /**< FIFOQ: Enqueue QBuf() failed, data pointer does not match */
+
+ OI_HID_HOST_SERVICE_NOT_STARTED = 2601, /**< HID: Cannot connect to a HID device unless HID host is started */
+ OI_HID_DEVICE_SERVICE_NOT_STARTED = 2602, /**< HID: Cannot connect to a HID host unless HID device is started */
+
+ OI_AT_ERROR = 2701, /**< AT: ERROR response */
+ OI_AT_NO_CARRIER = 2702, /**< AT: NO CARRIER response */
+ OI_AT_BUSY = 2703, /**< AT: BUSY response */
+ OI_AT_NO_ANSWER = 2704, /**< AT: NO ANSWER response */
+ OI_AT_DELAYED = 2705, /**< AT: DELAYED response */
+ OI_AT_BLACKLISTED = 2706, /**< AT: BLACKLISTED response */
+ OI_AT_CME_ERROR = 2707, /**< AT: +CME ERROR response */
+ OI_AT_CMS_ERROR = 2708, /**< AT: +CMS ERROR response */
+
+ OI_BLST_CHARACTER_TIMEOUT = 2801, /**< BLST: Timeout expired while waiting for a character from the client. */
+ OI_BLST_ACKNOWLDGE_TIMEOUT = 2802, /**< BLST: Timeout expired while waiting for event acknowledgment from the client */
+ OI_BLST_TX_NOT_READY = 2803, /**< BLST: BLST is not ready to send a BHAPI message to the client. */
+ OI_BLST_TX_BUSY = 2804, /**< BLST: BLST transmit buffer is in use. */
+
+ OI_AVDTP_CONNECTION_SEQ_ERROR = 2901, /**< AVDTP: sequencing of signalling/media channel connections broken. */
+ OI_AVDTP_OUT_OF_RESOURCES = 2902, /**< AVDTP: Tried to allocate too many endpoints or signalling channels. */
+
+ OI_PBAP_REPOSITORY_NOT_SET = 3001, /**< PBAP: Phonebook repository must be set for operation to complete. */
+ OI_PBAP_PHONEBOOK_NOT_SET = 3002, /**< PBAP: Phonebook be set for operation to complete. */
+
+ OI_AADP_BAD_ENDPOINT = 3101, /**< AADP: Invalid local endpoint specified */
+ OI_AADP_BAD_STATE = 3102, /**< AADP: AADP State is not correct for this operation. */
+
+ OI_UNICODE_INVALID_SOURCE = 3200, /**< Unicode Conversion: Source string has invalid character encoding. */
+ OI_UNICODE_SOURCE_EXHAUSTED = 3201, /**< Unicode Conversion: Incomplete Unicode character at end of source buffer. */
+ OI_UNICODE_DESTINATION_EXHAUSTED = 3202, /**< Unicode Conversion: Destination buffer not large enough to hold resulting Unicode string. */
+
+ OI_AVRCP_TOO_MANY_CONNECTIONS = 3300, /**< AVRCP: Exceeded maximum number of simultaneous AVCTP connections. */
+ OI_AVRCP_NOT_IMPLEMENTED = 3301, /**< AVRCP: The target does not implement the command specified by the opcode and operand. */
+ OI_AVRCP_REJECTED = 3302, /**< AVRCP: The target cannot respond because of invalid operands in command packet. */
+ OI_AVRCP_INVALID_RESPONSE = 3303, /**< AVRCP: The controller received the response with invalid parameters */
+ OI_AVRCP_RESPONSE_PACKET_OVERFLOW = 3304, /**< AVRCP: The response message does not fir in one AVRCP packet (512 bytes), has to be fragmented. */
+ OI_AVRCP_RESPONSE_INVALID_PDU = 3305, /**< AVRCP: Command rejected: target received a PDU that it did not understand. */
+ OI_AVRCP_RESPONSE_INVALID_PARAMETER = 3306, /**< AVRCP: Command rejected: target received a PDU with a parameter ID that it did not understand. */
+ OI_AVRCP_RESPONSE_PARAMETER_NOT_FOUND = 3307, /**< AVRCP: Command rejected: specified parameter not found, sent if the parameter ID is understood, but content is wrong or corrupted.*/
+ OI_AVRCP_RESPONSE_INTERNAL_ERROR = 3308, /**< AVRCP: Command rejected: target detected other error conditions. */
+ OI_MAX_BM3_STATUS_VAL, /* Maximum BM3 status code */
+
+ /* Status code values reserved for BM3 SDK platform-specific implementations */
+ OI_STATUS_RESERVED_FOR_BCOT = 9000,
+
+ /* Status code values reserved for BHAPI products */
+ OI_STATUS_RESERVED_FOR_BHAPI = 9200,
+
+ /* Status code values reserved for Soundabout products */
+ OI_STATUS_RESERVED_FOR_SOUNDABOUT= 9400,
+
+ /*
+ * Status code values greater than or equal to this value are reserved for use by applications.
+ * However, because of differences between compilers, and differences between 16-bit and 32-bit
+ * platforms custom status codes should be in the 16-bit range, so status codes can range from 0
+ * to 65534, inclusive (65535 is reserved)
+ */
+ OI_STATUS_RESERVED_FOR_APPS = 10000,
+
+
+
+ OI_STATUS_NONE = 0xffff /**< Special status code to indicate that there is no status. (Only to be used for special cases involving OI_SLOG_ERROR() and OI_SLOG_WARNING().) */
+
+} OI_STATUS;
+
+
+/* Remeber to update the #define below when new reserved blocks are added to
+ * the list above. */
+#define OI_NUM_RESERVED_STATUS_BLOCKS 4 /**< Number of status code blocks reserved, including user apps */
+
+
+/**
+ * Test for success
+ */
+#define OI_SUCCESS(x) ((x) == OI_OK)
+
+/*****************************************************************************/
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_STATUS_H */
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef OI_STDDEFS_H
+#define OI_STDDEFS_H
+/**
+ * @file
+ * This file contains BM3 standard type definitions.
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_cpu_dep.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef FALSE
+#define FALSE 0 /**< This define statement sets FALSE as a preprocessor alias for 0. */
+#endif
+
+#ifndef TRUE
+#define TRUE (!FALSE) /**< This define statement sets TRUE as a preprocessor alias for !FALSE. */
+#endif
+
+#ifdef HEW_TOOLCHAIN
+ #ifdef NULL
+ #undef NULL /**< Override HEW toolchain NULL definition */
+ #endif
+ #define NULL 0 /**< HEW toolchain does not allow us to compare (void*) type to function pointer */
+#else
+ #ifndef NULL
+ #define NULL ((void*)0) /**< This define statement sets NULL as a preprocessor alias for (void*)0 */
+ #endif
+#endif
+
+/**
+ * @name Maximum and minimum values for basic types
+ * @{
+ */
+#define OI_INT8_MIN ((OI_INT8)0x80) /**< decimal value: -128 */
+#define OI_INT8_MAX ((OI_INT8)0x7F) /**< decimal value: 127 */
+#define OI_INT16_MIN ((OI_INT16)0x8000) /**< decimal value: -32768 */
+#define OI_INT16_MAX ((OI_INT16)0x7FFF) /**< decimal value: 32767 */
+#define OI_INT32_MIN ((OI_INT32)0x80000000) /**< decimal value: -2,147,483,648 */
+#define OI_INT32_MAX ((OI_INT32)0x7FFFFFFF) /**< decimal value: 2,147,483,647 */
+#define OI_UINT8_MIN ((OI_UINT8)0) /**< decimal value: 0 */
+#define OI_UINT8_MAX ((OI_UINT8)0xFF) /**< decimal value: 255 */
+#define OI_UINT16_MIN ((OI_UINT16)0) /**< decimal value: 0 */
+#define OI_UINT16_MAX ((OI_UINT16)0xFFFF) /**< decimal value: 65535 */
+#define OI_UINT32_MIN ((OI_UINT32)0) /**< decimal value: 0 */
+#define OI_UINT32_MAX ((OI_UINT32)0xFFFFFFFF) /**< decimal value: 4,294,967,295 */
+
+/**
+ * @}
+ */
+
+/**
+ * @name Integer types required by the Service Discovery Protocol
+ * @{
+ */
+
+/** unsigned 64-bit integer as a structure of two unsigned 32-bit integers */
+typedef struct {
+ OI_UINT32 I1; /**< most significant 32 bits */
+ OI_UINT32 I2; /**< least significant 32 bits */
+} OI_UINT64;
+
+#define OI_UINT64_MIN { (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 }
+#define OI_UINT64_MAX { (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/** signed 64-bit integer as a structure of one unsigned 32-bit integer and one signed 32-bit integer */
+typedef struct {
+ OI_INT32 I1; /**< most significant 32 bits as a signed integer */
+ OI_UINT32 I2; /**< least significant 32 bits as an unsigned integer */
+} OI_INT64;
+
+#define OI_INT64_MIN { (OI_INT32)0x80000000, (OI_UINT32)0x00000000 }
+#define OI_INT64_MAX { (OI_INT32)0X7FFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/** unsigned 128-bit integer as a structure of four unsigned 32-bit integers */
+typedef struct {
+ OI_UINT32 I1; /**< most significant 32 bits */
+ OI_UINT32 I2; /**< second-most significant 32 bits */
+ OI_UINT32 I3; /**< third-most significant 32 bits */
+ OI_UINT32 I4; /**< least significant 32 bits */
+} OI_UINT128;
+
+#define OI_UINT128_MIN { (OI_UINT32)0x00000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 }
+#define OI_UINT128_MAX { (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/** signed 128-bit integer as a structure of three unsigned 32-bit integers and one signed 32-bit integer */
+typedef struct {
+ OI_INT32 I1; /**< most significant 32 bits as a signed integer */
+ OI_UINT32 I2; /**< second-most significant 32 bits as an unsigned integer */
+ OI_UINT32 I3; /**< third-most significant 32 bits as an unsigned integer */
+ OI_UINT32 I4; /**< least significant 32 bits as an unsigned integer */
+} OI_INT128;
+
+#define OI_INT128_MIN { (OI_UINT32)0x80000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 }
+#define OI_INT128_MAX { (OI_UINT32)0X7FFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/**
+ * @}
+ */
+
+
+/**
+ * type for ASCII character data items
+ */
+typedef char OI_CHAR;
+
+/**
+ * type for double-byte character data items
+ */
+typedef OI_UINT16 OI_CHAR16;
+
+/**
+ * types for UTF encoded strings.
+ */
+typedef OI_UINT8 OI_UTF8;
+typedef OI_UINT16 OI_UTF16;
+typedef OI_UINT32 OI_UTF32;
+
+
+/**
+ * @name Single-bit operation macros
+ * @{
+ * In these macros, x is the data item for which a bit is to be tested or set and y specifies which bit
+ * is to be tested or set.
+ */
+
+/** This macro's value is TRUE if the bit specified by y is set in data item x. */
+#define OI_BIT_TEST(x,y) ((x) & (y))
+
+/** This macro's value is TRUE if the bit specified by y is not set in data item x. */
+#define OI_BIT_CLEAR_TEST(x,y) (((x) & (y)) == 0)
+
+/** This macro sets the bit specified by y in data item x. */
+#define OI_BIT_SET(x,y) ((x) |= (y))
+
+/** This macro clears the bit specified by y in data item x. */
+#define OI_BIT_CLEAR(x,y) ((x) &= ~(y))
+
+/** @} */
+
+/**
+ * The OI_ARRAYSIZE macro is set to the number of elements in an array
+ * (instead of the number of bytes, which is returned by sizeof()).
+ */
+
+#ifndef OI_ARRAYSIZE
+#define OI_ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
+#endif
+
+/**
+ * @name Preprocessor aliases for individual bit positions
+ * Bits are defined here only if they are not already defined.
+ * @{
+ */
+
+#ifndef BIT0
+
+#define BIT0 0x00000001 /**< preprocessor alias for 32-bit value with bit 0 set, used to specify this single bit */
+#define BIT1 0x00000002 /**< preprocessor alias for 32-bit value with bit 1 set, used to specify this single bit */
+#define BIT2 0x00000004 /**< preprocessor alias for 32-bit value with bit 2 set, used to specify this single bit */
+#define BIT3 0x00000008 /**< preprocessor alias for 32-bit value with bit 3 set, used to specify this single bit */
+#define BIT4 0x00000010 /**< preprocessor alias for 32-bit value with bit 4 set, used to specify this single bit */
+#define BIT5 0x00000020 /**< preprocessor alias for 32-bit value with bit 5 set, used to specify this single bit */
+#define BIT6 0x00000040 /**< preprocessor alias for 32-bit value with bit 6 set, used to specify this single bit */
+#define BIT7 0x00000080 /**< preprocessor alias for 32-bit value with bit 7 set, used to specify this single bit */
+#define BIT8 0x00000100 /**< preprocessor alias for 32-bit value with bit 8 set, used to specify this single bit */
+#define BIT9 0x00000200 /**< preprocessor alias for 32-bit value with bit 9 set, used to specify this single bit */
+#define BIT10 0x00000400 /**< preprocessor alias for 32-bit value with bit 10 set, used to specify this single bit */
+#define BIT11 0x00000800 /**< preprocessor alias for 32-bit value with bit 11 set, used to specify this single bit */
+#define BIT12 0x00001000 /**< preprocessor alias for 32-bit value with bit 12 set, used to specify this single bit */
+#define BIT13 0x00002000 /**< preprocessor alias for 32-bit value with bit 13 set, used to specify this single bit */
+#define BIT14 0x00004000 /**< preprocessor alias for 32-bit value with bit 14 set, used to specify this single bit */
+#define BIT15 0x00008000 /**< preprocessor alias for 32-bit value with bit 15 set, used to specify this single bit */
+#define BIT16 0x00010000 /**< preprocessor alias for 32-bit value with bit 16 set, used to specify this single bit */
+#define BIT17 0x00020000 /**< preprocessor alias for 32-bit value with bit 17 set, used to specify this single bit */
+#define BIT18 0x00040000 /**< preprocessor alias for 32-bit value with bit 18 set, used to specify this single bit */
+#define BIT19 0x00080000 /**< preprocessor alias for 32-bit value with bit 19 set, used to specify this single bit */
+#define BIT20 0x00100000 /**< preprocessor alias for 32-bit value with bit 20 set, used to specify this single bit */
+#define BIT21 0x00200000 /**< preprocessor alias for 32-bit value with bit 21 set, used to specify this single bit */
+#define BIT22 0x00400000 /**< preprocessor alias for 32-bit value with bit 22 set, used to specify this single bit */
+#define BIT23 0x00800000 /**< preprocessor alias for 32-bit value with bit 23 set, used to specify this single bit */
+#define BIT24 0x01000000 /**< preprocessor alias for 32-bit value with bit 24 set, used to specify this single bit */
+#define BIT25 0x02000000 /**< preprocessor alias for 32-bit value with bit 25 set, used to specify this single bit */
+#define BIT26 0x04000000 /**< preprocessor alias for 32-bit value with bit 26 set, used to specify this single bit */
+#define BIT27 0x08000000 /**< preprocessor alias for 32-bit value with bit 27 set, used to specify this single bit */
+#define BIT28 0x10000000 /**< preprocessor alias for 32-bit value with bit 28 set, used to specify this single bit */
+#define BIT29 0x20000000 /**< preprocessor alias for 32-bit value with bit 29 set, used to specify this single bit */
+#define BIT30 0x40000000 /**< preprocessor alias for 32-bit value with bit 30 set, used to specify this single bit */
+#define BIT31 0x80000000 /**< preprocessor alias for 32-bit value with bit 31 set, used to specify this single bit */
+
+#endif /* BIT0 et al */
+
+
+/** @} */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+/*****************************************************************************/
+#endif /* OI_STDDEFS_H */
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef OI_STRING_H
+#define OI_STRING_H
+/**
+ * @file
+ * This file contains BM3 supplied portable string.h functions
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_cpu_dep.h"
+#include "oi_stddefs.h"
+
+#if defined(USE_NATIVE_MEMCPY) || defined(USE_NATIVE_MALLOC)
+#include <string.h>
+#endif
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * If we are using Native malloc(), we must also use
+ * native Ansi string.h functions for memory manipulation.
+ */
+#ifdef USE_NATIVE_MALLOC
+#ifndef USE_NATIVE_MEMCPY
+#define USE_NATIVE_MEMCPY
+#endif
+#endif
+
+#ifdef USE_NATIVE_MEMCPY
+
+#define OI_MemCopy(to, from, size) memcpy((to), (from), (size))
+#define OI_MemSet(block, val, size) memset((block), (val), (size))
+#define OI_MemZero(block, size) memset((block), 0, (size))
+#define OI_MemCmp(s1, s2, n) memcmp((s1), (s2), (n))
+#define OI_Strcpy(dest, src) strcpy((dest),(src))
+#define OI_Strcat(dest, src) strcat((dest),(src))
+#define OI_StrLen(str) strlen((str))
+#define OI_Strcmp(s1, s2) strcmp((s1), (s2))
+#define OI_Strncmp(s1, s2, n) strncmp((s1), (s2), (n))
+
+#else
+
+/*
+ * OI_MemCopy
+ *
+ * Copy an arbitrary number of bytes from one memory address to another.
+ * The underlying implementation is the ANSI memmove() or equivalant, so
+ * overlapping memory copies will work correctly.
+ */
+void OI_MemCopy(void *To, void const *From, OI_UINT32 Size);
+
+
+/*
+ * OI_MemSet
+ *
+ * Sets all bytes in a block of memory to the same value
+ */
+void OI_MemSet(void *Block, OI_UINT8 Val, OI_UINT32 Size);
+
+
+/*
+ * OI_MemZero
+ *
+ * Sets all bytes in a block of memory to zero
+ */
+void OI_MemZero(void *Block, OI_UINT32 Size);
+
+
+/*
+ * OI_MemCmp
+ *
+ * Compare two blocks of memory
+ *
+ * Returns:
+ * 0, if s1 == s2
+ * < 0, if s1 < s2
+ * > 0, if s2 > s2
+ */
+OI_INT OI_MemCmp(void const *s1, void const *s2, OI_UINT32 n);
+
+/*
+ * OI_Strcpy
+ *
+ * Copies the Null terminated string from pStr to pDest, and
+ * returns pDest.
+ */
+
+OI_CHAR* OI_Strcpy(OI_CHAR *pDest,
+ OI_CHAR const *pStr);
+
+/*
+ * OI_Strcat
+ *
+ * Concatonates the pStr string to the end of pDest, and
+ * returns pDest.
+ */
+
+OI_CHAR* OI_Strcat(OI_CHAR *pDest,
+ OI_CHAR const *pStr) ;
+
+/*
+ * OI_StrLen
+ *
+ * Calculates the number of OI_CHARs in pStr (not including
+ * the Null terminator) and returns the value.
+ */
+OI_UINT OI_StrLen(OI_CHAR const *pStr) ;
+
+/*
+ * OI_Strcmp
+ *
+ * Compares two Null terminated strings
+ *
+ * Returns:
+ * 0, if s1 == s2
+ * < 0, if s1 < s2
+ * > 0, if s2 > s2
+ */
+OI_INT OI_Strcmp(OI_CHAR const *s1,
+ OI_CHAR const *s2);
+
+/*
+ * OI_Strncmp
+ *
+ * Compares the first "len" OI_CHARs of strings s1 and s2.
+ *
+ * Returns:
+ * 0, if s1 == s2
+ * < 0, if s1 < s2
+ * > 0, if s2 > s2
+ */
+OI_INT OI_Strncmp(OI_CHAR const *s1,
+ OI_CHAR const *s2,
+ OI_UINT32 len);
+
+
+#endif /* USE_NATIVE_MEMCPY */
+
+/*
+ * OI_StrcmpInsensitive
+ *
+ * Compares two Null terminated strings, treating
+ * the Upper and Lower case of 'A' through 'Z' as
+ * equivilent.
+ *
+ * Returns:
+ * 0, if s1 == s2
+ * < 0, if s1 < s2
+ * > 0, if s2 > s2
+ */
+OI_INT OI_StrcmpInsensitive(OI_CHAR const *s1,
+ OI_CHAR const *s2);
+
+/*
+ * OI_StrncmpInsensitive
+ *
+ * Compares the first "len" OI_CHARs of strings s1 and s2,
+ * treating the Upper and Lower case of 'A' through 'Z' as
+ * equivilent.
+ *
+ *
+ * Returns:
+ * 0, if s1 == s2
+ * < 0, if s1 < s2
+ * > 0, if s2 > s2
+ */
+OI_INT OI_StrncmpInsensitive(OI_CHAR const *s1,
+ OI_CHAR const *s2,
+ OI_UINT len);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+
+/*****************************************************************************/
+#endif /* OI_STRING_H */
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_TIME_H
+#define _OI_TIME_H
+/** @file
+ *
+ * This file provides time type definitions and interfaces to time-related functions.
+ *
+ * The stack maintains a 64-bit real-time millisecond clock. The choice of
+ * milliseconds is for convenience, not accuracy.
+ *
+ * Timeouts are specified as tenths of seconds in a 32-bit value. Timeout values
+ * specified by the Bluetooth specification are usually muliple seconds, so
+ * accuracy to a tenth of a second is more than adequate.
+ *
+ * This file also contains macros to convert between seconds and the Link
+ * Manager's 1.28-second units.
+ *
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+/**
+ * Within the core stack timeouts are specified in intervals of tenths of seconds
+ */
+
+typedef OI_UINT16 OI_INTERVAL;
+#define OI_INTERVALS_PER_SECOND 10
+#define MSECS_PER_OI_INTERVAL (1000 / OI_INTERVALS_PER_SECOND)
+
+/** maximum interval (54 min 36.7 sec) */
+#define OI_MAX_INTERVAL 0x7fff
+
+
+/**
+ * Macro to convert seconds to OI_INTERVAL time units
+ */
+
+#define OI_SECONDS(n) ((OI_INTERVAL) ((n) * OI_INTERVALS_PER_SECOND))
+
+/**
+ * Macro to convert milliseconds to OI_INTERVAL time units (Rounded Up)
+ */
+
+#define OI_MSECONDS(n) ((OI_INTERVAL) ((n + MSECS_PER_OI_INTERVAL - 1) / MSECS_PER_OI_INTERVAL))
+
+/**
+ * Macro to convert minutes to OI_INTERVAL time units
+ */
+
+#define OI_MINUTES(n) ((OI_INTERVAL) ((n) * OI_SECONDS(60)))
+
+/** Convert an OI_INTERVAL to milliseconds. */
+#define OI_INTERVAL_TO_MILLISECONDS(i) ((i) * MSECS_PER_OI_INTERVAL)
+
+/**
+ * The stack depends on relative not absolute time. Any mapping between the
+ * stack's real-time clock and absolute time and date is implementation-dependent.
+ */
+
+typedef struct {
+ OI_INT32 seconds;
+ OI_INT16 mseconds;
+} OI_TIME;
+
+/**
+ * Convert an OI_TIME to milliseconds.
+ *
+ * @param t the time to convert
+ *
+ * @return the time in milliseconds
+ */
+OI_UINT32 OI_Time_ToMS(OI_TIME *t);
+
+
+/**
+ * This function compares two time values.
+ *
+ * @param T1 first time to compare.
+ *
+ * @param T2 second time to compare.
+ *
+ * @return
+ @verbatim
+ -1 if t1 < t2
+ 0 if t1 = t2
+ +1 if t1 > t2
+ @endverbatim
+ */
+
+OI_INT16 OI_Time_Compare(OI_TIME *T1,
+ OI_TIME *T2);
+
+
+/**
+ * This function returns the interval between two times to a granularity of 0.1 seconds.
+ *
+ * @param Sooner a time value more recent that Later
+ *
+ * @param Later a time value later than Sooner
+ *
+ * @note The result is an OI_INTERVAL value so this function only works for time intervals
+ * that are less than about 71 minutes.
+ *
+ * @return the time interval between the two times = (Later - Sooner)
+ */
+
+OI_INTERVAL OI_Time_Interval(OI_TIME *Sooner,
+ OI_TIME *Later);
+
+
+
+/**
+ * This function returns the interval between two times to a granularity of milliseconds.
+ *
+ * @param Sooner a time value more recent that Later
+ *
+ * @param Later a time value later than Sooner
+ *
+ * @note The result is an OI_UINT32 value so this function only works for time intervals
+ * that are less than about 50 days.
+ *
+ * @return the time interval between the two times = (Later - Sooner)
+ */
+
+OI_UINT32 OI_Time_IntervalMsecs(OI_TIME *Sooner,
+ OI_TIME *Later);
+
+
+
+/**
+ * This function answers the question, Have we reached or gone past the target time?
+ *
+ * @param pTargetTime target time
+ *
+ * @return TRUE means time now is at or past target time
+ * FALSE means target time is still some time in the future
+ */
+
+OI_BOOL OI_Time_NowReachedTime(OI_TIME *pTargetTime);
+
+/**
+ * Convert seconds to the Link Manager 1.28-second units
+ * Approximate by using 1.25 conversion factor.
+ */
+
+#define OI_SECONDS_TO_LM_TIME_UNITS(lmUnits) ((lmUnits)<4?(lmUnits):(lmUnits)-((lmUnits)>>2))
+
+
+/**
+ * Convert Link Manager 1.28-second units to seconds.
+ * Approximate by using 1.25 conversion factor.
+ */
+
+#define OI_LM_TIME_UNITS_TO_SECONDS(lmUnits) ((lmUnits) + ((lmUnits)>>2))
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+/* Include for OI_Time_Now() prototype
+ * Must be included at end to obtain OI_TIME typedef
+ */
+#include "oi_osinterface.h"
+
+/*****************************************************************************/
+#endif /* _OI_TIME_H */
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef _OI_UTILS_H
+#define _OI_UTILS_H
+/**
+ * @file
+ *
+ * This file provides the interface for utility functions.
+ * Among the utilities are strlen (string length), strcmp (string compare), and
+ * other string manipulation functions. These are provided for those plaforms
+ * where this functionality is not available in stdlib.
+ */
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include <stdarg.h>
+#include "oi_common.h"
+#include "oi_string.h"
+#include "oi_bt_spec.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Opaque type for a callback function handle. See OI_ScheduleCallbackFunction()
+ */
+typedef OI_UINT32 OI_CALLBACK_HANDLE;
+
+
+/**
+ * Function prototype for a timed procedure callback.
+ *
+ * @param arg Value that was passed into the OI_ScheduleCallback() function
+ *
+ */
+typedef void (*OI_SCHEDULED_CALLBACK)(void *arg);
+
+
+/**
+ * Registers a function to be called when a timeout expires. This API uses BLUEmagic's internal
+ * function dispatch mechanism, so applications that make extensive use of this facility may need to
+ * increase the value of DispatchTableSize in the configuration block for the dispatcher (see
+ * oi_bt_stack_config.h).
+ *
+ * @param callbackFunction The function that will be called when the timeout expires
+ *
+ * @param arg Value that will be returned as the parameter to the callback function.
+ *
+ * @param timeout A timeout expressed in OI_INTERVALs (tenths of seconds). This can be
+ * zero in which case the callback function will be called as soon as
+ * possible.
+ *
+ * @param handle NULL or a pointer receive the callback handle.
+ *
+ * @return OI_OK if the function was reqistered, or an error status.
+ */
+OI_STATUS OI_ScheduleCallbackFunction(OI_SCHEDULED_CALLBACK callbackFunction,
+ void *arg,
+ OI_INTERVAL timeout,
+ OI_CALLBACK_HANDLE *handle);
+
+
+/**
+ * Cancels a function registered with OI_ScheduleCallbackFunction() before its timer expires.
+ *
+ * @param handle handle returned by OI_ScheduleCallbackFunction().
+ *
+ * @return OI_OK if the function was cancelled, or an error status.
+ */
+OI_STATUS OI_CancelCallbackFunction(OI_CALLBACK_HANDLE handle);
+
+
+/**
+ * Registers a function to be called when a timeout expires. This version does not return a handle
+ * so can only be canceled by calling OI_CancelCallback().
+ *
+ * @param callbackFunction The function that will be called when the timeout expires
+ *
+ * @param arg Value that will be returned as the parameter to the callback function.
+ *
+ * @param timeout A timeout expressed in OI_INTERVALs (tenths of seconds). This can be
+ * zero in which case the callback function will be called as soon as
+ * possible.
+ *
+ * @return OI_OK if the function was reqistered, or an error status.
+ */
+#define OI_ScheduleCallback(f, a, t) OI_ScheduleCallbackFunction(f, a, t, NULL);
+
+
+/**
+ * Cancels a function registered with OI_ScheduleCallback() before its timer expires. This
+ * function will cancel the first entry matches the indicated callback function pointer.
+ *
+ * @param callbackFunction The function that was originally registered
+ *
+ * @return OI_OK if the function was cancelled, or an error status.
+ */
+OI_STATUS OI_CancelCallback(OI_SCHEDULED_CALLBACK callbackFunction);
+
+
+/**
+ * Parse a Bluetooth device address from the specified string.
+ *
+ * @param str the string to parse
+ * @param addr the parsed address, if successful
+ *
+ * @return TRUE if an address was successfully parsed, FALSE otherwise
+ */
+
+OI_BOOL OI_ParseBdAddr(const OI_CHAR *str,
+ OI_BD_ADDR *addr) ;
+
+/**
+ * Printf function for platforms which have no stdio or printf available.
+ * OI_Printf supports the basic formatting types, with the exception of
+ * floating point types. Additionally, OI_Printf supports several formats
+ * specific to BLUEmagic 3.0 software:
+ *
+ * \%! prints the string for an #OI_STATUS value.
+ * @code OI_Printf("There was an error %!", status); @endcode
+ *
+ * \%@ prints a hex dump of a buffer.
+ * Requires a pointer to the buffer and a signed integer length
+ * (0 for default length). If the buffer is large, only an excerpt will
+ * be printed.
+ * @code OI_Printf("Contents of buffer %@", buffer, sizeof(buffer)); @endcode
+ *
+ * \%: prints a Bluetooth address in the form "HH:HH:HH:HH:HH:HH".
+ * Requires a pointer to an #OI_BD_ADDR.
+ * @code OI_Printf("Bluetooth address %:", &bdaddr); @endcode
+ *
+ * \%^ decodes and prints a data element as formatted XML.
+ * Requires a pointer to an #OI_DATAELEM.
+ * @code OI_Printf("Service attribute list is:\n%^", &attributes); @endcode
+ *
+ * \%/ prints the base file name of a path, that is, the final substring
+ * following a '/' or '\\' character. Requires a pointer to a null
+ * terminated string.
+ * @code OI_Printf("File %/", "c:\\dir1\\dir2\\file.txt"); @endcode
+ *
+ * \%~ prints a string, escaping characters as needed to display it in
+ * ASCII. Requires a pointer to an #OI_PSTR and an #OI_UNICODE_ENCODING
+ * parameter.
+ * @code OI_Printf("Identifier %~", &id, OI_UNICODE_UTF16_BE); @endcode
+ *
+ * \%[ inserts an ANSI color escape sequence. Requires a single character
+ * identifying the color to select. Colors are red (r/R), green (g/G),
+ * blue (b/B), yellow (y/Y), cyan (c/C), magenta (m/M), white (W),
+ * light-gray (l/L), dark-gray (d/D), and black (0). The lower case is
+ * dim, the upper case is bright (except in the case of light-gray and
+ * dark-gray, where bright and dim are identical). Any other value will
+ * select the default color.
+ * @code OI_Printf("%[red text %[black %[normal\n", 'r', '0', 0); @endcode
+ *
+ * \%a same as \%s, except '\\r' and '\\n' are output as "<cr>" and "<lf>".
+ * \%?a is valid, but \%la is not.
+ *
+ * \%b prints an integer in base 2.
+ * @code OI_Printf("Bits are %b", I); @endcode
+ *
+ * \%lb prints a long integer in base 2.
+ *
+ * \%?b prints the least significant N bits of an integer (or long integer)
+ * in base 2. Requires the integer and a length N.
+ * @code OI_Printf("Bottom 4 bits are: %?b", I, 4); @endcode
+ *
+ * \%B prints an integer as boolean text, "TRUE" or "FALSE".
+ * @code OI_Printf("The value 0 is %B, the value 1 is %B", 0, 1); @endcode
+ *
+ * \%?s prints a substring up to a specified maximum length.
+ * Requires a pointer to a string and a length parameter.
+ * @code OI_Printf("String prefix is %?s", str, 3); @endcode
+ *
+ * \%ls same as \%S.
+ *
+ * \%S prints a UTF16 string as UTF8 (plain ASCII, plus 8-bit char sequences
+ * where needed). Requires a pointer to #OI_CHAR16. \%?S is valid. The
+ * length parameter is in OI_CHAR16 characters.
+ *
+ * \%T prints time, formatted as "secs.msecs".
+ * Requires pointer to #OI_TIME struct, NULL pointer prints current time.
+ * @code OI_Printf("The time now is %T", NULL); @endcode
+ *
+ * @param format The format string
+ *
+ */
+void OI_Printf(const OI_CHAR *format, ...);
+
+
+/**
+ * Var-args version OI_Printf
+ *
+ * @param format Same as for OI_Printf.
+ *
+ * @param argp Var-args list.
+ */
+void OI_VPrintf(const OI_CHAR *format, va_list argp);
+
+
+/**
+ * Writes a formatted string to a buffer. This function supports the same format specifiers as
+ * OI_Printf().
+ *
+ * @param buffer Destination buffer for the formatted string.
+ *
+ * @param bufLen The length of the destination buffer.
+ *
+ * @param format The format string
+ *
+ * @return Number of characters written or -1 in the case of an error.
+ */
+OI_INT32 OI_SNPrintf(OI_CHAR *buffer,
+ OI_UINT16 bufLen,
+ const OI_CHAR* format, ...);
+
+
+/**
+ * Var-args version OI_SNPrintf
+ *
+ * @param buffer Destination buffer for the formatted string.
+ *
+ * @param bufLen The length of the destination buffer.
+ *
+ * @param format The format string
+ *
+ * @param argp Var-args list.
+ *
+ * @return Number of characters written or -1 in the case of an error.
+ */
+OI_INT32 OI_VSNPrintf(OI_CHAR *buffer,
+ OI_UINT16 bufLen,
+ const OI_CHAR *format, va_list argp);
+
+
+/**
+ * Convert a string to an integer.
+ *
+ * @param str the string to parse
+ *
+ * @return the integer value of the string or 0 if the string could not be parsed
+ */
+OI_INT OI_atoi(const OI_CHAR *str);
+
+
+/**
+ * Parse a signed integer in a string.
+ *
+ * Skips leading whitespace (space and tabs only) and parses a decimal or hex string. Hex string
+ * must be prefixed by "0x". Returns pointer to first character following the integer. Returns the
+ * pointer passed in if the string does not describe an integer.
+ *
+ * @param str String to parse.
+ *
+ * @param val Pointer to receive the parsed integer value.
+ *
+ * @return A pointer to the first character following the integer or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanInt(const OI_CHAR *str,
+ OI_INT32 *val);
+
+
+/**
+ * Parse an unsigned integer in a string.
+ *
+ * Skips leading whitespace (space and tabs only) and parses a decimal or hex string. Hex string
+ * must be prefixed by "0x". Returns pointer to first character following the integer. Returns the
+ * pointer passed in if the string does not describe an integer.
+ *
+ * @param str String to parse.
+ *
+ * @param val Pointer to receive the parsed unsigned integer value.
+ *
+ * @return A pointer to the first character following the unsigned integer or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanUInt(const OI_CHAR *str,
+ OI_UINT32 *val);
+
+/**
+ * Parse a whitespace delimited substring out of a string.
+ *
+ * @param str Input string to parse.
+ * @param outStr Buffer to return the substring
+ * @param len Length of outStr
+ *
+ *
+ * @return A pointer to the first character following the substring or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanStr(const OI_CHAR *str,
+ OI_CHAR *outStr,
+ OI_UINT16 len);
+
+
+/**
+ * Parse a string for one of a set of alternative value. Skips leading whitespace (space and tabs
+ * only) and parses text matching one of the alternative strings. Returns pointer to first character
+ * following the matched text.
+ *
+ * @param str String to parse.
+ *
+ * @param alts Alternative matching strings separated by '|'
+ *
+ * @param index Pointer to receive the index of the matching alternative, return value is -1 if
+ * there is no match.
+ *
+ * @return A pointer to the first character following the matched value or the pointer passed in
+ * if there was no matching text.
+ */
+const OI_CHAR* OI_ScanAlt(const OI_CHAR *str,
+ const OI_CHAR *alts,
+ OI_INT *index);
+
+/**
+ * Parse a string for a BD Addr. Skips leading whitespace (space and tabs only) and parses a
+ * Bluetooth device address with nibbles optionally separated by colons. Return pointet to first
+ * character following the BD Addr.
+ *
+ * @param str String to parse.
+ *
+ * @param addr Pointer to receive the Bluetooth device address
+ *
+ * @return A pointer to the first character following the BD Addr or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanBdAddr(const OI_CHAR *str,
+ OI_BD_ADDR *addr);
+
+
+/** Get a character from a digit integer value (0 - 9). */
+#define OI_DigitToChar(d) ((d) + '0')
+
+/**
+ * Determine Maximum and Minimum between two arguments.
+ *
+ * @param a 1st value
+ * @param b 2nd value
+ *
+ * @return the max or min value between a & b
+ */
+#define OI_MAX(a, b) (((a) < (b)) ? (b) : (a) )
+#define OI_MIN(a, b) (((a) > (b)) ? (b) : (a) )
+
+/**
+ * Compare two BD_ADDRs
+ * SAME_BD_ADDR - Boolean: TRUE if they are the same address
+ */
+
+#define SAME_BD_ADDR(x, y) (0 == OI_MemCmp((x),(y),OI_BD_ADDR_BYTE_SIZE) )
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_UTILS_H */
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <stdlib.h>
+#include <oi_codec_sbc_private.h>
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+PRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ OI_UINT32 *codecDataAligned,
+ OI_UINT32 codecDataBytes,
+ OI_UINT8 maxChannels,
+ OI_UINT8 pcmStride)
+{
+ int i;
+ size_t filterBufferCount;
+ size_t subdataSize;
+ OI_BYTE *codecData = (OI_BYTE*)codecDataAligned;
+
+ if (maxChannels < 1 || maxChannels > 2) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (pcmStride < 1 || pcmStride > maxChannels) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ common->maxChannels = maxChannels;
+ common->pcmStride = pcmStride;
+
+ /* Compute sizes needed for the memory regions, and bail if we don't have
+ * enough memory for them. */
+ subdataSize = maxChannels * sizeof(common->subdata[0]) * SBC_MAX_BANDS * SBC_MAX_BLOCKS;
+ if (subdataSize > codecDataBytes) {
+ return OI_STATUS_OUT_OF_MEMORY;
+ }
+
+ filterBufferCount = (codecDataBytes - subdataSize) / (sizeof(common->filterBuffer[0][0]) * SBC_MAX_BANDS * maxChannels);
+ if (filterBufferCount < SBC_CODEC_MIN_FILTER_BUFFERS) {
+ return OI_STATUS_OUT_OF_MEMORY;
+ }
+ common->filterBufferLen = filterBufferCount * SBC_MAX_BANDS;
+
+ /* Allocate memory for the subband data */
+ common->subdata = (OI_INT32*)codecData;
+ codecData += subdataSize;
+ OI_ASSERT(codecDataBytes >= subdataSize);
+ codecDataBytes -= subdataSize;
+
+ /* Allocate memory for the synthesis buffers */
+ for (i = 0; i < maxChannels; ++i) {
+ size_t allocSize = common->filterBufferLen * sizeof(common->filterBuffer[0][0]);
+ common->filterBuffer[i] = (SBC_BUFFER_T*)codecData;
+ OI_ASSERT(codecDataBytes >= allocSize);
+ codecData += allocSize;
+ codecDataBytes -= allocSize;
+ }
+
+ return OI_OK;
+}
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addgroup codec_internal*/
+/**@{*/
+
+#include <oi_codec_sbc_private.h>
+
+static void dualBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ OI_UINT bitcountL;
+ OI_UINT bitcountR;
+ OI_UINT bitpoolPreferenceL = 0;
+ OI_UINT bitpoolPreferenceR = 0;
+ BITNEED_UNION1 bitneedsL;
+ BITNEED_UNION1 bitneedsR;
+
+ bitcountL = computeBitneed(common, bitneedsL.uint8, 0, &bitpoolPreferenceL);
+ bitcountR = computeBitneed(common, bitneedsR.uint8, 1, &bitpoolPreferenceR);
+
+ oneChannelBitAllocation(common, &bitneedsL, 0, bitcountL);
+ oneChannelBitAllocation(common, &bitneedsR, 1, bitcountR);
+}
+
+static void stereoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+ BITNEED_UNION2 bitneeds;
+ OI_UINT excess;
+ OI_INT bitadjust;
+ OI_UINT bitcount;
+ OI_UINT sbL;
+ OI_UINT sbR;
+ OI_UINT bitpoolPreference = 0;
+
+ bitcount = computeBitneed(common, &bitneeds.uint8[0], 0, &bitpoolPreference);
+ bitcount += computeBitneed(common, &bitneeds.uint8[nrof_subbands], 1, &bitpoolPreference);
+
+ {
+ OI_UINT ex;
+ bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds.uint32, 2 * nrof_subbands, bitcount, &ex);
+ /* We want the compiler to put excess into a register */
+ excess = ex;
+ }
+ sbL = 0;
+ sbR = nrof_subbands;
+ while (sbL < nrof_subbands) {
+ excess = allocAdjustedBits(&common->bits.uint8[sbL], bitneeds.uint8[sbL] + bitadjust, excess);
+ ++sbL;
+ excess = allocAdjustedBits(&common->bits.uint8[sbR], bitneeds.uint8[sbR] + bitadjust, excess);
+ ++sbR;
+ }
+ sbL = 0;
+ sbR = nrof_subbands;
+ while (excess) {
+ excess = allocExcessBits(&common->bits.uint8[sbL], excess);
+ ++sbL;
+ if (!excess) {
+ break;
+ }
+ excess = allocExcessBits(&common->bits.uint8[sbR], excess);
+ ++sbR;
+ }
+
+}
+
+static const BIT_ALLOC balloc[] = {
+ monoBitAllocation, /* SBC_MONO */
+ dualBitAllocation, /* SBC_DUAL_CHANNEL */
+ stereoBitAllocation, /* SBC_STEREO */
+ stereoBitAllocation /* SBC_JOINT_STEREO */
+};
+
+
+PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ OI_ASSERT(common->frameInfo.bitpool <= OI_SBC_MaxBitpool(&common->frameInfo));
+ OI_ASSERT(common->frameInfo.mode < OI_ARRAYSIZE(balloc));
+
+ /*
+ * Using an array of function pointers prevents the compiler from creating a suboptimal
+ * monolithic inlined bit allocation function.
+ */
+ balloc[common->frameInfo.mode](common);
+}
+
+OI_UINT32 OI_CODEC_SBC_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ return internal_CalculateBitrate(frame);
+}
+
+/*
+ * Return the current maximum bitneed and clear it.
+ */
+OI_UINT8 OI_CODEC_SBC_GetMaxBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ OI_UINT8 max = common->maxBitneed;
+
+ common->maxBitneed = 0;
+ return max;
+}
+
+/*
+ * Calculates the bitpool size for a given frame length
+ */
+OI_UINT16 OI_CODEC_SBC_CalculateBitpool(OI_CODEC_SBC_FRAME_INFO *frame,
+ OI_UINT16 frameLen)
+{
+ OI_UINT16 nrof_subbands = frame->nrof_subbands;
+ OI_UINT16 nrof_blocks = frame->nrof_blocks;
+ OI_UINT16 hdr;
+ OI_UINT16 bits;
+
+ if (frame->mode == SBC_JOINT_STEREO) {
+ hdr = 9 * nrof_subbands;
+ } else {
+ if (frame->mode == SBC_MONO) {
+ hdr = 4 * nrof_subbands;
+ } else {
+ hdr = 8 * nrof_subbands;
+ }
+ if (frame->mode == SBC_DUAL_CHANNEL) {
+ nrof_blocks *= 2;
+ }
+ }
+ bits = 8 * (frameLen - SBC_HEADER_LEN) - hdr;
+ return DIVIDE(bits, nrof_blocks);
+}
+
+OI_UINT16 OI_CODEC_SBC_CalculatePcmBytes(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ return sizeof(OI_INT16) * common->pcmStride * common->frameInfo.nrof_subbands * common->frameInfo.nrof_blocks;
+}
+
+
+OI_UINT16 OI_CODEC_SBC_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ return internal_CalculateFramelen(frame);
+}
+
+/**@}*/
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+ ***********************************************************************************/
+
+/**
+@file
+
+The functions in this file relate to the allocation of available bits to
+subbands within the SBC/eSBC frame, along with support functions for computing
+frame length and bitrate.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_utils.h"
+#include <oi_codec_sbc_private.h>
+
+OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ switch (frame->mode) {
+ case SBC_MONO:
+ case SBC_DUAL_CHANNEL:
+ return 16 * frame->nrof_subbands;
+ case SBC_STEREO:
+ case SBC_JOINT_STEREO:
+ return 32 * frame->nrof_subbands;
+ }
+
+ ERROR(("Invalid frame mode %d", frame->mode));
+ OI_ASSERT(FALSE);
+ return 0; /* Should never be reached */
+}
+
+
+PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ OI_UINT16 nbits = frame->nrof_blocks * frame->bitpool;
+ OI_UINT16 nrof_subbands = frame->nrof_subbands;
+ OI_UINT16 result = nbits;
+
+ if (frame->mode == SBC_JOINT_STEREO) {
+ result += nrof_subbands + (8 * nrof_subbands);
+ } else {
+ if (frame->mode == SBC_DUAL_CHANNEL) { result += nbits; }
+ if (frame->mode == SBC_MONO) { result += 4*nrof_subbands; } else { result += 8*nrof_subbands; }
+ }
+ return SBC_HEADER_LEN + (result + 7) / 8;
+}
+
+
+PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ OI_UINT blocksbands;
+ blocksbands = frame->nrof_subbands * frame->nrof_blocks;
+
+ return DIVIDE(8 * internal_CalculateFramelen(frame) * frame->frequency, blocksbands);
+}
+
+
+INLINE OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_)
+{
+ OI_UINT headerLen = SBC_HEADER_LEN + frame->nrof_subbands * frame->nrof_channels/2;
+
+ if (frame->mode == SBC_JOINT_STEREO) { headerLen++; }
+
+ *headerLen_ = headerLen;
+ return internal_CalculateFramelen(frame);
+}
+
+
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+
+
+/*
+ * Computes the bit need for each sample and as also returns a counts of bit needs that are greater
+ * than one. This count is used in the first phase of bit allocation.
+ *
+ * We also compute a preferred bitpool value that this is the minimum bitpool needed to guarantee
+ * lossless representation of the audio data. The preferred bitpool may be larger than the bits
+ * actually required but the only input we have are the scale factors. For example, it takes 2 bits
+ * to represent values in the range -1 .. +1 but the scale factor is 0. To guarantee lossless
+ * representation we add 2 to each scale factor and sum them to come up with the preferred bitpool.
+ * This is not ideal because 0 requires 0 bits but we currently have no way of knowing this.
+ *
+ * @param bitneed Array to return bitneeds for each subband
+ *
+ * @param ch Channel 0 or 1
+ *
+ * @param preferredBitpool Returns the number of reserved bits
+ *
+ * @return The SBC bit need
+ *
+ */
+OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ OI_UINT8 *bitneeds,
+ OI_UINT ch,
+ OI_UINT *preferredBitpool)
+{
+ static const OI_INT8 offset4[4][4] = {
+ { -1, 0, 0, 0 },
+ { -2, 0, 0, 1 },
+ { -2, 0, 0, 1 },
+ { -2, 0, 0, 1 }
+ };
+
+ static const OI_INT8 offset8[4][8] = {
+ { -2, 0, 0, 0, 0, 0, 0, 1 },
+ { -3, 0, 0, 0, 0, 0, 1, 2 },
+ { -4, 0, 0, 0, 0, 0, 1, 2 },
+ { -4, 0, 0, 0, 0, 0, 1, 2 }
+ };
+
+ const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+ OI_UINT sb;
+ OI_INT8 *scale_factor = &common->scale_factor[ch ? nrof_subbands : 0];
+ OI_UINT bitcount = 0;
+ OI_UINT8 maxBits = 0;
+ OI_UINT8 prefBits = 0;
+
+ if (common->frameInfo.alloc == SBC_SNR) {
+ for (sb = 0; sb < nrof_subbands; sb++) {
+ OI_INT bits = scale_factor[sb];
+ if (bits > maxBits) {
+ maxBits = bits;
+ }
+ if ((bitneeds[sb] = bits) > 1) {
+ bitcount += bits;
+ }
+ prefBits += 2 + bits;
+ }
+ } else {
+ const OI_INT8 *offset;
+ if (nrof_subbands == 4) {
+ offset = offset4[common->frameInfo.freqIndex];
+ } else {
+ offset = offset8[common->frameInfo.freqIndex];
+ }
+ for (sb = 0; sb < nrof_subbands; sb++) {
+ OI_INT bits = scale_factor[sb];
+ if (bits > maxBits) {
+ maxBits = bits;
+ }
+ prefBits += 2 + bits;
+ if (bits) {
+ bits -= offset[sb];
+ if (bits > 0) {
+ bits /= 2;
+ }
+ bits += 5;
+ }
+ if ((bitneeds[sb] = bits) > 1) {
+ bitcount += bits;
+ }
+ }
+ }
+ common->maxBitneed = OI_MAX(maxBits, common->maxBitneed);
+ *preferredBitpool += prefBits;
+ return bitcount;
+}
+
+
+/*
+ * Explanation of the adjustToFitBitpool inner loop.
+ *
+ * The inner loop computes the effect of adjusting the bit allocation up or
+ * down. Allocations must be 0 or in the range 2..16. This is accomplished by
+ * the following code:
+ *
+ * for (s = bands - 1; s >= 0; --s) {
+ * OI_INT bits = bitadjust + bitneeds[s];
+ * bits = bits < 2 ? 0 : bits;
+ * bits = bits > 16 ? 16 : bits;
+ * count += bits;
+ * }
+ *
+ * This loop can be optimized to perform 4 operations at a time as follows:
+ *
+ * Adjustment is computed as a 7 bit signed value and added to the bitneed.
+ *
+ * Negative allocations are zeroed by masking. (n & 0x40) >> 6 puts the
+ * sign bit into bit 0, adding this to 0x7F give us a mask of 0x80
+ * for -ve values and 0x7F for +ve values.
+ *
+ * n &= 0x7F + (n & 0x40) >> 6)
+ *
+ * Allocations greater than 16 are truncated to 16. Adjusted allocations are in
+ * the range 0..31 so we know that bit 4 indicates values >= 16. We use this bit
+ * to create a mask that zeroes bits 0 .. 3 if bit 4 is set.
+ *
+ * n &= (15 + (n >> 4))
+ *
+ * Allocations of 1 are disallowed. Add and shift creates a mask that
+ * eliminates the illegal value
+ *
+ * n &= ((n + 14) >> 4) | 0x1E
+ *
+ * These operations can be performed in 8 bits without overflowing so we can
+ * operate on 4 values at once.
+ */
+
+
+/*
+ * Encoder/Decoder
+ *
+ * Computes adjustment +/- of bitneeds to fill bitpool and returns overall
+ * adjustment and excess bits.
+ *
+ * @param bitpool The bitpool we have to work within
+ *
+ * @param bitneeds An array of bit needs (more acturately allocation prioritities) for each
+ * subband across all blocks in the SBC frame
+ *
+ * @param subbands The number of subbands over which the adkustment is calculated. For mono and
+ * dual mode this is 4 or 8, for stereo or joint stereo this is 8 or 16.
+ *
+ * @param bitcount A starting point for the adjustment
+ *
+ * @param excess Returns the excess bits after the adjustment
+ *
+ * @return The adjustment.
+ */
+OI_INT adjustToFitBitpool(const OI_UINT bitpool,
+ OI_UINT32 *bitneeds,
+ const OI_UINT subbands,
+ OI_UINT bitcount,
+ OI_UINT *excess)
+{
+ OI_INT maxBitadjust = 0;
+ OI_INT bitadjust = (bitcount > bitpool) ? -8 : 8;
+ OI_INT chop = 8;
+
+ /*
+ * This is essentially a binary search for the optimal adjustment value.
+ */
+ while ((bitcount != bitpool) && chop) {
+ OI_UINT32 total = 0;
+ OI_UINT count;
+ OI_UINT32 adjust4;
+ OI_INT i;
+
+ adjust4 = bitadjust & 0x7F;
+ adjust4 |= (adjust4 << 8);
+ adjust4 |= (adjust4 << 16);
+
+ for (i = (subbands / 4 - 1); i >= 0; --i) {
+ OI_UINT32 mask;
+ OI_UINT32 n = bitneeds[i] + adjust4;
+ mask = 0x7F7F7F7F + ((n & 0x40404040) >> 6);
+ n &= mask;
+ mask = 0x0F0F0F0F + ((n & 0x10101010) >> 4);
+ n &= mask;
+ mask = (((n + 0x0E0E0E0E) >> 4) | 0x1E1E1E1E);
+ n &= mask;
+ total += n;
+ }
+
+ count = (total & 0xFFFF) + (total >> 16);
+ count = (count & 0xFF) + (count >> 8);
+
+ chop >>= 1;
+ if (count > bitpool) {
+ bitadjust -= chop;
+ } else {
+ maxBitadjust = bitadjust;
+ bitcount = count;
+ bitadjust += chop;
+ }
+ }
+
+ *excess = bitpool - bitcount;
+
+ return maxBitadjust;
+}
+
+
+/*
+ * The bit allocator trys to avoid single bit allocations except as a last resort. So in the case
+ * where a bitneed of 1 was passed over during the adsjustment phase 2 bits are now allocated.
+ */
+INLINE OI_INT allocAdjustedBits(OI_UINT8 *dest,
+ OI_INT bits,
+ OI_INT excess)
+{
+ if (bits < 16) {
+ if (bits > 1) {
+ if (excess) {
+ ++bits;
+ --excess;
+ }
+ } else if ((bits == 1) && (excess > 1)) {
+ bits = 2;
+ excess -= 2;
+ } else {
+ bits = 0;
+ }
+ } else {
+ bits = 16;
+ }
+ *dest = (OI_UINT8)bits;
+ return excess;
+}
+
+
+/*
+ * Excess bits not allocated by allocaAdjustedBits are allocated round-robin.
+ */
+INLINE OI_INT allocExcessBits(OI_UINT8 *dest,
+ OI_INT excess)
+{
+ if (*dest < 16) {
+ *dest += 1;
+ return excess - 1;
+ } else {
+ return excess;
+ }
+}
+
+void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ BITNEED_UNION1 *bitneeds,
+ OI_UINT ch,
+ OI_UINT bitcount)
+{
+ const OI_UINT8 nrof_subbands = common->frameInfo.nrof_subbands;
+ OI_UINT excess;
+ OI_UINT sb;
+ OI_INT bitadjust;
+ OI_UINT8 RESTRICT *allocBits;
+
+
+ {
+ OI_UINT ex;
+ bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds->uint32, nrof_subbands, bitcount, &ex);
+ /* We want the compiler to put excess into a register */
+ excess = ex;
+ }
+
+ /*
+ * Allocate adjusted bits
+ */
+ allocBits = &common->bits.uint8[ch ? nrof_subbands : 0];
+
+ sb = 0;
+ while (sb < nrof_subbands) {
+ excess = allocAdjustedBits(&allocBits[sb], bitneeds->uint8[sb] + bitadjust, excess);
+ ++sb;
+ }
+ sb = 0;
+ while (excess) {
+ excess = allocExcessBits(&allocBits[sb], excess);
+ ++sb;
+ }
+}
+
+
+void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+ BITNEED_UNION1 bitneeds;
+ OI_UINT bitcount;
+ OI_UINT bitpoolPreference = 0;
+
+ bitcount = computeBitneed(common, bitneeds.uint8, 0, &bitpoolPreference);
+
+ oneChannelBitAllocation(common, &bitneeds, 0, bitcount);
+}
+
+/**
+@}
+*/
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/**
+@file
+Functions for manipulating input bitstreams.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_stddefs.h"
+#include "oi_bitstream.h"
+#include "oi_assert.h"
+
+PRIVATE void OI_BITSTREAM_ReadInit(OI_BITSTREAM *bs,
+ const OI_BYTE *buffer)
+{
+ bs->value = ((OI_INT32)buffer[0] << 16) | ((OI_INT32)buffer[1] << 8) | (buffer[2]);
+ bs->ptr.r = buffer + 3;
+ bs->bitPtr = 8;
+}
+
+PRIVATE OI_UINT32 OI_BITSTREAM_ReadUINT(OI_BITSTREAM *bs, OI_UINT bits)
+{
+ OI_UINT32 result;
+
+ OI_BITSTREAM_READUINT(result, bits, bs->ptr.r, bs->value, bs->bitPtr);
+
+ return result;
+}
+
+PRIVATE OI_UINT8 OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM *bs)
+{
+ OI_UINT32 result;
+
+ OI_ASSERT(bs->bitPtr < 16);
+ OI_ASSERT(bs->bitPtr % 4 == 0);
+
+ if (bs->bitPtr == 8) {
+ result = bs->value << 8;
+ bs->bitPtr = 12;
+ } else {
+ result = bs->value << 12;
+ bs->value = (bs->value << 8) | *bs->ptr.r++;
+ bs->bitPtr = 8;
+ }
+ result >>= 28;
+ OI_ASSERT(result < (1u << 4));
+ return (OI_UINT8)result;
+}
+
+PRIVATE OI_UINT8 OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM *bs)
+{
+ OI_UINT32 result;
+ OI_ASSERT(bs->bitPtr == 8);
+
+ result = bs->value >> 16;
+ bs->value = (bs->value << 8) | *bs->ptr.r++;
+
+ return (OI_UINT8)result;
+}
+
+/**
+@}
+*/
+
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2006 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+ ***********************************************************************************/
+
+/**
+@file
+This file exposes OINA-specific interfaces to decoder functions.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+
+#include <oi_codec_sbc_private.h>
+
+OI_STATUS OI_CODEC_SBC_DecoderConfigureRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_BOOL enhanced,
+ OI_UINT8 frequency,
+ OI_UINT8 mode,
+ OI_UINT8 subbands,
+ OI_UINT8 blocks,
+ OI_UINT8 alloc,
+ OI_UINT8 maxBitpool)
+{
+ if (frequency > SBC_FREQ_48000) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (enhanced) {
+#ifdef SBC_ENHANCED
+ if (subbands != SBC_SUBBANDS_8) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+#else
+ return OI_STATUS_INVALID_PARAMETERS;
+#endif
+ }
+
+ if (mode > SBC_JOINT_STEREO) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (subbands > SBC_SUBBANDS_8) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (blocks > SBC_BLOCKS_16) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (alloc > SBC_SNR) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+#ifdef SBC_ENHANCED
+ context->common.frameInfo.enhanced = enhanced;
+#else
+ context->common.frameInfo.enhanced = FALSE;
+#endif
+ context->common.frameInfo.freqIndex = frequency;
+ context->common.frameInfo.mode = mode;
+ context->common.frameInfo.subbands = subbands;
+ context->common.frameInfo.blocks = blocks;
+ context->common.frameInfo.alloc = alloc;
+ context->common.frameInfo.bitpool = maxBitpool;
+
+ OI_SBC_ExpandFrameFields(&context->common.frameInfo);
+
+ if (context->common.frameInfo.nrof_channels >= context->common.pcmStride) {
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ return OI_OK;
+}
+
+
+
+OI_STATUS OI_CODEC_SBC_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT8 bitpool,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes)
+{
+ return internal_DecodeRaw(context,
+ bitpool,
+ frameData,
+ frameBytes,
+ pcmData,
+ pcmBytes);
+}
+
+OI_STATUS OI_CODEC_SBC_DecoderLimit(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_BOOL enhanced,
+ OI_UINT8 subbands)
+{
+ if (enhanced)
+ {
+#ifdef SBC_ENHANCED
+ context->enhancedEnabled = TRUE;
+#else
+ context->enhancedEnabled = FALSE;
+#endif
+ }
+ else
+ {
+ context->enhancedEnabled = FALSE;
+ }
+ context->restrictSubbands = subbands;
+ context->limitFrameFormat = TRUE;
+ return OI_OK;
+}
+
+
+/**
+@}
+*/
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+ ***********************************************************************************/
+
+/**
+@file
+This file drives SBC decoding.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_bitstream.h"
+#include <stdio.h>
+
+OI_CHAR * const OI_Codec_Copyright = "Copyright 2002-2007 Open Interface North America, Inc. All rights reserved";
+
+INLINE OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT32 *decoderData,
+ OI_UINT32 decoderDataBytes,
+ OI_BYTE maxChannels,
+ OI_BYTE pcmStride,
+ OI_BOOL enhanced)
+{
+ OI_UINT i;
+ OI_STATUS status;
+
+ for (i = 0; i < sizeof(*context); i++) {
+ ((char *)context)[i] = 0;
+ }
+
+#ifdef SBC_ENHANCED
+ context->enhancedEnabled = enhanced ? TRUE : FALSE;
+#else
+ context->enhancedEnabled = FALSE;
+ if (enhanced){
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+#endif
+
+ status = OI_CODEC_SBC_Alloc(&context->common, decoderData, decoderDataBytes, maxChannels, pcmStride);
+
+ if (!OI_SUCCESS(status)) {
+ return status;
+ }
+
+ context->common.codecInfo = OI_Codec_Copyright;
+ context->common.maxBitneed = 0;
+ context->limitFrameFormat = FALSE;
+ OI_SBC_ExpandFrameFields(&context->common.frameInfo);
+
+ /*PLATFORM_DECODER_RESET(context);*/
+
+ return OI_OK;
+}
+
+
+
+
+/**
+ * Read the SBC header up to but not including the joint stereo mask. The syncword has already been
+ * examined, and the enhanced mode flag set, by FindSyncword.
+ */
+INLINE void OI_SBC_ReadHeader(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data)
+{
+ OI_CODEC_SBC_FRAME_INFO *frame = &common->frameInfo;
+ OI_UINT8 d1;
+
+
+ OI_ASSERT(data[0] == OI_SBC_SYNCWORD || data[0] == OI_SBC_ENHANCED_SYNCWORD);
+
+ /* Avoid filling out all these strucutures if we already remember the values
+ * from last time. Just in case we get a stream corresponding to data[1] ==
+ * 0, DecoderReset is responsible for ensuring the lookup table entries have
+ * already been populated
+ */
+ d1 = data[1];
+ if (d1 != frame->cachedInfo) {
+
+ frame->freqIndex = (d1 & (BIT7 | BIT6)) >> 6;
+ frame->frequency = freq_values[frame->freqIndex];
+
+ frame->blocks = (d1 & (BIT5 | BIT4)) >> 4;
+ frame->nrof_blocks = block_values[frame->blocks];
+
+ frame->mode = (d1 & (BIT3 | BIT2)) >> 2;
+ frame->nrof_channels = channel_values[frame->mode];
+
+ frame->alloc = (d1 & BIT1) >> 1;
+
+ frame->subbands = (d1 & BIT0);
+ frame->nrof_subbands = band_values[frame->subbands];
+
+ frame->cachedInfo = d1;
+ }
+ /*
+ * For decode, the bit allocator needs to know the bitpool value
+ */
+ frame->bitpool = data[2];
+ frame->crc = data[3];
+}
+
+
+#define LOW(x) ((x)& 0xf)
+#define HIGH(x) ((x) >> 4)
+
+/*
+ * Read scalefactor values and prepare the bitstream for OI_SBC_ReadSamples
+ */
+PRIVATE void OI_SBC_ReadScalefactors(OI_CODEC_SBC_COMMON_CONTEXT *common,
+ const OI_BYTE *b,
+ OI_BITSTREAM *bs)
+{
+ OI_UINT i = common->frameInfo.nrof_subbands * common->frameInfo.nrof_channels;
+ OI_INT8 *scale_factor = common->scale_factor;
+ OI_UINT f;
+
+ if (common->frameInfo.nrof_subbands == 8 || common->frameInfo.mode != SBC_JOINT_STEREO) {
+ if (common->frameInfo.mode == SBC_JOINT_STEREO) {
+ common->frameInfo.join = *b++;
+ } else {
+ common->frameInfo.join = 0;
+ }
+ i /= 2;
+ do {
+ *scale_factor++ = HIGH(f = *b++);
+ *scale_factor++ = LOW(f);
+ } while (--i);
+ /*
+ * In this case we know that the scale factors end on a byte boundary so all we need to do
+ * is initialize the bitstream.
+ */
+ OI_BITSTREAM_ReadInit(bs, b);
+ } else {
+ OI_ASSERT(common->frameInfo.nrof_subbands == 4 && common->frameInfo.mode == SBC_JOINT_STEREO);
+ common->frameInfo.join = HIGH(f = *b++);
+ i = (i - 1) / 2;
+ do {
+ *scale_factor++ = LOW(f);
+ *scale_factor++ = HIGH(f = *b++);
+ } while (--i);
+ *scale_factor++ = LOW(f);
+ /*
+ * In 4-subband joint stereo mode, the joint stereo information ends on a half-byte
+ * boundary, so it's necessary to use the bitstream abstraction to read it, since
+ * OI_SBC_ReadSamples will need to pick up in mid-byte.
+ */
+ OI_BITSTREAM_ReadInit(bs, b);
+ *scale_factor++ = OI_BITSTREAM_ReadUINT4Aligned(bs);
+ }
+}
+
+/** Read quantized subband samples from the input bitstream and expand them. */
+PRIVATE void OI_SBC_ReadSamples(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+ OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common;
+ OI_UINT nrof_blocks = common->frameInfo.nrof_blocks;
+ OI_INT32 * RESTRICT s = common->subdata;
+ OI_UINT8 *ptr = global_bs->ptr.w;
+ OI_UINT32 value = global_bs->value;
+ OI_UINT bitPtr = global_bs->bitPtr;
+
+ const OI_UINT iter_count = common->frameInfo.nrof_channels * common->frameInfo.nrof_subbands / 4;
+ do {
+ OI_UINT i;
+ for (i = 0; i < iter_count; ++i) {
+ OI_UINT32 sf_by4 = ((OI_UINT32*)common->scale_factor)[i];
+ OI_UINT32 bits_by4 = common->bits.uint32[i];
+ OI_UINT n;
+ for (n = 0; n < 4; ++n) {
+ OI_INT32 dequant;
+ OI_UINT bits;
+ OI_INT sf;
+
+ if (OI_CPU_BYTE_ORDER == OI_LITTLE_ENDIAN_BYTE_ORDER) {
+ bits = bits_by4 & 0xFF;
+ bits_by4 >>= 8;
+ sf = sf_by4 & 0xFF;
+ sf_by4 >>= 8;
+ } else {
+ bits = (bits_by4 >> 24) & 0xFF;
+ bits_by4 <<= 8;
+ sf = (sf_by4 >> 24) & 0xFF;
+ sf_by4 <<= 8;
+ }
+ if (bits) {
+ OI_UINT32 raw;
+ OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
+ dequant = OI_SBC_Dequant(raw, sf, bits);
+ } else {
+ dequant = 0;
+ }
+ *s++ = dequant;
+ }
+ }
+ } while (--nrof_blocks);
+}
+
+
+
+/**
+@}
+*/
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2006 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+ ***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addtogroup codec_internal */
+/**@{*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_bitstream.h"
+
+#define SPECIALIZE_READ_SAMPLES_JOINT
+
+/**
+ * Scans through a buffer looking for a codec syncword. If the decoder has been
+ * set for enhanced operation using OI_CODEC_SBC_DecoderReset(), it will search
+ * for both a standard and an enhanced syncword.
+ */
+PRIVATE OI_STATUS FindSyncword(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes)
+{
+#ifdef SBC_ENHANCED
+ OI_BYTE search1 = OI_SBC_SYNCWORD;
+ OI_BYTE search2 = OI_SBC_ENHANCED_SYNCWORD;
+#endif // SBC_ENHANCED
+
+ if (*frameBytes == 0) {
+ return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+ }
+
+#ifdef SBC_ENHANCED
+ if (context->limitFrameFormat && context->enhancedEnabled){
+ /* If the context is restricted, only search for specified SYNCWORD */
+ search1 = search2;
+ } else if (context->enhancedEnabled == FALSE) {
+ /* If enhanced is not enabled, only search for classic SBC SYNCWORD*/
+ search2 = search1;
+ }
+ while (*frameBytes && (**frameData != search1) && (**frameData != search2)) {
+ (*frameBytes)--;
+ (*frameData)++;
+ }
+ if (*frameBytes) {
+ /* Syncword found, *frameData points to it, and *frameBytes correctly
+ * reflects the number of bytes available to read, including the
+ * syncword. */
+ context->common.frameInfo.enhanced = (**frameData == OI_SBC_ENHANCED_SYNCWORD);
+ return OI_OK;
+ } else {
+ /* No syncword was found anywhere in the provided input data.
+ * *frameData points past the end of the original input, and
+ * *frameBytes is 0. */
+ return OI_CODEC_SBC_NO_SYNCWORD;
+ }
+#else // SBC_ENHANCED
+ while (*frameBytes && (**frameData != OI_SBC_SYNCWORD)) {
+ (*frameBytes)--;
+ (*frameData)++;
+ }
+ if (*frameBytes) {
+ /* Syncword found, *frameData points to it, and *frameBytes correctly
+ * reflects the number of bytes available to read, including the
+ * syncword. */
+ context->common.frameInfo.enhanced = FALSE;
+ return OI_OK;
+ } else {
+ /* No syncword was found anywhere in the provided input data.
+ * *frameData points past the end of the original input, and
+ * *frameBytes is 0. */
+ return OI_CODEC_SBC_NO_SYNCWORD;
+ }
+#endif // SBC_ENHANCED
+}
+
+static OI_STATUS DecodeBody(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE *bodyData,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes,
+ OI_BOOL allowPartial)
+{
+ OI_BITSTREAM bs;
+ OI_UINT frameSamples = context->common.frameInfo.nrof_blocks * context->common.frameInfo.nrof_subbands;
+ OI_UINT decode_block_count;
+
+ /*
+ * Based on the header data, make sure that there is enough room to write the output samples.
+ */
+ if (*pcmBytes < (sizeof(OI_INT16) * frameSamples * context->common.pcmStride) && !allowPartial) {
+ /* If we're not allowing partial decodes, we need room for the entire
+ * codec frame */
+ TRACE(("-OI_CODEC_SBC_Decode: OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA"));
+ return OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA;
+ } else if (*pcmBytes < sizeof (OI_INT16) * context->common.frameInfo.nrof_subbands * context->common.pcmStride) {
+ /* Even if we're allowing partials, we can still only decode on a frame
+ * boundary */
+ return OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA;
+ }
+
+ if (context->bufferedBlocks == 0) {
+ TRACE(("Reading scalefactors"));
+ OI_SBC_ReadScalefactors(&context->common, bodyData, &bs);
+
+ TRACE(("Computing bit allocation"));
+ OI_SBC_ComputeBitAllocation(&context->common);
+
+ TRACE(("Reading samples"));
+ if (context->common.frameInfo.mode == SBC_JOINT_STEREO) {
+ OI_SBC_ReadSamplesJoint(context, &bs);
+ } else {
+ OI_SBC_ReadSamples(context, &bs);
+ }
+
+ context->bufferedBlocks = context->common.frameInfo.nrof_blocks;
+ }
+
+ if (allowPartial) {
+ decode_block_count = *pcmBytes / sizeof(OI_INT16) / context->common.pcmStride / context->common.frameInfo.nrof_subbands;
+
+ if (decode_block_count > context->bufferedBlocks) {
+ decode_block_count = context->bufferedBlocks;
+ }
+
+ } else {
+ decode_block_count = context->common.frameInfo.nrof_blocks;
+ }
+
+ TRACE(("Synthesizing frame"));
+ {
+ OI_UINT start_block = context->common.frameInfo.nrof_blocks - context->bufferedBlocks;
+ OI_SBC_SynthFrame(context, pcmData, start_block, decode_block_count);
+ }
+
+ OI_ASSERT(context->bufferedBlocks >= decode_block_count);
+ context->bufferedBlocks -= decode_block_count;
+
+ frameSamples = decode_block_count * context->common.frameInfo.nrof_subbands;
+
+ /*
+ * When decoding mono into a stride-2 array, copy pcm data to second channel
+ */
+ if (context->common.frameInfo.nrof_channels == 1 && context->common.pcmStride == 2) {
+ OI_UINT i;
+ for (i = 0; i < frameSamples; ++i) {
+ pcmData[2*i+1] = pcmData[2*i];
+ }
+ }
+
+ /*
+ * Return number of pcm bytes generated by the decode operation.
+ */
+ *pcmBytes = frameSamples * sizeof(OI_INT16) * context->common.pcmStride;
+ if (context->bufferedBlocks > 0) {
+ return OI_CODEC_SBC_PARTIAL_DECODE;
+ } else {
+ return OI_OK;
+ }
+}
+
+PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT8 bitpool,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes)
+{
+ OI_STATUS status;
+ OI_UINT bodyLen;
+
+ TRACE(("+OI_CODEC_SBC_DecodeRaw"));
+
+ if (context->bufferedBlocks == 0) {
+ /*
+ * The bitallocator needs to know the bitpool value.
+ */
+ context->common.frameInfo.bitpool = bitpool;
+ /*
+ * Compute the frame length and check we have enough frame data to proceed
+ */
+ bodyLen = OI_CODEC_SBC_CalculateFramelen(&context->common.frameInfo) - SBC_HEADER_LEN;
+ if (*frameBytes < bodyLen) {
+ TRACE(("-OI_CODEC_SBC_Decode: OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA"));
+ return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA;
+ }
+ } else {
+ bodyLen = 0;
+ }
+ /*
+ * Decode the SBC data. Pass TRUE to DecodeBody to allow partial decoding of
+ * tones.
+ */
+ status = DecodeBody(context, *frameData, pcmData, pcmBytes, TRUE);
+ if (OI_SUCCESS(status) || status == OI_CODEC_SBC_PARTIAL_DECODE) {
+ *frameData += bodyLen;
+ *frameBytes -= bodyLen;
+ }
+ TRACE(("-OI_CODEC_SBC_DecodeRaw: %d", status));
+ return status;
+}
+
+OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ OI_UINT32 *decoderData,
+ OI_UINT32 decoderDataBytes,
+ OI_UINT8 maxChannels,
+ OI_UINT8 pcmStride,
+ OI_BOOL enhanced)
+{
+ return internal_DecoderReset(context, decoderData, decoderDataBytes, maxChannels, pcmStride, enhanced);
+}
+
+OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes,
+ OI_INT16 *pcmData,
+ OI_UINT32 *pcmBytes)
+{
+ OI_STATUS status;
+ OI_UINT framelen;
+ OI_UINT8 crc;
+
+ TRACE(("+OI_CODEC_SBC_DecodeFrame"));
+
+ TRACE(("Finding syncword"));
+ status = FindSyncword(context, frameData, frameBytes);
+ if (!OI_SUCCESS(status)) {
+ return status;
+ }
+
+ /* Make sure enough data remains to read the header. */
+ if (*frameBytes < SBC_HEADER_LEN) {
+ TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA"));
+ return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+ }
+
+ TRACE(("Reading Header"));
+ OI_SBC_ReadHeader(&context->common, *frameData);
+
+ /*
+ * Some implementations load the decoder into RAM and use overlays for 4 vs 8 subbands. We need
+ * to ensure that the SBC parameters for this frame are compatible with the restrictions imposed
+ * by the loaded overlays.
+ */
+ if (context->limitFrameFormat && (context->common.frameInfo.subbands != context->restrictSubbands)) {
+ ERROR(("SBC parameters incompatible with loaded overlay"));
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (context->common.frameInfo.nrof_channels > context->common.maxChannels) {
+ ERROR(("SBC parameters incompatible with number of channels specified during reset"));
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ if (context->common.pcmStride < 1 || context->common.pcmStride > 2) {
+ ERROR(("PCM stride not set correctly during reset"));
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+
+ /*
+ * At this point a header has been read. However, it's possible that we found a false syncword,
+ * so the header data might be invalid. Make sure we have enough bytes to read in the
+ * CRC-protected header, but don't require we have the whole frame. That way, if it turns out
+ * that we're acting on bogus header data, we don't stall the decoding process by waiting for
+ * data that we don't actually need.
+ */
+ framelen = OI_CODEC_SBC_CalculateFramelen(&context->common.frameInfo);
+ if (*frameBytes < framelen) {
+ TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA"));
+ return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA;
+ }
+
+ TRACE(("Calculating checksum"));
+
+ crc = OI_SBC_CalculateChecksum(&context->common.frameInfo, *frameData);
+ if (crc != context->common.frameInfo.crc) {
+ TRACE(("CRC Mismatch: calc=%02x read=%02x\n", crc, context->common.frameInfo.crc));
+ TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_CHECKSUM_MISMATCH"));
+ return OI_CODEC_SBC_CHECKSUM_MISMATCH;
+ }
+
+#ifdef OI_DEBUG
+ /*
+ * Make sure the bitpool values are sane.
+ */
+ if ((context->common.frameInfo.bitpool < SBC_MIN_BITPOOL) && !context->common.frameInfo.enhanced) {
+ ERROR(("Bitpool too small: %d (must be >= 2)", context->common.frameInfo.bitpool));
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+ if (context->common.frameInfo.bitpool > OI_SBC_MaxBitpool(&context->common.frameInfo)) {
+ ERROR(("Bitpool too large: %d (must be <= %ld)", context->common.frameInfo.bitpool, OI_SBC_MaxBitpool(&context->common.frameInfo)));
+ return OI_STATUS_INVALID_PARAMETERS;
+ }
+#endif
+
+ /*
+ * Now decode the SBC data. Partial decode is not yet implemented for an SBC
+ * stream, so pass FALSE to decode body to have it enforce the old rule that
+ * you have to decode a whole packet at a time.
+ */
+ status = DecodeBody(context, *frameData + SBC_HEADER_LEN, pcmData, pcmBytes, FALSE);
+ if (OI_SUCCESS(status)) {
+ *frameData += framelen;
+ *frameBytes -= framelen;
+ }
+ TRACE(("-OI_CODEC_SBC_DecodeFrame: %d", status));
+
+ return status;
+}
+
+OI_STATUS OI_CODEC_SBC_SkipFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+ const OI_BYTE **frameData,
+ OI_UINT32 *frameBytes)
+{
+ OI_STATUS status;
+ OI_UINT framelen;
+ OI_UINT headerlen;
+ OI_UINT8 crc;
+
+ status = FindSyncword(context, frameData, frameBytes);
+ if (!OI_SUCCESS(status)) {
+ return status;
+ }
+ if (*frameBytes < SBC_HEADER_LEN) {
+ return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+ }
+ OI_SBC_ReadHeader(&context->common, *frameData);
+ framelen = OI_SBC_CalculateFrameAndHeaderlen(&context->common.frameInfo, &headerlen);
+ if (*frameBytes < headerlen) {
+ return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+ }
+ crc = OI_SBC_CalculateChecksum(&context->common.frameInfo, *frameData);
+ if (crc != context->common.frameInfo.crc) {
+ return OI_CODEC_SBC_CHECKSUM_MISMATCH;
+ }
+ if (*frameBytes < framelen) {
+ return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA;
+ }
+ context->bufferedBlocks = 0;
+ *frameData += framelen;
+ *frameBytes -= framelen;
+ return OI_OK;
+}
+
+OI_UINT8 OI_CODEC_SBC_FrameCount(OI_BYTE *frameData,
+ OI_UINT32 frameBytes)
+{
+ OI_UINT8 mode;
+ OI_UINT8 blocks;
+ OI_UINT8 subbands;
+ OI_UINT8 frameCount = 0;
+ OI_UINT frameLen;
+
+ while (frameBytes){
+ while (frameBytes && ((frameData[0] & 0xFE) != 0x9C)){
+ frameData++;
+ frameBytes--;
+ }
+
+ if (frameBytes < SBC_HEADER_LEN) {
+ return frameCount;
+ }
+
+ /* Extract and translate required fields from Header */
+ subbands = mode = blocks = frameData[1];;
+ mode = (mode & (BIT3 | BIT2)) >> 2;
+ blocks = block_values[(blocks & (BIT5 | BIT4)) >> 4];
+ subbands = band_values[(subbands & BIT0)];
+
+ /* Inline logic to avoid corrupting context */
+ frameLen = blocks * frameData[2];
+ switch (mode){
+ case SBC_JOINT_STEREO:
+ frameLen += subbands + (8 * subbands);
+ break;
+
+ case SBC_DUAL_CHANNEL:
+ frameLen *= 2;
+ /* fall through */
+
+ default:
+ if (mode == SBC_MONO){
+ frameLen += 4*subbands;
+ } else {
+ frameLen += 8*subbands;
+ }
+ }
+
+ frameCount++;
+ frameLen = SBC_HEADER_LEN + (frameLen + 7) / 8;
+ if (frameBytes > frameLen){
+ frameBytes -= frameLen;
+ frameData += frameLen;
+ } else {
+ frameBytes = 0;
+ }
+ }
+ return frameCount;
+}
+
+/** Read quantized subband samples from the input bitstream and expand them. */
+
+#ifdef SPECIALIZE_READ_SAMPLES_JOINT
+
+PRIVATE void OI_SBC_ReadSamplesJoint4(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+#define NROF_SUBBANDS 4
+#include "readsamplesjoint.inc"
+#undef NROF_SUBBANDS
+}
+
+PRIVATE void OI_SBC_ReadSamplesJoint8(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+#define NROF_SUBBANDS 8
+#include "readsamplesjoint.inc"
+#undef NROF_SUBBANDS
+}
+
+typedef void (*READ_SAMPLES)(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs);
+
+static const READ_SAMPLES SpecializedReadSamples[] = {
+ OI_SBC_ReadSamplesJoint4,
+ OI_SBC_ReadSamplesJoint8
+};
+
+#endif /* SPECIALIZE_READ_SAMPLES_JOINT */
+
+
+PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+ OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common;
+ OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+#ifdef SPECIALIZE_READ_SAMPLES_JOINT
+ OI_ASSERT((nrof_subbands >> 3u) <= 1u);
+ SpecializedReadSamples[nrof_subbands >> 3](context, global_bs);
+#else
+
+#define NROF_SUBBANDS nrof_subbands
+#include "readsamplesjoint.inc"
+#undef NROF_SUBBANDS
+#endif /* SPECIALIZE_READ_SAMPLES_JOINT */
+}
+
+/**@}*/
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/**
+ @file
+
+ Dequantizer for SBC decoder; reconstructs quantized representation of subband samples.
+
+ @ingroup codec_internal
+ */
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+/**
+ This function is a fixed-point approximation of a modification of the following
+ dequantization operation defined in the spec, as inferred from section 12.6.4:
+
+ @code
+ dequant = 2^(scale_factor+1) * ((raw * 2.0 + 1.0) / ((2^bits) - 1) - 1)
+
+ 2 <= bits <= 16
+ 0 <= raw < (2^bits)-1 (the -1 is because quantized values with all 1's are forbidden)
+
+ -65535 < dequant < 65535
+ @endcode
+
+ The code below computes the dequantized value divided by a scaling constant
+ equal to about 1.38. This constant is chosen to ensure that the entry in the
+ dequant_long_scaled table for 16 bits is as accurate as possible, since it has
+ the least relative precision available to it due to its small magnitude.
+
+ This routine outputs in Q16.15 format.
+
+ The helper array dequant_long is defined as follows:
+
+ @code
+ dequant_long_long[bits] = round(2^31 * 1/((2^bits - 1) / 1.38...) for 2 <= bits <= 16
+ @endcode
+
+
+ Additionally, the table entries have the following property:
+
+ @code
+ dequant_long_scaled[bits] <= 2^31 / ((2^bits - 1)) for 2 <= bits <= 16
+ @endcode
+
+ Therefore
+
+ @code
+ d = 2 * raw + 1 1 <= d <= 2^bits - 2
+
+ d' = d * dequant_long[bits]
+
+ d * dequant_long_scaled[bits] <= (2^bits - 2) * (2^31 / (2^bits - 1))
+ d * dequant_long_scaled[bits] <= 2^31 * (2^bits - 2)/(2^bits - 1) < 2^31
+ @endcode
+
+ Therefore, d' doesn't overflow a signed 32-bit value.
+
+ @code
+
+ d' =~ 2^31 * (raw * 2.0 + 1.0) / (2^bits - 1) / 1.38...
+
+ result = d' - 2^31/1.38... =~ 2^31 * ((raw * 2.0 + 1.0) / (2^bits - 1) - 1) / 1.38...
+
+ result is therefore a scaled approximation to dequant. It remains only to
+ turn 2^31 into 2^(scale_factor+1). Since we're aiming for Q16.15 format,
+ this is achieved by shifting right by (15-scale_factor):
+
+ (2^31 * x) >> (15-scale_factor) =~ 2^(31-15+scale_factor) * x = 2^15 * 2^(1+scale_factor) * x
+ @endcode
+
+ */
+
+#include <oi_codec_sbc_private.h>
+
+#ifndef SBC_DEQUANT_LONG_SCALED_OFFSET
+#define SBC_DEQUANT_LONG_SCALED_OFFSET 1555931970
+#endif
+
+#ifndef SBC_DEQUANT_LONG_UNSCALED_OFFSET
+#define SBC_DEQUANT_LONG_UNSCALED_OFFSET 2147483648
+#endif
+
+#ifndef SBC_DEQUANT_SCALING_FACTOR
+#define SBC_DEQUANT_SCALING_FACTOR 1.38019122262781f
+#endif
+
+const OI_UINT32 dequant_long_scaled[17];
+const OI_UINT32 dequant_long_unscaled[17];
+
+/** Scales x by y bits to the right, adding a rounding factor.
+ */
+#ifndef SCALE
+#define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y))
+#endif
+
+#ifdef DEBUG_DEQUANTIZATION
+
+#include <math.h>
+
+INLINE float dequant_float(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits)
+{
+ float result = (1 << (scale_factor+1)) * ((raw * 2.0f + 1.0f) / ((1 << bits) - 1.0f) - 1.0f);
+
+ result /= SBC_DEQUANT_SCALING_FACTOR;
+
+ /* Unless the encoder screwed up, all correct dequantized values should
+ * satisfy this inequality. Non-compliant encoders which generate quantized
+ * values with all 1-bits set can, theoretically, trigger this assert. This
+ * is unlikely, however, and only an issue in debug mode.
+ */
+ OI_ASSERT(fabs(result) < 32768 * 1.6);
+
+ return result;
+}
+
+#endif
+
+
+INLINE OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits)
+{
+ OI_UINT32 d;
+ OI_INT32 result;
+
+ OI_ASSERT(scale_factor <= 15);
+ OI_ASSERT(bits <= 16);
+
+ if (bits <= 1) {
+ return 0;
+ }
+
+ d = (raw * 2) + 1;
+ d *= dequant_long_scaled[bits];
+ result = d - SBC_DEQUANT_LONG_SCALED_OFFSET;
+
+#ifdef DEBUG_DEQUANTIZATION
+ {
+ OI_INT32 integerized_float_result;
+ float float_result;
+
+ float_result = dequant_float(raw, scale_factor, bits);
+ integerized_float_result = (OI_INT32)floor(0.5f+float_result * (1 << 15));
+
+ /* This detects overflow */
+ OI_ASSERT(((result >= 0) && (integerized_float_result >= 0)) ||
+ ((result <= 0) && (integerized_float_result <= 0)));
+ }
+#endif
+ return result >> (15 - scale_factor);
+}
+
+/* This version of Dequant does not incorporate the scaling factor of 1.38. It
+ * is intended for use with implementations of the filterbank which are
+ * hard-coded into a DSP. Output is Q16.4 format, so that after joint stereo
+ * processing (which leaves the most significant bit equal to the sign bit if
+ * the encoder is conformant) the result will fit a 24 bit fixed point signed
+ * value.*/
+
+INLINE OI_INT32 OI_SBC_Dequant_Unscaled(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits)
+{
+ OI_UINT32 d;
+ OI_INT32 result;
+
+ OI_ASSERT(scale_factor <= 15);
+ OI_ASSERT(bits <= 16);
+
+
+ if (bits <= 1) {
+ return 0;
+ }
+ if (bits == 16) {
+ result = (raw << 16) + raw - 0x7fff7fff;
+ return SCALE(result, 24 - scale_factor);
+ }
+
+
+ d = (raw * 2) + 1;
+ d *= dequant_long_unscaled[bits];
+ result = d - 0x80000000;
+
+ return SCALE(result, 24 - scale_factor);
+}
+
+/**
+@}
+*/
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addgroup codec_internal*/
+/**@{*/
+
+#include "oi_codec_sbc_private.h"
+
+const OI_CHAR* const OI_CODEC_SBC_FreqText[] = { "SBC_FREQ_16000", "SBC_FREQ_32000", "SBC_FREQ_44100", "SBC_FREQ_48000" };
+const OI_CHAR* const OI_CODEC_SBC_ModeText[] = { "SBC_MONO", "SBC_DUAL_CHANNEL", "SBC_STEREO", "SBC_JOINT_STEREO" };
+const OI_CHAR* const OI_CODEC_SBC_SubbandsText[] = { "SBC_SUBBANDS_4", "SBC_SUBBANDS_8" };
+const OI_CHAR* const OI_CODEC_SBC_BlocksText[] = { "SBC_BLOCKS_4", "SBC_BLOCKS_8", "SBC_BLOCKS_12", "SBC_BLOCKS_16" };
+const OI_CHAR* const OI_CODEC_SBC_AllocText[] = { "SBC_LOUDNESS", "SBC_SNR" };
+
+#ifdef OI_DEBUG
+void OI_CODEC_SBC_DumpConfig(OI_CODEC_SBC_FRAME_INFO *frameInfo)
+{
+ printf("SBC configuration\n");
+ printf(" enhanced: %s\n", frameInfo->enhanced ? "TRUE" : "FALSE");
+ printf(" frequency: %d\n", frameInfo->frequency);
+ printf(" subbands: %d\n", frameInfo->nrof_subbands);
+ printf(" blocks: %d\n", frameInfo->nrof_blocks);
+ printf(" channels: %d\n", frameInfo->nrof_channels);
+ printf(" mode: %s\n", OI_CODEC_SBC_ModeText[frameInfo->mode]);
+ printf(" alloc: %s\n", OI_CODEC_SBC_AllocText[frameInfo->alloc]);
+ printf(" bitpool: %d\n", frameInfo->bitpool);
+}
+#endif /* OI_DEBUG */
+
+/**@}*/
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/**
+@file
+Checksum and header-related functions.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_assert.h"
+
+
+/* asdasd */
+
+#define USE_NIBBLEWISE_CRC
+
+/* #define PRINT_SAMPLES */
+/* #define PRINT_SCALEFACTORS */
+/* #define DEBUG_CRC */
+
+/*
+ * CRC-8 table for X^8 + X^4 + X^3 + X^2 + 1; byte-wise lookup
+ */
+#ifdef USE_WIDE_CRC
+/* Save space if a char is 16 bits, such as on the C54x */
+const OI_BYTE crc8_wide[128] = {
+ 0x001d, 0x3a27, 0x7469, 0x4e53, 0xe8f5, 0xd2cf, 0x9c81, 0xa6bb, 0xcdd0, 0xf7ea, 0xb9a4, 0x839e, 0x2538, 0x1f02, 0x514c, 0x6b76, 0x879a, 0xbda0, 0xf3ee, 0xc9d4, 0x6f72, 0x5548, 0x1b06, 0x213c, 0x4a57, 0x706d, 0x3e23, 0x0419, 0xa2bf, 0x9885, 0xd6cb, 0xecf1, 0x130e, 0x2934, 0x677a, 0x5d40, 0xfbe6, 0xc1dc, 0x8f92, 0xb5a8, 0xdec3, 0xe4f9, 0xaab7, 0x908d, 0x362b, 0x0c11, 0x425f, 0x7865, 0x9489, 0xaeb3, 0xe0fd, 0xdac7, 0x7c61, 0x465b, 0x0815, 0x322f, 0x5944, 0x637e, 0x2d30, 0x170a, 0xb1ac, 0x8b96, 0xc5d8, 0xffe2, 0x263b, 0x1c01, 0x524f, 0x6875, 0xced3, 0xf4e9, 0xbaa7, 0x809d, 0xebf6, 0xd1cc, 0x9f82, 0xa5b8, 0x031e, 0x3924, 0x776a, 0x4d50, 0xa1bc, 0x9b86, 0xd5c8, 0xeff2, 0x4954, 0x736e, 0x3d20, 0x071a, 0x6c71, 0x564b, 0x1805, 0x223f, 0x8499, 0xbea3, 0xf0ed, 0xcad7, 0x3528, 0x0f12, 0x415c, 0x7b66, 0xddc0, 0xe7fa, 0xa9b4, 0x938e, 0xf8e5, 0xc2df, 0x8c91, 0xb6ab, 0x100d, 0x2a37, 0x6479, 0x5e43, 0xb2af, 0x8895, 0xc6db, 0xfce1, 0x5a47, 0x607d, 0x2e33, 0x1409, 0x7f62, 0x4558, 0x0b16, 0x312c, 0x978a, 0xadb0, 0xe3fe, 0xd9c4,
+};
+#elif defined(USE_NIBBLEWISE_CRC)
+const OI_BYTE crc8_narrow[16] = {
+ 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb
+};
+#else
+const OI_BYTE crc8_narrow[256] = {
+ 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, 0x1f, 0x02, 0x51, 0x4c, 0x6b, 0x76, 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x06, 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x04, 0x19, 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0x0e, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, 0x36, 0x2b, 0x0c, 0x11, 0x42, 0x5f, 0x78, 0x65, 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, 0x46, 0x5b, 0x08, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0x0a, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, 0x26, 0x3b, 0x1c, 0x01, 0x52, 0x4f, 0x68, 0x75, 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x03, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x07, 0x1a, 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x05, 0x22, 0x3f, 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, 0x35, 0x28, 0x0f, 0x12, 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, 0x10, 0x0d, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x09, 0x7f, 0x62, 0x45, 0x58, 0x0b, 0x16, 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4
+};
+#endif
+const OI_UINT32 dequant_long_scaled[17] = {
+ 0,
+ 0,
+ 0x1ee9e116, /* bits=2 0.24151243 1/3 * (1/1.38019122262781) (0x00000008)*/
+ 0x0d3fa99c, /* bits=3 0.10350533 1/7 * (1/1.38019122262781) (0x00000013)*/
+ 0x062ec69e, /* bits=4 0.04830249 1/15 * (1/1.38019122262781) (0x00000029)*/
+ 0x02fddbfa, /* bits=5 0.02337217 1/31 * (1/1.38019122262781) (0x00000055)*/
+ 0x0178d9f5, /* bits=6 0.01150059 1/63 * (1/1.38019122262781) (0x000000ad)*/
+ 0x00baf129, /* bits=7 0.00570502 1/127 * (1/1.38019122262781) (0x0000015e)*/
+ 0x005d1abe, /* bits=8 0.00284132 1/255 * (1/1.38019122262781) (0x000002bf)*/
+ 0x002e760d, /* bits=9 0.00141788 1/511 * (1/1.38019122262781) (0x00000582)*/
+ 0x00173536, /* bits=10 0.00070825 1/1023 * (1/1.38019122262781) (0x00000b07)*/
+ 0x000b9928, /* bits=11 0.00035395 1/2047 * (1/1.38019122262781) (0x00001612)*/
+ 0x0005cc37, /* bits=12 0.00017693 1/4095 * (1/1.38019122262781) (0x00002c27)*/
+ 0x0002e604, /* bits=13 0.00008846 1/8191 * (1/1.38019122262781) (0x00005852)*/
+ 0x000172fc, /* bits=14 0.00004422 1/16383 * (1/1.38019122262781) (0x0000b0a7)*/
+ 0x0000b97d, /* bits=15 0.00002211 1/32767 * (1/1.38019122262781) (0x00016150)*/
+ 0x00005cbe, /* bits=16 0.00001106 1/65535 * (1/1.38019122262781) (0x0002c2a5)*/
+};
+
+
+const OI_UINT32 dequant_long_unscaled[17] = {
+ 0,
+ 0,
+ 0x2aaaaaab, /* bits=2 0.33333333 1/3 (0x00000005)*/
+ 0x12492492, /* bits=3 0.14285714 1/7 (0x0000000e)*/
+ 0x08888889, /* bits=4 0.06666667 1/15 (0x0000001d)*/
+ 0x04210842, /* bits=5 0.03225806 1/31 (0x0000003e)*/
+ 0x02082082, /* bits=6 0.01587302 1/63 (0x0000007e)*/
+ 0x01020408, /* bits=7 0.00787402 1/127 (0x000000fe)*/
+ 0x00808081, /* bits=8 0.00392157 1/255 (0x000001fd)*/
+ 0x00402010, /* bits=9 0.00195695 1/511 (0x000003fe)*/
+ 0x00200802, /* bits=10 0.00097752 1/1023 (0x000007fe)*/
+ 0x00100200, /* bits=11 0.00048852 1/2047 (0x00000ffe)*/
+ 0x00080080, /* bits=12 0.00024420 1/4095 (0x00001ffe)*/
+ 0x00040020, /* bits=13 0.00012209 1/8191 (0x00003ffe)*/
+ 0x00020008, /* bits=14 0.00006104 1/16383 (0x00007ffe)*/
+ 0x00010002, /* bits=15 0.00003052 1/32767 (0x0000fffe)*/
+ 0x00008001, /* bits=16 0.00001526 1/65535 (0x0001fffc)*/
+};
+
+#if defined(OI_DEBUG) || defined(PRINT_SAMPLES) || defined(PRINT_SCALEFACTORS)
+#include <stdio.h>
+#endif
+
+#ifdef USE_WIDE_CRC
+INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next)
+{
+ OI_UINT crc;
+ OI_UINT idx;
+ idx = oldcrc^next;
+ crc = crc8_wide[idx >> 1];
+ if (idx%2) {
+ crc &= 0xff;
+ } else {
+ crc >>= 8;
+ }
+
+ return crc;
+}
+
+INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next)
+{
+ OI_UINT crc;
+ OI_UINT idx;
+ idx = (oldcrc ^ next) >> 4;
+ crc = crc8_wide[idx>>1];
+ if (idx%2) {
+ crc &= 0xff;
+ } else {
+ crc >>= 8;
+ }
+
+ return (oldcrc << 4) ^ crc;
+}
+
+#else // USE_WIDE_CRC
+
+INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next)
+{
+ return (oldcrc << 4) ^ crc8_narrow[(oldcrc^next) >> 4];
+}
+
+#ifdef USE_NIBBLEWISE_CRC
+INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next)
+{
+ crc = (crc << 4) ^ crc8_narrow[(crc^next) >> 4];
+ crc = (crc << 4) ^ crc8_narrow[((crc>>4)^next)&0xf];
+
+ return crc;
+}
+
+#else // USE_NIBBLEWISE_CRC
+INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next)
+{
+ return crc8_narrow[crc^next];
+}
+
+#endif // USE_NIBBLEWISE_CRC
+
+#endif // USE_WIDE_CRC
+
+
+PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data)
+{
+ OI_UINT i;
+ OI_UINT8 crc = 0x0f;
+ /* Count is the number of whole bytes subject to CRC. Actually, it's one
+ * more than this number, because data[3] is the CRC field itself, which is
+ * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper
+ * spacewise to include the check in the loop. This shouldn't be much of a
+ * bottleneck routine in the first place. */
+ OI_UINT count = (frame->nrof_subbands * frame->nrof_channels / 2u) + 4;
+
+ if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 8) {
+ count++;
+ }
+
+ for (i = 1; i < count; i++) {
+ if (i != 3) {
+ crc = crc_iterate(crc,data[i]);
+ }
+ }
+
+ if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 4) {
+ crc = crc_iterate_top4(crc, data[i]);
+ }
+
+ return crc;
+}
+
+void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+ frame->nrof_blocks = block_values[frame->blocks];
+ frame->nrof_subbands = band_values[frame->subbands];
+
+ frame->frequency = freq_values[frame->freqIndex];
+ frame->nrof_channels = channel_values[frame->mode];
+}
+
+/**
+ * Unrolled macro to copy 4 32-bit aligned 32-bit values backward in memory
+ */
+#define COPY4WORDS_BACK(_dest, _src) \
+ do { \
+ OI_INT32 _a, _b, _c, _d; \
+ _a = *--_src; \
+ _b = *--_src; \
+ _c = *--_src; \
+ _d = *--_src; \
+ *--_dest = _a; \
+ *--_dest = _b; \
+ *--_dest = _c; \
+ *--_dest = _d; \
+ } while (0)
+
+
+#if defined(USE_PLATFORM_MEMMOVE) || defined(USE_PLATFORM_MEMCPY)
+#include <string.h>
+#endif
+PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount)
+{
+#ifdef USE_PLATFORM_MEMMOVE
+ memmove(dest, src, wordCount * sizeof(SBC_BUFFER_T));
+#elif defined(USE_PLATFORM_MEMCPY)
+ OI_ASSERT(((OI_CHAR *)(dest) - (OI_CHAR *)(src)) >= wordCount*sizeof(*dest));
+ memcpy(dest, src, wordCount * sizeof(SBC_BUFFER_T));
+#else
+ OI_UINT n;
+ OI_INT32 *d;
+ OI_INT32 *s;
+ n = wordCount / 4 / (sizeof(OI_INT32)/sizeof(*dest));
+ OI_ASSERT((n * 4 * (sizeof(OI_INT32)/sizeof(*dest))) == wordCount);
+
+ d = (void*)(dest + wordCount);
+ s = (void*)(src + wordCount);
+
+ do {
+ COPY4WORDS_BACK(d, s);
+ } while (--n);
+#endif
+}
+/**
+@}
+*/
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**
+@file
+This file contains a single function, which returns a string indicating the
+version number of the eSBC codec
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+#include "oi_codec_sbc_private.h"
+
+/** Version string for the BLUEmagic 3.0 protocol stack and profiles */
+PRIVATE OI_CHAR * const codecVersion = "v1.5"
+#ifdef OI_SBC_EVAL
+" (Evaluation version)"
+#endif
+;
+
+/** This function returns the version string for the BLUEmagic 3.0 protocol stack
+ and profiles */
+OI_CHAR *OI_CODEC_Version(void) {
+ return codecVersion;
+}
+
+/**********************************************************************************/
+
+/**
+@}
+*/
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * @file readsamplesjoint.inc
+ *
+ * This is the body of the generic version of OI_SBC_ReadSamplesJoint().
+ * It is designed to be \#included into a function as follows:
+ \code
+ void OI_SBC_ReadSamplesJoint4(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
+ {
+ #define NROF_SUBBANDS 4
+ #include "readsamplesjoint.inc"
+ #undef NROF_SUBBANDS
+ }
+
+ void OI_SBC_ReadSamplesJoint8(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
+ {
+ #define NROF_SUBBANDS 8
+ #include "readsamplesjoint.inc"
+ #undef NROF_SUBBANDS
+ }
+ \endcode
+ * Or to make a generic version:
+ \code
+ void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
+ {
+ OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+
+ #define NROF_SUBBANDS nrof_subbands
+ #include "readsamplesjoint.inc"
+ #undef NROF_SUBBANDS
+ }
+ \endcode
+ * @ingroup codec_internal
+ *******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+{
+ OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common;
+ OI_UINT bl = common->frameInfo.nrof_blocks;
+ OI_INT32 * RESTRICT s = common->subdata;
+ OI_UINT8 *ptr = global_bs->ptr.w;
+ OI_UINT32 value = global_bs->value;
+ OI_UINT bitPtr = global_bs->bitPtr;
+ OI_UINT8 jmask = common->frameInfo.join << (8 - NROF_SUBBANDS);
+
+ do {
+ OI_INT8 *sf_array = &common->scale_factor[0];
+ OI_UINT8 *bits_array = &common->bits.uint8[0];
+ OI_UINT8 joint = jmask;
+ OI_UINT sb;
+ /*
+ * Left channel
+ */
+ sb = NROF_SUBBANDS;
+ do {
+ OI_UINT32 raw;
+ OI_INT32 dequant;
+ OI_UINT8 bits = *bits_array++;
+ OI_INT sf = *sf_array++;
+
+ OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
+ dequant = OI_SBC_Dequant(raw, sf, bits);
+ *s++ = dequant;
+ } while (--sb);
+ /*
+ * Right channel
+ */
+ sb = NROF_SUBBANDS;
+ do {
+ OI_UINT32 raw;
+ OI_INT32 dequant;
+ OI_UINT8 bits = *bits_array++;
+ OI_INT sf = *sf_array++;
+
+ OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
+ dequant = OI_SBC_Dequant(raw, sf, bits);
+ /*
+ * Check if we need to do mid/side
+ */
+ if (joint & 0x80) {
+ OI_INT32 mid = *(s - NROF_SUBBANDS);
+ OI_INT32 side = dequant;
+ *(s - NROF_SUBBANDS) = mid + side;
+ dequant = mid - side;
+ }
+ joint <<= 1;
+ *s++ = dequant;
+ } while (--sb);
+ } while (--bl);
+}
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**
+ @file
+
+ DO NOT EDIT THIS FILE DIRECTLY
+
+ This file is automatically generated by the "synthesis-gen.pl" script.
+ Any changes to this generated file will be lost when the script is re-run.
+
+ These functions are called by functions in synthesis.c to perform the synthesis
+ filterbank computations for the SBC decoder.
+
+
+ */
+
+#include <oi_codec_sbc_private.h>
+
+#ifndef CLIP_INT16
+#define CLIP_INT16(x) do { if (x > OI_INT16_MAX) { x = OI_INT16_MAX; } else if (x < OI_INT16_MIN) { x = OI_INT16_MIN; } } while (0)
+#endif
+
+#define MUL_16S_16S(_x, _y) ((_x) * (_y))
+
+PRIVATE void SynthWindow80_generated(OI_INT16 *pcm, SBC_BUFFER_T const * RESTRICT buffer, OI_UINT strideShift)
+{
+ OI_INT32 pcm_a, pcm_b;
+ /* 1 - stage 0 */ pcm_b = 0;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(8235, buffer[ 12]))>> 3;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(-23167, buffer[ 20]))>> 3;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(26479, buffer[ 28]))>> 2;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(-17397, buffer[ 36]))<< 1;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(9399, buffer[ 44]))<< 3;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(17397, buffer[ 52]))<< 1;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(26479, buffer[ 60]))>> 2;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(23167, buffer[ 68]))>> 3;
+ /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(8235, buffer[ 76]))>> 3;
+ /* 1 - stage 0 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[0<<strideShift] = (OI_INT16)pcm_b;
+ /* 1 - stage 1 */ pcm_a = 0;
+ /* 1 - stage 1 */ pcm_b = 0;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(-3263, buffer[ 5]))>> 5;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(9293, buffer[ 5]))>> 3;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(29293, buffer[ 11]))>> 5;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(-6087, buffer[ 11]))>> 2;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(-5229, buffer[ 21]));
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(1247, buffer[ 21]))<< 3;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(30835, buffer[ 27]))>> 3;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(-2893, buffer[ 27]))<< 3;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(-27021, buffer[ 37]))<< 1;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(23671, buffer[ 37]))<< 2;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(31633, buffer[ 43]))<< 1;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(18055, buffer[ 43]))<< 1;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(17319, buffer[ 53]))<< 1;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(11537, buffer[ 53]))>> 1;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(26663, buffer[ 59]))>> 2;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(1747, buffer[ 59]))<< 1;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(4555, buffer[ 69]))>> 1;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(685, buffer[ 69]))<< 1;
+ /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(12419, buffer[ 75]))>> 4;
+ /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(8721, buffer[ 75]))>> 7;
+ /* 1 - stage 1 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[1<<strideShift] = (OI_INT16)pcm_a;
+ /* 1 - stage 1 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[7<<strideShift] = (OI_INT16)pcm_b;
+ /* 1 - stage 2 */ pcm_a = 0;
+ /* 1 - stage 2 */ pcm_b = 0;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(-10385, buffer[ 6]))>> 6;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(11167, buffer[ 6]))>> 4;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(24995, buffer[ 10]))>> 5;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(-10337, buffer[ 10]))>> 4;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(-309, buffer[ 22]))<< 4;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(1917, buffer[ 22]))<< 2;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(9161, buffer[ 26]))>> 3;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(-30605, buffer[ 26]))>> 1;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(-23063, buffer[ 38]))<< 1;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(8317, buffer[ 38]))<< 3;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(27561, buffer[ 42]))<< 1;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(9553, buffer[ 42]))<< 2;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(2309, buffer[ 54]))<< 3;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(22117, buffer[ 54]))>> 4;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(12705, buffer[ 58]))>> 1;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(16383, buffer[ 58]))>> 2;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(6239, buffer[ 70]))>> 3;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(7543, buffer[ 70]))>> 3;
+ /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(9251, buffer[ 74]))>> 4;
+ /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(8603, buffer[ 74]))>> 6;
+ /* 1 - stage 2 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[2<<strideShift] = (OI_INT16)pcm_a;
+ /* 1 - stage 2 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[6<<strideShift] = (OI_INT16)pcm_b;
+ /* 1 - stage 3 */ pcm_a = 0;
+ /* 1 - stage 3 */ pcm_b = 0;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-16457, buffer[ 7]))>> 6;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(16913, buffer[ 7]))>> 5;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(19083, buffer[ 9]))>> 5;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(-8443, buffer[ 9]))>> 7;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-23641, buffer[ 23]))>> 2;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(3687, buffer[ 23]))<< 1;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-29015, buffer[ 25]))>> 4;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(-301, buffer[ 25]))<< 5;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-12889, buffer[ 39]))<< 2;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(15447, buffer[ 39]))<< 2;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(6145, buffer[ 41]))<< 3;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(10255, buffer[ 41]))<< 2;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(24211, buffer[ 55]))>> 1;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(-18233, buffer[ 55]))>> 3;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(23469, buffer[ 57]))>> 2;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(9405, buffer[ 57]))>> 1;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(21223, buffer[ 71]))>> 8;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(1499, buffer[ 71]))>> 1;
+ /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(26913, buffer[ 73]))>> 6;
+ /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(26189, buffer[ 73]))>> 7;
+ /* 1 - stage 3 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[3<<strideShift] = (OI_INT16)pcm_a;
+ /* 1 - stage 3 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[5<<strideShift] = (OI_INT16)pcm_b;
+ /* 1 - stage 4 */ pcm_a = 0;
+ /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(10445, buffer[ 8]))>> 4;
+ /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(-5297, buffer[ 24]))<< 1;
+ /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(22299, buffer[ 40]))<< 2;
+ /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(10603, buffer[ 56]));
+ /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(9539, buffer[ 72]))>> 4;
+ /* 1 - stage 4 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[4<<strideShift] = (OI_INT16)pcm_a;
+}
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addgroup codec_internal*/
+/**@{*/
+
+/*
+ * Performs an 8-point Type-II scaled DCT using the Arai-Agui-Nakajima
+ * factorization. The scaling factors are folded into the windowing
+ * constants. 29 adds and 5 16x32 multiplies per 8 samples.
+ */
+
+#include "oi_codec_sbc_private.h"
+
+#define AAN_C4_FIX (759250125)/* S1.30 759250125 0.707107*/
+
+#define AAN_C6_FIX (410903207)/* S1.30 410903207 0.382683*/
+
+#define AAN_Q0_FIX (581104888)/* S1.30 581104888 0.541196*/
+
+#define AAN_Q1_FIX (1402911301)/* S1.30 1402911301 1.306563*/
+
+/** Scales x by y bits to the right, adding a rounding factor.
+ */
+#ifndef SCALE
+#define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y))
+#endif
+
+/**
+ * Default C language implementation of a 32x32->32 multiply. This function may
+ * be replaced by a platform-specific version for speed.
+ *
+ * @param u A signed 32-bit multiplicand
+ * @param v A signed 32-bit multiplier
+
+ * @return A signed 32-bit value corresponding to the 32 most significant bits
+ * of the 64-bit product of u and v.
+ */
+INLINE OI_INT32 default_mul_32s_32s_hi(OI_INT32 u, OI_INT32 v)
+{
+ OI_UINT32 u0, v0;
+ OI_INT32 u1, v1, w1, w2, t;
+
+ u0 = u & 0xFFFF; u1 = u >> 16;
+ v0 = v & 0xFFFF; v1 = v >> 16;
+ t = u0*v0;
+ t = u1*v0 + ((OI_UINT32)t >> 16);
+ w1 = t & 0xFFFF;
+ w2 = t >> 16;
+ w1 = u0*v1 + w1;
+ return u1*v1 + w2 + (w1 >> 16);
+}
+
+#define MUL_32S_32S_HI(_x, _y) default_mul_32s_32s_hi(_x, _y)
+
+
+#ifdef DEBUG_DCT
+PRIVATE void float_dct2_8(float * RESTRICT out, OI_INT32 const *RESTRICT in)
+{
+#define FIX(x,bits) (((int)floor(0.5f+((x)*((float)(1<<bits)))))/((float)(1<<bits)))
+#define FLOAT_BUTTERFLY(x,y) x += y; y = x - (y*2); OI_ASSERT(VALID_INT32(x)); OI_ASSERT(VALID_INT32(y));
+#define FLOAT_MULT_DCT(K, sample) (FIX(K,20) * sample)
+#define FLOAT_SCALE(x, y) (((x) / (double)(1 << (y))))
+
+ double L00,L01,L02,L03,L04,L05,L06,L07;
+ double L25;
+
+ double in0,in1,in2,in3;
+ double in4,in5,in6,in7;
+
+ in0 = FLOAT_SCALE(in[0], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in0));
+ in1 = FLOAT_SCALE(in[1], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in1));
+ in2 = FLOAT_SCALE(in[2], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in2));
+ in3 = FLOAT_SCALE(in[3], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in3));
+ in4 = FLOAT_SCALE(in[4], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in4));
+ in5 = FLOAT_SCALE(in[5], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in5));
+ in6 = FLOAT_SCALE(in[6], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in6));
+ in7 = FLOAT_SCALE(in[7], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in7));
+
+ L00 = (in0 + in7); OI_ASSERT(VALID_INT32(L00));
+ L01 = (in1 + in6); OI_ASSERT(VALID_INT32(L01));
+ L02 = (in2 + in5); OI_ASSERT(VALID_INT32(L02));
+ L03 = (in3 + in4); OI_ASSERT(VALID_INT32(L03));
+
+ L04 = (in3 - in4); OI_ASSERT(VALID_INT32(L04));
+ L05 = (in2 - in5); OI_ASSERT(VALID_INT32(L05));
+ L06 = (in1 - in6); OI_ASSERT(VALID_INT32(L06));
+ L07 = (in0 - in7); OI_ASSERT(VALID_INT32(L07));
+
+ FLOAT_BUTTERFLY(L00, L03);
+ FLOAT_BUTTERFLY(L01, L02);
+
+ L02 += L03; OI_ASSERT(VALID_INT32(L02));
+
+ L02 = FLOAT_MULT_DCT(AAN_C4_FLOAT, L02); OI_ASSERT(VALID_INT32(L02));
+
+ FLOAT_BUTTERFLY(L00, L01);
+
+ out[0] = (float)FLOAT_SCALE(L00, DCTII_8_SHIFT_0); OI_ASSERT(VALID_INT16(out[0]));
+ out[4] = (float)FLOAT_SCALE(L01, DCTII_8_SHIFT_4); OI_ASSERT(VALID_INT16(out[4]));
+
+ FLOAT_BUTTERFLY(L03, L02);
+ out[6] = (float)FLOAT_SCALE(L02, DCTII_8_SHIFT_6); OI_ASSERT(VALID_INT16(out[6]));
+ out[2] = (float)FLOAT_SCALE(L03, DCTII_8_SHIFT_2); OI_ASSERT(VALID_INT16(out[2]));
+
+ L04 += L05; OI_ASSERT(VALID_INT32(L04));
+ L05 += L06; OI_ASSERT(VALID_INT32(L05));
+ L06 += L07; OI_ASSERT(VALID_INT32(L06));
+
+ L04/=2;
+ L05/=2;
+ L06/=2;
+ L07/=2;
+
+ L05 = FLOAT_MULT_DCT(AAN_C4_FLOAT, L05); OI_ASSERT(VALID_INT32(L05));
+
+ L25 = L06 - L04; OI_ASSERT(VALID_INT32(L25));
+ L25 = FLOAT_MULT_DCT(AAN_C6_FLOAT, L25); OI_ASSERT(VALID_INT32(L25));
+
+ L04 = FLOAT_MULT_DCT(AAN_Q0_FLOAT, L04); OI_ASSERT(VALID_INT32(L04));
+ L04 -= L25; OI_ASSERT(VALID_INT32(L04));
+
+ L06 = FLOAT_MULT_DCT(AAN_Q1_FLOAT, L06); OI_ASSERT(VALID_INT32(L06));
+ L06 -= L25; OI_ASSERT(VALID_INT32(L25));
+
+ FLOAT_BUTTERFLY(L07, L05);
+
+ FLOAT_BUTTERFLY(L05, L04);
+ out[3] = (float)(FLOAT_SCALE(L04, DCTII_8_SHIFT_3-1)); OI_ASSERT(VALID_INT16(out[3]));
+ out[5] = (float)(FLOAT_SCALE(L05, DCTII_8_SHIFT_5-1)); OI_ASSERT(VALID_INT16(out[5]));
+
+ FLOAT_BUTTERFLY(L07, L06);
+ out[7] = (float)(FLOAT_SCALE(L06, DCTII_8_SHIFT_7-1)); OI_ASSERT(VALID_INT16(out[7]));
+ out[1] = (float)(FLOAT_SCALE(L07, DCTII_8_SHIFT_1-1)); OI_ASSERT(VALID_INT16(out[1]));
+}
+#undef BUTTERFLY
+#endif
+
+
+/*
+ * This function calculates the AAN DCT. Its inputs are in S16.15 format, as
+ * returned by OI_SBC_Dequant. In practice, abs(in[x]) < 52429.0 / 1.38
+ * (1244918057 integer). The function it computes is an approximation to the array defined
+ * by:
+ *
+ * diag(aan_s) * AAN= C2
+ *
+ * or
+ *
+ * AAN = diag(1/aan_s) * C2
+ *
+ * where C2 is as it is defined in the comment at the head of this file, and
+ *
+ * aan_s[i] = aan_s = 1/(2*cos(i*pi/16)) with i = 1..7, aan_s[0] = 1;
+ *
+ * aan_s[i] = [ 1.000 0.510 0.541 0.601 0.707 0.900 1.307 2.563 ]
+ *
+ * The output ranges are shown as follows:
+ *
+ * Let Y[0..7] = AAN * X[0..7]
+ *
+ * Without loss of generality, assume the input vector X consists of elements
+ * between -1 and 1. The maximum possible value of a given output element occurs
+ * with some particular combination of input vector elements each of which is -1
+ * or 1. Consider the computation of Y[i]. Y[i] = sum t=0..7 of AAN[t,i]*X[i]. Y is
+ * maximized if the sign of X[i] matches the sign of AAN[t,i], ensuring a
+ * positive contribution to the sum. Equivalently, one may simply sum
+ * abs(AAN)[t,i] over t to get the maximum possible value of Y[i].
+ *
+ * This yields approximately [8.00 10.05 9.66 8.52 8.00 5.70 4.00 2.00]
+ *
+ * Given the maximum magnitude sensible input value of +/-37992, this yields the
+ * following vector of maximum output magnitudes:
+ *
+ * [ 303936 381820 367003 323692 303936 216555 151968 75984 ]
+ *
+ * Ultimately, these values must fit into 16 bit signed integers, so they must
+ * be scaled. A non-uniform scaling helps maximize the kept precision. The
+ * relative number of extra bits of precision maintainable with respect to the
+ * largest value is given here:
+ *
+ * [ 0 0 0 0 0 0 1 2 ]
+ *
+ */
+PRIVATE void dct2_8(SBC_BUFFER_T * RESTRICT out, OI_INT32 const *RESTRICT in)
+{
+#define BUTTERFLY(x,y) x += y; y = x - (y<<1);
+#define FIX_MULT_DCT(K, x) (MUL_32S_32S_HI(K,x)<<2)
+
+ OI_INT32 L00,L01,L02,L03,L04,L05,L06,L07;
+ OI_INT32 L25;
+
+ OI_INT32 in0,in1,in2,in3;
+ OI_INT32 in4,in5,in6,in7;
+
+#if DCTII_8_SHIFT_IN != 0
+ in0 = SCALE(in[0], DCTII_8_SHIFT_IN);
+ in1 = SCALE(in[1], DCTII_8_SHIFT_IN);
+ in2 = SCALE(in[2], DCTII_8_SHIFT_IN);
+ in3 = SCALE(in[3], DCTII_8_SHIFT_IN);
+ in4 = SCALE(in[4], DCTII_8_SHIFT_IN);
+ in5 = SCALE(in[5], DCTII_8_SHIFT_IN);
+ in6 = SCALE(in[6], DCTII_8_SHIFT_IN);
+ in7 = SCALE(in[7], DCTII_8_SHIFT_IN);
+#else
+ in0 = in[0];
+ in1 = in[1];
+ in2 = in[2];
+ in3 = in[3];
+ in4 = in[4];
+ in5 = in[5];
+ in6 = in[6];
+ in7 = in[7];
+#endif
+
+ L00 = in0 + in7;
+ L01 = in1 + in6;
+ L02 = in2 + in5;
+ L03 = in3 + in4;
+
+ L04 = in3 - in4;
+ L05 = in2 - in5;
+ L06 = in1 - in6;
+ L07 = in0 - in7;
+
+ BUTTERFLY(L00, L03);
+ BUTTERFLY(L01, L02);
+
+ L02 += L03;
+
+ L02 = FIX_MULT_DCT(AAN_C4_FIX, L02);
+
+ BUTTERFLY(L00, L01);
+
+ out[0] = (OI_INT16)SCALE(L00, DCTII_8_SHIFT_0);
+ out[4] = (OI_INT16)SCALE(L01, DCTII_8_SHIFT_4);
+
+ BUTTERFLY(L03, L02);
+ out[6] = (OI_INT16)SCALE(L02, DCTII_8_SHIFT_6);
+ out[2] = (OI_INT16)SCALE(L03, DCTII_8_SHIFT_2);
+
+ L04 += L05;
+ L05 += L06;
+ L06 += L07;
+
+ L04/=2;
+ L05/=2;
+ L06/=2;
+ L07/=2;
+
+ L05 = FIX_MULT_DCT(AAN_C4_FIX, L05);
+
+ L25 = L06 - L04;
+ L25 = FIX_MULT_DCT(AAN_C6_FIX, L25);
+
+ L04 = FIX_MULT_DCT(AAN_Q0_FIX, L04);
+ L04 -= L25;
+
+ L06 = FIX_MULT_DCT(AAN_Q1_FIX, L06);
+ L06 -= L25;
+
+ BUTTERFLY(L07, L05);
+
+ BUTTERFLY(L05, L04);
+ out[3] = (OI_INT16)SCALE(L04, DCTII_8_SHIFT_3-1);
+ out[5] = (OI_INT16)SCALE(L05, DCTII_8_SHIFT_5-1);
+
+ BUTTERFLY(L07, L06);
+ out[7] = (OI_INT16)SCALE(L06, DCTII_8_SHIFT_7-1);
+ out[1] = (OI_INT16)SCALE(L07, DCTII_8_SHIFT_1-1);
+#undef BUTTERFLY
+
+#ifdef DEBUG_DCT
+ {
+ float float_out[8];
+ float_dct2_8(float_out, in);
+ }
+#endif
+}
+
+/**@}*/
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+ $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+
+This file, along with synthesis-generated.c, contains the synthesis
+filterbank routines. The operations performed correspond to the
+operations described in A2DP Appendix B, Figure 12.3. Several
+mathematical optimizations are performed, particularly for the
+8-subband case.
+
+One important optimization is to note that the "matrixing" operation
+can be decomposed into the product of a type II discrete cosine kernel
+and another, sparse matrix.
+
+According to Fig 12.3, in the 8-subband case,
+@code
+ N[k][i] = cos((i+0.5)*(k+4)*pi/8), k = 0..15 and i = 0..7
+@endcode
+
+N can be factored as R * C2, where C2 is an 8-point type II discrete
+cosine kernel given by
+@code
+ C2[k][i] = cos((i+0.5)*k*pi/8)), k = 0..7 and i = 0..7
+@endcode
+
+R turns out to be a sparse 16x8 matrix with the following non-zero
+entries:
+@code
+ R[k][k+4] = 1, k = 0..3
+ R[k][abs(12-k)] = -1, k = 5..15
+@endcode
+
+The spec describes computing V[0..15] as N * R.
+@code
+ V[0..15] = N * R = (R * C2) * R = R * (C2 * R)
+@endcode
+
+C2 * R corresponds to computing the discrete cosine transform of R, so
+V[0..15] can be computed by taking the DCT of R followed by assignment
+and selective negation of the DCT result into V.
+
+ Although this was derived empirically using GNU Octave, it is
+ formally demonstrated in, e.g., Liu, Chi-Min and Lee,
+ Wen-Chieh. "A Unified Fast Algorithm for Cosine Modulated
+ Filter Banks in Current Audio Coding Standards." Journal of
+ the AES 47 (December 1999): 1061.
+
+Given the shift operation performed prior to computing V[0..15], it is
+clear that V[0..159] represents a rolling history of the 10 most
+recent groups of blocks input to the synthesis operation. Interpreting
+the matrix N in light of its factorization into C2 and R, R's
+sparseness has implications for interpreting the values in V. In
+particular, there is considerable redundancy in the values stored in
+V. Furthermore, since R[4][0..7] are all zeros, one out of every 16
+values in V will be zero regardless of the input data. Within each
+block of 16 values in V, fully half of them are redundant or
+irrelevant:
+
+@code
+ V[ 0] = DCT[4]
+ V[ 1] = DCT[5]
+ V[ 2] = DCT[6]
+ V[ 3] = DCT[7]
+ V[ 4] = 0
+ V[ 5] = -DCT[7] = -V[3] (redundant)
+ V[ 6] = -DCT[6] = -V[2] (redundant)
+ V[ 7] = -DCT[5] = -V[1] (redundant)
+ V[ 8] = -DCT[4] = -V[0] (redundant)
+ V[ 9] = -DCT[3]
+ V[10] = -DCT[2]
+ V[11] = -DCT[1]
+ V[12] = -DCT[0]
+ V[13] = -DCT[1] = V[11] (redundant)
+ V[14] = -DCT[2] = V[10] (redundant)
+ V[15] = -DCT[3] = V[ 9] (redundant)
+@endcode
+
+Since the elements of V beyond 15 were originally computed the same
+way during a previous run, what holds true for V[x] also holds true
+for V[x+16]. Thus, so long as care is taken to maintain the mapping,
+we need only actually store the unique values, which correspond to the
+output of the DCT, in some cases inverted. In fact, instead of storing
+V[0..159], we could store DCT[0..79] which would contain a history of
+DCT results. More on this in a bit.
+
+Going back to figure 12.3 in the spec, it should be clear that the
+vector U need not actually be explicitly constructed, but that with
+suitable indexing into V during the window operation, the same end can
+be accomplished. In the same spirit of the pseudocode shown in the
+figure, the following is the construction of W without using U:
+
+@code
+ for i=0 to 79 do
+ W[i] = D[i]*VSIGN(i)*V[remap_V(i)] where remap_V(i) = 32*(int(i/16)) + (i % 16) + (i % 16 >= 8 ? 16 : 0)
+ and VSIGN(i) maps i%16 into {1, 1, 1, 1, 0, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1 }
+ These values correspond to the
+ signs of the redundant values as
+ shown in the explanation three
+ paragraphs above.
+@endcode
+
+We saw above how V[4..8,13..15] (and by extension
+V[(4..8,13..15)+16*n]) can be defined in terms of other elements
+within the subblock of V. V[0..3,9..12] correspond to DCT elements.
+
+@code
+ for i=0 to 79 do
+ W[i] = D[i]*DSIGN(i)*DCT[remap_DCT(i)]
+@endcode
+
+The DCT is calculated using the Arai-Agui-Nakajima factorization,
+which saves some computation by producing output that needs to be
+multiplied by scaling factors before being used.
+
+@code
+ for i=0 to 79 do
+ W[i] = D[i]*SCALE[i%8]*AAN_DCT[remap_DCT(i)]
+@endcode
+
+D can be premultiplied with the DCT scaling factors to yield
+
+@code
+ for i=0 to 79 do
+ W[i] = DSCALED[i]*AAN_DCT[remap_DCT(i)] where DSCALED[i] = D[i]*SCALE[i%8]
+@endcode
+
+The output samples X[0..7] are defined as sums of W:
+
+@code
+ X[j] = sum{i=0..9}(W[j+8*i])
+@endcode
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+
+const OI_INT32 dec_window_4[21] = {
+ 0, /* +0.00000000E+00 */
+ 97, /* +5.36548976E-04 */
+ 270, /* +1.49188357E-03 */
+ 495, /* +2.73370904E-03 */
+ 694, /* +3.83720193E-03 */
+ 704, /* +3.89205149E-03 */
+ 338, /* +1.86581691E-03 */
+ -554, /* -3.06012286E-03 */
+ 1974, /* +1.09137620E-02 */
+ 3697, /* +2.04385087E-02 */
+ 5224, /* +2.88757392E-02 */
+ 5824, /* +3.21939290E-02 */
+ 4681, /* +2.58767811E-02 */
+ 1109, /* +6.13245186E-03 */
+ -5214, /* -2.88217274E-02 */
+ -14047, /* -7.76463494E-02 */
+ 24529, /* +1.35593274E-01 */
+ 35274, /* +1.94987841E-01 */
+ 44618, /* +2.46636662E-01 */
+ 50984, /* +2.81828203E-01 */
+ 53243, /* +2.94315332E-01 */
+};
+
+#define DCTII_4_K06_FIX ( 11585)/* S1.14 11585 0.707107*/
+
+#define DCTII_4_K08_FIX ( 21407)/* S1.14 21407 1.306563*/
+
+#define DCTII_4_K09_FIX (-15137)/* S1.14 -15137 -0.923880*/
+
+#define DCTII_4_K10_FIX ( -8867)/* S1.14 -8867 -0.541196*/
+
+/** Scales x by y bits to the right, adding a rounding factor.
+ */
+#ifndef SCALE
+#define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y))
+#endif
+
+#ifndef CLIP_INT16
+#define CLIP_INT16(x) do { if (x > OI_INT16_MAX) { x = OI_INT16_MAX; } else if (x < OI_INT16_MIN) { x = OI_INT16_MIN; } } while (0)
+#endif
+
+/**
+ * Default C language implementation of a 16x32->32 multiply. This function may
+ * be replaced by a platform-specific version for speed.
+ *
+ * @param u A signed 16-bit multiplicand
+ * @param v A signed 32-bit multiplier
+
+ * @return A signed 32-bit value corresponding to the 32 most significant bits
+ * of the 48-bit product of u and v.
+ */
+INLINE OI_INT32 default_mul_16s_32s_hi(OI_INT16 u, OI_INT32 v)
+{
+ OI_UINT16 v0;
+ OI_INT16 v1;
+
+ OI_INT32 w,x;
+
+ v0 = (OI_UINT16)(v & 0xffff);
+ v1 = (OI_INT16) (v >> 16);
+
+ w = v1 * u;
+ x = u * v0;
+
+ return w + (x >> 16);
+}
+
+#define MUL_16S_32S_HI(_x, _y) default_mul_16s_32s_hi(_x, _y)
+
+#define LONG_MULT_DCT(K, sample) (MUL_16S_32S_HI(K, sample)<<2)
+
+PRIVATE void SynthWindow80_generated(OI_INT16 *pcm, SBC_BUFFER_T const * RESTRICT buffer, OI_UINT strideShift);
+PRIVATE void SynthWindow112_generated(OI_INT16 *pcm, SBC_BUFFER_T const * RESTRICT buffer, OI_UINT strideShift);
+PRIVATE void dct2_8(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT x);
+
+typedef void (*SYNTH_FRAME)(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount);
+
+#ifndef COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS
+#define COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(dest, src) do { shift_buffer(dest, src, 72); } while (0)
+#endif
+
+#ifndef DCT2_8
+#define DCT2_8(dst, src) dct2_8(dst, src)
+#endif
+
+#ifndef SYNTH80
+#define SYNTH80 SynthWindow80_generated
+#endif
+
+#ifndef SYNTH112
+#define SYNTH112 SynthWindow112_generated
+#endif
+
+PRIVATE void OI_SBC_SynthFrame_80(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount)
+{
+ OI_UINT blk;
+ OI_UINT ch;
+ OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+ OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1;
+ OI_UINT offset = context->common.filterBufferOffset;
+ OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart;
+ OI_UINT blkstop = blkstart + blkcount;
+
+ for (blk = blkstart; blk < blkstop; blk++) {
+ if (offset == 0) {
+ COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[0] + context->common.filterBufferLen - 72, context->common.filterBuffer[0]);
+ if (nrof_channels == 2) {
+ COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 72, context->common.filterBuffer[1]);
+ }
+ offset = context->common.filterBufferLen - 80;
+ } else {
+ offset -= 1*8;
+ }
+
+ for (ch = 0; ch < nrof_channels; ch++) {
+ DCT2_8(context->common.filterBuffer[ch] + offset, s);
+ SYNTH80(pcm + ch, context->common.filterBuffer[ch] + offset, pcmStrideShift);
+ s += 8;
+ }
+ pcm += (8 << pcmStrideShift);
+ }
+ context->common.filterBufferOffset = offset;
+}
+
+PRIVATE void OI_SBC_SynthFrame_4SB(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount)
+{
+ OI_UINT blk;
+ OI_UINT ch;
+ OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+ OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1;
+ OI_UINT offset = context->common.filterBufferOffset;
+ OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart;
+ OI_UINT blkstop = blkstart + blkcount;
+
+ for (blk = blkstart; blk < blkstop; blk++) {
+ if (offset == 0) {
+ COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[0] + context->common.filterBufferLen - 72,context->common.filterBuffer[0]);
+ if (nrof_channels == 2) {
+ COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 72,context->common.filterBuffer[1]);
+ }
+ offset =context->common.filterBufferLen - 80;
+ } else {
+ offset -= 8;
+ }
+ for (ch = 0; ch < nrof_channels; ch++) {
+ cosineModulateSynth4(context->common.filterBuffer[ch] + offset, s);
+ SynthWindow40_int32_int32_symmetry_with_sum(pcm + ch,
+ context->common.filterBuffer[ch] + offset,
+ pcmStrideShift);
+ s += 4;
+ }
+ pcm += (4 << pcmStrideShift);
+ }
+ context->common.filterBufferOffset = offset;
+}
+
+#ifdef SBC_ENHANCED
+
+PRIVATE void OI_SBC_SynthFrame_Enhanced(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount)
+{
+ OI_UINT blk;
+ OI_UINT ch;
+ OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+ OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1;
+ OI_UINT offset = context->common.filterBufferOffset;
+ OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart;
+ OI_UINT blkstop = blkstart + blkcount;
+
+ for (blk = blkstart; blk < blkstop; blk++) {
+ if (offset == 0) {
+ COPY_BACKWARD_32BIT_ALIGNED_104_HALFWORDS(context->common.filterBuffer[0] +context->common.filterBufferLen - 104, context->common.filterBuffer[0]);
+ if (nrof_channels == 2) {
+ COPY_BACKWARD_32BIT_ALIGNED_104_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 104, context->common.filterBuffer[1]);
+ }
+ offset = context->common.filterBufferLen - 112;
+ } else {
+ offset -= 8;
+ }
+ for (ch = 0; ch < nrof_channels; ++ch) {
+ DCT2_8(context->common.filterBuffer[ch] + offset, s);
+ SYNTH112(pcm + ch, context->common.filterBuffer[ch] + offset, pcmStrideShift);
+ s += 8;
+ }
+ pcm += (8 << pcmStrideShift);
+ }
+ context->common.filterBufferOffset = offset;
+}
+
+static const SYNTH_FRAME SynthFrameEnhanced[] = {
+ NULL, /* invalid */
+ OI_SBC_SynthFrame_Enhanced, /* mono */
+ OI_SBC_SynthFrame_Enhanced /* stereo */
+};
+
+#endif
+
+static const SYNTH_FRAME SynthFrame8SB[] = {
+ NULL, /* invalid */
+ OI_SBC_SynthFrame_80, /* mono */
+ OI_SBC_SynthFrame_80 /* stereo */
+};
+
+
+static const SYNTH_FRAME SynthFrame4SB[] = {
+ NULL, /* invalid */
+ OI_SBC_SynthFrame_4SB, /* mono */
+ OI_SBC_SynthFrame_4SB /* stereo */
+};
+
+PRIVATE void OI_SBC_SynthFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT start_block, OI_UINT nrof_blocks)
+{
+ OI_UINT nrof_subbands = context->common.frameInfo.nrof_subbands;
+ OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+
+ OI_ASSERT(nrof_subbands == 4 || nrof_subbands == 8);
+ if (nrof_subbands == 4) {
+ SynthFrame4SB[nrof_channels](context, pcm, start_block, nrof_blocks);
+#ifdef SBC_ENHANCED
+ } else if (context->common.frameInfo.enhanced) {
+ SynthFrameEnhanced[nrof_channels](context, pcm, start_block, nrof_blocks);
+#endif /* SBC_ENHANCED */
+ } else {
+ SynthFrame8SB[nrof_channels](context, pcm, start_block, nrof_blocks);
+ }
+}
+
+
+void SynthWindow40_int32_int32_symmetry_with_sum(OI_INT16 *pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift)
+{
+ OI_INT32 pa;
+ OI_INT32 pb;
+
+ /* These values should be zero, since out[2] of the 4-band cosine modulation
+ * is always zero. */
+ OI_ASSERT(buffer[ 2] == 0);
+ OI_ASSERT(buffer[10] == 0);
+ OI_ASSERT(buffer[18] == 0);
+ OI_ASSERT(buffer[26] == 0);
+ OI_ASSERT(buffer[34] == 0);
+ OI_ASSERT(buffer[42] == 0);
+ OI_ASSERT(buffer[50] == 0);
+ OI_ASSERT(buffer[58] == 0);
+ OI_ASSERT(buffer[66] == 0);
+ OI_ASSERT(buffer[74] == 0);
+
+
+ pa = dec_window_4[ 4] * (buffer[12] + buffer[76]);
+ pa += dec_window_4[ 8] * (buffer[16] - buffer[64]);
+ pa += dec_window_4[12] * (buffer[28] + buffer[60]);
+ pa += dec_window_4[16] * (buffer[32] - buffer[48]);
+ pa += dec_window_4[20] * buffer[44];
+ pa = SCALE(-pa, 15);
+ CLIP_INT16(pa);
+ pcm[0 << strideShift] = (OI_INT16)pa;
+
+
+ pa = dec_window_4[ 1] * buffer[ 1]; pb = dec_window_4[ 1] * buffer[79];
+ pb += dec_window_4[ 3] * buffer[ 3]; pa += dec_window_4[ 3] * buffer[77];
+ pa += dec_window_4[ 5] * buffer[13]; pb += dec_window_4[ 5] * buffer[67];
+ pb += dec_window_4[ 7] * buffer[15]; pa += dec_window_4[ 7] * buffer[65];
+ pa += dec_window_4[ 9] * buffer[17]; pb += dec_window_4[ 9] * buffer[63];
+ pb += dec_window_4[11] * buffer[19]; pa += dec_window_4[11] * buffer[61];
+ pa += dec_window_4[13] * buffer[29]; pb += dec_window_4[13] * buffer[51];
+ pb += dec_window_4[15] * buffer[31]; pa += dec_window_4[15] * buffer[49];
+ pa += dec_window_4[17] * buffer[33]; pb += dec_window_4[17] * buffer[47];
+ pb += dec_window_4[19] * buffer[35]; pa += dec_window_4[19] * buffer[45];
+ pa = SCALE(-pa, 15);
+ CLIP_INT16(pa);
+ pcm[1 << strideShift] = (OI_INT16)(pa);
+ pb = SCALE(-pb, 15);
+ CLIP_INT16(pb);
+ pcm[3 << strideShift] = (OI_INT16)(pb);
+
+
+ pa = dec_window_4[2] * (/*buffer[ 2] + */ buffer[78]); /* buffer[ 2] is always zero */
+ pa += dec_window_4[6] * (buffer[14] /* + buffer[66]*/); /* buffer[66] is always zero */
+ pa += dec_window_4[10] * (/*buffer[18] + */ buffer[62]); /* buffer[18] is always zero */
+ pa += dec_window_4[14] * (buffer[30] /* + buffer[50]*/); /* buffer[50] is always zero */
+ pa += dec_window_4[18] * (/*buffer[34] + */ buffer[46]); /* buffer[34] is always zero */
+ pa = SCALE(-pa, 15);
+ CLIP_INT16(pa);
+ pcm[2 << strideShift] = (OI_INT16)(pa);
+}
+
+
+/**
+ This routine implements the cosine modulation matrix for 4-subband
+ synthesis. This is called "matrixing" in the SBC specification. This
+ matrix, M4, can be factored into an 8-point Type II Discrete Cosine
+ Transform, DCTII_4 and a matrix S4, given here:
+
+ @code
+ __ __
+ | 0 0 1 0 |
+ | 0 0 0 1 |
+ | 0 0 0 0 |
+ | 0 0 0 -1 |
+ S4 = | 0 0 -1 0 |
+ | 0 -1 0 0 |
+ | -1 0 0 0 |
+ |__ 0 -1 0 0 __|
+
+ M4 * in = S4 * (DCTII_4 * in)
+ @endcode
+
+ (DCTII_4 * in) is computed using a Fast Cosine Transform. The algorithm
+ here is based on an implementation computed by the SPIRAL computer
+ algebra system, manually converted to fixed-point arithmetic. S4 can be
+ implemented using only assignment and negation.
+ */
+PRIVATE void cosineModulateSynth4(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT in)
+{
+ OI_INT32 f0, f1, f2, f3, f4, f7, f8, f9, f10;
+ OI_INT32 y0, y1, y2, y3;
+
+ f0 = (in[0] - in[3]);
+ f1 = (in[0] + in[3]);
+ f2 = (in[1] - in[2]);
+ f3 = (in[1] + in[2]);
+
+ f4 = f1 - f3;
+
+ y0 = -SCALE(f1 + f3, DCT_SHIFT);
+ y2 = -SCALE(LONG_MULT_DCT(DCTII_4_K06_FIX, f4), DCT_SHIFT);
+ f7 = f0 + f2;
+ f8 = LONG_MULT_DCT(DCTII_4_K08_FIX, f0);
+ f9 = LONG_MULT_DCT(DCTII_4_K09_FIX, f7);
+ f10 = LONG_MULT_DCT(DCTII_4_K10_FIX, f2);
+ y3 = -SCALE(f8 + f9, DCT_SHIFT);
+ y1 = -SCALE(f10 - f9, DCT_SHIFT);
+
+ out[0] = (OI_INT16)-y2;
+ out[1] = (OI_INT16)-y3;
+ out[2] = (OI_INT16)0;
+ out[3] = (OI_INT16)y3;
+ out[4] = (OI_INT16)y2;
+ out[5] = (OI_INT16)y1;
+ out[6] = (OI_INT16)y0;
+ out[7] = (OI_INT16)y1;
+}
+
+
+
+/**
+@}
+*/
$(LOCAL_PATH)/../hci/include\
$(LOCAL_PATH)/../vnd/include \
$(LOCAL_PATH)/../embdrv/sbc/encoder/include \
+ $(LOCAL_PATH)/../embdrv/sbc/decoder/include \
$(LOCAL_PATH)/../audio_a2dp_hw \
$(LOCAL_PATH)/../utils/include \
$(bdroid_C_INCLUDES) \
libbt-utils
#LOCAL_WHOLE_STATIC_LIBRARIES := libbt-brcm_gki libbt-brcm_stack libbt-brcm_bta
-LOCAL_STATIC_LIBRARIES := libosi libbt-brcm_gki libbt-brcm_bta libbt-brcm_stack libtinyxml2
+LOCAL_STATIC_LIBRARIES := libosi libbt-brcm_gki libbt-brcm_bta libbt-brcm_stack libtinyxml2 libbt-qcom_sbc_decoder
LOCAL_MODULE := bluetooth.default
LOCAL_MODULE_RELATIVE_PATH := hw