-
Notifications
You must be signed in to change notification settings - Fork 47
Expand file tree
/
Copy patha2dp_decoder_internal.h
More file actions
201 lines (178 loc) · 7.5 KB
/
Copy patha2dp_decoder_internal.h
File metadata and controls
201 lines (178 loc) · 7.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/***************************************************************************
*
* 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__