annotate aac_parser.c @ 5319:40af705cef7e libavcodec

AC-3 decoder, soc revision 69, Aug 31 07:12:56 2006 UTC by cloud9 Fix the bugs: 1. The quality of output because of incorrect windowing coefficients. New code for window generation. 2. Dynrng values were reset where dynrng value is present in the first block, but not in the subsequent block.
author jbr
date Sat, 14 Jul 2007 16:03:14 +0000
parents b42e963c8149
children ced30500e2b1
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 */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
70 skip_bits(&bits, 11); /* adts_buffer_fullness */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
71 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
72
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
73 *channels = aac_channels[ch];
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
74 *sample_rate = aac_sample_rates[sr];
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
75 *samples = (rdb + 1) * 1024;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
76 *bit_rate = size * 8 * *sample_rate / *samples;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
77
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
78 return size;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
79 }
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 static int aac_parse_init(AVCodecParserContext *s1)
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
82 {
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
83 AACAC3ParseContext *s = s1->priv_data;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
84 s->inbuf_ptr = s->inbuf;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
85 s->header_size = AAC_HEADER_SIZE;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
86 s->sync = aac_sync;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
87 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
88 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
89
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
90
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
91 AVCodecParser aac_parser = {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
92 { CODEC_ID_AAC },
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
93 sizeof(AACAC3ParseContext),
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
94 aac_parse_init,
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
95 ff_aac_ac3_parse,
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
96 NULL,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
97 };