annotate aac_parser.c @ 5875:5a61e8e2f65c libavcodec

Remove libvorbis Vorbis decoding support. Our native decoder is complete and has no known bugs, any remaining issues will hopefully be uncovered now.
author diego
date Sun, 04 Nov 2007 12:55:32 +0000
parents ced30500e2b1
children 48759bfbd073
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
1 /*
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
2 * Audio and Video frame extraction
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
4 * Copyright (c) 2003 Michael Niedermayer.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
5 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
6 * This file is part of FFmpeg.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
7 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
12 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
16 * Lesser General Public License for more details.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
17 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
21 */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
22
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
23 #include "parser.h"
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
24 #include "aac_ac3_parser.h"
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
25 #include "bitstream.h"
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
26
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
27
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
28 #define AAC_HEADER_SIZE 7
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
29
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
30
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
31 static const int aac_sample_rates[16] = {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
32 96000, 88200, 64000, 48000, 44100, 32000,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
33 24000, 22050, 16000, 12000, 11025, 8000, 7350
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
34 };
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
35
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
36 static const int aac_channels[8] = {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
37 0, 1, 2, 3, 4, 5, 6, 8
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
38 };
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
39
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
40
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
41 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
42 int *bit_rate, int *samples)
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
43 {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
44 GetBitContext bits;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
45 int size, rdb, ch, sr;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
46
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
47 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
48
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
49 if(get_bits(&bits, 12) != 0xfff)
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
50 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
51
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
52 skip_bits1(&bits); /* id */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
53 skip_bits(&bits, 2); /* layer */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
54 skip_bits1(&bits); /* protection_absent */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
55 skip_bits(&bits, 2); /* profile_objecttype */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
56 sr = get_bits(&bits, 4); /* sample_frequency_index */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
57 if(!aac_sample_rates[sr])
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
58 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
59 skip_bits1(&bits); /* private_bit */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
60 ch = get_bits(&bits, 3); /* channel_configuration */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
61 if(!aac_channels[ch])
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
62 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
63 skip_bits1(&bits); /* original/copy */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
64 skip_bits1(&bits); /* home */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
65
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
66 /* adts_variable_header */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
67 skip_bits1(&bits); /* copyright_identification_bit */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
68 skip_bits1(&bits); /* copyright_identification_start */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
69 size = get_bits(&bits, 13); /* aac_frame_length */
5817
ced30500e2b1 prevent infinite loop and memcpy of negative amounts
michael
parents: 4942
diff changeset
70 if(size < AAC_HEADER_SIZE)
ced30500e2b1 prevent infinite loop and memcpy of negative amounts
michael
parents: 4942
diff changeset
71 return 0;
ced30500e2b1 prevent infinite loop and memcpy of negative amounts
michael
parents: 4942
diff changeset
72
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
73 skip_bits(&bits, 11); /* adts_buffer_fullness */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
74 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
75
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
76 *channels = aac_channels[ch];
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
77 *sample_rate = aac_sample_rates[sr];
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
78 *samples = (rdb + 1) * 1024;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
79 *bit_rate = size * 8 * *sample_rate / *samples;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
80
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
81 return size;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
82 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
83
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
84 static int aac_parse_init(AVCodecParserContext *s1)
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
85 {
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
86 AACAC3ParseContext *s = s1->priv_data;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
87 s->inbuf_ptr = s->inbuf;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
88 s->header_size = AAC_HEADER_SIZE;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
89 s->sync = aac_sync;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
90 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
91 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
92
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
93
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
94 AVCodecParser aac_parser = {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
95 { CODEC_ID_AAC },
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
96 sizeof(AACAC3ParseContext),
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
97 aac_parse_init,
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
98 ff_aac_ac3_parse,
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
99 NULL,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
100 };