avcodec/vc1: fix calculation of the last line of a slice
[ffmpeg.git] / libavcodec / mpeg4audio.h
index 68ad310..b9cea8a 100644 (file)
 
 #include <stdint.h>
 
 
 #include <stdint.h>
 
-typedef struct {
+#include "libavutil/attributes.h"
+
+#include "get_bits.h"
+#include "internal.h"
+#include "put_bits.h"
+
+typedef struct MPEG4AudioConfig {
     int object_type;
     int sampling_index;
     int sample_rate;
     int chan_config;
     int object_type;
     int sampling_index;
     int sample_rate;
     int chan_config;
-    int sbr; //< -1 implicit, 1 presence
+    int sbr; ///< -1 implicit, 1 presence
     int ext_object_type;
     int ext_sampling_index;
     int ext_sample_rate;
     int ext_object_type;
     int ext_sampling_index;
     int ext_sample_rate;
+    int ext_chan_config;
+    int channels;
+    int ps;  ///< -1 implicit, 1 presence
+    int frame_length_short;
 } MPEG4AudioConfig;
 
 } MPEG4AudioConfig;
 
-extern const int ff_mpeg4audio_sample_rates[16];
+extern av_export_avcodec const int avpriv_mpeg4audio_sample_rates[16];
 extern const uint8_t ff_mpeg4audio_channels[8];
 extern const uint8_t ff_mpeg4audio_channels[8];
+
+/**
+ * Parse MPEG-4 systems extradata from a potentially unaligned GetBitContext to retrieve audio configuration.
+ * @param[in] c        MPEG4AudioConfig structure to fill.
+ * @param[in] gb       Extradata from container.
+ * @param[in] sync_extension look for a sync extension after config if true.
+ * @return On error -1 is returned, on success AudioSpecificConfig bit index in extradata.
+ */
+int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb,
+                                int sync_extension);
+
 /**
 /**
- * Parse MPEG-4 systems extradata to retrieve audio configuration.
+ * Parse MPEG-4 systems extradata from a raw buffer to retrieve audio configuration.
  * @param[in] c        MPEG4AudioConfig structure to fill.
  * @param[in] buf      Extradata from container.
  * @param[in] c        MPEG4AudioConfig structure to fill.
  * @param[in] buf      Extradata from container.
- * @param[in] buf_size Extradata size.
+ * @param[in] bit_size Extradata size in bits.
+ * @param[in] sync_extension look for a sync extension after config if true.
  * @return On error -1 is returned, on success AudioSpecificConfig bit index in extradata.
  */
  * @return On error -1 is returned, on success AudioSpecificConfig bit index in extradata.
  */
