mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-03 23:51:39 +01:00 
			
		
		
		
	
		
			
	
	
		
			230 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			230 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *  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 */
							 | 
						||
| 
								 | 
							
								
							 |