annotate a52dec.c @ 2071:41d30bae5019 libavcodec

attempt to create some separation in the FLAC system with respect to demuxer and decoder layers by enabling the FLAC decoder to decode data without needing the entire file, from start to finish
author melanson
date Thu, 10 Jun 2004 04:13:43 +0000
parents 141a9539e270
children 40765c51a7a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
1 /*
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
2 * A52 decoder
429
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
3 * Copyright (c) 2001 Fabrice Bellard.
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
4 *
429
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
5 * This library is free software; you can redistribute it and/or
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
7 * License as published by the Free Software Foundation; either
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
8 * version 2 of the License, or (at your option) any later version.
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
9 *
429
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
10 * This library is distributed in the hope that it will be useful,
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
13 * Lesser General Public License for more details.
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
14 *
429
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
16 * License along with this library; if not, write to the Free Software
718a22dc121f license/copyright change
glantau
parents: 368
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
18 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
19
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
20 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
21 * @file a52dec.c
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
22 * A52 decoder.
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
23 */
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
24
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
25 #include "avcodec.h"
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
26 #include "liba52/a52.h"
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
27
338
1a38b3b4ea28 * using liba52
kabi
parents: 332
diff changeset
28 #ifdef CONFIG_A52BIN
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
29 #include <dlfcn.h>
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
30 static const char* liba52name = "liba52.so.0";
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
31 #endif
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
32
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
33 /**
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
34 * liba52 - Copyright (C) Aaron Holtzman
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
35 * released under the GPL license.
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
36 */
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
37 typedef struct AC3DecodeState {
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1018
diff changeset
38 uint8_t inbuf[4096]; /* input buffer */
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1018
diff changeset
39 uint8_t *inbuf_ptr;
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
40 int frame_size;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
41 int flags;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
42 int channels;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
43 a52_state_t* state;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
44 sample_t* samples;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
45
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
46 /*
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
47 * virtual method table
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
48 *
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
49 * using this function table so the liba52 doesn't
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
50 * have to be really linked together with ffmpeg
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
51 * and might be linked in runtime - this allows binary
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
52 * distribution of ffmpeg library which doens't depend
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
53 * on liba52 library - but if user has it installed
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
54 * it will be used - user might install such library
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
55 * separately
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
56 */
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
57 void* handle;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
58 a52_state_t* (*a52_init)(uint32_t mm_accel);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
59 sample_t* (*a52_samples)(a52_state_t * state);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
60 int (*a52_syncinfo)(uint8_t * buf, int * flags,
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
61 int * sample_rate, int * bit_rate);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
62 int (*a52_frame)(a52_state_t * state, uint8_t * buf, int * flags,
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
63 sample_t * level, sample_t bias);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
64 void (*a52_dynrng)(a52_state_t * state,
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
65 sample_t (* call) (sample_t, void *), void * data);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
66 int (*a52_block)(a52_state_t * state);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
67 void (*a52_free)(a52_state_t * state);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
68
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
69 } AC3DecodeState;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
70
338
1a38b3b4ea28 * using liba52
kabi
parents: 332
diff changeset
71 #ifdef CONFIG_A52BIN
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
72 static void* dlsymm(void* handle, const char* symbol)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
73 {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
74 void* f = dlsym(handle, symbol);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
75 if (!f)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
76 fprintf(stderr, "A52 Decoder - function '%s' can't be resolved\n", symbol);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
77 return f;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
78 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
79 #endif
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
80
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
81 static int a52_decode_init(AVCodecContext *avctx)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
82 {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
83 AC3DecodeState *s = avctx->priv_data;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
84
338
1a38b3b4ea28 * using liba52
kabi
parents: 332
diff changeset
85 #ifdef CONFIG_A52BIN
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
86 s->handle = dlopen(liba52name, RTLD_LAZY);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
87 if (!s->handle)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
88 {
368
1db6950d81ea - Segfault fixed when liba52 dynamic library isn't found.
pulento
parents: 338
diff changeset
89 fprintf(stderr, "A52 library %s could not be opened! \n%s\n", liba52name, dlerror());
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
90 return -1;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
91 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
92 s->a52_init = (a52_state_t* (*)(uint32_t)) dlsymm(s->handle, "a52_init");
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
93 s->a52_samples = (sample_t* (*)(a52_state_t*)) dlsymm(s->handle, "a52_samples");
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
94 s->a52_syncinfo = (int (*)(uint8_t*, int*, int*, int*)) dlsymm(s->handle, "a52_syncinfo");
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
95 s->a52_frame = (int (*)(a52_state_t*, uint8_t*, int*, sample_t*, sample_t)) dlsymm(s->handle, "a52_frame");
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
96 s->a52_block = (int (*)(a52_state_t*)) dlsymm(s->handle, "a52_block");
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
97 s->a52_free = (void (*)(a52_state_t*)) dlsymm(s->handle, "a52_free");
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
98 if (!s->a52_init || !s->a52_samples || !s->a52_syncinfo
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
99 || !s->a52_frame || !s->a52_block || !s->a52_free)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
100 {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
101 dlclose(s->handle);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
102 return -1;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
103 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
104 #else
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
105 /* static linked version */
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
106 s->handle = 0;
1018
696ccd81403e reverse
nickols_k
parents: 1017
diff changeset
107 s->a52_init = a52_init;
696ccd81403e reverse
nickols_k
parents: 1017
diff changeset
108 s->a52_samples = a52_samples;
696ccd81403e reverse
nickols_k
parents: 1017
diff changeset
109 s->a52_syncinfo = a52_syncinfo;
696ccd81403e reverse
nickols_k
parents: 1017
diff changeset
110 s->a52_frame = a52_frame;
696ccd81403e reverse
nickols_k
parents: 1017
diff changeset
111 s->a52_block = a52_block;
696ccd81403e reverse
nickols_k
parents: 1017
diff changeset
112 s->a52_free = a52_free;
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
113 #endif
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
114 s->state = s->a52_init(0); /* later use CPU flags */
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
115 s->samples = s->a52_samples(s->state);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
116 s->inbuf_ptr = s->inbuf;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
117 s->frame_size = 0;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
118
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
119 return 0;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
120 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
121
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
122 /**** the following two functions comes from a52dec */
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
123 static inline int blah (int32_t i)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
124 {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
125 if (i > 0x43c07fff)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
126 return 32767;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
127 else if (i < 0x43bf8000)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
128 return -32768;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
129 return i - 0x43c00000;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
130 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
131
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1018
diff changeset
132 static inline void float_to_int (float * _f, int16_t * s16, int nchannels)
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
133 {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
134 int i, j, c;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
135 int32_t * f = (int32_t *) _f; // XXX assumes IEEE float format
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
136
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
137 j = 0;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
138 nchannels *= 256;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
139 for (i = 0; i < 256; i++) {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
140 for (c = 0; c < nchannels; c += 256)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
141 s16[j++] = blah (f[i + c]);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
142 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
143 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
144
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
145 /**** end */
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
146
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
147 #define HEADER_SIZE 7
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
148
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
149 static int a52_decode_frame(AVCodecContext *avctx,
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
150 void *data, int *data_size,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1018
diff changeset
151 uint8_t *buf, int buf_size)
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
152 {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
153 AC3DecodeState *s = avctx->priv_data;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1018
diff changeset
154 uint8_t *buf_ptr;
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
155 int flags, i, len;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
156 int sample_rate, bit_rate;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
157 short *out_samples = data;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
158 float level;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
159 static const int ac3_channels[8] = {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
160 2, 1, 2, 3, 3, 4, 4, 5
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
161 };
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
162
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
163 buf_ptr = buf;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
164 while (buf_size > 0) {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
165 len = s->inbuf_ptr - s->inbuf;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
166 if (s->frame_size == 0) {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
167 /* no header seen : find one. We need at least 7 bytes to parse it */
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
168 len = HEADER_SIZE - len;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
169 if (len > buf_size)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
170 len = buf_size;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
171 memcpy(s->inbuf_ptr, buf_ptr, len);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
172 buf_ptr += len;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
173 s->inbuf_ptr += len;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
174 buf_size -= len;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
175 if ((s->inbuf_ptr - s->inbuf) == HEADER_SIZE) {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
176 len = s->a52_syncinfo(s->inbuf, &s->flags, &sample_rate, &bit_rate);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
177 if (len == 0) {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
178 /* no sync found : move by one byte (inefficient, but simple!) */
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
179 memcpy(s->inbuf, s->inbuf + 1, HEADER_SIZE - 1);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
180 s->inbuf_ptr--;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
181 } else {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
182 s->frame_size = len;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
183 /* update codec info */
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
184 avctx->sample_rate = sample_rate;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
185 s->channels = ac3_channels[s->flags & 7];
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
186 if (s->flags & A52_LFE)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
187 s->channels++;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
188 if (avctx->channels == 0)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
189 /* No specific number of channel requested */
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
190 avctx->channels = s->channels;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
191 else if (s->channels < avctx->channels) {
1602
fdb8244da1e5 av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1106
diff changeset
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);
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
193 avctx->channels = s->channels;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
194 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
195 avctx->bit_rate = bit_rate;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
196 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
197 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
198 } else if (len < s->frame_size) {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
199 len = s->frame_size - len;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
200 if (len > buf_size)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
201 len = buf_size;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
202
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
203 memcpy(s->inbuf_ptr, buf_ptr, len);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
204 buf_ptr += len;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
205 s->inbuf_ptr += len;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
206 buf_size -= len;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
207 } else {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
208 flags = s->flags;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
209 if (avctx->channels == 1)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
210 flags = A52_MONO;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
211 else if (avctx->channels == 2)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
212 flags = A52_STEREO;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
213 else
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
214 flags |= A52_ADJUST_LEVEL;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
215 level = 1;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
216 if (s->a52_frame(s->state, s->inbuf, &flags, &level, 384)) {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
217 fail:
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
218 s->inbuf_ptr = s->inbuf;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
219 s->frame_size = 0;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
220 continue;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
221 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
222 for (i = 0; i < 6; i++) {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
223 if (s->a52_block(s->state))
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
224 goto fail;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
225 float_to_int(s->samples, out_samples + i * 256 * avctx->channels, avctx->channels);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
226 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
227 s->inbuf_ptr = s->inbuf;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
228 s->frame_size = 0;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1018
diff changeset
229 *data_size = 6 * avctx->channels * 256 * sizeof(int16_t);
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
230 break;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
231 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
232 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
233 return buf_ptr - buf;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
234 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
235
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
236 static int a52_decode_end(AVCodecContext *avctx)
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
237 {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
238 AC3DecodeState *s = avctx->priv_data;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
239 s->a52_free(s->state);
338
1a38b3b4ea28 * using liba52
kabi
parents: 332
diff changeset
240 #ifdef CONFIG_A52BIN
332
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
241 dlclose(s->handle);
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
242 #endif
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
243 return 0;
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
244 }
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
245
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
246 AVCodec ac3_decoder = {
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
247 "ac3",
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
248 CODEC_TYPE_AUDIO,
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
249 CODEC_ID_AC3,
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
250 sizeof(AC3DecodeState),
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
251 a52_decode_init,
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
252 NULL,
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
253 a52_decode_end,
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
254 a52_decode_frame,
207cc56d18f8 * add support for liba52
kabi
parents:
diff changeset
255 };