-int ff_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf, int buf_size);
+int avpriv_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf,
+                                 int bit_size, int sync_extension);
+
+enum AudioObjectType {
+    AOT_NULL,
+                               // Support?                Name
+    AOT_AAC_MAIN,              ///< Y                       Main
+    AOT_AAC_LC,                ///< Y                       Low Complexity
+    AOT_AAC_SSR,               ///< N (code in SoC repo)    Scalable Sample Rate
+    AOT_AAC_LTP,               ///< Y                       Long Term Prediction
+    AOT_SBR,                   ///< Y                       Spectral Band Replication
+    AOT_AAC_SCALABLE,          ///< N                       Scalable
+    AOT_TWINVQ,                ///< N                       Twin Vector Quantizer
+    AOT_CELP,                  ///< N                       Code Excited Linear Prediction
+    AOT_HVXC,                  ///< N                       Harmonic Vector eXcitation Coding
+    AOT_TTSI             = 12, ///< N                       Text-To-Speech Interface
+    AOT_MAINSYNTH,             ///< N                       Main Synthesis
+    AOT_WAVESYNTH,             ///< N                       Wavetable Synthesis
+    AOT_MIDI,                  ///< N                       General MIDI
+    AOT_SAFX,                  ///< N                       Algorithmic Synthesis and Audio Effects
+    AOT_ER_AAC_LC,             ///< N                       Error Resilient Low Complexity
+    AOT_ER_AAC_LTP       = 19, ///< N                       Error Resilient Long Term Prediction
+    AOT_ER_AAC_SCALABLE,       ///< N                       Error Resilient Scalable
+    AOT_ER_TWINVQ,             ///< N                       Error Resilient Twin Vector Quantizer
+    AOT_ER_BSAC,               ///< N                       Error Resilient Bit-Sliced Arithmetic Coding
+    AOT_ER_AAC_LD,             ///< N                       Error Resilient Low Delay
+    AOT_ER_CELP,               ///< N                       Error Resilient Code Excited Linear Prediction
+    AOT_ER_HVXC,               ///< N                       Error Resilient Harmonic Vector eXcitation Coding
+    AOT_ER_HILN,               ///< N                       Error Resilient Harmonic and Individual Lines plus Noise
+    AOT_ER_PARAM,              ///< N                       Error Resilient Parametric
+    AOT_SSC,                   ///< N                       SinuSoidal Coding
+    AOT_PS,                    ///< N                       Parametric Stereo
+    AOT_SURROUND,              ///< N                       MPEG Surround
+    AOT_ESCAPE,                ///< Y                       Escape Value
+    AOT_L1,                    ///< Y                       Layer 1
+    AOT_L2,                    ///< Y                       Layer 2
+    AOT_L3,                    ///< Y                       Layer 3
+    AOT_DST,                   ///< N                       Direct Stream Transfer
+    AOT_ALS,                   ///< Y                       Audio LosslesS
+    AOT_SLS,                   ///< N                       Scalable LosslesS
+    AOT_SLS_NON_CORE,          ///< N                       Scalable LosslesS (non core)
+    AOT_ER_AAC_ELD,            ///< N                       Error Resilient Enhanced Low Delay
+    AOT_SMR_SIMPLE,            ///< N                       Symbolic Music Representation Simple
+    AOT_SMR_MAIN,              ///< N                       Symbolic Music Representation Main
+    AOT_USAC_NOSBR,            ///< N                       Unified Speech and Audio Coding (no SBR)
+    AOT_SAOC,                  ///< N                       Spatial Audio Object Coding
+    AOT_LD_SURROUND,           ///< N                       Low Delay MPEG Surround
+    AOT_USAC,                  ///< N                       Unified Speech and Audio Coding
+};
+
+#define MAX_PCE_SIZE 320 ///<Maximum size of a PCE including the 3-bit ID_PCE
+                         ///<marker and the comment
+
+static av_always_inline unsigned int ff_pce_copy_bits(PutBitContext *pb,
+                                                      GetBitContext *gb,
+                                                      int bits)
+{
+    unsigned int el = get_bits(gb, bits);
+    put_bits(pb, bits, el);
+    return el;
+}
+
+static inline int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb)
+{
+    int five_bit_ch, four_bit_ch, comment_size, bits;
+    int offset = put_bits_count(pb);
+
+    ff_pce_copy_bits(pb, gb, 10);               // Tag, Object Type, Frequency
+    five_bit_ch  = ff_pce_copy_bits(pb, gb, 4); // Front
+    five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Side
+    five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Back
+    four_bit_ch  = ff_pce_copy_bits(pb, gb, 2); // LFE
+    four_bit_ch += ff_pce_copy_bits(pb, gb, 3); // Data
+    five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Coupling
+    if (ff_pce_copy_bits(pb, gb, 1))            // Mono Mixdown
+        ff_pce_copy_bits(pb, gb, 4);
+    if (ff_pce_copy_bits(pb, gb, 1))            // Stereo Mixdown
+        ff_pce_copy_bits(pb, gb, 4);
+    if (ff_pce_copy_bits(pb, gb, 1))            // Matrix Mixdown
+        ff_pce_copy_bits(pb, gb, 3);
+    for (bits = five_bit_ch*5+four_bit_ch*4; bits > 16; bits -= 16)
+        ff_pce_copy_bits(pb, gb, 16);
+    if (bits)
+        ff_pce_copy_bits(pb, gb, bits);
+    avpriv_align_put_bits(pb);
+    align_get_bits(gb);
+    comment_size = ff_pce_copy_bits(pb, gb, 8);
+    for (; comment_size > 0; comment_size--)
+        ff_pce_copy_bits(pb, gb, 8);
+
+    return put_bits_count(pb) - offset;
+}
 
 #endif /* AVCODEC_MPEG4AUDIO_H */
 
 #endif /* AVCODEC_MPEG4AUDIO_H */