annotate a52dec.c @ 3990:746a60ba3177 libavcodec

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