Mercurial > libavcodec.hg
annotate ac3_parser.c @ 11104:bb877c9cb102 libavcodec
Detect spatial direct MBs partitioned smaller than 16x16 that can be partitioned
as 16x16 (except ones changing interlacing relative to the colocated MB).
20 cycles slower during MV generation
175 cycles faster during MC
author | michael |
---|---|
date | Mon, 08 Feb 2010 16:23:05 +0000 |
parents | ba5d9a97ab2f |
children | 6e15ce7ca0ca |
rev | line source |
---|---|
4941 | 1 /* |
7470
1a93d3bbe3ee
cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents:
7138
diff
changeset
|
2 * AC-3 parser |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8545
diff
changeset
|
3 * Copyright (c) 2003 Fabrice Bellard |
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8545
diff
changeset
|
4 * Copyright (c) 2003 Michael Niedermayer |
4941 | 5 * |
6 * This file is part of FFmpeg. | |
7 * | |
8 * FFmpeg is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU Lesser General Public | |
10 * License as published by the Free Software Foundation; either | |
11 * version 2.1 of the License, or (at your option) any later version. | |
12 * | |
13 * FFmpeg is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
19 * License along with FFmpeg; if not, write to the Free Software | |
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 */ | |
22 | |
23 #include "parser.h" | |
24 #include "ac3_parser.h" | |
25 #include "aac_ac3_parser.h" | |
9428 | 26 #include "get_bits.h" |
4941 | 27 |
28 | |
29 #define AC3_HEADER_SIZE 7 | |
30 | |
31 | |
32 static const uint8_t eac3_blocks[4] = { | |
33 1, 2, 3, 6 | |
34 }; | |
35 | |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
36 |
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
37 int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr) |
4941 | 38 { |
6116 | 39 int frame_size_code; |
4941 | 40 |
41 memset(hdr, 0, sizeof(*hdr)); | |
42 | |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
43 hdr->sync_word = get_bits(gbc, 16); |
4941 | 44 if(hdr->sync_word != 0x0B77) |
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8361
diff
changeset
|
45 return AAC_AC3_PARSE_ERROR_SYNC; |
4941 | 46 |
6117 | 47 /* read ahead to bsid to distinguish between AC-3 and E-AC-3 */ |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
48 hdr->bitstream_id = show_bits_long(gbc, 29) & 0x1F; |
6117 | 49 if(hdr->bitstream_id > 16) |
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8361
diff
changeset
|
50 return AAC_AC3_PARSE_ERROR_BSID; |
4941 | 51 |
7011
77f607fb4e8b
get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents:
6671
diff
changeset
|
52 hdr->num_blocks = 6; |
77f607fb4e8b
get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents:
6671
diff
changeset
|
53 |
7016 | 54 /* set default mix levels */ |
7019
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
55 hdr->center_mix_level = 1; // -4.5dB |
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
56 hdr->surround_mix_level = 1; // -6.0dB |
7016 | 57 |
6117 | 58 if(hdr->bitstream_id <= 10) { |
6118 | 59 /* Normal AC-3 */ |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
60 hdr->crc1 = get_bits(gbc, 16); |
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
61 hdr->sr_code = get_bits(gbc, 2); |
6118 | 62 if(hdr->sr_code == 3) |
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8361
diff
changeset
|
63 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE; |
4941 | 64 |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
65 frame_size_code = get_bits(gbc, 6); |
6118 | 66 if(frame_size_code > 37) |
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8361
diff
changeset
|
67 return AAC_AC3_PARSE_ERROR_FRAME_SIZE; |
4941 | 68 |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
69 skip_bits(gbc, 5); // skip bsid, already got it |
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
70 |
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
71 skip_bits(gbc, 3); // skip bitstream mode |
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
72 hdr->channel_mode = get_bits(gbc, 3); |
4941 | 73 |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
74 if(hdr->channel_mode == AC3_CHMODE_STEREO) { |
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
75 skip_bits(gbc, 2); // skip dsurmod |
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
76 } else { |
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
77 if((hdr->channel_mode & 1) && hdr->channel_mode != AC3_CHMODE_MONO) |
7019
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
78 hdr->center_mix_level = get_bits(gbc, 2); |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
79 if(hdr->channel_mode & 4) |
7019
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
80 hdr->surround_mix_level = get_bits(gbc, 2); |
6118 | 81 } |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
82 hdr->lfe_on = get_bits1(gbc); |
4941 | 83 |
6118 | 84 hdr->sr_shift = FFMAX(hdr->bitstream_id, 8) - 8; |
85 hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code] >> hdr->sr_shift; | |
86 hdr->bit_rate = (ff_ac3_bitrate_tab[frame_size_code>>1] * 1000) >> hdr->sr_shift; | |
87 hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on; | |
88 hdr->frame_size = ff_ac3_frame_size_tab[frame_size_code][hdr->sr_code] * 2; | |
6651
abc8176ddf88
Make most of E-AC-3 work without breaking regression tests.
michael
parents:
6645
diff
changeset
|
89 hdr->frame_type = EAC3_FRAME_TYPE_AC3_CONVERT; //EAC3_FRAME_TYPE_INDEPENDENT; |
7012 | 90 hdr->substreamid = 0; |
6117 | 91 } else { |
92 /* Enhanced AC-3 */ | |
93 hdr->crc1 = 0; | |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
94 hdr->frame_type = get_bits(gbc, 2); |
6540
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6539
diff
changeset
|
95 if(hdr->frame_type == EAC3_FRAME_TYPE_RESERVED) |
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8361
diff
changeset
|
96 return AAC_AC3_PARSE_ERROR_FRAME_TYPE; |
6529 | 97 |
7012 | 98 hdr->substreamid = get_bits(gbc, 3); |
6117 | 99 |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
100 hdr->frame_size = (get_bits(gbc, 11) + 1) << 1; |
6117 | 101 if(hdr->frame_size < AC3_HEADER_SIZE) |
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8361
diff
changeset
|
102 return AAC_AC3_PARSE_ERROR_FRAME_SIZE; |
6117 | 103 |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
104 hdr->sr_code = get_bits(gbc, 2); |
6117 | 105 if (hdr->sr_code == 3) { |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
106 int sr_code2 = get_bits(gbc, 2); |
6117 | 107 if(sr_code2 == 3) |
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8361
diff
changeset
|
108 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE; |
6117 | 109 hdr->sample_rate = ff_ac3_sample_rate_tab[sr_code2] / 2; |
110 hdr->sr_shift = 1; | |
111 } else { | |
7011
77f607fb4e8b
get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents:
6671
diff
changeset
|
112 hdr->num_blocks = eac3_blocks[get_bits(gbc, 2)]; |
6117 | 113 hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code]; |
114 hdr->sr_shift = 0; | |
115 } | |
116 | |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
117 hdr->channel_mode = get_bits(gbc, 3); |
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
118 hdr->lfe_on = get_bits1(gbc); |
6117 | 119 |
120 hdr->bit_rate = (uint32_t)(8.0 * hdr->frame_size * hdr->sample_rate / | |
7011
77f607fb4e8b
get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents:
6671
diff
changeset
|
121 (hdr->num_blocks * 256.0)); |
6117 | 122 hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on; |
123 } | |
9512
ba5d9a97ab2f
Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents:
9428
diff
changeset
|
124 hdr->channel_layout = ff_ac3_channel_layout_tab[hdr->channel_mode]; |
ba5d9a97ab2f
Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents:
9428
diff
changeset
|
125 if (hdr->lfe_on) |
ba5d9a97ab2f
Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents:
9428
diff
changeset
|
126 hdr->channel_layout |= CH_LOW_FREQUENCY; |
4941 | 127 |
128 return 0; | |
129 } | |
130 | |
6671
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
131 int ff_ac3_parse_header_full(GetBitContext *gbc, AC3HeaderInfo *hdr){ |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
132 int ret, i; |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
133 ret = ff_ac3_parse_header(gbc, hdr); |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
134 if(!ret){ |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
135 if(hdr->bitstream_id>10){ |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
136 /* Enhanced AC-3 */ |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
137 skip_bits(gbc, 5); // skip bitstream id |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
138 |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
139 /* skip dialog normalization and compression gain */ |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
140 for (i = 0; i < (hdr->channel_mode ? 1 : 2); i++) { |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
141 skip_bits(gbc, 5); // skip dialog normalization |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
142 if (get_bits1(gbc)) { |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
143 skip_bits(gbc, 8); //skip Compression gain word |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
144 } |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
145 } |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
146 /* dependent stream channel map */ |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
147 if (hdr->frame_type == EAC3_FRAME_TYPE_DEPENDENT && get_bits1(gbc)) { |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
148 hdr->channel_map = get_bits(gbc, 16); //custom channel map |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
149 return 0; |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
150 } |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
151 } |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
152 //default channel map based on acmod and lfeon |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
153 hdr->channel_map = ff_eac3_default_chmap[hdr->channel_mode]; |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
154 if(hdr->lfe_on) |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
155 hdr->channel_map |= AC3_CHMAP_LFE; |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
156 } |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
157 return ret; |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
158 } |
2d0b86dfe5bb
add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents:
6661
diff
changeset
|
159 |
6643 | 160 static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info, |
161 int *need_next_header, int *new_frame_start) | |
4941 | 162 { |
163 int err; | |
8361 | 164 union { |
165 uint64_t u64; | |
166 uint8_t u8[8]; | |
167 } tmp = { be2me_64(state) }; | |
4941 | 168 AC3HeaderInfo hdr; |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
169 GetBitContext gbc; |
4941 | 170 |
8361 | 171 init_get_bits(&gbc, tmp.u8+8-AC3_HEADER_SIZE, 54); |
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6651
diff
changeset
|
172 err = ff_ac3_parse_header(&gbc, &hdr); |
4941 | 173 |
6117 | 174 if(err < 0) |
4941 | 175 return 0; |
176 | |
6527
32b984487899
Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents:
6517
diff
changeset
|
177 hdr_info->sample_rate = hdr.sample_rate; |
32b984487899
Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents:
6517
diff
changeset
|
178 hdr_info->bit_rate = hdr.bit_rate; |
32b984487899
Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents:
6517
diff
changeset
|
179 hdr_info->channels = hdr.channels; |
9512
ba5d9a97ab2f
Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents:
9428
diff
changeset
|
180 hdr_info->channel_layout = hdr.channel_layout; |
8992
5a3426d7d053
Set the correct number of samples for E-AC-3 in the AC3 parser.
jbr
parents:
8977
diff
changeset
|
181 hdr_info->samples = hdr.num_blocks * 256; |
8977 | 182 if(hdr.bitstream_id>10) |
183 hdr_info->codec_id = CODEC_ID_EAC3; | |
184 else | |
185 hdr_info->codec_id = CODEC_ID_AC3; | |
6539
04763b6fd4f0
removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents:
6530
diff
changeset
|
186 |
6651
abc8176ddf88
Make most of E-AC-3 work without breaking regression tests.
michael
parents:
6645
diff
changeset
|
187 *need_next_header = (hdr.frame_type != EAC3_FRAME_TYPE_AC3_CONVERT); |
abc8176ddf88
Make most of E-AC-3 work without breaking regression tests.
michael
parents:
6645
diff
changeset
|
188 *new_frame_start = (hdr.frame_type != EAC3_FRAME_TYPE_DEPENDENT); |
6118 | 189 return hdr.frame_size; |
4941 | 190 } |
191 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6118
diff
changeset
|
192 static av_cold int ac3_parse_init(AVCodecParserContext *s1) |
4941 | 193 { |
4942
b42e963c8149
cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents:
4941
diff
changeset
|
194 AACAC3ParseContext *s = s1->priv_data; |
4941 | 195 s->header_size = AC3_HEADER_SIZE; |
196 s->sync = ac3_sync; | |
197 return 0; | |
198 } | |
199 | |
200 | |
201 AVCodecParser ac3_parser = { | |
7769 | 202 { CODEC_ID_AC3, CODEC_ID_EAC3 }, |
4942
b42e963c8149
cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents:
4941
diff
changeset
|
203 sizeof(AACAC3ParseContext), |
4941 | 204 ac3_parse_init, |
4942
b42e963c8149
cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents:
4941
diff
changeset
|
205 ff_aac_ac3_parse, |
7138 | 206 ff_parse_close, |
4941 | 207 }; |