1 /******************************************************************************
2  *
3  *  Copyright (C) 2000-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /******************************************************************************
20  *
21  *  nterface to low complexity subband codec (SBC)
22  *
23  ******************************************************************************/
24 #ifndef A2D_SBC_H
25 #define A2D_SBC_H
26 
27 /*****************************************************************************
28 **  Constants
29 *****************************************************************************/
30 /* the length of the SBC Media Payload header. */
31 #define A2D_SBC_MPL_HDR_LEN         1
32 
33 /* the LOSC of SBC media codec capabilitiy */
34 #define A2D_SBC_INFO_LEN            6
35 
36 /* for Codec Specific Information Element */
37 #define A2D_SBC_IE_SAMP_FREQ_MSK    0xF0    /* b7-b4 sampling frequency */
38 #define A2D_SBC_IE_SAMP_FREQ_16     0x80    /* b7:16  kHz */
39 #define A2D_SBC_IE_SAMP_FREQ_32     0x40    /* b6:32  kHz */
40 #define A2D_SBC_IE_SAMP_FREQ_44     0x20    /* b5:44.1kHz */
41 #define A2D_SBC_IE_SAMP_FREQ_48     0x10    /* b4:48  kHz */
42 
43 #define A2D_SBC_IE_CH_MD_MSK        0x0F    /* b3-b0 channel mode */
44 #define A2D_SBC_IE_CH_MD_MONO       0x08    /* b3: mono */
45 #define A2D_SBC_IE_CH_MD_DUAL       0x04    /* b2: dual */
46 #define A2D_SBC_IE_CH_MD_STEREO     0x02    /* b1: stereo */
47 #define A2D_SBC_IE_CH_MD_JOINT      0x01    /* b0: joint stereo */
48 
49 #define A2D_SBC_IE_BLOCKS_MSK       0xF0    /* b7-b4 number of blocks */
50 #define A2D_SBC_IE_BLOCKS_4         0x80    /* 4 blocks */
51 #define A2D_SBC_IE_BLOCKS_8         0x40    /* 8 blocks */
52 #define A2D_SBC_IE_BLOCKS_12        0x20    /* 12blocks */
53 #define A2D_SBC_IE_BLOCKS_16        0x10    /* 16blocks */
54 
55 #define A2D_SBC_IE_SUBBAND_MSK      0x0C    /* b3-b2 number of subbands */
56 #define A2D_SBC_IE_SUBBAND_4        0x08    /* b3: 4 */
57 #define A2D_SBC_IE_SUBBAND_8        0x04    /* b2: 8 */
58 
59 #define A2D_SBC_IE_ALLOC_MD_MSK     0x03    /* b1-b0 allocation mode */
60 #define A2D_SBC_IE_ALLOC_MD_S       0x02    /* b1: SNR */
61 #define A2D_SBC_IE_ALLOC_MD_L       0x01    /* b0: loundess */
62 
63 #define A2D_SBC_IE_MIN_BITPOOL      2
64 #define A2D_SBC_IE_MAX_BITPOOL      250
65 
66 /* for media payload header */
67 #define A2D_SBC_HDR_F_MSK           0x80
68 #define A2D_SBC_HDR_S_MSK           0x40
69 #define A2D_SBC_HDR_L_MSK           0x20
70 #define A2D_SBC_HDR_NUM_MSK         0x0F
71 
72 /*****************************************************************************
73 **  Type Definitions
74 *****************************************************************************/
75 
76 /* data type for the SBC Codec Information Element*/
77 typedef struct
78 {
79     UINT8   samp_freq;      /* Sampling frequency */
80     UINT8   ch_mode;        /* Channel mode */
81     UINT8   block_len;      /* Block length */
82     UINT8   num_subbands;   /* Number of subbands */
83     UINT8   alloc_mthd;     /* Allocation method */
84     UINT8   max_bitpool;    /* Maximum bitpool */
85     UINT8   min_bitpool;    /* Minimum bitpool */
86 } tA2D_SBC_CIE;
87 
88 
89 /*****************************************************************************
90 **  External Function Declarations
91 *****************************************************************************/
92 #ifdef __cplusplus
93 extern "C"
94 {
95 #endif
96 /******************************************************************************
97 **
98 ** Function         A2D_SbcChkFrInit
99 **
100 ** Description      check if need to init the descramble control block.
101 **
102 ** Returns          nothing.
103 ******************************************************************************/
104 extern void A2D_SbcChkFrInit(UINT8 *p_pkt);
105 
106 /******************************************************************************
107 **
108 ** Function         A2D_SbcDescramble
109 **
110 ** Description      descramble the packet.
111 **
112 ** Returns          nothing.
113 ******************************************************************************/
114 extern void A2D_SbcDescramble(UINT8 *p_pkt, UINT16 len);
115 
116 /******************************************************************************
117 **
118 ** Function         A2D_BldSbcInfo
119 **
120 ** Description      This function is called by an application to build
121 **                  the SBC Media Codec Capabilities byte sequence
122 **                  beginning from the LOSC octet.
123 **                  Input Parameters:
124 **                      media_type:  Indicates Audio, or Multimedia.
125 **
126 **                      p_ie:  The SBC Codec Information Element information.
127 **
128 **                  Output Parameters:
129 **                      p_result:  the resulting codec info byte sequence.
130 **
131 ** Returns          A2D_SUCCESS if function execution succeeded.
132 **                  Error status code, otherwise.
133 ******************************************************************************/
134 extern tA2D_STATUS A2D_BldSbcInfo(UINT8 media_type, tA2D_SBC_CIE *p_ie,
135                                   UINT8 *p_result);
136 
137 /******************************************************************************
138 **
139 ** Function         A2D_ParsSbcInfo
140 **
141 ** Description      This function is called by an application to parse
142 **                  the SBC Media Codec Capabilities byte sequence
143 **                  beginning from the LOSC octet.
144 **                  Input Parameters:
145 **                      p_info:  the byte sequence to parse.
146 **
147 **                      for_caps:  TRUE, if the byte sequence is for get capabilities response.
148 **
149 **                  Output Parameters:
150 **                      p_ie:  The SBC Codec Information Element information.
151 **
152 ** Returns          A2D_SUCCESS if function execution succeeded.
153 **                  Error status code, otherwise.
154 ******************************************************************************/
155 extern tA2D_STATUS A2D_ParsSbcInfo(tA2D_SBC_CIE *p_ie, UINT8 *p_info,
156                                    BOOLEAN for_caps);
157 
158 /******************************************************************************
159 **
160 ** Function         A2D_BldSbcMplHdr
161 **
162 ** Description      This function is called by an application to parse
163 **                  the SBC Media Payload header.
164 **                  Input Parameters:
165 **                      frag:  1, if fragmented. 0, otherwise.
166 **
167 **                      start:  1, if the starting packet of a fragmented frame.
168 **
169 **                      last:  1, if the last packet of a fragmented frame.
170 **
171 **                      num:  If frag is 1, this is the number of remaining fragments
172 **                            (including this fragment) of this frame.
173 **                            If frag is 0, this is the number of frames in this packet.
174 **
175 **                  Output Parameters:
176 **                      p_dst:  the resulting media payload header byte sequence.
177 **
178 ** Returns          void.
179 ******************************************************************************/
180 extern void A2D_BldSbcMplHdr(UINT8 *p_dst, BOOLEAN frag, BOOLEAN start,
181                              BOOLEAN last, UINT8 num);
182 
183 /******************************************************************************
184 **
185 ** Function         A2D_ParsSbcMplHdr
186 **
187 ** Description      This function is called by an application to parse
188 **                  the SBC Media Payload header.
189 **                  Input Parameters:
190 **                      p_src:  the byte sequence to parse..
191 **
192 **                  Output Parameters:
193 **                      frag:  1, if fragmented. 0, otherwise.
194 **
195 **                      start:  1, if the starting packet of a fragmented frame.
196 **
197 **                      last:  1, if the last packet of a fragmented frame.
198 **
199 **                      num:  If frag is 1, this is the number of remaining fragments
200 **                            (including this fragment) of this frame.
201 **                            If frag is 0, this is the number of frames in this packet.
202 **
203 ** Returns          void.
204 ******************************************************************************/
205 extern void A2D_ParsSbcMplHdr(UINT8 *p_src, BOOLEAN *p_frag,
206                               BOOLEAN *p_start, BOOLEAN *p_last,
207                               UINT8 *p_num);
208 #ifdef __cplusplus
209 }
210 #endif
211 
212 #endif /* A2D_SBC_H */
213