Mercurial > libavcodec.hg
annotate faad.c @ 2059:ad972ab280bc libavcodec
sample_rate and channels in aac audio patch by (Luca Abeni <lucabe72 at email dot it>)
author | michael |
---|---|
date | Sat, 05 Jun 2004 22:36:43 +0000 |
parents | d4525c3065d0 |
children | c28b03fea50f |
rev | line source |
---|---|
1245 | 1 /* |
2 * Faad decoder | |
3 * Copyright (c) 2003 Zdenek Kabelac. | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
4 * Copyright (c) 2004 Thomas Raivio. |
1245 | 5 * |
6 * This library is free software; you can redistribute it and/or | |
7 * modify it under the terms of the GNU Lesser General Public | |
8 * License as published by the Free Software Foundation; either | |
9 * version 2 of the License, or (at your option) any later version. | |
10 * | |
11 * This library is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * Lesser General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU Lesser General Public | |
17 * License along with this library; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 */ | |
20 | |
21 /** | |
22 * @file faad.c | |
23 * AAC decoder. | |
24 * | |
25 * still a bit unfinished - but it plays something | |
26 */ | |
27 | |
28 #include "avcodec.h" | |
29 #include "faad.h" | |
30 | |
31 /* | |
32 * when CONFIG_FAADBIN is defined the libfaad will be opened at runtime | |
33 */ | |
34 //#undef CONFIG_FAADBIN | |
35 //#define CONFIG_FAADBIN | |
36 | |
37 #ifdef CONFIG_FAADBIN | |
38 #include <dlfcn.h> | |
39 static const char* libfaadname = "libfaad.so.0"; | |
40 #else | |
41 #define dlopen(a) | |
42 #define dlclose(a) | |
43 #endif | |
44 | |
45 typedef struct { | |
46 void* handle; /* dlopen handle */ | |
47 void* faac_handle; /* FAAD library handle */ | |
48 int frame_size; | |
49 int sample_size; | |
50 int flags; | |
51 | |
52 /* faad calls */ | |
53 faacDecHandle FAADAPI (*faacDecOpen)(void); | |
54 faacDecConfigurationPtr FAADAPI (*faacDecGetCurrentConfiguration)(faacDecHandle hDecoder); | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
55 #ifndef FAAD2_VERSION |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
56 int FAADAPI (*faacDecSetConfiguration)(faacDecHandle hDecoder, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
57 faacDecConfigurationPtr config); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
58 int FAADAPI (*faacDecInit)(faacDecHandle hDecoder, |
1245 | 59 unsigned char *buffer, |
60 unsigned long *samplerate, | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
61 unsigned long *channels); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
62 int FAADAPI (*faacDecInit2)(faacDecHandle hDecoder, unsigned char *pBuffer, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
63 unsigned long SizeOfDecoderSpecificInfo, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
64 unsigned long *samplerate, unsigned long *channels); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
65 int FAADAPI (*faacDecDecode)(faacDecHandle hDecoder, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
66 unsigned char *buffer, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
67 unsigned long *bytesconsumed, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
68 short *sample_buffer, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
69 unsigned long *samples); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
70 #else |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
71 unsigned char FAADAPI (*faacDecSetConfiguration)(faacDecHandle hDecoder, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
72 faacDecConfigurationPtr config); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
73 long FAADAPI (*faacDecInit)(faacDecHandle hDecoder, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
74 unsigned char *buffer, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
75 unsigned long buffer_size, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
76 unsigned long *samplerate, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
77 unsigned char *channels); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
78 char FAADAPI (*faacDecInit2)(faacDecHandle hDecoder, unsigned char *pBuffer, |
1245 | 79 unsigned long SizeOfDecoderSpecificInfo, |
80 unsigned long *samplerate, unsigned char *channels); | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
81 void *FAADAPI (*faacDecDecode)(faacDecHandle hDecoder, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
82 faacDecFrameInfo *hInfo, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
83 unsigned char *buffer, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
84 unsigned long buffer_size); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
85 unsigned char* FAADAPI (*faacDecGetErrorMessage)(unsigned char errcode); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
86 #endif |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
87 |
1245 | 88 void FAADAPI (*faacDecClose)(faacDecHandle hDecoder); |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
89 |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
90 |
1245 | 91 } FAACContext; |
92 | |
93 static const unsigned long faac_srates[] = | |
94 { | |
95 96000, 88200, 64000, 48000, 44100, 32000, | |
96 24000, 22050, 16000, 12000, 11025, 8000 | |
97 }; | |
98 | |
99 static int faac_init_mp4(AVCodecContext *avctx) | |
100 { | |
101 FAACContext *s = (FAACContext *) avctx->priv_data; | |
102 unsigned long samplerate; | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
103 #ifndef FAAD2_VERSION |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
104 unsigned long channels; |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
105 #else |
1245 | 106 unsigned char channels; |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
107 #endif |
1245 | 108 int r = 0; |
109 | |
110 if (avctx->extradata) | |
111 r = s->faacDecInit2(s->faac_handle, (uint8_t*) avctx->extradata, | |
112 avctx->extradata_size, | |
113 &samplerate, &channels); | |
114 // else r = s->faacDecInit(s->faac_handle ... ); | |
115 | |
116 if (r < 0) | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
117 av_log(avctx, AV_LOG_ERROR, "faacDecInit2 failed r:%d sr:%ld ch:%ld s:%d\n", |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
118 r, samplerate, (long)channels, avctx->extradata_size); |
2059
ad972ab280bc
sample_rate and channels in aac audio patch by (Luca Abeni <lucabe72 at email dot it>)
michael
parents:
1929
diff
changeset
|
119 avctx->sample_rate = samplerate; |
ad972ab280bc
sample_rate and channels in aac audio patch by (Luca Abeni <lucabe72 at email dot it>)
michael
parents:
1929
diff
changeset
|
120 avctx->channels = channels; |
ad972ab280bc
sample_rate and channels in aac audio patch by (Luca Abeni <lucabe72 at email dot it>)
michael
parents:
1929
diff
changeset
|
121 |
1245 | 122 return r; |
123 } | |
124 | |
125 static int faac_init_aac(AVCodecContext *avctx) | |
126 { | |
127 return 0; | |
128 } | |
129 | |
130 static int faac_decode_frame(AVCodecContext *avctx, | |
131 void *data, int *data_size, | |
132 uint8_t *buf, int buf_size) | |
133 { | |
134 FAACContext *s = (FAACContext *) avctx->priv_data; | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
135 #ifndef FAAD2_VERSION |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
136 unsigned long bytesconsumed; |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
137 short *sample_buffer = NULL; |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
138 unsigned long samples; |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
139 int out; |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
140 #else |
1245 | 141 faacDecFrameInfo frame_info; |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
142 void *out; |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
143 #endif |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
144 if(buf_size == 0) |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
145 return 0; |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
146 #ifndef FAAD2_VERSION |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
147 out = s->faacDecDecode(s->faac_handle, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
148 (unsigned char*)buf, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
149 &bytesconsumed, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
150 data, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
151 &samples); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
152 samples *= s->sample_size; |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
153 if (data_size) |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
154 *data_size = samples; |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
155 return (buf_size < (int)bytesconsumed) |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
156 ? buf_size : (int)bytesconsumed; |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
157 #else |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
158 |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
159 out = s->faacDecDecode(s->faac_handle, &frame_info, (unsigned char*)buf, (unsigned long)buf_size); |
1245 | 160 |
161 if (frame_info.error > 0) { | |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1245
diff
changeset
|
162 av_log(avctx, AV_LOG_ERROR, "faac: frame decodinf failed: %s\n", |
1245 | 163 s->faacDecGetErrorMessage(frame_info.error)); |
164 return 0; | |
165 } | |
166 | |
167 frame_info.samples *= s->sample_size; | |
168 memcpy(data, out, frame_info.samples); // CHECKME - can we cheat this one | |
169 | |
170 if (data_size) | |
171 *data_size = frame_info.samples; | |
172 | |
173 return (buf_size < (int)frame_info.bytesconsumed) | |
174 ? buf_size : (int)frame_info.bytesconsumed; | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
175 #endif |
1245 | 176 } |
177 | |
178 static int faac_decode_end(AVCodecContext *avctx) | |
179 { | |
180 FAACContext *s = (FAACContext *) avctx->priv_data; | |
181 | |
182 if (s->faacDecClose) | |
183 s->faacDecClose(s->faac_handle); | |
184 | |
185 dlclose(s->handle); | |
186 return 0; | |
187 } | |
188 | |
189 static int faac_decode_init(AVCodecContext *avctx) | |
190 { | |
191 FAACContext *s = (FAACContext *) avctx->priv_data; | |
192 faacDecConfigurationPtr faac_cfg; | |
193 | |
194 #ifdef CONFIG_FAADBIN | |
195 const char* err = 0; | |
196 | |
197 s->handle = dlopen(libfaadname, RTLD_LAZY); | |
198 if (!s->handle) | |
199 { | |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1245
diff
changeset
|
200 av_log(avctx, AV_LOG_ERROR, "FAAD library: %s could not be opened! \n%s\n", |
1245 | 201 libfaadname, dlerror()); |
202 return -1; | |
203 } | |
204 #define dfaac(a, b) \ | |
205 do { static const char* n = "faacDec" #a; \ | |
206 if ((s->faacDec ## a = b dlsym( s->handle, n )) == NULL) { err = n; break; } } while(0) | |
207 for(;;) { | |
208 #else /* !CONFIG_FAADBIN */ | |
209 #define dfaac(a, b) s->faacDec ## a = faacDec ## a | |
210 #endif /* CONFIG_FAADBIN */ | |
211 | |
212 // resolve all needed function calls | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
213 dfaac(Open, (faacDecHandle FAADAPI (*)(void))); |
1245 | 214 dfaac(GetCurrentConfiguration, (faacDecConfigurationPtr |
215 FAADAPI (*)(faacDecHandle))); | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
216 #ifndef FAAD2_VERSION |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
217 dfaac(SetConfiguration, (int FAADAPI (*)(faacDecHandle, |
1245 | 218 faacDecConfigurationPtr))); |
219 | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
220 dfaac(Init, (int FAADAPI (*)(faacDecHandle, unsigned char*, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
221 unsigned long*, unsigned long*))); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
222 dfaac(Init2, (int FAADAPI (*)(faacDecHandle, unsigned char*, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
223 unsigned long, unsigned long*, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
224 unsigned long*))); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
225 dfaac(Close, (void FAADAPI (*)(faacDecHandle hDecoder))); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
226 dfaac(Decode, (int FAADAPI (*)(faacDecHandle, unsigned char*, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
227 unsigned long*, short*, unsigned long*))); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
228 #else |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
229 dfaac(SetConfiguration, (unsigned char FAADAPI (*)(faacDecHandle, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
230 faacDecConfigurationPtr))); |
1245 | 231 dfaac(Init, (long FAADAPI (*)(faacDecHandle, unsigned char*, |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
232 unsigned long, unsigned long*, unsigned char*))); |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
233 dfaac(Init2, (char FAADAPI (*)(faacDecHandle, unsigned char*, |
1245 | 234 unsigned long, unsigned long*, |
235 unsigned char*))); | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
236 dfaac(Decode, (void *FAADAPI (*)(faacDecHandle, faacDecFrameInfo*, |
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
237 unsigned char*, unsigned long))); |
1245 | 238 dfaac(GetErrorMessage, (unsigned char* FAADAPI (*)(unsigned char))); |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
239 #endif |
1245 | 240 #undef dfacc |
241 | |
242 #ifdef CONFIG_FAADBIN | |
243 break; | |
244 } | |
245 if (err) { | |
246 dlclose(s->handle); | |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1245
diff
changeset
|
247 av_log(avctx, AV_LOG_ERROR, "FAAD library: cannot resolve %s in %s!\n", |
1245 | 248 err, libfaadname); |
249 return -1; | |
250 } | |
251 #endif | |
252 | |
253 s->faac_handle = s->faacDecOpen(); | |
254 if (!s->faac_handle) { | |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1245
diff
changeset
|
255 av_log(avctx, AV_LOG_ERROR, "FAAD library: cannot create handler!\n"); |
1245 | 256 faac_decode_end(avctx); |
257 return -1; | |
258 } | |
259 | |
260 | |
261 faac_cfg = s->faacDecGetCurrentConfiguration(s->faac_handle); | |
262 | |
263 if (faac_cfg) { | |
264 switch (avctx->bits_per_sample) { | |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1245
diff
changeset
|
265 case 8: av_log(avctx, AV_LOG_ERROR, "FAADlib unsupported bps %d\n", avctx->bits_per_sample); break; |
1245 | 266 default: |
267 case 16: | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
268 #ifdef FAAD2_VERSION |
1245 | 269 faac_cfg->outputFormat = FAAD_FMT_16BIT; |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
270 #endif |
1245 | 271 s->sample_size = 2; |
272 break; | |
273 case 24: | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
274 #ifdef FAAD2_VERSION |
1245 | 275 faac_cfg->outputFormat = FAAD_FMT_24BIT; |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
276 #endif |
1245 | 277 s->sample_size = 3; |
278 break; | |
279 case 32: | |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
280 #ifdef FAAD2_VERSION |
1245 | 281 faac_cfg->outputFormat = FAAD_FMT_32BIT; |
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
282 #endif |
1245 | 283 s->sample_size = 4; |
284 break; | |
285 } | |
286 | |
287 faac_cfg->defSampleRate = (!avctx->sample_rate) ? 44100 : avctx->sample_rate; | |
288 faac_cfg->defObjectType = LC; | |
289 } | |
290 | |
291 s->faacDecSetConfiguration(s->faac_handle, faac_cfg); | |
292 | |
293 faac_init_mp4(avctx); | |
294 | |
295 return 0; | |
296 } | |
297 | |
298 #define AAC_CODEC(id, name) \ | |
299 AVCodec name ## _decoder = { \ | |
300 #name, \ | |
301 CODEC_TYPE_AUDIO, \ | |
302 id, \ | |
303 sizeof(FAACContext), \ | |
304 faac_decode_init, \ | |
305 NULL, \ | |
306 faac_decode_end, \ | |
307 faac_decode_frame, \ | |
308 } | |
309 | |
310 // FIXME - raw AAC files - maybe just one entry will be enough | |
311 AAC_CODEC(CODEC_ID_AAC, aac); | |
312 // If it's mp4 file - usually embeded into Qt Mov | |
313 AAC_CODEC(CODEC_ID_MPEG4AAC, mpeg4aac); | |
314 | |
315 #undef AAC_CODEC |