Mercurial > libavcodec.hg
annotate mpeg4audio.c @ 11557:53822d92c3f7 libavcodec
Make sure the EC code does not attempt to use inter based concealment if there
is no reference frame available. (this can happen because the EC code will attempt
to use reference frames even for I/IDR frames)
author | michael |
---|---|
date | Tue, 30 Mar 2010 20:46:46 +0000 |
parents | c7ed26e2011f |
children | 2dc5036a8d18 |
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; |
11387
c7ed26e2011f
Add support for non-backwards compatible signaled parametric stereo.
alexc
parents:
10535
diff
changeset
|
91 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
|
92 // check for W6132 Annex YYYY draft MP3onMP4 |
c7ed26e2011f
Add support for non-backwards compatible signaled parametric stereo.
alexc
parents:
10535
diff
changeset
|
93 !(show_bits(&gb, 3) & 0x03 && !(show_bits(&gb, 9) & 0x3F)))) { |
6558 | 94 c->ext_object_type = c->object_type; |
95 c->sbr = 1; | |
96 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index); | |
97 c->object_type = get_object_type(&gb); | |
9527
b687da895962
Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents:
9428
diff
changeset
|
98 if (c->object_type == AOT_ER_BSAC) |
b687da895962
Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents:
9428
diff
changeset
|
99 c->ext_chan_config = get_bits(&gb, 4); |
9226 | 100 } else { |
10064
41796cdda927
Use the AOT enum instead of integer literals for setting and comparing audio
alexc
parents:
10009
diff
changeset
|
101 c->ext_object_type = AOT_NULL; |
9226 | 102 c->ext_sample_rate = 0; |
103 } | |
6558 | 104 specific_config_bitindex = get_bits_count(&gb); |
105 | |
10521
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
106 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
|
107 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
|
108 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
|
109 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
|
110 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
111 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
|
112 |
33890a382b36
Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents:
10518
diff
changeset
|
113 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
|
114 return -1; |
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 |
10009
8649dc2299e2
Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents:
9636
diff
changeset
|
117 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
|
118 int bits_left = buf_size*8 - get_bits_count(&gb); |
6558 | 119 for (; bits_left > 15; bits_left--) { |
120 if (show_bits(&gb, 11) == 0x2b7) { // sync extension | |
121 get_bits(&gb, 11); | |
122 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
|
123 if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(&gb)) == 1) |
6558 | 124 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index); |
125 break; | |
126 } else | |
127 get_bits1(&gb); // skip 1 bit | |
128 } | |
129 } | |
130 return specific_config_bitindex; | |
131 } | |
9636
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
132 |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
133 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
|
134 GetBitContext *gb, |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
135 int bits) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
136 { |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
137 unsigned int el = get_bits(gb, bits); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
138 put_bits(pb, bits, el); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
139 return el; |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
140 } |
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 ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
143 { |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
144 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
|
145 int offset = put_bits_count(pb); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
146 |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
147 copy_bits(pb, gb, 10); //Tag, Object Type, Frequency |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
148 five_bit_ch = copy_bits(pb, gb, 4); //Front |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
149 five_bit_ch += copy_bits(pb, gb, 4); //Side |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
150 five_bit_ch += copy_bits(pb, gb, 4); //Back |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
151 four_bit_ch = copy_bits(pb, gb, 2); //LFE |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
152 four_bit_ch += copy_bits(pb, gb, 3); //Data |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
153 five_bit_ch += copy_bits(pb, gb, 4); //Coupling |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
154 if (copy_bits(pb, gb, 1)) //Mono 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)) //Stereo Mixdown |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
157 copy_bits(pb, gb, 4); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
158 if (copy_bits(pb, gb, 1)) //Matrix Mixdown |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
159 copy_bits(pb, gb, 3); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
160 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
|
161 copy_bits(pb, gb, 16); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
162 if (bits) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
163 copy_bits(pb, gb, bits); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
164 align_put_bits(pb); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
165 align_get_bits(gb); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
166 comment_size = copy_bits(pb, gb, 8); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
167 for (; comment_size > 0; comment_size--) |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
168 copy_bits(pb, gb, 8); |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
169 |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
170 return put_bits_count(pb) - offset; |
8e95c7402d1a
Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents:
9527
diff
changeset
|
171 } |