| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #ifndef _API_CODEC_H
- #define _API_CODEC_H
- /* 采样点数 -> PCM16字节数 */
- #define SAMPLE_2_PCM16_BYTE(x) (x*2)
- /* PCM16字节数 -> 采样点数 */
- #define PCM16_BYTE_2_SAMPLE(x) (x/2)
- /* 采样点数 -> ADPCM块字节数 */
- #define SAMPLE_2_ADPCM_BYTE(x) ((x-1)/2+4)
- /* ADPCM块字节数 -> 采样点数 */
- #define ADPCM_BYTE_2_SAMPLE(x) (((x-4)*2)+1)
- /* ADPCM块字节数 -> PCM16字节数 */
- #define ADPCM_BYTE_2_PCM16_BYTE(x) (((x-4)*4)+2)
- //wav
- uint16_t wav_res_analize(u8 *head_buf, u8 *nch, u32 *spr, u16 *block_size);
- //sbc
- /* sampling frequency */
- enum {
- SBC_FREQ_16000 = 0x00,
- SBC_FREQ_32000 = 0x01,
- SBC_FREQ_44100 = 0x02,
- SBC_FREQ_48000 = 0x03,
- };
- /* blocks */
- enum {
- SBC_BLK_4 = 0x00,
- SBC_BLK_8 = 0x01,
- SBC_BLK_12 = 0x02,
- SBC_BLK_16 = 0x03,
- };
- /* subbands */
- enum {
- SBC_SB_4 = 0x00,
- SBC_SB_8 = 0x01,
- };
- /* channel mode */
- enum {
- SBC_MODE_MONO = 0x00,
- SBC_MODE_DUAL_CHANNEL = 0x01,
- SBC_MODE_STEREO = 0x02,
- SBC_MODE_JOINT_STEREO = 0x03,
- };
- /* allocation method */
- enum {
- SBC_AM_LOUDNESS = 0x00,
- SBC_AM_SNR = 0x01,
- };
- /**
- * @brief Take the mono 16K sampling rate as an example
- * @brief mSBC:
- * @brief mSBC parameter cannot be changed, ilen = 120 * 2, olen = 57;
- *
- * @brief SBC:
- * @brief subbands_l = subbands ? 8 : 4;
- * @brief blocks_l = 4 + (blocks * 4);
- * @brief channels_l = mode ? 2 : 1;
- * @brief SBC ilen = subbands_l * blocks_l * channels_l * 2;
- * @brief SBC olen = 4 + (4 * subbands_l * channels_l) / 8 + ((blocks_l * channels_l * bitpool) + 7) / 8; //Ignore the decimal point
- *
- * @brief mic sample points = ilen / 2; (max: 128)
- */
- void sbc_encode_init(uint8_t freq, uint8_t blocks, uint8_t subbands, uint8_t mode, uint8_t allocation, uint8_t bitpool);
- uint16_t sbc_encode_frame(uint8_t *ibuf, uint16_t ilen, uint8_t *obuf, uint16_t olen);
- void msbc_encode_init(void);
- uint16_t msbc_encode_frame(uint8_t *ibuf, uint16_t ilen, uint8_t *obuf, uint16_t olen);
- /**
- * @brief SBC decode
- *
- * @brief is_msbc: 1 -- msbc, 0 -- sbc.
- * @brief ibuf: SBC encoded buf
- * @brief ilen: SBC encoded buf len
- * @brief obuf: SBC decoded output buf
- *
- * @brief return: decode output buf sample points. (max: 128)
- */
- void sbc_decode_init(bool is_msbc);
- uint16_t sbc_decode_frame(uint8_t *ibuf, uint16_t ilen, uint8_t *obuf);
- //adpcm
- /**
- * @brief ima adpcm encode compression ratio 4:1
- * @brief encode output buf format:2byte prediction sample, 1byte index, 1byte reserve, nbyte data
- * @brief decode input buf format:2byte prediction sample, 1byte index, 1byte reserve, nbyte data
- *
- * @brief ima adpcm need one more sample point. reference routine bsp_sdadc_voice.c
- *
- * @param p_dst: output buf
- * @param p_src: input buf
- * @param sample_len:sample points
- */
- void adpcm_decode_block(uint8_t *p_dst,uint8_t *p_src,uint32_t sample_len);
- void adpcm_encode_block(uint8_t *p_dst, uint8_t *p_src, uint32_t sample_len);
- void adpcm_decode_block_big(uint8_t *p_dst, uint8_t *p_src, uint32_t sample_len);
- void adpcm_encode_block_big(uint8_t *p_dst, uint8_t *p_src, uint32_t sample_len);
- void adpcm_sample_idx_set(int16_t idx);
- void adpcm_sample_idx_reset(void);
- void adpcm_presample_set(int32_t pcm_16);
- uint16_t adpcm_sample_idx_get(void);
- int16_t adpcm_presample_get(void);
- //opus
- /**
- * @brief opus encode initialization, 16bit, 20ms one frame
- * @brief opus encode requires high computing power, so the system needs to raise the main frequency to more than 120M
- * @param samplerate: sampling rate, only support 8000 or 16000
- * @param nch: number of channels,only support 1 channel now
- * @param bit_rate:16000 or 32000, 16000-->1:16 32000-->1:8
- * @return true or false
- */
- bool opus_enc_init(u32 samplerate, u32 nch, u32 bit_rate);
- /**
- * @brief opus encode exit
- * @return true or false
- */
- bool opus_enc_exit(void);
- /**
- * @brief opus encode process
- * @param pcm: Data to be encoded
- At a sample rate of 16K, 16bit, 20ms one frame, pcm_size = (16 * 20 * 2)byte
- Ensure that there is a sufficient length of data
- * @param out: opus encoded data, out_len = pcm_size / 16
- Ensure that there is a sufficient length of data
- */
- int32_t opus_enc_process(int16_t *pcm, u8 *out);
- /**
- * @brief mp3 decode
- */
- bool mp3_dec_frame(void);
- void mp3_music_pcm_kick(void);
- u8 mp3_music_dec_sta_get(void);
- void mp3_music_dec_sta_set(u8 sta);
- bool mp3_res_play_kick(u32 addr, u32 len);
- void mp3_res_play_exit(void);
- #endif // _API_CODEC_H
|