pinebuds/services/multimedia/audio/codec/sbc/inc/codec_sbc.h

193 lines
6.0 KiB
C

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef _CODEC_SBC_H
#define _CODEC_SBC_H
#ifdef __cplusplus
extern "C" {
#endif
#include "bluetooth.h"
#define BTIF_SBC_USE_FIXED_POINT_ENABLED
#ifdef BTIF_SBC_USE_FIXED_POINT_ENABLED
typedef S32 REAL;
#else
typedef float REAL;
#endif
typedef U8 btif_sbc_sample_freq_t;
#define BTIF_SBC_CHNL_SAMPLE_FREQ_16 0
#define BTIF_SBC_CHNL_SAMPLE_FREQ_32 1
#define BTIF_SBC_CHNL_SAMPLE_FREQ_44_1 2
#define BTIF_SBC_CHNL_SAMPLE_FREQ_48 3
typedef U8 btif_sbc_channel_mode_t;
#define BTIF_SBC_CHNL_MODE_MONO 0
#define BTIF_SBC_CHNL_MODE_DUAL_CHNL 1
#define BTIF_SBC_CHNL_MODE_STEREO 2
#define BTIF_SBC_CHNL_MODE_JOINT_STEREO 3
typedef U8 btif_sbc_alloc_method_t;
#define BTIF_SBC_ALLOC_METHOD_LOUDNESS 0
#define BTIF_SBC_ALLOC_METHOD_SNR 1
#define BTIF_SBC_MAX_NUM_BLK 16
#define BTIF_SBC_MAX_NUM_SB 8
#define BTIF_SBC_MAX_NUM_CHNL 2
#define BTIF_SBC_MAX_PCM_DATA 512
#define BTIF_SBC_DEC_ALL 0
#define BTIF_SBC_DEC_LEFT 1
#define BTIF_SBC_DEC_RIGHT 2
#define BTIF_SBC_SPLIT_LEFT 1
#define BTIF_SBC_SPLIT_RIGHT 2
#define BTIF_MSBC_BLOCKS 15
typedef U8 btif_sbc_alloc_method_t;
#define BTIF_SBC_ALLOC_METHOD_LOUDNESS 0
#define BTIF_SBC_ALLOC_METHOD_SNR 1
typedef struct {
U8 bitPool;
btif_sbc_sample_freq_t sampleFreq;
btif_sbc_channel_mode_t channelMode;
btif_sbc_alloc_method_t allocMethod;
U8 numBlocks;
U8 numSubBands;
U8 numChannels;
U8 mSbcFlag;
U16 bitOffset;
U8 crc;
U8 fcs;
U8 join[BTIF_SBC_MAX_NUM_SB];
U8 scale_factors[BTIF_SBC_MAX_NUM_CHNL][BTIF_SBC_MAX_NUM_SB];
S32 scaleFactors[BTIF_SBC_MAX_NUM_CHNL][BTIF_SBC_MAX_NUM_SB];
U16 levels[BTIF_SBC_MAX_NUM_CHNL][BTIF_SBC_MAX_NUM_SB];
S8 bitNeed0[BTIF_SBC_MAX_NUM_SB];
S8 bitNeed1[BTIF_SBC_MAX_NUM_SB];
U8 bits[BTIF_SBC_MAX_NUM_CHNL][BTIF_SBC_MAX_NUM_SB];
REAL sbSample[BTIF_SBC_MAX_NUM_BLK][BTIF_SBC_MAX_NUM_CHNL][BTIF_SBC_MAX_NUM_SB];
U8 fcs_bak;
} btif_sbc_stream_info_t;
typedef struct {
U8 bitPool;
uint8_t sampleFreq;
uint8_t channelMode;
uint8_t allocMethod;
U8 numBlocks;
U8 numSubBands;
U8 numChannels;
U8 mSbcFlag;
} btif_sbc_stream_info_short_t;
typedef struct {
btif_sbc_stream_info_t streamInfo;
U8 sFactorsJoint[BTIF_SBC_MAX_NUM_CHNL][BTIF_SBC_MAX_NUM_SB];
REAL sbJoint[BTIF_SBC_MAX_NUM_BLK][BTIF_SBC_MAX_NUM_CHNL];
S16 X0[80 * 2];
S16 X1[80 * 2];
U16 X0pos, X1pos;
REAL Y[16];
} btif_sbc_encoder_t;
typedef struct {
btif_sbc_stream_info_t streamInfo;
U16 maxPcmLen;
REAL V0[160];
REAL V1[160];
struct {
U8 stageBuff[BTIF_SBC_MAX_PCM_DATA];
U16 stageLen;
U16 curStageOff;
U8 *rxBuff;
U16 rxSize;
U8 rxState;
} parser;
} btif_sbc_decoder_t;
typedef struct {
list_entry_t node;
uint8_t *data;
uint16_t dataLen;
uint16_t frameSize;
btif_bt_packet_t packet;
uint16_t dataSent;
uint16_t frmDataSent;
} btif_a2dp_sbc_packet_t;
typedef struct {
btif_sbc_sample_freq_t sampleFreq;
uint8_t numChannels;
uint16_t dataLen;
uint8_t *data;
} btif_sbc_pcm_data_t;
uint16_t btif_sbc_frame_len(btif_sbc_stream_info_t *StreamInfo);
void btif_sbc_init_decoder(btif_sbc_decoder_t *Decoder);
bt_status_t btif_sbc_decode_frames(btif_sbc_decoder_t *Decoder,
uint8_t *Buff,
uint16_t Len,
uint16_t *BytesParsed,
btif_sbc_pcm_data_t *PcmData,
uint16_t MaxPcmData,
float* gains);
bt_status_t btif_sbc_decode_frames_parser(btif_sbc_decoder_t *Decoder,
uint8_t *Buff,
uint16_t Len,
uint16_t *BytesParsed);
bt_status_t btif_sbc_decode_frames_out_sbsamples(btif_sbc_decoder_t *Decoder,
uint8_t *Buff,
uint16_t Len,
uint16_t *BytesDecoded,
btif_sbc_pcm_data_t *PcmData,
uint16_t MaxPcmData,
float* gains,
uint8_t ChooseDecChannel,
REAL *SBSamplesBuf,
uint32_t SBSamplesBufLen,
uint32_t *SBSamplesBufUsed,
uint8_t ChooseSplitChannel);
void btif_sbc_init_encoder(btif_sbc_encoder_t *Encoder);
bt_status_t btif_sbc_encode_frames(btif_sbc_encoder_t *Encoder,
btif_sbc_pcm_data_t *PcmData,
uint16_t *BytesEncoded,
uint8_t *Buff,
uint16_t *Len,
uint16_t MaxSbcData);
bt_status_t btif_sbc_encode_frames_with_sbsamples(btif_sbc_encoder_t *Encoder,
REAL *SBSamplesBuf,
uint32_t SBSamplesBufLen_bytes,
uint32_t *SBSamplesBufUsed_bytes,
uint8_t *Buff,
uint16_t *Len,
uint16_t MaxSbcData,
uint8_t *number_freame_encoded);
void btif_plc_update_sbc_decoder_state(btif_sbc_encoder_t *Encoder, btif_sbc_pcm_data_t *PcmData, btif_sbc_decoder_t *Decoder, float *gain);
#ifdef __cplusplus
}
#endif
#endif /* CODEC_SBC */