Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * MPEG-4 Audio common code | ||
3 | * Copyright (c) 2008 Baptiste Coudurier <baptiste.coudurier@free.fr> | ||
4 | * Copyright (c) 2009 Alex Converse <alex.converse@gmail.com> | ||
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 "get_bits.h" | ||
24 | #include "mpeg4audio.h" | ||
25 | |||
26 | /** | ||
27 | * Parse MPEG-4 audio configuration for ALS object type. | ||
28 | * @param[in] gb bit reader context | ||
29 | * @param[in] c MPEG4AudioConfig structure to fill | ||
30 | * @return on success 0 is returned, otherwise a value < 0 | ||
31 | */ | ||
32 | 21 | static int parse_config_ALS(GetBitContext *gb, MPEG4AudioConfig *c, void *logctx) | |
33 | { | ||
34 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 21 times.
|
21 | if (get_bits_left(gb) < 112) |
35 | ✗ | return AVERROR_INVALIDDATA; | |
36 | |||
37 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 21 times.
|
21 | if (get_bits_long(gb, 32) != MKBETAG('A','L','S','\0')) |
38 | ✗ | return AVERROR_INVALIDDATA; | |
39 | |||
40 | // override AudioSpecificConfig channel configuration and sample rate | ||
41 | // which are buggy in old ALS conformance files | ||
42 | 21 | c->sample_rate = get_bits_long(gb, 32); | |
43 | |||
44 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
|
21 | if (c->sample_rate <= 0) { |
45 | ✗ | av_log(logctx, AV_LOG_ERROR, "Invalid sample rate %d\n", c->sample_rate); | |
46 | ✗ | return AVERROR_INVALIDDATA; | |
47 | } | ||
48 | |||
49 | // skip number of samples | ||
50 | 21 | skip_bits_long(gb, 32); | |
51 | |||
52 | // read number of channels | ||
53 | 21 | c->chan_config = 0; | |
54 | 21 | c->channels = get_bits(gb, 16) + 1; | |
55 | |||
56 | 21 | return 0; | |
57 | } | ||
58 | |||
59 | const uint8_t ff_mpeg4audio_channels[15] = { | ||
60 | 0, | ||
61 | 1, // mono (1/0) | ||
62 | 2, // stereo (2/0) | ||
63 | 3, // 3/0 | ||
64 | 4, // 3/1 | ||
65 | 5, // 3/2 | ||
66 | 6, // 3/2.1 | ||
67 | 8, // 5/2.1 | ||
68 | 0, | ||
69 | 0, | ||
70 | 0, | ||
71 | 7, // 3/3.1 | ||
72 | 8, // 3/2/2.1 | ||
73 | 24, // 3/3/3 - 5/2/3 - 3/0/0.2 | ||
74 | 8, // 3/2.1 - 2/0 | ||
75 | }; | ||
76 | |||
77 | 868 | static inline int get_object_type(GetBitContext *gb) | |
78 | { | ||
79 | 868 | int object_type = get_bits(gb, 5); | |
80 |
2/2✓ Branch 0 taken 42 times.
✓ Branch 1 taken 826 times.
|
868 | if (object_type == AOT_ESCAPE) |
81 | 42 | object_type = 32 + get_bits(gb, 6); | |
82 | 868 | return object_type; | |
83 | } | ||
84 | |||
85 | 805 | static inline int get_sample_rate(GetBitContext *gb, int *index) | |
86 | { | ||
87 | 805 | *index = get_bits(gb, 4); | |
88 |
2/2✓ Branch 0 taken 21 times.
✓ Branch 1 taken 784 times.
|
1589 | return *index == 0x0f ? get_bits(gb, 24) : |
89 | 784 | ff_mpeg4audio_sample_rates[*index]; | |
90 | } | ||
91 | |||
92 | 721 | int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb, | |
93 | int sync_extension, void *logctx) | ||
94 | { | ||
95 | int specific_config_bitindex, ret; | ||
96 | 721 | int start_bit_index = get_bits_count(gb); | |
97 | 721 | c->object_type = get_object_type(gb); | |
98 | 721 | c->sample_rate = get_sample_rate(gb, &c->sampling_index); | |
99 | 721 | c->chan_config = get_bits(gb, 4); | |
100 |
1/2✓ Branch 0 taken 721 times.
✗ Branch 1 not taken.
|
721 | if (c->chan_config < FF_ARRAY_ELEMS(ff_mpeg4audio_channels)) |
101 | 721 | c->channels = ff_mpeg4audio_channels[c->chan_config]; | |
102 | else { | ||
103 | ✗ | av_log(logctx, AV_LOG_ERROR, "Invalid chan_config %d\n", c->chan_config); | |
104 | ✗ | return AVERROR_INVALIDDATA; | |
105 | } | ||
106 | 721 | c->sbr = -1; | |
107 | 721 | c->ps = -1; | |
108 |
4/4✓ Branch 0 taken 718 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 715 times.
|
721 | if (c->object_type == AOT_SBR || (c->object_type == AOT_PS && |
109 | // check for W6132 Annex YYYY draft MP3onMP4 | ||
110 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
3 | !(show_bits(gb, 3) & 0x03 && !(show_bits(gb, 9) & 0x3F)))) { |
111 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
6 | if (c->object_type == AOT_PS) |
112 | 3 | c->ps = 1; | |
113 | 6 | c->ext_object_type = AOT_SBR; | |
114 | 6 | c->sbr = 1; | |
115 | 6 | c->ext_sample_rate = get_sample_rate(gb, &c->ext_sampling_index); | |
116 | 6 | c->object_type = get_object_type(gb); | |
117 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
|
6 | if (c->object_type == AOT_ER_BSAC) |
118 | ✗ | c->ext_chan_config = get_bits(gb, 4); | |
119 | } else { | ||
120 | 715 | c->ext_object_type = AOT_NULL; | |
121 | 715 | c->ext_sample_rate = 0; | |
122 | } | ||
123 | 721 | specific_config_bitindex = get_bits_count(gb); | |
124 | |||
125 |
2/2✓ Branch 0 taken 21 times.
✓ Branch 1 taken 700 times.
|
721 | if (c->object_type == AOT_ALS) { |
126 | 21 | skip_bits(gb, 5); | |
127 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 21 times.
|
21 | if (show_bits(gb, 24) != MKBETAG('\0','A','L','S')) |
128 | ✗ | skip_bits(gb, 24); | |
129 | |||
130 | 21 | specific_config_bitindex = get_bits_count(gb); | |
131 | |||
132 | 21 | ret = parse_config_ALS(gb, c, logctx); | |
133 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
|
21 | if (ret < 0) |
134 | ✗ | return ret; | |
135 | } | ||
136 | |||
137 |
4/4✓ Branch 0 taken 715 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 393 times.
✓ Branch 3 taken 322 times.
|
721 | if (c->ext_object_type != AOT_SBR && sync_extension) { |
138 |
2/2✓ Branch 1 taken 14617 times.
✓ Branch 2 taken 252 times.
|
14869 | while (get_bits_left(gb) > 15) { |
139 |
2/2✓ Branch 1 taken 141 times.
✓ Branch 2 taken 14476 times.
|
14617 | if (show_bits(gb, 11) == 0x2b7) { // sync extension |
140 | 141 | get_bits(gb, 11); | |
141 | 141 | c->ext_object_type = get_object_type(gb); | |
142 |
4/4✓ Branch 0 taken 132 times.
✓ Branch 1 taken 9 times.
✓ Branch 3 taken 78 times.
✓ Branch 4 taken 54 times.
|
141 | if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(gb)) == 1) { |
143 | 78 | c->ext_sample_rate = get_sample_rate(gb, &c->ext_sampling_index); | |
144 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 72 times.
|
78 | if (c->ext_sample_rate == c->sample_rate) |
145 | 6 | c->sbr = -1; | |
146 | } | ||
147 |
4/4✓ Branch 1 taken 36 times.
✓ Branch 2 taken 105 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 9 times.
|
141 | if (get_bits_left(gb) > 11 && get_bits(gb, 11) == 0x548) |
148 | 27 | c->ps = get_bits1(gb); | |
149 | 141 | break; | |
150 | } else | ||
151 | 14476 | get_bits1(gb); // skip 1 bit | |
152 | } | ||
153 | } | ||
154 | |||
155 | //PS requires SBR | ||
156 |
2/2✓ Branch 0 taken 54 times.
✓ Branch 1 taken 667 times.
|
721 | if (!c->sbr) |
157 | 54 | c->ps = 0; | |
158 | //Limit implicit PS to the HE-AACv2 Profile | ||
159 |
6/6✓ Branch 0 taken 637 times.
✓ Branch 1 taken 84 times.
✓ Branch 2 taken 577 times.
✓ Branch 3 taken 60 times.
✓ Branch 4 taken 488 times.
✓ Branch 5 taken 173 times.
|
721 | if ((c->ps == -1 && c->object_type != AOT_AAC_LC) || c->channels & ~0x01) |
160 | 548 | c->ps = 0; | |
161 | |||
162 | 721 | return specific_config_bitindex - start_bit_index; | |
163 | } | ||
164 | |||
165 | 156 | int avpriv_mpeg4audio_get_config2(MPEG4AudioConfig *c, const uint8_t *buf, | |
166 | int size, int sync_extension, void *logctx) | ||
167 | { | ||
168 | GetBitContext gb; | ||
169 | int ret; | ||
170 | |||
171 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 155 times.
|
156 | if (size <= 0) |
172 | 1 | return AVERROR_INVALIDDATA; | |
173 | |||
174 | 155 | ret = init_get_bits8(&gb, buf, size); | |
175 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 155 times.
|
155 | if (ret < 0) |
176 | ✗ | return ret; | |
177 | |||
178 | 155 | return ff_mpeg4audio_get_config_gb(c, &gb, sync_extension, logctx); | |
179 | } | ||
180 |