~ubuntu-branches/ubuntu/natty/libav/natty-security

« back to all changes in this revision

Viewing changes to libavcodec/mpegaudiodecheader.c

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2011-03-20 12:09:31 UTC
  • Revision ID: james.westby@ubuntu.com-20110320120931-nfhi9tiok27gxhw1
Tags: upstream-0.6.2
ImportĀ upstreamĀ versionĀ 0.6.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * MPEG Audio header decoder
 
3
 * Copyright (c) 2001, 2002 Fabrice Bellard
 
4
 *
 
5
 * This file is part of FFmpeg.
 
6
 *
 
7
 * FFmpeg is free software; you can redistribute it and/or
 
8
 * modify it under the terms of the GNU Lesser General Public
 
9
 * License as published by the Free Software Foundation; either
 
10
 * version 2.1 of the License, or (at your option) any later version.
 
11
 *
 
12
 * FFmpeg is distributed in the hope that it will be useful,
 
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
15
 * Lesser General Public License for more details.
 
16
 *
 
17
 * You should have received a copy of the GNU Lesser General Public
 
18
 * License along with FFmpeg; if not, write to the Free Software
 
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
20
 */
 
21
 
 
22
/**
 
23
 * @file
 
24
 * MPEG Audio header decoder.
 
25
 */
 
26
 
 
27
//#define DEBUG
 
28
#include "avcodec.h"
 
29
#include "mpegaudio.h"
 
30
#include "mpegaudiodata.h"
 
31
#include "mpegaudiodecheader.h"
 
32
 
 
33
 
 
34
int ff_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header)
 
35
{
 
36
    int sample_rate, frame_size, mpeg25, padding;
 
37
    int sample_rate_index, bitrate_index;
 
38
    if (header & (1<<20)) {
 
39
        s->lsf = (header & (1<<19)) ? 0 : 1;
 
40
        mpeg25 = 0;
 
41
    } else {
 
42
        s->lsf = 1;
 
43
        mpeg25 = 1;
 
44
    }
 
45
 
 
46
    s->layer = 4 - ((header >> 17) & 3);
 
47
    /* extract frequency */
 
48
    sample_rate_index = (header >> 10) & 3;
 
49
    sample_rate = ff_mpa_freq_tab[sample_rate_index] >> (s->lsf + mpeg25);
 
50
    sample_rate_index += 3 * (s->lsf + mpeg25);
 
51
    s->sample_rate_index = sample_rate_index;
 
52
    s->error_protection = ((header >> 16) & 1) ^ 1;
 
53
    s->sample_rate = sample_rate;
 
54
 
 
55
    bitrate_index = (header >> 12) & 0xf;
 
56
    padding = (header >> 9) & 1;
 
57
    //extension = (header >> 8) & 1;
 
58
    s->mode = (header >> 6) & 3;
 
59
    s->mode_ext = (header >> 4) & 3;
 
60
    //copyright = (header >> 3) & 1;
 
61
    //original = (header >> 2) & 1;
 
62
    //emphasis = header & 3;
 
63
 
 
64
    if (s->mode == MPA_MONO)
 
65
        s->nb_channels = 1;
 
66
    else
 
67
        s->nb_channels = 2;
 
68
 
 
69
    if (bitrate_index != 0) {
 
70
        frame_size = ff_mpa_bitrate_tab[s->lsf][s->layer - 1][bitrate_index];
 
71
        s->bit_rate = frame_size * 1000;
 
72
        switch(s->layer) {
 
73
        case 1:
 
74
            frame_size = (frame_size * 12000) / sample_rate;
 
75
            frame_size = (frame_size + padding) * 4;
 
76
            break;
 
77
        case 2:
 
78
            frame_size = (frame_size * 144000) / sample_rate;
 
79
            frame_size += padding;
 
80
            break;
 
81
        default:
 
82
        case 3:
 
83
            frame_size = (frame_size * 144000) / (sample_rate << s->lsf);
 
84
            frame_size += padding;
 
85
            break;
 
86
        }
 
87
        s->frame_size = frame_size;
 
88
    } else {
 
89
        /* if no frame size computed, signal it */
 
90
        return 1;
 
91
    }
 
92
 
 
93
#if defined(DEBUG)
 
94
    dprintf(NULL, "layer%d, %d Hz, %d kbits/s, ",
 
95
           s->layer, s->sample_rate, s->bit_rate);
 
96
    if (s->nb_channels == 2) {
 
97
        if (s->layer == 3) {
 
98
            if (s->mode_ext & MODE_EXT_MS_STEREO)
 
99
                dprintf(NULL, "ms-");
 
100
            if (s->mode_ext & MODE_EXT_I_STEREO)
 
101
                dprintf(NULL, "i-");
 
102
        }
 
103
        dprintf(NULL, "stereo");
 
104
    } else {
 
105
        dprintf(NULL, "mono");
 
106
    }
 
107
    dprintf(NULL, "\n");
 
108
#endif
 
109
    return 0;
 
110
}