3 * Copyright (c) 2001 Fabrice Bellard.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "liba52/a52.h"
30 static const char* liba52name
= "liba52.so.0";
34 * liba52 - Copyright (C) Aaron Holtzman
35 * released under the GPL license.
37 typedef struct AC3DecodeState
{
38 uint8_t inbuf
[4096]; /* input buffer */
47 * virtual method table
49 * using this function table so the liba52 doesn't
50 * have to be really linked together with ffmpeg
51 * and might be linked in runtime - this allows binary
52 * distribution of ffmpeg library which doens't depend
53 * on liba52 library - but if user has it installed
54 * it will be used - user might install such library
58 a52_state_t
* (*a52_init
)(uint32_t mm_accel
);
59 sample_t
* (*a52_samples
)(a52_state_t
* state
);
60 int (*a52_syncinfo
)(uint8_t * buf
, int * flags
,
61 int * sample_rate
, int * bit_rate
);
62 int (*a52_frame
)(a52_state_t
* state
, uint8_t * buf
, int * flags
,
63 sample_t
* level
, sample_t bias
);
64 void (*a52_dynrng
)(a52_state_t
* state
,
65 sample_t (* call
) (sample_t
, void *), void * data
);
66 int (*a52_block
)(a52_state_t
* state
);
67 void (*a52_free
)(a52_state_t
* state
);
72 static void* dlsymm(void* handle
, const char* symbol
)
74 void* f
= dlsym(handle
, symbol
);
76 av_log( NULL
, AV_LOG_ERROR
, "A52 Decoder - function '%s' can't be resolved\n", symbol
);
81 static int a52_decode_init(AVCodecContext
*avctx
)
83 AC3DecodeState
*s
= avctx
->priv_data
;
86 s
->handle
= dlopen(liba52name
, RTLD_LAZY
);
89 av_log( avctx
, AV_LOG_ERROR
, "A52 library %s could not be opened! \n%s\n", liba52name
, dlerror());
92 s
->a52_init
= (a52_state_t
* (*)(uint32_t)) dlsymm(s
->handle
, "a52_init");
93 s
->a52_samples
= (sample_t
* (*)(a52_state_t
*)) dlsymm(s
->handle
, "a52_samples");
94 s
->a52_syncinfo
= (int (*)(uint8_t*, int*, int*, int*)) dlsymm(s
->handle
, "a52_syncinfo");
95 s
->a52_frame
= (int (*)(a52_state_t
*, uint8_t*, int*, sample_t
*, sample_t
)) dlsymm(s
->handle
, "a52_frame");
96 s
->a52_block
= (int (*)(a52_state_t
*)) dlsymm(s
->handle
, "a52_block");
97 s
->a52_free
= (void (*)(a52_state_t
*)) dlsymm(s
->handle
, "a52_free");
98 if (!s
->a52_init
|| !s
->a52_samples
|| !s
->a52_syncinfo
99 || !s
->a52_frame
|| !s
->a52_block
|| !s
->a52_free
)
105 /* static linked version */
107 s
->a52_init
= a52_init
;
108 s
->a52_samples
= a52_samples
;
109 s
->a52_syncinfo
= a52_syncinfo
;
110 s
->a52_frame
= a52_frame
;
111 s
->a52_block
= a52_block
;
112 s
->a52_free
= a52_free
;
114 s
->state
= s
->a52_init(0); /* later use CPU flags */
115 s
->samples
= s
->a52_samples(s
->state
);
116 s
->inbuf_ptr
= s
->inbuf
;
122 /**** the following two functions comes from a52dec */
123 static inline int blah (int32_t i
)
127 else if (i
< 0x43bf8000)
129 return i
- 0x43c00000;
132 static inline void float_to_int (float * _f
, int16_t * s16
, int nchannels
)
135 int32_t * f
= (int32_t *) _f
; // XXX assumes IEEE float format
139 for (i
= 0; i
< 256; i
++) {
140 for (c
= 0; c
< nchannels
; c
+= 256)
141 s16
[j
++] = blah (f
[i
+ c
]);
147 #define HEADER_SIZE 7
149 static int a52_decode_frame(AVCodecContext
*avctx
,
150 void *data
, int *data_size
,
151 uint8_t *buf
, int buf_size
)
153 AC3DecodeState
*s
= avctx
->priv_data
;
156 int sample_rate
, bit_rate
;
157 short *out_samples
= data
;
159 static const int ac3_channels
[8] = {
160 2, 1, 2, 3, 3, 4, 4, 5
164 while (buf_size
> 0) {
165 len
= s
->inbuf_ptr
- s
->inbuf
;
166 if (s
->frame_size
== 0) {
167 /* no header seen : find one. We need at least 7 bytes to parse it */
168 len
= HEADER_SIZE
- len
;
171 memcpy(s
->inbuf_ptr
, buf_ptr
, len
);
175 if ((s
->inbuf_ptr
- s
->inbuf
) == HEADER_SIZE
) {
176 len
= s
->a52_syncinfo(s
->inbuf
, &s
->flags
, &sample_rate
, &bit_rate
);
178 /* no sync found : move by one byte (inefficient, but simple!) */
179 memcpy(s
->inbuf
, s
->inbuf
+ 1, HEADER_SIZE
- 1);
183 /* update codec info */
184 avctx
->sample_rate
= sample_rate
;
185 s
->channels
= ac3_channels
[s
->flags
& 7];
186 if (s
->flags
& A52_LFE
)
188 if (avctx
->channels
== 0)
189 /* No specific number of channel requested */
190 avctx
->channels
= s
->channels
;
191 else if (s
->channels
< avctx
->channels
) {
192 av_log(avctx
, AV_LOG_ERROR
, "ac3dec: AC3 Source channels are less than specified: output to %d channels.. (frmsize: %d)\n", s
->channels
, len
);
193 avctx
->channels
= s
->channels
;
195 avctx
->bit_rate
= bit_rate
;
198 } else if (len
< s
->frame_size
) {
199 len
= s
->frame_size
- len
;
203 memcpy(s
->inbuf_ptr
, buf_ptr
, len
);
209 if (avctx
->channels
== 1)
211 else if (avctx
->channels
== 2)
214 flags
|= A52_ADJUST_LEVEL
;
216 if (s
->a52_frame(s
->state
, s
->inbuf
, &flags
, &level
, 384)) {
218 s
->inbuf_ptr
= s
->inbuf
;
222 for (i
= 0; i
< 6; i
++) {
223 if (s
->a52_block(s
->state
))
225 float_to_int(s
->samples
, out_samples
+ i
* 256 * avctx
->channels
, avctx
->channels
);
227 s
->inbuf_ptr
= s
->inbuf
;
229 *data_size
= 6 * avctx
->channels
* 256 * sizeof(int16_t);
233 return buf_ptr
- buf
;
236 static int a52_decode_end(AVCodecContext
*avctx
)
238 AC3DecodeState
*s
= avctx
->priv_data
;
239 s
->a52_free(s
->state
);
246 AVCodec ac3_decoder
= {
250 sizeof(AC3DecodeState
),