202 lines
7.5 KiB
C
202 lines
7.5 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 __A2DP_DECODER_INTERNAL_H__
|
||
|
#define __A2DP_DECODER_INTERNAL_H__
|
||
|
|
||
|
#include "list.h"
|
||
|
#include "a2dp_decoder.h"
|
||
|
#ifdef A2DP_CP_ACCEL
|
||
|
#include "a2dp_decoder_cp.h"
|
||
|
#include "hal_location.h"
|
||
|
#endif
|
||
|
#include "a2dp_decoder_trace.h"
|
||
|
|
||
|
#define TEXT_A2DP_LOC_A(n, l) __attribute__((section(#n "." #l)))
|
||
|
#define TEXT_A2DP_LOC(n, l) TEXT_A2DP_LOC_A(n, l)
|
||
|
|
||
|
#define TEXT_SBC_LOC TEXT_A2DP_LOC(.overlay_a2dp_sbc, __LINE__)
|
||
|
#define TEXT_AAC_LOC TEXT_A2DP_LOC(.overlay_a2dp_aac, __LINE__)
|
||
|
#define TEXT_SSC_LOC TEXT_A2DP_LOC(.overlay_a2dp_ssc, __LINE__)
|
||
|
#define TEXT_LDAC_LOC TEXT_A2DP_LOC(.overlay_a2dp_ldac, __LINE__)
|
||
|
#define TEXT_LHDC_LOC TEXT_A2DP_LOC(.overlay_a2dp_lhdc, __LINE__)
|
||
|
|
||
|
#define A2DP_DECODER_NO_ERROR (0)
|
||
|
#define A2DP_DECODER_DECODE_ERROR (-1)
|
||
|
#define A2DP_DECODER_BUSY_ERROR (-2)
|
||
|
#define A2DP_DECODER_MEMORY_ERROR (-3)
|
||
|
#define A2DP_DECODER_MTU_LIMTER_ERROR (-4)
|
||
|
#define A2DP_DECODER_CACHE_UNDERFLOW_ERROR (-5)
|
||
|
#define A2DP_DECODER_SYNC_ERROR (-6)
|
||
|
#define A2DP_DECODER_NOT_SUPPORT (-128)
|
||
|
|
||
|
#ifdef MIN
|
||
|
#undef MIN
|
||
|
#endif
|
||
|
#define MIN(a,b) ((a)<(b) ? (a):(b))
|
||
|
#ifdef MAX
|
||
|
#undef MAX
|
||
|
#endif
|
||
|
#define MAX(a,b) ((a)>(b) ? (a):(b))
|
||
|
|
||
|
typedef A2DP_AUDIO_OUTPUT_CONFIG_T AUDIO_DECODER_STREAM_INFO_T;
|
||
|
|
||
|
typedef int (*AUDIO_DECODER_INIT)(A2DP_AUDIO_OUTPUT_CONFIG_T *, void *);
|
||
|
typedef int (*AUDIO_DECODER_DEINIT)(void);
|
||
|
typedef int (*AUDIO_DECODER_DECODE_FRAME)(uint8_t *, uint32_t);
|
||
|
typedef int (*AUDIO_DECODER_PREPARSE_PACKET)(btif_media_header_t *, uint8_t *, uint32_t);
|
||
|
typedef int (*AUDIO_DECODER_STORE_PACKET)(btif_media_header_t *, uint8_t *, uint32_t);
|
||
|
typedef int (*AUDIO_DECODER_DISCARDS_PACKET)(uint32_t);
|
||
|
typedef int (*AUDIO_DECODER_SYNCHRONIZE_PACKET)(A2DP_AUDIO_SYNCFRAME_INFO_T *, uint32_t);
|
||
|
typedef int (*AUDIO_DECODER_SYNCHRONIZE_DEST_PACKET_MUT)(uint16_t);
|
||
|
typedef int (*AUDIO_DECODER_HEADFRAME_INFO_GET)(A2DP_AUDIO_HEADFRAME_INFO_T*);
|
||
|
typedef int (*AUDIO_DECODER_INFO_GET)(void *);
|
||
|
typedef void(*AUDIO_DECODER_PACKET_FREE)(void *);
|
||
|
typedef int (*AUDIO_DECODER_SYNCHRONIZE_CONVERT_LIST_TO_SAMPLES)(uint32_t *);
|
||
|
typedef int (*AUDIO_DECODER_SYNCHRONIZE_DISCARDS_SAMPLES)(uint32_t);
|
||
|
typedef int (*AUDIO_DECODER_CHANNEL_SELECT)(A2DP_AUDIO_CHANNEL_SELECT_E);
|
||
|
|
||
|
typedef struct {
|
||
|
AUDIO_DECODER_STREAM_INFO_T stream_info;
|
||
|
uint32_t auto_synchronize_support;
|
||
|
AUDIO_DECODER_INIT audio_decoder_init;
|
||
|
AUDIO_DECODER_DEINIT audio_decoder_deinit;
|
||
|
AUDIO_DECODER_DECODE_FRAME audio_decoder_decode_frame;
|
||
|
AUDIO_DECODER_PREPARSE_PACKET audio_decoder_preparse_packet;
|
||
|
AUDIO_DECODER_STORE_PACKET audio_decoder_store_packet;
|
||
|
AUDIO_DECODER_DISCARDS_PACKET audio_decoder_discards_packet;
|
||
|
AUDIO_DECODER_SYNCHRONIZE_PACKET audio_decoder_synchronize_packet;
|
||
|
AUDIO_DECODER_SYNCHRONIZE_DEST_PACKET_MUT audio_decoder_synchronize_dest_packet_mut;
|
||
|
AUDIO_DECODER_SYNCHRONIZE_CONVERT_LIST_TO_SAMPLES a2dp_audio_convert_list_to_samples;
|
||
|
AUDIO_DECODER_SYNCHRONIZE_DISCARDS_SAMPLES a2dp_audio_discards_samples;
|
||
|
AUDIO_DECODER_HEADFRAME_INFO_GET audio_decoder_headframe_info_get;
|
||
|
AUDIO_DECODER_INFO_GET audio_decoder_info_get;
|
||
|
AUDIO_DECODER_PACKET_FREE audio_decoder_packet_free;
|
||
|
AUDIO_DECODER_CHANNEL_SELECT audio_decoder_channel_select;
|
||
|
} A2DP_AUDIO_DECODER_T;
|
||
|
|
||
|
typedef struct {
|
||
|
list_t *input_raw_packet_list;
|
||
|
list_t *output_pcm_packet_list;
|
||
|
} A2DP_AUDIO_DATAPATH_T;
|
||
|
|
||
|
typedef struct {
|
||
|
bool enalbe;
|
||
|
void *semaphore;
|
||
|
} AUDIO_BUFFER_SEMAPHORE_T;
|
||
|
|
||
|
enum A2DP_AUDIO_DECODER_STATUS {
|
||
|
A2DP_AUDIO_DECODER_STATUS_NULL,
|
||
|
A2DP_AUDIO_DECODER_STATUS_READY,
|
||
|
A2DP_AUDIO_DECODER_STATUS_START,
|
||
|
A2DP_AUDIO_DECODER_STATUS_STOP
|
||
|
};
|
||
|
|
||
|
enum A2DP_AUDIO_DECODER_STORE_PACKET_STATUS {
|
||
|
A2DP_AUDIO_DECODER_STORE_PACKET_STATUS_IDLE,
|
||
|
A2DP_AUDIO_DECODER_STORE_PACKET_STATUS_BUSY,
|
||
|
};
|
||
|
|
||
|
enum A2DP_AUDIO_DECODER_PLAYBACK_STATUS {
|
||
|
A2DP_AUDIO_DECODER_PLAYBACK_STATUS_IDLE,
|
||
|
A2DP_AUDIO_DECODER_PLAYBACK_STATUS_BUSY,
|
||
|
};
|
||
|
|
||
|
typedef struct {
|
||
|
uint16_t sequenceNumber;
|
||
|
uint32_t timestamp;
|
||
|
uint16_t curSubSequenceNumber;
|
||
|
uint16_t totalSubSequenceNumber;
|
||
|
uint32_t frame_samples;
|
||
|
uint32_t list_samples;
|
||
|
uint32_t decoded_frames;
|
||
|
uint32_t undecode_frames;
|
||
|
uint32_t check_sum;
|
||
|
A2DP_AUDIO_OUTPUT_CONFIG_T stream_info;
|
||
|
} A2DP_AUDIO_DECODER_LASTFRAME_INFO_T;
|
||
|
|
||
|
typedef struct {
|
||
|
A2DP_AUDIO_SYNC_PID_T pid;
|
||
|
uint32_t tick;
|
||
|
uint32_t cnt;
|
||
|
} A2DP_AUDIO_SYNC_T;
|
||
|
|
||
|
typedef struct {
|
||
|
A2DP_AUDIO_OUTPUT_CONFIG_T output_cfg;
|
||
|
float init_factor_reference;
|
||
|
A2DP_AUDIO_CHANNEL_SELECT_E chnl_sel;
|
||
|
uint16_t dest_packet_mut;
|
||
|
float average_packet_mut;
|
||
|
A2DP_AUDIO_DECODER_T audio_decoder;
|
||
|
A2DP_AUDIO_DATAPATH_T audio_datapath;
|
||
|
list_t *input_raw_packet_list;
|
||
|
list_t *output_pcm_packet_list;
|
||
|
bool need_detect_first_packet;
|
||
|
bool underflow_onporcess;
|
||
|
uint32_t skip_frame_cnt_after_no_cache;
|
||
|
uint32_t mute_frame_cnt_after_no_cache;
|
||
|
AUDIO_BUFFER_SEMAPHORE_T audio_semaphore;
|
||
|
void *audio_buffer_mutex;
|
||
|
void *audio_status_mutex;
|
||
|
void *audio_stop_mutex;
|
||
|
enum A2DP_AUDIO_DECODER_STATUS audio_decoder_status;
|
||
|
enum A2DP_AUDIO_DECODER_STORE_PACKET_STATUS store_packet_status;
|
||
|
enum A2DP_AUDIO_DECODER_PLAYBACK_STATUS playback_status;
|
||
|
A2DP_AUDIO_SYNC_T audio_sync;
|
||
|
#if A2DP_DECODER_HISTORY_SEQ_SAVE
|
||
|
uint16_t historySeq[A2DP_DECODER_HISTORY_SEQ_SAVE];
|
||
|
#ifdef A2DP_DECODER_HISTORY_LOCTIME_SAVE
|
||
|
uint32_t historyLoctime[A2DP_DECODER_HISTORY_SEQ_SAVE];
|
||
|
#endif
|
||
|
#ifdef A2DP_DECODER_HISTORY_CHECK_SUM_SAVE
|
||
|
uint32_t historyChecksum[A2DP_DECODER_HISTORY_SEQ_SAVE];
|
||
|
#endif
|
||
|
uint8_t historySeq_idx;
|
||
|
#endif
|
||
|
} A2DP_AUDIO_CONTEXT_T;
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
void *a2dp_audio_heap_malloc(uint32_t size);
|
||
|
void *a2dp_audio_heap_cmalloc(uint32_t size);
|
||
|
void *a2dp_audio_heap_realloc(void *rmem, uint32_t newsize);
|
||
|
void a2dp_audio_heap_free(void *rmem);
|
||
|
|
||
|
list_node_t *a2dp_audio_list_begin(const list_t *list);
|
||
|
list_node_t *a2dp_audio_list_end(const list_t *list);
|
||
|
uint32_t a2dp_audio_list_length(const list_t *list);
|
||
|
void *a2dp_audio_list_node(const list_node_t *node);
|
||
|
list_node_t *a2dp_audio_list_next(const list_node_t *node);
|
||
|
bool a2dp_audio_list_remove(list_t *list, void *data);
|
||
|
bool a2dp_audio_list_append(list_t *list, void *data);
|
||
|
void a2dp_audio_list_clear(list_t *list);
|
||
|
void a2dp_audio_list_free(list_t *list);
|
||
|
list_t *a2dp_audio_list_new(list_free_cb callback, list_mempool_zmalloc zmalloc, list_mempool_free free);
|
||
|
|
||
|
int a2dp_audio_semaphore_wait(uint32_t timeout_ms);
|
||
|
int a2dp_audio_semaphore_release(void);
|
||
|
int a2dp_audio_decoder_internal_lastframe_info_set(A2DP_AUDIO_DECODER_LASTFRAME_INFO_T *lastframe_info);
|
||
|
uint32_t a2dp_audio_get_passed(uint32_t curr_ticks, uint32_t prev_ticks, uint32_t max_ticks);
|
||
|
uint32_t a2dp_audio_decoder_internal_check_sum_generate(const uint8_t *buf, uint32_t len);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif//__A2DPPLAY_H__
|
||
|
|