OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [first/] [mp3/] [sw/] [mad-xess/] [libmad/] [frame.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.