xref: /plan9/sys/src/games/mp3dec/frame.c (revision f30ccc91ab9e7f92bd5dd82b1eebdeb503fd3465)
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