annotate faad.c @ 2504:f12657081093 libavcodec

INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org) This patch adds the support for INTRA PCM macroblocks in CAVLC and CABAC mode, the deblocking needed a small modification and so did the intra4x4_pred_mode prediction. With this patch, the 5 streams of the conformance suite containing INTRA PCM macroblocks now decode entirely, 4 are completely corrects, 1 is incorrect since the first B slice because of deblocking in B slice not yet implemented. The code is not optimized for speed, it is not necessary IPCM macroblocks are rare, but it could be optimized for code size, if someone want to do this, feel free.
author michael
date Mon, 07 Feb 2005 00:10:28 +0000
parents c28b03fea50f
children e25782262d7d
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 {
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
50 void* handle; /* dlopen handle */
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
51 void* faac_handle; /* FAAD library handle */
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
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
60 int FAADAPI (*faacDecSetConfiguration)(faacDecHandle hDecoder,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
61 faacDecConfigurationPtr config);
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
62 int FAADAPI (*faacDecInit)(faacDecHandle hDecoder,
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
63 unsigned char *buffer,
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
64 unsigned long *samplerate,
1929
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
65 unsigned long *channels);
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
66 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
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);
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
69 int FAADAPI (*faacDecDecode)(faacDecHandle hDecoder,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
70 unsigned char *buffer,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
71 unsigned long *bytesconsumed,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
72 short *sample_buffer,
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
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
75 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
76 faacDecConfigurationPtr config);
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
77 long FAADAPI (*faacDecInit)(faacDecHandle hDecoder,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
78 unsigned char *buffer,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
79 unsigned long buffer_size,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
80 unsigned long *samplerate,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
81 unsigned char *channels);
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
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);
1929
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
85 void *FAADAPI (*faacDecDecode)(faacDecHandle hDecoder,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
86 faacDecFrameInfo *hInfo,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
87 unsigned char *buffer,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
88 unsigned long buffer_size);
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
89 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
90 #endif
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
91
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
92 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
93
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
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)
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
115 r = s->faacDecInit2(s->faac_handle, (uint8_t*) avctx->extradata,
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
116 avctx->extradata_size,
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
117 &samplerate, &channels);
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)
1929
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
121 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
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_init_aac(AVCodecContext *avctx)
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
130 {
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
131 return 0;
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
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
134 static int faac_decode_frame(AVCodecContext *avctx,
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
135 void *data, int *data_size,
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
136 uint8_t *buf, int buf_size)
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
137 {
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
138 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
139 #ifndef FAAD2_VERSION
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
140 unsigned long bytesconsumed;
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
141 short *sample_buffer = NULL;
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
142 unsigned long samples;
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
143 int out;
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
144 #else
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
145 faacDecFrameInfo frame_info;
1929
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
146 void *out;
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
147 #endif
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
148 if(buf_size == 0)
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
149 return 0;
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
150 #ifndef FAAD2_VERSION
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
151 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
152 (unsigned char*)buf,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
153 &bytesconsumed,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
154 data,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
155 &samples);
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
156 samples *= s->sample_size;
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
157 if (data_size)
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
158 *data_size = samples;
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
159 return (buf_size < (int)bytesconsumed)
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
160 ? buf_size : (int)bytesconsumed;
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
161 #else
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
162
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
163 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
164
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
165 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
166 av_log(avctx, AV_LOG_ERROR, "faac: frame decodinf failed: %s\n",
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
167 s->faacDecGetErrorMessage(frame_info.error));
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
168 return 0;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
169 }
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
170
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
171 frame_info.samples *= s->sample_size;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
172 memcpy(data, out, frame_info.samples); // CHECKME - can we cheat this one
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
173
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
174 if (data_size)
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
175 *data_size = frame_info.samples;
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 return (buf_size < (int)frame_info.bytesconsumed)
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
178 ? 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
179 #endif
1245
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
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
182 static int faac_decode_end(AVCodecContext *avctx)
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 FAACContext *s = (FAACContext *) avctx->priv_data;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
185
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
186 if (s->faacDecClose)
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
187 s->faacDecClose(s->faac_handle);
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
188
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
189 dlclose(s->handle);
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
190 return 0;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
191 }
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 static int faac_decode_init(AVCodecContext *avctx)
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
194 {
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
195 FAACContext *s = (FAACContext *) avctx->priv_data;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
196 faacDecConfigurationPtr faac_cfg;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
197
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
198 #ifdef CONFIG_FAADBIN
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
199 const char* err = 0;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
200
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
201 s->handle = dlopen(libfaadname, RTLD_LAZY);
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
202 if (!s->handle)
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
203 {
1602
fdb8244da1e5 av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1245
diff changeset
204 av_log(avctx, AV_LOG_ERROR, "FAAD library: %s could not be opened! \n%s\n",
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
205 libfaadname, dlerror());
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
206 return -1;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
207 }
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
208 #define dfaac(a, b) \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
209 do { static const char* n = "faacDec" #a; \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
210 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
211 for(;;) {
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
212 #else /* !CONFIG_FAADBIN */
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
213 #define dfaac(a, b) s->faacDec ## a = faacDec ## a
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
214 #endif /* CONFIG_FAADBIN */
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
215
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
216 // 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
217 dfaac(Open, (faacDecHandle FAADAPI (*)(void)));
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
218 dfaac(GetCurrentConfiguration, (faacDecConfigurationPtr
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
219 FAADAPI (*)(faacDecHandle)));
1929
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
220 #ifndef FAAD2_VERSION
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
221 dfaac(SetConfiguration, (int FAADAPI (*)(faacDecHandle,
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
222 faacDecConfigurationPtr)));
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
223
1929
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
224 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
225 unsigned long*, unsigned long*)));
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
226 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
227 unsigned long, unsigned long*,
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
228 unsigned long*)));
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
229 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
230 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
231 unsigned long*, short*, unsigned long*)));
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
232 #else
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
233 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
234 faacDecConfigurationPtr)));
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
235 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
236 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
237 dfaac(Init2, (char FAADAPI (*)(faacDecHandle, unsigned char*,
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
238 unsigned long, unsigned long*,
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
239 unsigned char*)));
1929
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
240 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
241 unsigned char*, unsigned long)));
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
242 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
243 #endif
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
244 #undef dfacc
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
246 #ifdef CONFIG_FAADBIN
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
247 break;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
248 }
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
249 if (err) {
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
250 dlclose(s->handle);
1602
fdb8244da1e5 av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1245
diff changeset
251 av_log(avctx, AV_LOG_ERROR, "FAAD library: cannot resolve %s in %s!\n",
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
252 err, libfaadname);
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
253 return -1;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
254 }
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
255 #endif
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
256
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
257 s->faac_handle = s->faacDecOpen();
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
258 if (!s->faac_handle) {
1602
fdb8244da1e5 av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1245
diff changeset
259 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
260 faac_decode_end(avctx);
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
261 return -1;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
262 }
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
263
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
264
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
265 faac_cfg = s->faacDecGetCurrentConfiguration(s->faac_handle);
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
266
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
267 if (faac_cfg) {
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
268 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
269 case 8: av_log(avctx, AV_LOG_ERROR, "FAADlib unsupported bps %d\n", avctx->bits_per_sample); break;
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
270 default:
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
271 case 16:
1929
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
272 #ifdef FAAD2_VERSION
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
273 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
274 #endif
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
275 s->sample_size = 2;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
276 break;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
277 case 24:
1929
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
278 #ifdef FAAD2_VERSION
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
279 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
280 #endif
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
281 s->sample_size = 3;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
282 break;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
283 case 32:
1929
d4525c3065d0 aac decoding patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 1602
diff changeset
284 #ifdef FAAD2_VERSION
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
285 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
286 #endif
1245
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
287 s->sample_size = 4;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
288 break;
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
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
291 faac_cfg->defSampleRate = (!avctx->sample_rate) ? 44100 : avctx->sample_rate;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
292 faac_cfg->defObjectType = LC;
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
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
295 s->faacDecSetConfiguration(s->faac_handle, faac_cfg);
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 faac_init_mp4(avctx);
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
298
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
299 return 0;
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
300 }
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
301
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
302 #define AAC_CODEC(id, name) \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
303 AVCodec name ## _decoder = { \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
304 #name, \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
305 CODEC_TYPE_AUDIO, \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
306 id, \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
307 sizeof(FAACContext), \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
308 faac_decode_init, \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
309 NULL, \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
310 faac_decode_end, \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
311 faac_decode_frame, \
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
312 }
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 // FIXME - raw AAC files - maybe just one entry will be enough
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
315 AAC_CODEC(CODEC_ID_AAC, aac);
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
316 // If it's mp4 file - usually embeded into Qt Mov
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
317 AAC_CODEC(CODEC_ID_MPEG4AAC, mpeg4aac);
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
318
cd88870c4560 * support for AAC audio streams via libfaad
kabi
parents:
diff changeset
319 #undef AAC_CODEC