FFmpeg
mpeg4audio.h
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 "internal.h"
31 #include "put_bits.h"
32 
33 typedef struct MPEG4AudioConfig {
34  int object_type;
35  int sampling_index;
36  int sample_rate;
37  int chan_config;
38  int sbr;
39  int ext_object_type;
40  int ext_sampling_index;
41  int ext_sample_rate;
42  int ext_chan_config;
43  int channels;
44  int ps;
45  int frame_length_short;
47 
48 extern av_export_avcodec const int avpriv_mpeg4audio_sample_rates[16];
49 extern const uint8_t ff_mpeg4audio_channels[8];
50 
58 int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb,
59  int sync_extension);
60 
69 int avpriv_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf,
70  int bit_size, int sync_extension);
71 
72 enum AudioObjectType {
73  AOT_NULL,
74  // Support? Name
75  AOT_AAC_MAIN,
76  AOT_AAC_LC,
77  AOT_AAC_SSR,
78  AOT_AAC_LTP,
79  AOT_SBR,
80  AOT_AAC_SCALABLE,
81  AOT_TWINVQ,
82  AOT_CELP,
83  AOT_HVXC,
84  AOT_TTSI = 12,
85  AOT_MAINSYNTH,
86  AOT_WAVESYNTH,
87  AOT_MIDI,
88  AOT_SAFX,
89  AOT_ER_AAC_LC,
90  AOT_ER_AAC_LTP = 19,
91  AOT_ER_AAC_SCALABLE,
92  AOT_ER_TWINVQ,
93  AOT_ER_BSAC,
94  AOT_ER_AAC_LD,
95  AOT_ER_CELP,
96  AOT_ER_HVXC,
97  AOT_ER_HILN,
98  AOT_ER_PARAM,
99  AOT_SSC,
100  AOT_PS,
101  AOT_SURROUND,
102  AOT_ESCAPE,
103  AOT_L1,
104  AOT_L2,
105  AOT_L3,
106  AOT_DST,
107  AOT_ALS,
108  AOT_SLS,
109  AOT_SLS_NON_CORE,
110  AOT_ER_AAC_ELD,
111  AOT_SMR_SIMPLE,
112  AOT_SMR_MAIN,
113  AOT_USAC_NOSBR,
114  AOT_SAOC,
115  AOT_LD_SURROUND,
116  AOT_USAC,
117 };
118 
119 #define MAX_PCE_SIZE 320
120 
122 static av_always_inline unsigned int ff_pce_copy_bits(PutBitContext *pb,
123  GetBitContext *gb,
124  int bits)
125 {
126  unsigned int el = get_bits(gb, bits);
127  put_bits(pb, bits, el);
128  return el;
129 }
130 
131 static inline int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb)
132 {
133  int five_bit_ch, four_bit_ch, comment_size, bits;
134  int offset = put_bits_count(pb);
135 
136  ff_pce_copy_bits(pb, gb, 10); // Tag, Object Type, Frequency
137  five_bit_ch = ff_pce_copy_bits(pb, gb, 4); // Front
138  five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Side
139  five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Back
140  four_bit_ch = ff_pce_copy_bits(pb, gb, 2); // LFE
141  four_bit_ch += ff_pce_copy_bits(pb, gb, 3); // Data
142  five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Coupling
143  if (ff_pce_copy_bits(pb, gb, 1)) // Mono Mixdown
144  ff_pce_copy_bits(pb, gb, 4);
145  if (ff_pce_copy_bits(pb, gb, 1)) // Stereo Mixdown
146  ff_pce_copy_bits(pb, gb, 4);
147  if (ff_pce_copy_bits(pb, gb, 1)) // Matrix Mixdown
148  ff_pce_copy_bits(pb, gb, 3);
149  for (bits = five_bit_ch*5+four_bit_ch*4; bits > 16; bits -= 16)
150  ff_pce_copy_bits(pb, gb, 16);
151  if (bits)
152  ff_pce_copy_bits(pb, gb, bits);
154  align_get_bits(gb);
155  comment_size = ff_pce_copy_bits(pb, gb, 8);
156  for (; comment_size > 0; comment_size--)
157  ff_pce_copy_bits(pb, gb, 8);
158 
159  return put_bits_count(pb) - offset;
160 }
161 
162 #endif /* AVCODEC_MPEG4AUDIO_H */
Definition: put_bits.h:35
void avpriv_align_put_bits(PutBitContext *s)
Pad the bitstream with zeros up to the next byte boundary.
Definition: bitstream.c:48
Macro definitions for various function/variable attributes.
bitstream reader API header.
Definition: mpeg4audio.h:33
Definition: get_bits.h:56
common internal api header.
int sbr
-1 implicit, 1 presence
Definition: mpeg4audio.h:38
int ps
-1 implicit, 1 presence
Definition: mpeg4audio.h:44
bitstream writer API