~ubuntu-branches/ubuntu/precise/ffmpeg-debian/precise

« back to all changes in this revision

Viewing changes to libavcodec/aac_parser.c

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2009-01-20 09:20:53 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20090120092053-izz63p40hc98qfgp
Tags: 3:0.svn20090119-1ubuntu1
* merge from debian. LP: #318501
* new version fixes CVE-2008-3230, LP: #253767

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 
23
23
#include "parser.h"
24
24
#include "aac_ac3_parser.h"
 
25
#include "aac_parser.h"
25
26
#include "bitstream.h"
26
27
#include "mpeg4audio.h"
27
28
 
28
29
#define AAC_HEADER_SIZE 7
29
30
 
30
 
static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info,
31
 
        int *need_next_header, int *new_frame_start)
 
31
int ff_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
32
32
{
33
 
    GetBitContext bits;
34
33
    int size, rdb, ch, sr;
35
 
    uint8_t tmp[8];
36
 
 
37
 
    AV_WB64(tmp, state);
38
 
    init_get_bits(&bits, tmp+8-AAC_HEADER_SIZE, AAC_HEADER_SIZE * 8);
39
 
 
40
 
    if(get_bits(&bits, 12) != 0xfff)
41
 
        return 0;
42
 
 
43
 
    skip_bits1(&bits);          /* id */
44
 
    skip_bits(&bits, 2);        /* layer */
45
 
    skip_bits1(&bits);          /* protection_absent */
46
 
    skip_bits(&bits, 2);        /* profile_objecttype */
47
 
    sr = get_bits(&bits, 4);    /* sample_frequency_index */
 
34
    int aot, crc_abs;
 
35
 
 
36
    if(get_bits(gbc, 12) != 0xfff)
 
37
        return AAC_AC3_PARSE_ERROR_SYNC;
 
38
 
 
39
    skip_bits1(gbc);             /* id */
 
40
    skip_bits(gbc, 2);           /* layer */
 
41
    crc_abs = get_bits1(gbc);    /* protection_absent */
 
42
    aot     = get_bits(gbc, 2);  /* profile_objecttype */
 
43
    sr      = get_bits(gbc, 4);  /* sample_frequency_index */
48
44
    if(!ff_mpeg4audio_sample_rates[sr])
49
 
        return 0;
50
 
    skip_bits1(&bits);          /* private_bit */
51
 
    ch = get_bits(&bits, 3);    /* channel_configuration */
 
45
        return AAC_AC3_PARSE_ERROR_SAMPLE_RATE;
 
46
    skip_bits1(gbc);             /* private_bit */
 
47
    ch      = get_bits(gbc, 3);  /* channel_configuration */
 
48
 
52
49
    if(!ff_mpeg4audio_channels[ch])
53
 
        return 0;
54
 
    skip_bits1(&bits);          /* original/copy */
55
 
    skip_bits1(&bits);          /* home */
 
50
        return AAC_AC3_PARSE_ERROR_CHANNEL_CFG;
 
51
 
 
52
    skip_bits1(gbc);             /* original/copy */
 
53
    skip_bits1(gbc);             /* home */
56
54
 
57
55
    /* adts_variable_header */
58
 
    skip_bits1(&bits);          /* copyright_identification_bit */
59
 
    skip_bits1(&bits);          /* copyright_identification_start */
60
 
    size = get_bits(&bits, 13); /* aac_frame_length */
 
56
    skip_bits1(gbc);             /* copyright_identification_bit */
 
57
    skip_bits1(gbc);             /* copyright_identification_start */
 
58
    size    = get_bits(gbc, 13); /* aac_frame_length */
61
59
    if(size < AAC_HEADER_SIZE)
 
60
        return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
 
61
 
 
62
    skip_bits(gbc, 11);          /* adts_buffer_fullness */
 
63
    rdb = get_bits(gbc, 2);      /* number_of_raw_data_blocks_in_frame */
 
64
 
 
65
    hdr->object_type    = aot;
 
66
    hdr->chan_config    = ch;
 
67
    hdr->crc_absent     = crc_abs;
 
68
    hdr->num_aac_frames = rdb + 1;
 
69
    hdr->sampling_index = sr;
 
70
    hdr->sample_rate    = ff_mpeg4audio_sample_rates[sr];
 
71
    hdr->samples        = (rdb + 1) * 1024;
 
72
    hdr->bit_rate       = size * 8 * hdr->sample_rate / hdr->samples;
 
73
 
 
74
    return size;
 
75
}
 
76
 
 
77
static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info,
 
78
        int *need_next_header, int *new_frame_start)
 
79
{
 
80
    GetBitContext bits;
 
81
    AACADTSHeaderInfo hdr;
 
82
    int size;
 
83
    union {
 
84
        uint64_t u64;
 
85
        uint8_t  u8[8];
 
86
    } tmp;
 
87
 
 
88
    tmp.u64 = be2me_64(state);
 
89
    init_get_bits(&bits, tmp.u8+8-AAC_HEADER_SIZE, AAC_HEADER_SIZE * 8);
 
90
 
 
91
    if ((size = ff_aac_parse_header(&bits, &hdr)) < 0)
62
92
        return 0;
63
 
 
64
 
    skip_bits(&bits, 11);       /* adts_buffer_fullness */
65
 
    rdb = get_bits(&bits, 2);   /* number_of_raw_data_blocks_in_frame */
66
 
 
67
 
    hdr_info->channels = ff_mpeg4audio_channels[ch];
68
 
    hdr_info->sample_rate = ff_mpeg4audio_sample_rates[sr];
69
 
    hdr_info->samples = (rdb + 1) * 1024;
70
 
    hdr_info->bit_rate = size * 8 * hdr_info->sample_rate / hdr_info->samples;
71
 
 
72
93
    *need_next_header = 0;
73
94
    *new_frame_start  = 1;
 
95
    hdr_info->sample_rate = hdr.sample_rate;
 
96
    hdr_info->channels    = ff_mpeg4audio_channels[hdr.chan_config];
 
97
    hdr_info->samples     = hdr.samples;
 
98
    hdr_info->bit_rate    = hdr.bit_rate;
74
99
    return size;
75
100
}
76
101