1 /*
2  *
3  *  BlueZ - Bluetooth protocol stack for Linux
4  *
5  *  Copyright (C) 2006-2010  Nokia Corporation
6  *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
7  *
8  *
9  *  This library is free software; you can redistribute it and/or
10  *  modify it under the terms of the GNU Lesser General Public
11  *  License as published by the Free Software Foundation; either
12  *  version 2.1 of the License, or (at your option) any later version.
13  *
14  *  This library is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  *  Lesser General Public License for more details.
18  *
19  *  You should have received a copy of the GNU Lesser General Public
20  *  License along with this library; if not, write to the Free Software
21  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
22  *
23  */
24 
25 #ifndef __GST_BLUEZ_A2DP_CODECS_H_INCLUDED__
26 #define __GST_BLUEZ_A2DP_CODECS_H_INCLUDED__
27 
28 #include <glib.h>
29 
30 #define A2DP_CODEC_SBC			0x00
31 #define A2DP_CODEC_MPEG12		0x01
32 #define A2DP_CODEC_MPEG24		0x02
33 #define A2DP_CODEC_ATRAC		0x03
34 #define A2DP_CODEC_VENDOR		0xFF
35 
36 #define SBC_SAMPLING_FREQ_16000		(1 << 3)
37 #define SBC_SAMPLING_FREQ_32000		(1 << 2)
38 #define SBC_SAMPLING_FREQ_44100		(1 << 1)
39 #define SBC_SAMPLING_FREQ_48000		1
40 
41 #define SBC_CHANNEL_MODE_MONO		(1 << 3)
42 #define SBC_CHANNEL_MODE_DUAL_CHANNEL	(1 << 2)
43 #define SBC_CHANNEL_MODE_STEREO		(1 << 1)
44 #define SBC_CHANNEL_MODE_JOINT_STEREO	1
45 
46 #define SBC_BLOCK_LENGTH_4		(1 << 3)
47 #define SBC_BLOCK_LENGTH_8		(1 << 2)
48 #define SBC_BLOCK_LENGTH_12		(1 << 1)
49 #define SBC_BLOCK_LENGTH_16		1
50 
51 #define SBC_SUBBANDS_4			(1 << 1)
52 #define SBC_SUBBANDS_8			1
53 
54 #define SBC_ALLOCATION_SNR		(1 << 1)
55 #define SBC_ALLOCATION_LOUDNESS		1
56 
57 #define MAX_BITPOOL 64
58 #define MIN_BITPOOL 2
59 
60 #define MPEG_CHANNEL_MODE_MONO		(1 << 3)
61 #define MPEG_CHANNEL_MODE_DUAL_CHANNEL	(1 << 2)
62 #define MPEG_CHANNEL_MODE_STEREO	(1 << 1)
63 #define MPEG_CHANNEL_MODE_JOINT_STEREO	1
64 
65 #define MPEG_LAYER_MP1			(1 << 2)
66 #define MPEG_LAYER_MP2			(1 << 1)
67 #define MPEG_LAYER_MP3			1
68 
69 #define MPEG_SAMPLING_FREQ_16000	(1 << 5)
70 #define MPEG_SAMPLING_FREQ_22050	(1 << 4)
71 #define MPEG_SAMPLING_FREQ_24000	(1 << 3)
72 #define MPEG_SAMPLING_FREQ_32000	(1 << 2)
73 #define MPEG_SAMPLING_FREQ_44100	(1 << 1)
74 #define MPEG_SAMPLING_FREQ_48000	1
75 
76 #define MPEG_BIT_RATE_VBR		0x8000
77 #define MPEG_BIT_RATE_320000		0x4000
78 #define MPEG_BIT_RATE_256000		0x2000
79 #define MPEG_BIT_RATE_224000		0x1000
80 #define MPEG_BIT_RATE_192000		0x0800
81 #define MPEG_BIT_RATE_160000		0x0400
82 #define MPEG_BIT_RATE_128000		0x0200
83 #define MPEG_BIT_RATE_112000		0x0100
84 #define MPEG_BIT_RATE_96000		0x0080
85 #define MPEG_BIT_RATE_80000		0x0040
86 #define MPEG_BIT_RATE_64000		0x0020
87 #define MPEG_BIT_RATE_56000		0x0010
88 #define MPEG_BIT_RATE_48000		0x0008
89 #define MPEG_BIT_RATE_40000		0x0004
90 #define MPEG_BIT_RATE_32000		0x0002
91 #define MPEG_BIT_RATE_FREE		0x0001
92 
93 #define AAC_OBJECT_TYPE_MPEG2_AAC_LC		0x80
94 #define AAC_OBJECT_TYPE_MPEG4_AAC_LC		0x40
95 #define AAC_OBJECT_TYPE_MPEG4_AAC_LTP		0x20
96 #define AAC_OBJECT_TYPE_MPEG4_AAC_SCALABLE	0x10
97 
98 #define AAC_SAMPLING_FREQ_8000		0x0800
99 #define AAC_SAMPLING_FREQ_11025		0x0400
100 #define AAC_SAMPLING_FREQ_12000		0x0200
101 #define AAC_SAMPLING_FREQ_16000		0x0100
102 #define AAC_SAMPLING_FREQ_22050		0x0080
103 #define AAC_SAMPLING_FREQ_24000		0x0040
104 #define AAC_SAMPLING_FREQ_32000		0x0020
105 #define AAC_SAMPLING_FREQ_44100		0x0010
106 #define AAC_SAMPLING_FREQ_48000		0x0008
107 #define AAC_SAMPLING_FREQ_64000		0x0004
108 #define AAC_SAMPLING_FREQ_88200		0x0002
109 #define AAC_SAMPLING_FREQ_96000		0x0001
110 
111 #define AAC_CHANNELS_1		0x02
112 #define AAC_CHANNELS_2		0x01
113 
114 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
115 
116 typedef struct {
117 	uint8_t channel_mode:4;
118 	uint8_t frequency:4;
119 	uint8_t allocation_method:2;
120 	uint8_t subbands:2;
121 	uint8_t block_length:4;
122 	uint8_t min_bitpool;
123 	uint8_t max_bitpool;
124 } __attribute__ ((packed)) a2dp_sbc_t;
125 
126 typedef struct {
127 	uint8_t channel_mode:4;
128 	uint8_t crc:1;
129 	uint8_t layer:3;
130 	uint8_t frequency:6;
131 	uint8_t mpf:1;
132 	uint8_t rfa:1;
133 	uint16_t bitrate;
134 } __attribute__ ((packed)) a2dp_mpeg_t;
135 
136 typedef struct {
137 	uint8_t object_type;
138 	uint16_t frequency;
139 	uint8_t rfa;
140 	uint8_t channels;
141 	uint8_t vbr;
142 	uint32_t bitrate;
143 } __attribute__ ((packed)) a2dp_aac_t;
144 
145 #elif G_BYTE_ORDER == G_BIG_ENDIAN
146 
147 typedef struct {
148 	uint8_t frequency:4;
149 	uint8_t channel_mode:4;
150 	uint8_t block_length:4;
151 	uint8_t subbands:2;
152 	uint8_t allocation_method:2;
153 	uint8_t min_bitpool;
154 	uint8_t max_bitpool;
155 } __attribute__ ((packed)) a2dp_sbc_t;
156 
157 typedef struct {
158 	uint8_t layer:3;
159 	uint8_t crc:1;
160 	uint8_t channel_mode:4;
161 	uint8_t rfa:1;
162 	uint8_t mpf:1;
163 	uint8_t frequency:6;
164 	uint16_t bitrate;
165 } __attribute__ ((packed)) a2dp_mpeg_t;
166 
167 typedef struct {
168 	uint8_t object_type;
169 	uint16_t frequency:12;
170 	uint8_t channels:2;
171 	uint8_t rfa:2;
172 	uint8_t vbr:1;
173 	uint32_t bitrate:23;
174 } __attribute__ ((packed)) a2dp_aac_t;
175 
176 #else
177 #error "Unknown byte order"
178 #endif
179 
180 typedef struct {
181 	uint8_t vendor_id[4];
182 	uint8_t codec_id[2];
183 } __attribute__ ((packed)) a2dp_vendor_codec_t;
184 
185 #endif /* #define __GST_BLUEZ_A2DP_CODECS_H_INCLUDED__ */
186