1*f30ccc91SDavid du Colombier /*
2*f30ccc91SDavid du Colombier * libmad - MPEG audio decoder library
3*f30ccc91SDavid du Colombier * Copyright (C) 2000-2004 Underbit Technologies, Inc.
4*f30ccc91SDavid du Colombier *
5*f30ccc91SDavid du Colombier * This program is free software; you can redistribute it and/or modify
6*f30ccc91SDavid du Colombier * it under the terms of the GNU General Public License as published by
7*f30ccc91SDavid du Colombier * the Free Software Foundation; either version 2 of the License, or
8*f30ccc91SDavid du Colombier * (at your option) any later version.
9*f30ccc91SDavid du Colombier *
10*f30ccc91SDavid du Colombier * This program is distributed in the hope that it will be useful,
11*f30ccc91SDavid du Colombier * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*f30ccc91SDavid du Colombier * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13*f30ccc91SDavid du Colombier * GNU General Public License for more details.
14*f30ccc91SDavid du Colombier *
15*f30ccc91SDavid du Colombier * You should have received a copy of the GNU General Public License
16*f30ccc91SDavid du Colombier * along with this program; if not, write to the Free Software
17*f30ccc91SDavid du Colombier * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18*f30ccc91SDavid du Colombier *
19*f30ccc91SDavid du Colombier * $Id: frame.c,v 1.29 2004/02/04 22:59:19 rob Exp $
20*f30ccc91SDavid du Colombier */
21*f30ccc91SDavid du Colombier
22*f30ccc91SDavid du Colombier # ifdef HAVE_CONFIG_H
23*f30ccc91SDavid du Colombier # include "config.h"
24*f30ccc91SDavid du Colombier # endif
25*f30ccc91SDavid du Colombier
26*f30ccc91SDavid du Colombier # include "global.h"
27*f30ccc91SDavid du Colombier
28*f30ccc91SDavid du Colombier # include "bit.h"
29*f30ccc91SDavid du Colombier # include "stream.h"
30*f30ccc91SDavid du Colombier # include "frame.h"
31*f30ccc91SDavid du Colombier # include "layer12.h"
32*f30ccc91SDavid du Colombier # include "layer3.h"
33*f30ccc91SDavid du Colombier
34*f30ccc91SDavid du Colombier static
35*f30ccc91SDavid du Colombier unsigned long const bitrate_table[5][15] = {
36*f30ccc91SDavid du Colombier /* MPEG-1 */
37*f30ccc91SDavid du Colombier { 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, /* Layer I */
38*f30ccc91SDavid du Colombier 256000, 288000, 320000, 352000, 384000, 416000, 448000 },
39*f30ccc91SDavid du Colombier { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer II */
40*f30ccc91SDavid du Colombier 128000, 160000, 192000, 224000, 256000, 320000, 384000 },
41*f30ccc91SDavid du Colombier { 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, /* Layer III */
42*f30ccc91SDavid du Colombier 112000, 128000, 160000, 192000, 224000, 256000, 320000 },
43*f30ccc91SDavid du Colombier
44*f30ccc91SDavid du Colombier /* MPEG-2 LSF */
45*f30ccc91SDavid du Colombier { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer I */
46*f30ccc91SDavid du Colombier 128000, 144000, 160000, 176000, 192000, 224000, 256000 },
47*f30ccc91SDavid du Colombier { 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, /* Layers */
48*f30ccc91SDavid du Colombier 64000, 80000, 96000, 112000, 128000, 144000, 160000 } /* II & III */
49*f30ccc91SDavid du Colombier };
50*f30ccc91SDavid du Colombier
51*f30ccc91SDavid du Colombier static
52*f30ccc91SDavid du Colombier unsigned int const samplerate_table[3] = { 44100, 48000, 32000 };
53*f30ccc91SDavid du Colombier
54*f30ccc91SDavid du Colombier static
55*f30ccc91SDavid du Colombier int (*const decoder_table[3])(struct mad_stream *, struct mad_frame *) = {
56*f30ccc91SDavid du Colombier mad_layer_I,
57*f30ccc91SDavid du Colombier mad_layer_II,
58*f30ccc91SDavid du Colombier mad_layer_III
59*f30ccc91SDavid du Colombier };
60*f30ccc91SDavid du Colombier
61*f30ccc91SDavid du Colombier /*
62*f30ccc91SDavid du Colombier * NAME: header->init()
63*f30ccc91SDavid du Colombier * DESCRIPTION: initialize header struct
64*f30ccc91SDavid du Colombier */
mad_header_init(struct mad_header * header)65*f30ccc91SDavid du Colombier void mad_header_init(struct mad_header *header)
66*f30ccc91SDavid du Colombier {
67*f30ccc91SDavid du Colombier header->layer = 0;
68*f30ccc91SDavid du Colombier header->mode = 0;
69*f30ccc91SDavid du Colombier header->mode_extension = 0;
70*f30ccc91SDavid du Colombier header->emphasis = 0;
71*f30ccc91SDavid du Colombier
72*f30ccc91SDavid du Colombier header->bitrate = 0;
73*f30ccc91SDavid du Colombier header->samplerate = 0;
74*f30ccc91SDavid du Colombier
75*f30ccc91SDavid du Colombier header->crc_check = 0;
76*f30ccc91SDavid du Colombier header->crc_target = 0;
77*f30ccc91SDavid du Colombier
78*f30ccc91SDavid du Colombier header->flags = 0;
79*f30ccc91SDavid du Colombier header->private_bits = 0;
80*f30ccc91SDavid du Colombier }
81*f30ccc91SDavid du Colombier
82*f30ccc91SDavid du Colombier /*
83*f30ccc91SDavid du Colombier * NAME: frame->init()
84*f30ccc91SDavid du Colombier * DESCRIPTION: initialize frame struct
85*f30ccc91SDavid du Colombier */
mad_frame_init(struct mad_frame * frame)86*f30ccc91SDavid du Colombier void mad_frame_init(struct mad_frame *frame)
87*f30ccc91SDavid du Colombier {
88*f30ccc91SDavid du Colombier mad_header_init(&frame->header);
89*f30ccc91SDavid du Colombier
90*f30ccc91SDavid du Colombier frame->options = 0;
91*f30ccc91SDavid du Colombier
92*f30ccc91SDavid du Colombier frame->overlap = 0;
93*f30ccc91SDavid du Colombier mad_frame_mute(frame);
94*f30ccc91SDavid du Colombier }
95*f30ccc91SDavid du Colombier
96*f30ccc91SDavid du Colombier /*
97*f30ccc91SDavid du Colombier * NAME: frame->finish()
98*f30ccc91SDavid du Colombier * DESCRIPTION: deallocate any dynamic memory associated with frame
99*f30ccc91SDavid du Colombier */
mad_frame_finish(struct mad_frame * frame)100*f30ccc91SDavid du Colombier void mad_frame_finish(struct mad_frame *frame)
101*f30ccc91SDavid du Colombier {
102*f30ccc91SDavid du Colombier mad_header_finish(&frame->header);
103*f30ccc91SDavid du Colombier
104*f30ccc91SDavid du Colombier if (frame->overlap) {
105*f30ccc91SDavid du Colombier free(frame->overlap);
106*f30ccc91SDavid du Colombier frame->overlap = 0;
107*f30ccc91SDavid du Colombier }
108*f30ccc91SDavid du Colombier }
109*f30ccc91SDavid du Colombier
110*f30ccc91SDavid du Colombier /*
111*f30ccc91SDavid du Colombier * NAME: decode_header()
112*f30ccc91SDavid du Colombier * DESCRIPTION: read header data and following CRC word
113*f30ccc91SDavid du Colombier */
114*f30ccc91SDavid du Colombier static
decode_header(struct mad_header * header,struct mad_stream * stream)115*f30ccc91SDavid du Colombier int decode_header(struct mad_header *header, struct mad_stream *stream)
116*f30ccc91SDavid du Colombier {
117*f30ccc91SDavid du Colombier unsigned int index;
118*f30ccc91SDavid du Colombier
119*f30ccc91SDavid du Colombier header->flags = 0;
120*f30ccc91SDavid du Colombier header->private_bits = 0;
121*f30ccc91SDavid du Colombier
122*f30ccc91SDavid du Colombier /* header() */
123*f30ccc91SDavid du Colombier
124*f30ccc91SDavid du Colombier /* syncword */
125*f30ccc91SDavid du Colombier mad_bit_skip(&stream->ptr, 11);
126*f30ccc91SDavid du Colombier
127*f30ccc91SDavid du Colombier /* MPEG 2.5 indicator (really part of syncword) */
128*f30ccc91SDavid du Colombier if (mad_bit_read(&stream->ptr, 1) == 0)
129*f30ccc91SDavid du Colombier header->flags |= MAD_FLAG_MPEG_2_5_EXT;
130*f30ccc91SDavid du Colombier
131*f30ccc91SDavid du Colombier /* ID */
132*f30ccc91SDavid du Colombier if (mad_bit_read(&stream->ptr, 1) == 0)
133*f30ccc91SDavid du Colombier header->flags |= MAD_FLAG_LSF_EXT;
134*f30ccc91SDavid du Colombier else if (header->flags & MAD_FLAG_MPEG_2_5_EXT) {
135*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_LOSTSYNC;
136*f30ccc91SDavid du Colombier return -1;
137*f30ccc91SDavid du Colombier }
138*f30ccc91SDavid du Colombier
139*f30ccc91SDavid du Colombier /* layer */
140*f30ccc91SDavid du Colombier header->layer = 4 - mad_bit_read(&stream->ptr, 2);
141*f30ccc91SDavid du Colombier
142*f30ccc91SDavid du Colombier if (header->layer == 4) {
143*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_BADLAYER;
144*f30ccc91SDavid du Colombier return -1;
145*f30ccc91SDavid du Colombier }
146*f30ccc91SDavid du Colombier
147*f30ccc91SDavid du Colombier /* protection_bit */
148*f30ccc91SDavid du Colombier if (mad_bit_read(&stream->ptr, 1) == 0) {
149*f30ccc91SDavid du Colombier header->flags |= MAD_FLAG_PROTECTION;
150*f30ccc91SDavid du Colombier header->crc_check = mad_bit_crc(stream->ptr, 16, 0xffff);
151*f30ccc91SDavid du Colombier }
152*f30ccc91SDavid du Colombier
153*f30ccc91SDavid du Colombier /* bitrate_index */
154*f30ccc91SDavid du Colombier index = mad_bit_read(&stream->ptr, 4);
155*f30ccc91SDavid du Colombier
156*f30ccc91SDavid du Colombier if (index == 15) {
157*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_BADBITRATE;
158*f30ccc91SDavid du Colombier return -1;
159*f30ccc91SDavid du Colombier }
160*f30ccc91SDavid du Colombier
161*f30ccc91SDavid du Colombier if (header->flags & MAD_FLAG_LSF_EXT)
162*f30ccc91SDavid du Colombier header->bitrate = bitrate_table[3 + (header->layer >> 1)][index];
163*f30ccc91SDavid du Colombier else
164*f30ccc91SDavid du Colombier header->bitrate = bitrate_table[header->layer - 1][index];
165*f30ccc91SDavid du Colombier
166*f30ccc91SDavid du Colombier /* sampling_frequency */
167*f30ccc91SDavid du Colombier index = mad_bit_read(&stream->ptr, 2);
168*f30ccc91SDavid du Colombier
169*f30ccc91SDavid du Colombier if (index == 3) {
170*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_BADSAMPLERATE;
171*f30ccc91SDavid du Colombier return -1;
172*f30ccc91SDavid du Colombier }
173*f30ccc91SDavid du Colombier
174*f30ccc91SDavid du Colombier header->samplerate = samplerate_table[index];
175*f30ccc91SDavid du Colombier
176*f30ccc91SDavid du Colombier if (header->flags & MAD_FLAG_LSF_EXT) {
177*f30ccc91SDavid du Colombier header->samplerate /= 2;
178*f30ccc91SDavid du Colombier
179*f30ccc91SDavid du Colombier if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
180*f30ccc91SDavid du Colombier header->samplerate /= 2;
181*f30ccc91SDavid du Colombier }
182*f30ccc91SDavid du Colombier
183*f30ccc91SDavid du Colombier /* padding_bit */
184*f30ccc91SDavid du Colombier if (mad_bit_read(&stream->ptr, 1))
185*f30ccc91SDavid du Colombier header->flags |= MAD_FLAG_PADDING;
186*f30ccc91SDavid du Colombier
187*f30ccc91SDavid du Colombier /* private_bit */
188*f30ccc91SDavid du Colombier if (mad_bit_read(&stream->ptr, 1))
189*f30ccc91SDavid du Colombier header->private_bits |= MAD_PRIVATE_HEADER;
190*f30ccc91SDavid du Colombier
191*f30ccc91SDavid du Colombier /* mode */
192*f30ccc91SDavid du Colombier header->mode = 3 - mad_bit_read(&stream->ptr, 2);
193*f30ccc91SDavid du Colombier
194*f30ccc91SDavid du Colombier /* mode_extension */
195*f30ccc91SDavid du Colombier header->mode_extension = mad_bit_read(&stream->ptr, 2);
196*f30ccc91SDavid du Colombier
197*f30ccc91SDavid du Colombier /* copyright */
198*f30ccc91SDavid du Colombier if (mad_bit_read(&stream->ptr, 1))
199*f30ccc91SDavid du Colombier header->flags |= MAD_FLAG_COPYRIGHT;
200*f30ccc91SDavid du Colombier
201*f30ccc91SDavid du Colombier /* original/copy */
202*f30ccc91SDavid du Colombier if (mad_bit_read(&stream->ptr, 1))
203*f30ccc91SDavid du Colombier header->flags |= MAD_FLAG_ORIGINAL;
204*f30ccc91SDavid du Colombier
205*f30ccc91SDavid du Colombier /* emphasis */
206*f30ccc91SDavid du Colombier header->emphasis = mad_bit_read(&stream->ptr, 2);
207*f30ccc91SDavid du Colombier
208*f30ccc91SDavid du Colombier # if defined(OPT_STRICT)
209*f30ccc91SDavid du Colombier /*
210*f30ccc91SDavid du Colombier * ISO/IEC 11172-3 says this is a reserved emphasis value, but
211*f30ccc91SDavid du Colombier * streams exist which use it anyway. Since the value is not important
212*f30ccc91SDavid du Colombier * to the decoder proper, we allow it unless OPT_STRICT is defined.
213*f30ccc91SDavid du Colombier */
214*f30ccc91SDavid du Colombier if (header->emphasis == MAD_EMPHASIS_RESERVED) {
215*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_BADEMPHASIS;
216*f30ccc91SDavid du Colombier return -1;
217*f30ccc91SDavid du Colombier }
218*f30ccc91SDavid du Colombier # endif
219*f30ccc91SDavid du Colombier
220*f30ccc91SDavid du Colombier /* error_check() */
221*f30ccc91SDavid du Colombier
222*f30ccc91SDavid du Colombier /* crc_check */
223*f30ccc91SDavid du Colombier if (header->flags & MAD_FLAG_PROTECTION)
224*f30ccc91SDavid du Colombier header->crc_target = mad_bit_read(&stream->ptr, 16);
225*f30ccc91SDavid du Colombier
226*f30ccc91SDavid du Colombier return 0;
227*f30ccc91SDavid du Colombier }
228*f30ccc91SDavid du Colombier
229*f30ccc91SDavid du Colombier /*
230*f30ccc91SDavid du Colombier * NAME: free_bitrate()
231*f30ccc91SDavid du Colombier * DESCRIPTION: attempt to discover the bitstream's free bitrate
232*f30ccc91SDavid du Colombier */
233*f30ccc91SDavid du Colombier static
free_bitrate(struct mad_stream * stream,struct mad_header const * header)234*f30ccc91SDavid du Colombier int free_bitrate(struct mad_stream *stream, struct mad_header const *header)
235*f30ccc91SDavid du Colombier {
236*f30ccc91SDavid du Colombier struct mad_bitptr keep_ptr;
237*f30ccc91SDavid du Colombier unsigned long rate = 0;
238*f30ccc91SDavid du Colombier unsigned int pad_slot, slots_per_frame;
239*f30ccc91SDavid du Colombier unsigned char const *ptr = 0;
240*f30ccc91SDavid du Colombier
241*f30ccc91SDavid du Colombier keep_ptr = stream->ptr;
242*f30ccc91SDavid du Colombier
243*f30ccc91SDavid du Colombier pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0;
244*f30ccc91SDavid du Colombier slots_per_frame = (header->layer == MAD_LAYER_III &&
245*f30ccc91SDavid du Colombier (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144;
246*f30ccc91SDavid du Colombier
247*f30ccc91SDavid du Colombier while (mad_stream_sync(stream) == 0) {
248*f30ccc91SDavid du Colombier struct mad_stream peek_stream;
249*f30ccc91SDavid du Colombier struct mad_header peek_header;
250*f30ccc91SDavid du Colombier
251*f30ccc91SDavid du Colombier peek_stream = *stream;
252*f30ccc91SDavid du Colombier peek_header = *header;
253*f30ccc91SDavid du Colombier
254*f30ccc91SDavid du Colombier if (decode_header(&peek_header, &peek_stream) == 0 &&
255*f30ccc91SDavid du Colombier peek_header.layer == header->layer &&
256*f30ccc91SDavid du Colombier peek_header.samplerate == header->samplerate) {
257*f30ccc91SDavid du Colombier unsigned int N;
258*f30ccc91SDavid du Colombier
259*f30ccc91SDavid du Colombier ptr = mad_bit_nextbyte(&stream->ptr);
260*f30ccc91SDavid du Colombier
261*f30ccc91SDavid du Colombier N = ptr - stream->this_frame;
262*f30ccc91SDavid du Colombier
263*f30ccc91SDavid du Colombier if (header->layer == MAD_LAYER_I) {
264*f30ccc91SDavid du Colombier rate = (unsigned long) header->samplerate *
265*f30ccc91SDavid du Colombier (N - 4 * pad_slot + 4) / 48 / 1000;
266*f30ccc91SDavid du Colombier }
267*f30ccc91SDavid du Colombier else {
268*f30ccc91SDavid du Colombier rate = (unsigned long) header->samplerate *
269*f30ccc91SDavid du Colombier (N - pad_slot + 1) / slots_per_frame / 1000;
270*f30ccc91SDavid du Colombier }
271*f30ccc91SDavid du Colombier
272*f30ccc91SDavid du Colombier if (rate >= 8)
273*f30ccc91SDavid du Colombier break;
274*f30ccc91SDavid du Colombier }
275*f30ccc91SDavid du Colombier
276*f30ccc91SDavid du Colombier mad_bit_skip(&stream->ptr, 8);
277*f30ccc91SDavid du Colombier }
278*f30ccc91SDavid du Colombier
279*f30ccc91SDavid du Colombier stream->ptr = keep_ptr;
280*f30ccc91SDavid du Colombier
281*f30ccc91SDavid du Colombier if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) {
282*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_LOSTSYNC;
283*f30ccc91SDavid du Colombier return -1;
284*f30ccc91SDavid du Colombier }
285*f30ccc91SDavid du Colombier
286*f30ccc91SDavid du Colombier stream->freerate = rate * 1000;
287*f30ccc91SDavid du Colombier
288*f30ccc91SDavid du Colombier return 0;
289*f30ccc91SDavid du Colombier }
290*f30ccc91SDavid du Colombier
291*f30ccc91SDavid du Colombier /*
292*f30ccc91SDavid du Colombier * NAME: header->decode()
293*f30ccc91SDavid du Colombier * DESCRIPTION: read the next frame header from the stream
294*f30ccc91SDavid du Colombier */
mad_header_decode(struct mad_header * header,struct mad_stream * stream)295*f30ccc91SDavid du Colombier int mad_header_decode(struct mad_header *header, struct mad_stream *stream)
296*f30ccc91SDavid du Colombier {
297*f30ccc91SDavid du Colombier register unsigned char const *ptr, *end;
298*f30ccc91SDavid du Colombier unsigned int pad_slot, N;
299*f30ccc91SDavid du Colombier
300*f30ccc91SDavid du Colombier ptr = stream->next_frame;
301*f30ccc91SDavid du Colombier end = stream->bufend;
302*f30ccc91SDavid du Colombier
303*f30ccc91SDavid du Colombier if (ptr == 0) {
304*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_BUFPTR;
305*f30ccc91SDavid du Colombier goto fail;
306*f30ccc91SDavid du Colombier }
307*f30ccc91SDavid du Colombier
308*f30ccc91SDavid du Colombier /* stream skip */
309*f30ccc91SDavid du Colombier if (stream->skiplen) {
310*f30ccc91SDavid du Colombier if (!stream->sync)
311*f30ccc91SDavid du Colombier ptr = stream->this_frame;
312*f30ccc91SDavid du Colombier
313*f30ccc91SDavid du Colombier if (end - ptr < stream->skiplen) {
314*f30ccc91SDavid du Colombier stream->skiplen -= end - ptr;
315*f30ccc91SDavid du Colombier stream->next_frame = end;
316*f30ccc91SDavid du Colombier
317*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_BUFLEN;
318*f30ccc91SDavid du Colombier goto fail;
319*f30ccc91SDavid du Colombier }
320*f30ccc91SDavid du Colombier
321*f30ccc91SDavid du Colombier ptr += stream->skiplen;
322*f30ccc91SDavid du Colombier stream->skiplen = 0;
323*f30ccc91SDavid du Colombier
324*f30ccc91SDavid du Colombier stream->sync = 1;
325*f30ccc91SDavid du Colombier }
326*f30ccc91SDavid du Colombier
327*f30ccc91SDavid du Colombier sync:
328*f30ccc91SDavid du Colombier /* synchronize */
329*f30ccc91SDavid du Colombier if (stream->sync) {
330*f30ccc91SDavid du Colombier if (end - ptr < MAD_BUFFER_GUARD) {
331*f30ccc91SDavid du Colombier stream->next_frame = ptr;
332*f30ccc91SDavid du Colombier
333*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_BUFLEN;
334*f30ccc91SDavid du Colombier goto fail;
335*f30ccc91SDavid du Colombier }
336*f30ccc91SDavid du Colombier else if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) {
337*f30ccc91SDavid du Colombier /* mark point where frame sync word was expected */
338*f30ccc91SDavid du Colombier stream->this_frame = ptr;
339*f30ccc91SDavid du Colombier stream->next_frame = ptr + 1;
340*f30ccc91SDavid du Colombier
341*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_LOSTSYNC;
342*f30ccc91SDavid du Colombier goto fail;
343*f30ccc91SDavid du Colombier }
344*f30ccc91SDavid du Colombier }
345*f30ccc91SDavid du Colombier else {
346*f30ccc91SDavid du Colombier mad_bit_init(&stream->ptr, ptr);
347*f30ccc91SDavid du Colombier
348*f30ccc91SDavid du Colombier if (mad_stream_sync(stream) == -1) {
349*f30ccc91SDavid du Colombier if (end - stream->next_frame >= MAD_BUFFER_GUARD)
350*f30ccc91SDavid du Colombier stream->next_frame = end - MAD_BUFFER_GUARD;
351*f30ccc91SDavid du Colombier
352*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_BUFLEN;
353*f30ccc91SDavid du Colombier goto fail;
354*f30ccc91SDavid du Colombier }
355*f30ccc91SDavid du Colombier
356*f30ccc91SDavid du Colombier ptr = mad_bit_nextbyte(&stream->ptr);
357*f30ccc91SDavid du Colombier }
358*f30ccc91SDavid du Colombier
359*f30ccc91SDavid du Colombier /* begin processing */
360*f30ccc91SDavid du Colombier stream->this_frame = ptr;
361*f30ccc91SDavid du Colombier stream->next_frame = ptr + 1; /* possibly bogus sync word */
362*f30ccc91SDavid du Colombier
363*f30ccc91SDavid du Colombier mad_bit_init(&stream->ptr, stream->this_frame);
364*f30ccc91SDavid du Colombier
365*f30ccc91SDavid du Colombier if (decode_header(header, stream) == -1)
366*f30ccc91SDavid du Colombier goto fail;
367*f30ccc91SDavid du Colombier
368*f30ccc91SDavid du Colombier /* calculate free bit rate */
369*f30ccc91SDavid du Colombier if (header->bitrate == 0) {
370*f30ccc91SDavid du Colombier if ((stream->freerate == 0 || !stream->sync ||
371*f30ccc91SDavid du Colombier (header->layer == MAD_LAYER_III && stream->freerate > 640000)) &&
372*f30ccc91SDavid du Colombier free_bitrate(stream, header) == -1)
373*f30ccc91SDavid du Colombier goto fail;
374*f30ccc91SDavid du Colombier
375*f30ccc91SDavid du Colombier header->bitrate = stream->freerate;
376*f30ccc91SDavid du Colombier header->flags |= MAD_FLAG_FREEFORMAT;
377*f30ccc91SDavid du Colombier }
378*f30ccc91SDavid du Colombier
379*f30ccc91SDavid du Colombier /* calculate beginning of next frame */
380*f30ccc91SDavid du Colombier pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0;
381*f30ccc91SDavid du Colombier
382*f30ccc91SDavid du Colombier if (header->layer == MAD_LAYER_I)
383*f30ccc91SDavid du Colombier N = ((12 * header->bitrate / header->samplerate) + pad_slot) * 4;
384*f30ccc91SDavid du Colombier else {
385*f30ccc91SDavid du Colombier unsigned int slots_per_frame;
386*f30ccc91SDavid du Colombier
387*f30ccc91SDavid du Colombier slots_per_frame = (header->layer == MAD_LAYER_III &&
388*f30ccc91SDavid du Colombier (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144;
389*f30ccc91SDavid du Colombier
390*f30ccc91SDavid du Colombier N = (slots_per_frame * header->bitrate / header->samplerate) + pad_slot;
391*f30ccc91SDavid du Colombier }
392*f30ccc91SDavid du Colombier
393*f30ccc91SDavid du Colombier /* verify there is enough data left in buffer to decode this frame */
394*f30ccc91SDavid du Colombier if (N + MAD_BUFFER_GUARD > end - stream->this_frame) {
395*f30ccc91SDavid du Colombier stream->next_frame = stream->this_frame;
396*f30ccc91SDavid du Colombier
397*f30ccc91SDavid du Colombier stream->error = MAD_ERROR_BUFLEN;
398*f30ccc91SDavid du Colombier goto fail;
399*f30ccc91SDavid du Colombier }
400*f30ccc91SDavid du Colombier
401*f30ccc91SDavid du Colombier stream->next_frame = stream->this_frame + N;
402*f30ccc91SDavid du Colombier
403*f30ccc91SDavid du Colombier if (!stream->sync) {
404*f30ccc91SDavid du Colombier /* check that a valid frame header follows this frame */
405*f30ccc91SDavid du Colombier
406*f30ccc91SDavid du Colombier ptr = stream->next_frame;
407*f30ccc91SDavid du Colombier if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) {
408*f30ccc91SDavid du Colombier ptr = stream->next_frame = stream->this_frame + 1;
409*f30ccc91SDavid du Colombier goto sync;
410*f30ccc91SDavid du Colombier }
411*f30ccc91SDavid du Colombier
412*f30ccc91SDavid du Colombier stream->sync = 1;
413*f30ccc91SDavid du Colombier }
414*f30ccc91SDavid du Colombier
415*f30ccc91SDavid du Colombier header->flags |= MAD_FLAG_INCOMPLETE;
416*f30ccc91SDavid du Colombier
417*f30ccc91SDavid du Colombier return 0;
418*f30ccc91SDavid du Colombier
419*f30ccc91SDavid du Colombier fail:
420*f30ccc91SDavid du Colombier stream->sync = 0;
421*f30ccc91SDavid du Colombier
422*f30ccc91SDavid du Colombier return -1;
423*f30ccc91SDavid du Colombier }
424*f30ccc91SDavid du Colombier
425*f30ccc91SDavid du Colombier /*
426*f30ccc91SDavid du Colombier * NAME: frame->decode()
427*f30ccc91SDavid du Colombier * DESCRIPTION: decode a single frame from a bitstream
428*f30ccc91SDavid du Colombier */
mad_frame_decode(struct mad_frame * frame,struct mad_stream * stream)429*f30ccc91SDavid du Colombier int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream)
430*f30ccc91SDavid du Colombier {
431*f30ccc91SDavid du Colombier frame->options = stream->options;
432*f30ccc91SDavid du Colombier
433*f30ccc91SDavid du Colombier /* header() */
434*f30ccc91SDavid du Colombier /* error_check() */
435*f30ccc91SDavid du Colombier
436*f30ccc91SDavid du Colombier if (!(frame->header.flags & MAD_FLAG_INCOMPLETE) &&
437*f30ccc91SDavid du Colombier mad_header_decode(&frame->header, stream) == -1)
438*f30ccc91SDavid du Colombier goto fail;
439*f30ccc91SDavid du Colombier
440*f30ccc91SDavid du Colombier /* audio_data() */
441*f30ccc91SDavid du Colombier
442*f30ccc91SDavid du Colombier frame->header.flags &= ~MAD_FLAG_INCOMPLETE;
443*f30ccc91SDavid du Colombier
444*f30ccc91SDavid du Colombier if (decoder_table[frame->header.layer - 1](stream, frame) == -1) {
445*f30ccc91SDavid du Colombier if (!MAD_RECOVERABLE(stream->error))
446*f30ccc91SDavid du Colombier stream->next_frame = stream->this_frame;
447*f30ccc91SDavid du Colombier
448*f30ccc91SDavid du Colombier goto fail;
449*f30ccc91SDavid du Colombier }
450*f30ccc91SDavid du Colombier
451*f30ccc91SDavid du Colombier /* ancillary_data() */
452*f30ccc91SDavid du Colombier
453*f30ccc91SDavid du Colombier if (frame->header.layer != MAD_LAYER_III) {
454*f30ccc91SDavid du Colombier struct mad_bitptr next_frame;
455*f30ccc91SDavid du Colombier
456*f30ccc91SDavid du Colombier mad_bit_init(&next_frame, stream->next_frame);
457*f30ccc91SDavid du Colombier
458*f30ccc91SDavid du Colombier stream->anc_ptr = stream->ptr;
459*f30ccc91SDavid du Colombier stream->anc_bitlen = mad_bit_length(&stream->ptr, &next_frame);
460*f30ccc91SDavid du Colombier
461*f30ccc91SDavid du Colombier mad_bit_finish(&next_frame);
462*f30ccc91SDavid du Colombier }
463*f30ccc91SDavid du Colombier
464*f30ccc91SDavid du Colombier return 0;
465*f30ccc91SDavid du Colombier
466*f30ccc91SDavid du Colombier fail:
467*f30ccc91SDavid du Colombier stream->anc_bitlen = 0;
468*f30ccc91SDavid du Colombier return -1;
469*f30ccc91SDavid du Colombier }
470*f30ccc91SDavid du Colombier
471*f30ccc91SDavid du Colombier /*
472*f30ccc91SDavid du Colombier * NAME: frame->mute()
473*f30ccc91SDavid du Colombier * DESCRIPTION: zero all subband values so the frame becomes silent
474*f30ccc91SDavid du Colombier */
mad_frame_mute(struct mad_frame * frame)475*f30ccc91SDavid du Colombier void mad_frame_mute(struct mad_frame *frame)
476*f30ccc91SDavid du Colombier {
477*f30ccc91SDavid du Colombier unsigned int s, sb;
478*f30ccc91SDavid du Colombier
479*f30ccc91SDavid du Colombier for (s = 0; s < 36; ++s) {
480*f30ccc91SDavid du Colombier for (sb = 0; sb < 32; ++sb) {
481*f30ccc91SDavid du Colombier frame->sbsample[0][s][sb] =
482*f30ccc91SDavid du Colombier frame->sbsample[1][s][sb] = 0;
483*f30ccc91SDavid du Colombier }
484*f30ccc91SDavid du Colombier }
485*f30ccc91SDavid du Colombier
486*f30ccc91SDavid du Colombier if (frame->overlap) {
487*f30ccc91SDavid du Colombier for (s = 0; s < 18; ++s) {
488*f30ccc91SDavid du Colombier for (sb = 0; sb < 32; ++sb) {
489*f30ccc91SDavid du Colombier (*frame->overlap)[0][sb][s] =
490*f30ccc91SDavid du Colombier (*frame->overlap)[1][sb][s] = 0;
491*f30ccc91SDavid du Colombier }
492*f30ccc91SDavid du Colombier }
493*f30ccc91SDavid du Colombier }
494*f30ccc91SDavid du Colombier }
495