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 32typedef 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 47extern const int ff_mpeg4audio_sample_rates[16]; 48extern 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 */ 58int 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 */ 70int avpriv_mpeg4audio_get_config2(MPEG4AudioConfig *c, const uint8_t *buf, 71 int size, int sync_extension, void *logctx); 72 73enum 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 123static av_always_inline unsigned int ff_pce_copy_bits(PutBitContext *pb, 124 GetBitContext *gb, 125 int bits) 126{ 127 unsigned int el = get_bits(gb, bits); 128 put_bits(pb, bits, el); 129 return el; 130} 131 132static inline int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb) 133{ 134 int five_bit_ch, four_bit_ch, comment_size, bits; 135 int offset = put_bits_count(pb); 136 137 ff_pce_copy_bits(pb, gb, 10); // Tag, Object Type, Frequency 138 five_bit_ch = ff_pce_copy_bits(pb, gb, 4); // Front 139 five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Side 140 five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Back 141 four_bit_ch = ff_pce_copy_bits(pb, gb, 2); // LFE 142 four_bit_ch += ff_pce_copy_bits(pb, gb, 3); // Data 143 five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Coupling 144 if (ff_pce_copy_bits(pb, gb, 1)) // Mono Mixdown 145 ff_pce_copy_bits(pb, gb, 4); 146 if (ff_pce_copy_bits(pb, gb, 1)) // Stereo Mixdown 147 ff_pce_copy_bits(pb, gb, 4); 148 if (ff_pce_copy_bits(pb, gb, 1)) // Matrix Mixdown 149 ff_pce_copy_bits(pb, gb, 3); 150 for (bits = five_bit_ch*5+four_bit_ch*4; bits > 16; bits -= 16) 151 ff_pce_copy_bits(pb, gb, 16); 152 if (bits) 153 ff_pce_copy_bits(pb, gb, bits); 154 align_put_bits(pb); 155 align_get_bits(gb); 156 comment_size = ff_pce_copy_bits(pb, gb, 8); 157 for (; comment_size > 0; comment_size--) 158 ff_pce_copy_bits(pb, gb, 8); 159 160 return put_bits_count(pb) - offset; 161} 162 163#endif /* AVCODEC_MPEG4AUDIO_H */ 164