/******************************************************************************
 *
 *  Copyright 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 {
  uint8_t uint8[SBC_MAX_BANDS];
  uint32_t uint32[SBC_MAX_BANDS / 4];
} BITNEED_UNION1;

typedef union {
  uint8_t uint8[2 * SBC_MAX_BANDS];
  uint32_t uint32[2 * SBC_MAX_BANDS / 4];
} BITNEED_UNION2;

static const uint16_t freq_values[] = {16000, 32000, 44100, 48000};
static const uint8_t block_values[] = {4, 8, 12, 16};
static const uint8_t channel_values[] = {1, 2, 2, 2};
static const uint8_t band_values[] = {4, 8};

#define TEST_MODE_SENTINEL "OINA"
#define TEST_MODE_SENTINEL_LENGTH 4

/** Used internally. */
typedef struct {
  union {
    const uint8_t* r;
    uint8_t* w;
  } ptr;
  uint32_t 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, uint8_t* 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, uint32_t* bitneeds,
                          const OI_UINT subbands, OI_UINT bitcount,
                          OI_UINT* excess);

INLINE OI_INT allocAdjustedBits(uint8_t* dest, OI_INT bits, OI_INT excess);

INLINE OI_INT allocExcessBits(uint8_t* dest, OI_INT excess);

PRIVATE uint32_t internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO* frame);

PRIVATE uint16_t 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,
                                     uint8_t bitpool, const OI_BYTE** frameData,
                                     uint32_t* frameBytes, int16_t* pcmData,
                                     uint32_t* pcmBytes);

INLINE OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT* context,
                                       uint32_t* decoderData,
                                       uint32_t decoderDataBytes,
                                       OI_BYTE maxChannels, OI_BYTE pcmStride,
                                       OI_BOOL enhanced);

INLINE uint16_t OI_SBC_CalculateFrameAndHeaderlen(
    OI_CODEC_SBC_FRAME_INFO* frame, OI_UINT* headerLen_);

PRIVATE uint32_t OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO* frame);

PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT* frame);
PRIVATE uint8_t 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,
                                  int32_t const* RESTRICT in);
PRIVATE void SynthWindow40_int32_int32_symmetry_with_sum(
    int16_t* pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift);

INLINE void dct3_4(int32_t* RESTRICT out, int32_t const* RESTRICT in);
PRIVATE void analyze4_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 40],
                                int16_t* pcm, OI_UINT strideShift,
                                int32_t subband[4]);

INLINE void dct3_8(int32_t* RESTRICT out, int32_t const* RESTRICT in);

PRIVATE void analyze8_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 80],
                                int16_t* pcm, OI_UINT strideShift,
                                int32_t subband[8]);

#ifdef SBC_ENHANCED
PRIVATE void analyze8_enhanced_generated(
    SBC_BUFFER_T analysisBuffer[RESTRICT 112], int16_t* pcm,
    OI_UINT strideShift, int32_t 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,
                               int16_t* pcm, OI_UINT start_block,
                               OI_UINT nrof_blocks);
INLINE int32_t OI_SBC_Dequant(uint32_t raw, OI_UINT scale_factor, OI_UINT bits);
PRIVATE OI_BOOL OI_SBC_ExamineCommandPacket(
    OI_CODEC_SBC_DECODER_CONTEXT* context, const OI_BYTE* data, uint32_t len);
PRIVATE void OI_SBC_GenerateTestSignal(int16_t pcmData[][2],
                                       uint32_t 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,
                                     uint32_t* codecDataAligned,
                                     uint32_t codecDataBytes,
                                     uint8_t maxChannels, uint8_t pcmStride);
/**
@}
*/

#endif /* _OI_CODEC_SBC_PRIVATE_H */
