Mercurial > libavcodec.hg
annotate libfaad.c @ 6150:49a4e4d78692 libavcodec
pqindex=0 is forbidden
| author | kostya |
|---|---|
| date | Wed, 16 Jan 2008 17:07:34 +0000 |
| parents | 49d225414a3f |
| children | 3544e992b60b |
| 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 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3164
diff
changeset
|
6 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3164
diff
changeset
|
7 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3164
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
| 1245 | 9 * modify it under the terms of the GNU Lesser General Public |
| 10 * License as published by the Free Software Foundation; either | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3164
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
| 1245 | 12 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3164
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
| 1245 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 16 * Lesser General Public License for more details. | |
| 17 * | |
| 18 * You should have received a copy of the GNU Lesser General Public | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3164
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
|
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 1245 | 21 */ |
| 22 | |
| 23 /** | |
| 24 * @file faad.c | |
| 25 * AAC decoder. | |
| 26 * | |
| 27 * still a bit unfinished - but it plays something | |
| 28 */ | |
| 29 | |
| 30 #include "avcodec.h" | |
| 31 #include "faad.h" | |
| 32 | |
|
2061
c28b03fea50f
Building with faad2-cvs fix by ("Steven M. Schultz" <sms at 2bsd dot com>)
michael
parents:
2059
diff
changeset
|
33 #ifndef FAADAPI |
|
c28b03fea50f
Building with faad2-cvs fix by ("Steven M. Schultz" <sms at 2bsd dot com>)
michael
parents:
2059
diff
changeset
|
34 #define FAADAPI |
|
c28b03fea50f
Building with faad2-cvs fix by ("Steven M. Schultz" <sms at 2bsd dot com>)
michael
parents:
2059
diff
changeset
|
35 #endif |
|
c28b03fea50f
Building with faad2-cvs fix by ("Steven M. Schultz" <sms at 2bsd dot com>)
michael
parents:
2059
diff
changeset
|
36 |
| 1245 | 37 /* |
|
4336
b7caa9237018
Rename variables: faad --> libfaad, faac --> libfaac, faadbin --> libfaadbin
diego
parents:
4163
diff
changeset
|
38 * when CONFIG_LIBFAADBIN is defined the libfaad will be opened at runtime |
| 1245 | 39 */ |
|
4336
b7caa9237018
Rename variables: faad --> libfaad, faac --> libfaac, faadbin --> libfaadbin
diego
parents:
4163
diff
changeset
|
40 //#undef CONFIG_LIBFAADBIN |
|
b7caa9237018
Rename variables: faad --> libfaad, faac --> libfaac, faadbin --> libfaadbin
diego
parents:
4163
diff
changeset
|
41 //#define CONFIG_LIBFAADBIN |
| 1245 | 42 |
|
4336
b7caa9237018
Rename variables: faad --> libfaad, faac --> libfaac, faadbin --> libfaadbin
diego
parents:
4163
diff
changeset
|
43 #ifdef CONFIG_LIBFAADBIN |
| 1245 | 44 #include <dlfcn.h> |
| 45 static const char* libfaadname = "libfaad.so.0"; | |
| 46 #else | |
| 47 #define dlopen(a) | |
| 48 #define dlclose(a) | |
| 49 #endif | |
| 50 | |
| 51 typedef struct { | |
| 2979 | 52 void* handle; /* dlopen handle */ |
| 53 void* faac_handle; /* FAAD library handle */ | |
| 1245 | 54 int sample_size; |
| 3097 | 55 int init; |
| 1245 | 56 |
| 57 /* faad calls */ | |
| 58 faacDecHandle FAADAPI (*faacDecOpen)(void); | |
| 59 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
|
60 #ifndef FAAD2_VERSION |
| 2979 | 61 int FAADAPI (*faacDecSetConfiguration)(faacDecHandle hDecoder, |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
62 faacDecConfigurationPtr config); |
| 2979 | 63 int FAADAPI (*faacDecInit)(faacDecHandle hDecoder, |
| 64 unsigned char *buffer, | |
| 65 unsigned long *samplerate, | |
| 66 unsigned long *channels); | |
| 67 int FAADAPI (*faacDecInit2)(faacDecHandle hDecoder, unsigned char *pBuffer, | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
68 unsigned long SizeOfDecoderSpecificInfo, |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
69 unsigned long *samplerate, unsigned long *channels); |
| 2979 | 70 int FAADAPI (*faacDecDecode)(faacDecHandle hDecoder, |
| 71 unsigned char *buffer, | |
| 72 unsigned long *bytesconsumed, | |
| 73 short *sample_buffer, | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
74 unsigned long *samples); |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
75 #else |
| 2979 | 76 unsigned char FAADAPI (*faacDecSetConfiguration)(faacDecHandle hDecoder, |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
77 faacDecConfigurationPtr config); |
| 2979 | 78 long FAADAPI (*faacDecInit)(faacDecHandle hDecoder, |
| 79 unsigned char *buffer, | |
| 80 unsigned long buffer_size, | |
| 81 unsigned long *samplerate, | |
| 82 unsigned char *channels); | |
| 83 char FAADAPI (*faacDecInit2)(faacDecHandle hDecoder, unsigned char *pBuffer, | |
| 1245 | 84 unsigned long SizeOfDecoderSpecificInfo, |
| 85 unsigned long *samplerate, unsigned char *channels); | |
| 2979 | 86 void *FAADAPI (*faacDecDecode)(faacDecHandle hDecoder, |
| 87 faacDecFrameInfo *hInfo, | |
| 88 unsigned char *buffer, | |
| 89 unsigned long buffer_size); | |
| 90 char* FAADAPI (*faacDecGetErrorMessage)(unsigned char errcode); | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
91 #endif |
| 2967 | 92 |
| 1245 | 93 void FAADAPI (*faacDecClose)(faacDecHandle hDecoder); |
| 2967 | 94 |
| 95 | |
| 1245 | 96 } FAACContext; |
| 97 | |
| 98 static const unsigned long faac_srates[] = | |
| 99 { | |
| 100 96000, 88200, 64000, 48000, 44100, 32000, | |
| 101 24000, 22050, 16000, 12000, 11025, 8000 | |
| 102 }; | |
| 103 | |
| 6119 | 104 static void channel_setup(AVCodecContext *avctx) |
| 105 { | |
| 106 #ifdef FAAD2_VERSION | |
| 107 FAACContext *s = avctx->priv_data; | |
| 108 if (avctx->request_channels > 0 && avctx->request_channels == 2 && | |
| 109 avctx->request_channels < avctx->channels) { | |
| 110 faacDecConfigurationPtr faac_cfg; | |
| 111 avctx->channels = 2; | |
| 112 faac_cfg = s->faacDecGetCurrentConfiguration(s->faac_handle); | |
| 113 faac_cfg->downMatrix = 1; | |
| 114 s->faacDecSetConfiguration(s->faac_handle, faac_cfg); | |
| 115 } | |
| 116 #endif | |
| 117 } | |
| 118 | |
| 1245 | 119 static int faac_init_mp4(AVCodecContext *avctx) |
| 120 { | |
| 4827 | 121 FAACContext *s = avctx->priv_data; |
| 1245 | 122 unsigned long samplerate; |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
123 #ifndef FAAD2_VERSION |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
124 unsigned long channels; |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
125 #else |
| 1245 | 126 unsigned char channels; |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
127 #endif |
| 1245 | 128 int r = 0; |
| 129 | |
| 3097 | 130 if (avctx->extradata){ |
| 2979 | 131 r = s->faacDecInit2(s->faac_handle, (uint8_t*) avctx->extradata, |
| 132 avctx->extradata_size, | |
| 133 &samplerate, &channels); | |
| 3097 | 134 if (r < 0){ |
| 135 av_log(avctx, AV_LOG_ERROR, | |
| 136 "faacDecInit2 failed r:%d sr:%ld ch:%ld s:%d\n", | |
| 137 r, samplerate, (long)channels, avctx->extradata_size); | |
| 138 } else { | |
| 139 avctx->sample_rate = samplerate; | |
| 140 avctx->channels = channels; | |
| 6119 | 141 channel_setup(avctx); |
| 3097 | 142 s->init = 1; |
| 143 } | |
| 144 } | |
|
2059
ad972ab280bc
sample_rate and channels in aac audio patch by (Luca Abeni <lucabe72 at email dot it>)
michael
parents:
1929
diff
changeset
|
145 |
| 1245 | 146 return r; |
| 147 } | |
| 148 | |
| 149 static int faac_decode_frame(AVCodecContext *avctx, | |
| 150 void *data, int *data_size, | |
| 151 uint8_t *buf, int buf_size) | |
| 152 { | |
| 4827 | 153 FAACContext *s = avctx->priv_data; |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
154 #ifndef FAAD2_VERSION |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
155 unsigned long bytesconsumed; |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
156 short *sample_buffer = NULL; |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
157 unsigned long samples; |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
158 int out; |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
159 #else |
| 1245 | 160 faacDecFrameInfo frame_info; |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
161 void *out; |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
162 #endif |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
163 if(buf_size == 0) |
| 2979 | 164 return 0; |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
165 #ifndef FAAD2_VERSION |
| 2967 | 166 out = s->faacDecDecode(s->faac_handle, |
| 167 (unsigned char*)buf, | |
| 168 &bytesconsumed, | |
| 169 data, | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
170 &samples); |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
171 samples *= s->sample_size; |
|
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
172 if (data_size) |
| 2979 | 173 *data_size = samples; |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
174 return (buf_size < (int)bytesconsumed) |
| 2979 | 175 ? buf_size : (int)bytesconsumed; |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
176 #else |
| 2967 | 177 |
| 3097 | 178 if(!s->init){ |
| 179 unsigned long srate; | |
| 180 unsigned char channels; | |
| 3155 | 181 int r = s->faacDecInit(s->faac_handle, buf, buf_size, &srate, &channels); |
| 3097 | 182 if(r < 0){ |
| 183 av_log(avctx, AV_LOG_ERROR, "faac: codec init failed: %s\n", | |
| 184 s->faacDecGetErrorMessage(frame_info.error)); | |
|
3164
d771383fbcb8
Make faac_decode_frame return -1 on error and not 0 which avoids
mru
parents:
3155
diff
changeset
|
185 return -1; |
| 3097 | 186 } |
| 187 avctx->sample_rate = srate; | |
| 188 avctx->channels = channels; | |
| 6119 | 189 channel_setup(avctx); |
| 3097 | 190 s->init = 1; |
| 191 } | |
| 192 | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
193 out = s->faacDecDecode(s->faac_handle, &frame_info, (unsigned char*)buf, (unsigned long)buf_size); |
| 1245 | 194 |
| 195 if (frame_info.error > 0) { | |
| 2979 | 196 av_log(avctx, AV_LOG_ERROR, "faac: frame decoding failed: %s\n", |
| 197 s->faacDecGetErrorMessage(frame_info.error)); | |
|
3164
d771383fbcb8
Make faac_decode_frame return -1 on error and not 0 which avoids
mru
parents:
3155
diff
changeset
|
198 return -1; |
| 1245 | 199 } |
| 200 | |
| 201 frame_info.samples *= s->sample_size; | |
| 202 memcpy(data, out, frame_info.samples); // CHECKME - can we cheat this one | |
| 203 | |
| 204 if (data_size) | |
| 2979 | 205 *data_size = frame_info.samples; |
| 1245 | 206 |
| 207 return (buf_size < (int)frame_info.bytesconsumed) | |
| 2979 | 208 ? 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
|
209 #endif |
| 1245 | 210 } |
| 211 | |
| 212 static int faac_decode_end(AVCodecContext *avctx) | |
| 213 { | |
| 4827 | 214 FAACContext *s = avctx->priv_data; |
| 1245 | 215 |
| 4753 | 216 s->faacDecClose(s->faac_handle); |
| 1245 | 217 |
| 218 dlclose(s->handle); | |
| 219 return 0; | |
| 220 } | |
| 221 | |
| 222 static int faac_decode_init(AVCodecContext *avctx) | |
| 223 { | |
| 4827 | 224 FAACContext *s = avctx->priv_data; |
| 1245 | 225 faacDecConfigurationPtr faac_cfg; |
| 226 | |
|
4336
b7caa9237018
Rename variables: faad --> libfaad, faac --> libfaac, faadbin --> libfaadbin
diego
parents:
4163
diff
changeset
|
227 #ifdef CONFIG_LIBFAADBIN |
| 1245 | 228 const char* err = 0; |
| 229 | |
| 230 s->handle = dlopen(libfaadname, RTLD_LAZY); | |
| 231 if (!s->handle) | |
| 232 { | |
| 2979 | 233 av_log(avctx, AV_LOG_ERROR, "FAAD library: %s could not be opened! \n%s\n", |
| 234 libfaadname, dlerror()); | |
| 1245 | 235 return -1; |
| 236 } | |
| 237 #define dfaac(a, b) \ | |
| 238 do { static const char* n = "faacDec" #a; \ | |
| 239 if ((s->faacDec ## a = b dlsym( s->handle, n )) == NULL) { err = n; break; } } while(0) | |
| 240 for(;;) { | |
|
4336
b7caa9237018
Rename variables: faad --> libfaad, faac --> libfaac, faadbin --> libfaadbin
diego
parents:
4163
diff
changeset
|
241 #else /* !CONFIG_LIBFAADBIN */ |
| 1245 | 242 #define dfaac(a, b) s->faacDec ## a = faacDec ## a |
|
4336
b7caa9237018
Rename variables: faad --> libfaad, faac --> libfaac, faadbin --> libfaadbin
diego
parents:
4163
diff
changeset
|
243 #endif /* CONFIG_LIBFAADBIN */ |
| 1245 | 244 |
| 245 // resolve all needed function calls | |
| 2979 | 246 dfaac(Open, (faacDecHandle FAADAPI (*)(void))); |
| 4753 | 247 dfaac(Close, (void FAADAPI (*)(faacDecHandle hDecoder))); |
| 2979 | 248 dfaac(GetCurrentConfiguration, (faacDecConfigurationPtr |
| 249 FAADAPI (*)(faacDecHandle))); | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
250 #ifndef FAAD2_VERSION |
| 2979 | 251 dfaac(SetConfiguration, (int FAADAPI (*)(faacDecHandle, |
| 252 faacDecConfigurationPtr))); | |
| 1245 | 253 |
| 2979 | 254 dfaac(Init, (int FAADAPI (*)(faacDecHandle, unsigned char*, |
| 255 unsigned long*, unsigned long*))); | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
256 dfaac(Init2, (int FAADAPI (*)(faacDecHandle, unsigned char*, |
| 2979 | 257 unsigned long, unsigned long*, |
| 258 unsigned long*))); | |
| 259 dfaac(Decode, (int FAADAPI (*)(faacDecHandle, unsigned char*, | |
| 260 unsigned long*, short*, unsigned long*))); | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
261 #else |
| 2979 | 262 dfaac(SetConfiguration, (unsigned char FAADAPI (*)(faacDecHandle, |
| 263 faacDecConfigurationPtr))); | |
| 264 dfaac(Init, (long FAADAPI (*)(faacDecHandle, unsigned char*, | |
| 265 unsigned long, unsigned long*, unsigned char*))); | |
| 266 dfaac(Init2, (char FAADAPI (*)(faacDecHandle, unsigned char*, | |
| 267 unsigned long, unsigned long*, | |
| 268 unsigned char*))); | |
| 269 dfaac(Decode, (void *FAADAPI (*)(faacDecHandle, faacDecFrameInfo*, | |
| 270 unsigned char*, unsigned long))); | |
| 271 dfaac(GetErrorMessage, (char* FAADAPI (*)(unsigned char))); | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
272 #endif |
| 1245 | 273 #undef dfacc |
| 274 | |
|
4336
b7caa9237018
Rename variables: faad --> libfaad, faac --> libfaac, faadbin --> libfaadbin
diego
parents:
4163
diff
changeset
|
275 #ifdef CONFIG_LIBFAADBIN |
| 1245 | 276 break; |
| 277 } | |
| 278 if (err) { | |
| 279 dlclose(s->handle); | |
| 2979 | 280 av_log(avctx, AV_LOG_ERROR, "FAAD library: cannot resolve %s in %s!\n", |
| 281 err, libfaadname); | |
| 1245 | 282 return -1; |
| 283 } | |
| 284 #endif | |
| 285 | |
| 286 s->faac_handle = s->faacDecOpen(); | |
| 287 if (!s->faac_handle) { | |
|
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1245
diff
changeset
|
288 av_log(avctx, AV_LOG_ERROR, "FAAD library: cannot create handler!\n"); |
| 1245 | 289 faac_decode_end(avctx); |
| 290 return -1; | |
| 291 } | |
| 292 | |
| 293 | |
| 294 faac_cfg = s->faacDecGetCurrentConfiguration(s->faac_handle); | |
| 295 | |
| 296 if (faac_cfg) { | |
| 2979 | 297 switch (avctx->bits_per_sample) { |
| 298 case 8: av_log(avctx, AV_LOG_ERROR, "FAADlib unsupported bps %d\n", avctx->bits_per_sample); break; | |
| 299 default: | |
| 300 case 16: | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
301 #ifdef FAAD2_VERSION |
| 2979 | 302 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
|
303 #endif |
| 2979 | 304 s->sample_size = 2; |
| 305 break; | |
| 306 case 24: | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
307 #ifdef FAAD2_VERSION |
| 2979 | 308 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
|
309 #endif |
| 2979 | 310 s->sample_size = 3; |
| 311 break; | |
| 312 case 32: | |
|
1929
d4525c3065d0
aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents:
1602
diff
changeset
|
313 #ifdef FAAD2_VERSION |
| 2979 | 314 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
|
315 #endif |
| 2979 | 316 s->sample_size = 4; |
| 317 break; | |
| 318 } | |
| 1245 | 319 |
| 2979 | 320 faac_cfg->defSampleRate = (!avctx->sample_rate) ? 44100 : avctx->sample_rate; |
| 321 faac_cfg->defObjectType = LC; | |
| 1245 | 322 } |
| 323 | |
| 324 s->faacDecSetConfiguration(s->faac_handle, faac_cfg); | |
| 325 | |
| 326 faac_init_mp4(avctx); | |
| 327 | |
| 6119 | 328 if(!s->init && avctx->channels > 0) |
| 329 channel_setup(avctx); | |
| 330 | |
| 1245 | 331 return 0; |
| 332 } | |
| 333 | |
| 334 #define AAC_CODEC(id, name) \ | |
| 335 AVCodec name ## _decoder = { \ | |
| 336 #name, \ | |
| 337 CODEC_TYPE_AUDIO, \ | |
| 338 id, \ | |
| 339 sizeof(FAACContext), \ | |
| 340 faac_decode_init, \ | |
| 341 NULL, \ | |
| 342 faac_decode_end, \ | |
| 343 faac_decode_frame, \ | |
| 344 } | |
| 345 | |
| 346 // FIXME - raw AAC files - maybe just one entry will be enough | |
|
5092
fd173be649b7
Rename aac_decoder to libfaad_decoder for consistency and to be able to
diego
parents:
4827
diff
changeset
|
347 AAC_CODEC(CODEC_ID_AAC, libfaad); |
|
4163
1e8621844040
get rid of CODEC_ID_MPEG4AAC after next version bump, and change it to CODEC_ID_AAC where used
bcoudurier
parents:
3947
diff
changeset
|
348 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0) |
| 1245 | 349 // If it's mp4 file - usually embeded into Qt Mov |
| 350 AAC_CODEC(CODEC_ID_MPEG4AAC, mpeg4aac); | |
|
4163
1e8621844040
get rid of CODEC_ID_MPEG4AAC after next version bump, and change it to CODEC_ID_AAC where used
bcoudurier
parents:
3947
diff
changeset
|
351 #endif |
| 1245 | 352 |
| 353 #undef AAC_CODEC |
