annotate faad.c @ 3014:959b8ad880dc libavcodec

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