Mercurial > libavcodec.hg
annotate mpeg4audio.c @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 95f3daa991a2 |
children | c7ed26e2011f |
rev | line source |
---|---|
6558 | 1 /* |
2 * MPEG-4 Audio common code | |
3 * Copyright (c) 2008 Baptiste Coudurier <baptiste.coudurier@free.fr> | |
9636
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
4 * Copyright (c) 2009 Alex Converse <alex.converse@gmail.com> |
6558 | 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 | |
9428 | 23 #include "get_bits.h" |
9636
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
24 #include "put_bits.h" |
6558 | 25 #include "mpeg4audio.h" |
26 | |
10521
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
27 /** |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
28 * Parse MPEG-4 audio configuration for ALS object type. |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
29 * @param[in] gb bit reader context |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
30 * @param[in] c MPEG4AudioConfig structure to fill |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
31 * @return on success 0 is returned, otherwise a value < 0 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
32 */ |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
33 static int parse_config_ALS(GetBitContext *gb, MPEG4AudioConfig *c) |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
34 { |
10535
95f3daa991a2
Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents:
10521
diff
changeset
|
35 if (get_bits_left(gb) < 112) |
10521
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
36 return -1; |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
37 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
38 if (get_bits_long(gb, 32) != MKBETAG('A','L','S','\0')) |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
39 return -1; |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
40 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
41 // override AudioSpecificConfig channel configuration and sample rate |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
42 // which are buggy in old ALS conformance files |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
43 c->sample_rate = get_bits_long(gb, 32); |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
44 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
45 // skip number of samples |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
46 skip_bits_long(gb, 32); |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
47 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
48 // read number of channels |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
49 c->chan_config = 0; |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
50 c->channels = get_bits(gb, 16) + 1; |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
51 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
52 return 0; |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
53 } |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
54 |
6558 | 55 const int ff_mpeg4audio_sample_rates[16] = { |
56 96000, 88200, 64000, 48000, 44100, 32000, | |
57 24000, 22050, 16000, 12000, 11025, 8000, 7350 | |
58 }; | |
59 | |
60 const uint8_t ff_mpeg4audio_channels[8] = { | |
61 0, 1, 2, 3, 4, 5, 6, 8 | |
62 }; | |
63 | |
64 static inline int get_object_type(GetBitContext *gb) | |
65 { | |
66 int object_type = get_bits(gb, 5); | |
10064
41796cdda927
Use the AOT enum instead of integer literals for setting and comparing audio
alexc
parents:
10009
diff
changeset
|
67 if (object_type == AOT_ESCAPE) |
6558 | 68 object_type = 32 + get_bits(gb, 6); |
69 return object_type; | |
70 } | |
71 | |
72 static inline int get_sample_rate(GetBitContext *gb, int *index) | |
73 { | |
74 *index = get_bits(gb, 4); | |
75 return *index == 0x0f ? get_bits(gb, 24) : | |
76 ff_mpeg4audio_sample_rates[*index]; | |
77 } | |
78 | |
79 int ff_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf, int buf_size) | |
80 { | |
81 GetBitContext gb; | |
82 int specific_config_bitindex; | |
83 | |
84 init_get_bits(&gb, buf, buf_size*8); | |
85 c->object_type = get_object_type(&gb); | |
86 c->sample_rate = get_sample_rate(&gb, &c->sampling_index); | |
87 c->chan_config = get_bits(&gb, 4); | |
10518 | 88 if (c->chan_config < FF_ARRAY_ELEMS(ff_mpeg4audio_channels)) |
89 c->channels = ff_mpeg4audio_channels[c->chan_config]; | |
6558 | 90 c->sbr = -1; |
10009
8649dc2299e2
Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents:
9636
diff
changeset
|
91 if (c->object_type == AOT_SBR) { |
6558 | 92 c->ext_object_type = c->object_type; |
93 c->sbr = 1; | |
94 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index); | |
95 c->object_type = get_object_type(&gb); | |
9527
b687da895962
Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents:
9428
diff
changeset
|
96 if (c->object_type == AOT_ER_BSAC) |
b687da895962
Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents:
9428
diff
changeset
|
97 c->ext_chan_config = get_bits(&gb, 4); |
9226 | 98 } else { |
10064
41796cdda927
Use the AOT enum instead of integer literals for setting and comparing audio
alexc
parents:
10009
diff
changeset
|
99 c->ext_object_type = AOT_NULL; |
9226 | 100 c->ext_sample_rate = 0; |
101 } | |
6558 | 102 specific_config_bitindex = get_bits_count(&gb); |
103 | |
10521
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
104 if (c->object_type == AOT_ALS) { |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
105 skip_bits(&gb, 5); |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
106 if (show_bits_long(&gb, 24) != MKBETAG('\0','A','L','S')) |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
107 skip_bits_long(&gb, 24); |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
108 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
109 specific_config_bitindex = get_bits_count(&gb); |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
110 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
111 if (parse_config_ALS(&gb, c)) |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
112 return -1; |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
113 } |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
114 |
10009
8649dc2299e2
Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents:
9636
diff
changeset
|
115 if (c->ext_object_type != AOT_SBR) { |
10521
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
116 int bits_left = buf_size*8 - get_bits_count(&gb); |
6558 | 117 for (; bits_left > 15; bits_left--) { |
118 if (show_bits(&gb, 11) == 0x2b7) { // sync extension | |
119 get_bits(&gb, 11); | |
120 c->ext_object_type = get_object_type(&gb); | |
10009
8649dc2299e2
Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents:
9636
diff
changeset
|
121 if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(&gb)) == 1) |
6558 | 122 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index); |
123 break; | |
124 } else | |
125 get_bits1(&gb); // skip 1 bit | |
126 } | |
127 } | |
128 return specific_config_bitindex; | |
129 } | |
9636
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
130 |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
131 static av_always_inline unsigned int copy_bits(PutBitContext *pb, |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
132 GetBitContext *gb, |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
133 int bits) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
134 { |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
135 unsigned int el = get_bits(gb, bits); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
136 put_bits(pb, bits, el); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
137 return el; |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
138 } |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
139 |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
140 int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
141 { |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
142 int five_bit_ch, four_bit_ch, comment_size, bits; |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
143 int offset = put_bits_count(pb); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
144 |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
145 copy_bits(pb, gb, 10); //Tag, Object Type, Frequency |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
146 five_bit_ch = copy_bits(pb, gb, 4); //Front |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
147 five_bit_ch += copy_bits(pb, gb, 4); //Side |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
148 five_bit_ch += copy_bits(pb, gb, 4); //Back |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
149 four_bit_ch = copy_bits(pb, gb, 2); //LFE |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
150 four_bit_ch += copy_bits(pb, gb, 3); //Data |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
151 five_bit_ch += copy_bits(pb, gb, 4); //Coupling |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
152 if (copy_bits(pb, gb, 1)) //Mono Mixdown |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
153 copy_bits(pb, gb, 4); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
154 if (copy_bits(pb, gb, 1)) //Stereo Mixdown |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
155 copy_bits(pb, gb, 4); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
156 if (copy_bits(pb, gb, 1)) //Matrix Mixdown |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
157 copy_bits(pb, gb, 3); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
158 for (bits = five_bit_ch*5+four_bit_ch*4; bits > 16; bits -= 16) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
159 copy_bits(pb, gb, 16); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
160 if (bits) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
161 copy_bits(pb, gb, bits); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
162 align_put_bits(pb); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
163 align_get_bits(gb); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
164 comment_size = copy_bits(pb, gb, 8); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
165 for (; comment_size > 0; comment_size--) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
166 copy_bits(pb, gb, 8); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
167 |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
168 return put_bits_count(pb) - offset; |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
169 } |