Mercurial > libavcodec.hg
annotate mpeg4audio.c @ 12266:48d6738904a9 libavcodec
Fix SPLATB_REG mess. Used to be a if/elseif/elseif/elseif spaghetti, so this
splits it into small optimization-specific macros which are selected for each
DSP function. The advantage of this approach is that the sse4 functions now
use the ssse3 codepath also without needing an explicit sse4 codepath.
author | rbultje |
---|---|
date | Sat, 24 Jul 2010 19:33:05 +0000 |
parents | 2d81202be6e2 |
children |
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; |
11588 | 91 c->ps = -1; |
11387
c7ed26e2011f
Add support for non-backwards compatible signaled parametric stereo.
alexc
parents:
10535
diff
changeset
|
92 if (c->object_type == AOT_SBR || (c->object_type == AOT_PS && |
c7ed26e2011f
Add support for non-backwards compatible signaled parametric stereo.
alexc
parents:
10535
diff
changeset
|
93 // check for W6132 Annex YYYY draft MP3onMP4 |
c7ed26e2011f
Add support for non-backwards compatible signaled parametric stereo.
alexc
parents:
10535
diff
changeset
|
94 !(show_bits(&gb, 3) & 0x03 && !(show_bits(&gb, 9) & 0x3F)))) { |
11588 | 95 if (c->object_type == AOT_PS) |
96 c->ps = 1; | |
11586 | 97 c->ext_object_type = AOT_SBR; |
6558 | 98 c->sbr = 1; |
99 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index); | |
100 c->object_type = get_object_type(&gb); | |
9527
b687da895962
Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents:
9428
diff
changeset
|
101 if (c->object_type == AOT_ER_BSAC) |
b687da895962
Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents:
9428
diff
changeset
|
102 c->ext_chan_config = get_bits(&gb, 4); |
9226 | 103 } else { |
10064
41796cdda927
Use the AOT enum instead of integer literals for setting and comparing audio
alexc
parents:
10009
diff
changeset
|
104 c->ext_object_type = AOT_NULL; |
9226 | 105 c->ext_sample_rate = 0; |
106 } | |
6558 | 107 specific_config_bitindex = get_bits_count(&gb); |
108 | |
10521
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
109 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
|
110 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
|
111 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
|
112 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
|
113 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
114 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
|
115 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
116 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
|
117 return -1; |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
118 } |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
119 |
10009
8649dc2299e2
Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents:
9636
diff
changeset
|
120 if (c->ext_object_type != AOT_SBR) { |
11587 | 121 while (get_bits_left(&gb) > 15) { |
6558 | 122 if (show_bits(&gb, 11) == 0x2b7) { // sync extension |
123 get_bits(&gb, 11); | |
124 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
|
125 if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(&gb)) == 1) |
6558 | 126 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index); |
11588 | 127 if (get_bits_left(&gb) > 11 && get_bits(&gb, 11) == 0x548) |
128 c->ps = get_bits1(&gb); | |
6558 | 129 break; |
130 } else | |
131 get_bits1(&gb); // skip 1 bit | |
132 } | |
133 } | |
11886 | 134 |
135 //PS requires SBR | |
136 if (!c->sbr) | |
137 c->ps = 0; | |
138 //Limit implicit PS to the HE-AACv2 Profile | |
139 if ((c->ps == -1 && c->object_type != AOT_AAC_LC) || c->channels & ~0x01) | |
140 c->ps = 0; | |
141 | |
6558 | 142 return specific_config_bitindex; |
143 } | |
9636
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 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
|
146 GetBitContext *gb, |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
147 int bits) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
148 { |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
149 unsigned int el = get_bits(gb, bits); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
150 put_bits(pb, bits, el); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
151 return el; |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
152 } |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
153 |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
154 int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
155 { |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
156 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
|
157 int offset = put_bits_count(pb); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
158 |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
159 copy_bits(pb, gb, 10); //Tag, Object Type, Frequency |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
160 five_bit_ch = copy_bits(pb, gb, 4); //Front |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
161 five_bit_ch += copy_bits(pb, gb, 4); //Side |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
162 five_bit_ch += copy_bits(pb, gb, 4); //Back |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
163 four_bit_ch = copy_bits(pb, gb, 2); //LFE |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
164 four_bit_ch += copy_bits(pb, gb, 3); //Data |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
165 five_bit_ch += copy_bits(pb, gb, 4); //Coupling |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
166 if (copy_bits(pb, gb, 1)) //Mono Mixdown |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
167 copy_bits(pb, gb, 4); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
168 if (copy_bits(pb, gb, 1)) //Stereo Mixdown |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
169 copy_bits(pb, gb, 4); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
170 if (copy_bits(pb, gb, 1)) //Matrix Mixdown |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
171 copy_bits(pb, gb, 3); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
172 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
|
173 copy_bits(pb, gb, 16); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
174 if (bits) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
175 copy_bits(pb, gb, bits); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
176 align_put_bits(pb); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
177 align_get_bits(gb); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
178 comment_size = copy_bits(pb, gb, 8); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
179 for (; comment_size > 0; comment_size--) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
180 copy_bits(pb, gb, 8); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
181 |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
182 return put_bits_count(pb) - offset; |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
183 } |