Directory: | ../../../ffmpeg/ |
---|---|
File: | src/libavcodec/mpeg4audio.h |
Date: | 2022-07-07 01:21:54 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 24 | 29 | 82.8% |
Branches: | 6 | 12 | 50.0% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * MPEG-4 Audio common header | ||
3 | * Copyright (c) 2008 Baptiste Coudurier <baptiste.coudurier@free.fr> | ||
4 | * | ||
5 | * This file is part of FFmpeg. | ||
6 | * | ||
7 | * FFmpeg is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU Lesser General Public | ||
9 | * License as published by the Free Software Foundation; either | ||
10 | * version 2.1 of the License, or (at your option) any later version. | ||
11 | * | ||
12 | * FFmpeg is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * Lesser General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU Lesser General Public | ||
18 | * License along with FFmpeg; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | */ | ||
21 | |||
22 | #ifndef AVCODEC_MPEG4AUDIO_H | ||
23 | #define AVCODEC_MPEG4AUDIO_H | ||
24 | |||
25 | #include <stdint.h> | ||
26 | |||
27 | #include "libavutil/attributes.h" | ||
28 | |||
29 | #include "get_bits.h" | ||
30 | #include "put_bits.h" | ||
31 | |||
32 | typedef struct MPEG4AudioConfig { | ||
33 | int object_type; | ||
34 | int sampling_index; | ||
35 | int sample_rate; | ||
36 | int chan_config; | ||
37 | int sbr; ///< -1 implicit, 1 presence | ||
38 | int ext_object_type; | ||
39 | int ext_sampling_index; | ||
40 | int ext_sample_rate; | ||
41 | int ext_chan_config; | ||
42 | int channels; | ||
43 | int ps; ///< -1 implicit, 1 presence | ||
44 | int frame_length_short; | ||
45 | } MPEG4AudioConfig; | ||
46 | |||
47 | extern const int ff_mpeg4audio_sample_rates[16]; | ||
48 | extern const uint8_t ff_mpeg4audio_channels[14]; | ||
49 | |||
50 | /** | ||
51 | * Parse MPEG-4 systems extradata from a potentially unaligned GetBitContext to retrieve audio configuration. | ||
52 | * @param[in] c MPEG4AudioConfig structure to fill. | ||
53 | * @param[in] gb Extradata from container. | ||
54 | * @param[in] sync_extension look for a sync extension after config if true. | ||
55 | * @param[in] logctx opaque struct starting with an AVClass element, used for logging. | ||
56 | * @return negative AVERROR code on error, on success AudioSpecificConfig bit index in extradata. | ||
57 | */ | ||
58 | int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb, | ||
59 | int sync_extension, void *logctx); | ||
60 | |||
61 | /** | ||
62 | * Parse MPEG-4 systems extradata from a raw buffer to retrieve audio configuration. | ||
63 | * @param[in] c MPEG4AudioConfig structure to fill. | ||
64 | * @param[in] buf Extradata from container. | ||
65 | * @param[in] size Extradata size in bytes. | ||
66 | * @param[in] sync_extension look for a sync extension after config if true. | ||
67 | * @param[in] logctx opaque struct starting with an AVClass element, used for logging. | ||
68 | * @return negative AVERROR code on error, AudioSpecificConfig bit index in extradata on success. | ||
69 | */ | ||
70 | int avpriv_mpeg4audio_get_config2(MPEG4AudioConfig *c, const uint8_t *buf, | ||
71 | int size, int sync_extension, void *logctx); | ||
72 | |||
73 | enum AudioObjectType { | ||
74 | AOT_NULL, | ||
75 | // Support? Name | ||
76 | AOT_AAC_MAIN, ///< Y Main | ||
77 | AOT_AAC_LC, ///< Y Low Complexity | ||
78 | AOT_AAC_SSR, ///< N (code in SoC repo) Scalable Sample Rate | ||
79 | AOT_AAC_LTP, ///< Y Long Term Prediction | ||
80 | AOT_SBR, ///< Y Spectral Band Replication | ||
81 | AOT_AAC_SCALABLE, ///< N Scalable | ||
82 | AOT_TWINVQ, ///< N Twin Vector Quantizer | ||
83 | AOT_CELP, ///< N Code Excited Linear Prediction | ||
84 | AOT_HVXC, ///< N Harmonic Vector eXcitation Coding | ||
85 | AOT_TTSI = 12, ///< N Text-To-Speech Interface | ||
86 | AOT_MAINSYNTH, ///< N Main Synthesis | ||
87 | AOT_WAVESYNTH, ///< N Wavetable Synthesis | ||
88 | AOT_MIDI, ///< N General MIDI | ||
89 | AOT_SAFX, ///< N Algorithmic Synthesis and Audio Effects | ||
90 | AOT_ER_AAC_LC, ///< N Error Resilient Low Complexity | ||
91 | AOT_ER_AAC_LTP = 19, ///< N Error Resilient Long Term Prediction | ||
92 | AOT_ER_AAC_SCALABLE, ///< N Error Resilient Scalable | ||
93 | AOT_ER_TWINVQ, ///< N Error Resilient Twin Vector Quantizer | ||
94 | AOT_ER_BSAC, ///< N Error Resilient Bit-Sliced Arithmetic Coding | ||
95 | AOT_ER_AAC_LD, ///< N Error Resilient Low Delay | ||
96 | AOT_ER_CELP, ///< N Error Resilient Code Excited Linear Prediction | ||
97 | AOT_ER_HVXC, ///< N Error Resilient Harmonic Vector eXcitation Coding | ||
98 | AOT_ER_HILN, ///< N Error Resilient Harmonic and Individual Lines plus Noise | ||
99 | AOT_ER_PARAM, ///< N Error Resilient Parametric | ||
100 | AOT_SSC, ///< N SinuSoidal Coding | ||
101 | AOT_PS, ///< N Parametric Stereo | ||
102 | AOT_SURROUND, ///< N MPEG Surround | ||
103 | AOT_ESCAPE, ///< Y Escape Value | ||
104 | AOT_L1, ///< Y Layer 1 | ||
105 | AOT_L2, ///< Y Layer 2 | ||
106 | AOT_L3, ///< Y Layer 3 | ||
107 | AOT_DST, ///< N Direct Stream Transfer | ||
108 | AOT_ALS, ///< Y Audio LosslesS | ||
109 | AOT_SLS, ///< N Scalable LosslesS | ||
110 | AOT_SLS_NON_CORE, ///< N Scalable LosslesS (non core) | ||
111 | AOT_ER_AAC_ELD, ///< N Error Resilient Enhanced Low Delay | ||
112 | AOT_SMR_SIMPLE, ///< N Symbolic Music Representation Simple | ||
113 | AOT_SMR_MAIN, ///< N Symbolic Music Representation Main | ||
114 | AOT_USAC_NOSBR, ///< N Unified Speech and Audio Coding (no SBR) | ||
115 | AOT_SAOC, ///< N Spatial Audio Object Coding | ||
116 | AOT_LD_SURROUND, ///< N Low Delay MPEG Surround | ||
117 | AOT_USAC, ///< N Unified Speech and Audio Coding | ||
118 | }; | ||
119 | |||
120 | #define MAX_PCE_SIZE 320 ///<Maximum size of a PCE including the 3-bit ID_PCE | ||
121 | ///<marker and the comment | ||
122 | |||
123 | 216 | static av_always_inline unsigned int ff_pce_copy_bits(PutBitContext *pb, | |
124 | GetBitContext *gb, | ||
125 | int bits) | ||
126 | { | ||
127 | 216 | unsigned int el = get_bits(gb, bits); | |
128 | 216 | put_bits(pb, bits, el); | |
129 | 216 | return el; | |
130 | } | ||
131 | |||
132 | 18 | static inline int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb) | |
133 | { | ||
134 | int five_bit_ch, four_bit_ch, comment_size, bits; | ||
135 | 18 | int offset = put_bits_count(pb); | |
136 | |||
137 | 18 | ff_pce_copy_bits(pb, gb, 10); // Tag, Object Type, Frequency | |
138 | 18 | five_bit_ch = ff_pce_copy_bits(pb, gb, 4); // Front | |
139 | 18 | five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Side | |
140 | 18 | five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Back | |
141 | 18 | four_bit_ch = ff_pce_copy_bits(pb, gb, 2); // LFE | |
142 | 18 | four_bit_ch += ff_pce_copy_bits(pb, gb, 3); // Data | |
143 | 18 | five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Coupling | |
144 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
|
18 | if (ff_pce_copy_bits(pb, gb, 1)) // Mono Mixdown |
145 | ✗ | ff_pce_copy_bits(pb, gb, 4); | |
146 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
|
18 | if (ff_pce_copy_bits(pb, gb, 1)) // Stereo Mixdown |
147 | ✗ | ff_pce_copy_bits(pb, gb, 4); | |
148 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
|
18 | if (ff_pce_copy_bits(pb, gb, 1)) // Matrix Mixdown |
149 | ✗ | ff_pce_copy_bits(pb, gb, 3); | |
150 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
|
18 | for (bits = five_bit_ch*5+four_bit_ch*4; bits > 16; bits -= 16) |
151 | ✗ | ff_pce_copy_bits(pb, gb, 16); | |
152 |
1/2✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
|
18 | if (bits) |
153 | 18 | ff_pce_copy_bits(pb, gb, bits); | |
154 | 18 | align_put_bits(pb); | |
155 | 18 | align_get_bits(gb); | |
156 | 18 | comment_size = ff_pce_copy_bits(pb, gb, 8); | |
157 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
|
18 | for (; comment_size > 0; comment_size--) |
158 | ✗ | ff_pce_copy_bits(pb, gb, 8); | |
159 | |||
160 | 18 | return put_bits_count(pb) - offset; | |
161 | } | ||
162 | |||
163 | #endif /* AVCODEC_MPEG4AUDIO_H */ | ||
164 |