"Fossies" - the Fresh Open Source Software Archive

Member "ffmpeg-4.0.1/libavcodec/aacenc.h" (20 Apr 2018, 17127 Bytes) of package /linux/misc/ffmpeg-4.0.1.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "aacenc.h" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 3.4.2_vs_4.0.

    1 /*
    2  * AAC encoder
    3  * Copyright (C) 2008 Konstantin Shishkov
    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_AACENC_H
   23 #define AVCODEC_AACENC_H
   24 
   25 #include "libavutil/float_dsp.h"
   26 #include "avcodec.h"
   27 #include "put_bits.h"
   28 
   29 #include "aac.h"
   30 #include "audio_frame_queue.h"
   31 #include "psymodel.h"
   32 
   33 #include "lpc.h"
   34 
   35 typedef enum AACCoder {
   36     AAC_CODER_ANMR = 0,
   37     AAC_CODER_TWOLOOP,
   38     AAC_CODER_FAST,
   39 
   40     AAC_CODER_NB,
   41 }AACCoder;
   42 
   43 typedef struct AACEncOptions {
   44     int coder;
   45     int pns;
   46     int tns;
   47     int ltp;
   48     int pce;
   49     int pred;
   50     int mid_side;
   51     int intensity_stereo;
   52 } AACEncOptions;
   53 
   54 struct AACEncContext;
   55 
   56 typedef struct AACCoefficientsEncoder {
   57     void (*search_for_quantizers)(AVCodecContext *avctx, struct AACEncContext *s,
   58                                   SingleChannelElement *sce, const float lambda);
   59     void (*encode_window_bands_info)(struct AACEncContext *s, SingleChannelElement *sce,
   60                                      int win, int group_len, const float lambda);
   61     void (*quantize_and_encode_band)(struct AACEncContext *s, PutBitContext *pb, const float *in, float *out, int size,
   62                                      int scale_idx, int cb, const float lambda, int rtz);
   63     void (*encode_tns_info)(struct AACEncContext *s, SingleChannelElement *sce);
   64     void (*encode_ltp_info)(struct AACEncContext *s, SingleChannelElement *sce, int common_window);
   65     void (*encode_main_pred)(struct AACEncContext *s, SingleChannelElement *sce);
   66     void (*adjust_common_pred)(struct AACEncContext *s, ChannelElement *cpe);
   67     void (*adjust_common_ltp)(struct AACEncContext *s, ChannelElement *cpe);
   68     void (*apply_main_pred)(struct AACEncContext *s, SingleChannelElement *sce);
   69     void (*apply_tns_filt)(struct AACEncContext *s, SingleChannelElement *sce);
   70     void (*update_ltp)(struct AACEncContext *s, SingleChannelElement *sce);
   71     void (*ltp_insert_new_frame)(struct AACEncContext *s);
   72     void (*set_special_band_scalefactors)(struct AACEncContext *s, SingleChannelElement *sce);
   73     void (*search_for_pns)(struct AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce);
   74     void (*mark_pns)(struct AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce);
   75     void (*search_for_tns)(struct AACEncContext *s, SingleChannelElement *sce);
   76     void (*search_for_ltp)(struct AACEncContext *s, SingleChannelElement *sce, int common_window);
   77     void (*search_for_ms)(struct AACEncContext *s, ChannelElement *cpe);
   78     void (*search_for_is)(struct AACEncContext *s, AVCodecContext *avctx, ChannelElement *cpe);
   79     void (*search_for_pred)(struct AACEncContext *s, SingleChannelElement *sce);
   80 } AACCoefficientsEncoder;
   81 
   82 extern const AACCoefficientsEncoder ff_aac_coders[];
   83 
   84 typedef struct AACQuantizeBandCostCacheEntry {
   85     float rd;
   86     float energy;
   87     int bits;
   88     char cb;
   89     char rtz;
   90     uint16_t generation;
   91 } AACQuantizeBandCostCacheEntry;
   92 
   93 typedef struct AACPCEInfo {
   94     int64_t layout;
   95     int num_ele[4];                              ///< front, side, back, lfe
   96     int pairing[3][8];                           ///< front, side, back
   97     int index[4][8];                             ///< front, side, back, lfe
   98     uint8_t config_map[16];                      ///< configs the encoder's channel specific settings
   99     uint8_t reorder_map[16];                     ///< maps channels from lavc to aac order
  100 } AACPCEInfo;
  101 
  102 /**
  103  * List of PCE (Program Configuration Element) for the channel layouts listed
  104  * in channel_layout.h
  105  *
  106  * For those wishing in the future to add other layouts:
  107  *
  108  * - num_ele: number of elements in each group of front, side, back, lfe channels
  109  *            (an element is of type SCE (single channel), CPE (channel pair) for
  110  *            the first 3 groups; and is LFE for LFE group).
  111  *
  112  * - pairing: 0 for an SCE element or 1 for a CPE; does not apply to LFE group
  113  *
  114  * - index: there are three independent indices for SCE, CPE and LFE;
  115  *     they are incremented irrespective of the group to which the element belongs;
  116  *     they are not reset when going from one group to another
  117  *
  118  *     Example: for 7.0 channel layout,
  119  *        .pairing = { { 1, 0 }, { 1 }, { 1 }, }, (3 CPE and 1 SCE in front group)
  120  *        .index = { { 0, 0 }, { 1 }, { 2 }, },
  121  *               (index is 0 for the single SCE but goes from 0 to 2 for the CPEs)
  122  *
  123  *     The index order impacts the channel ordering. But is otherwise arbitrary
  124  *     (the sequence could have been 2, 0, 1 instead of 0, 1, 2).
  125  *
  126  *     Spec allows for discontinuous indices, e.g. if one has a total of two SCE,
  127  *     SCE.0 SCE.15 is OK per spec; BUT it won't be decoded by our AAC decoder
  128  *     which at this time requires that indices fully cover some range starting
  129  *     from 0 (SCE.1 SCE.0 is OK but not SCE.0 SCE.15).
  130  *
  131  * - config_map: total number of elements and their types. Beware, the way the
  132  *               types are ordered impacts the final channel ordering.
  133  *
  134  * - reorder_map: reorders the channels.
  135  *
  136  */
  137 static const AACPCEInfo aac_pce_configs[] = {
  138     {
  139         .layout = AV_CH_LAYOUT_MONO,
  140         .num_ele = { 1, 0, 0, 0 },
  141         .pairing = { { 0 }, },
  142         .index = { { 0 }, },
  143         .config_map = { 1, TYPE_SCE, },
  144         .reorder_map = { 0 },
  145     },
  146     {
  147         .layout = AV_CH_LAYOUT_STEREO,
  148         .num_ele = { 1, 0, 0, 0 },
  149         .pairing = { { 1 }, },
  150         .index = { { 0 }, },
  151         .config_map = { 1, TYPE_CPE, },
  152         .reorder_map = { 0, 1 },
  153     },
  154     {
  155         .layout = AV_CH_LAYOUT_2POINT1,
  156         .num_ele = { 1, 0, 0, 1 },
  157         .pairing = { { 1 }, },
  158         .index = { { 0 },{ 0 },{ 0 },{ 0 } },
  159         .config_map = { 2, TYPE_CPE, TYPE_LFE },
  160         .reorder_map = { 0, 1, 2 },
  161     },
  162     {
  163         .layout = AV_CH_LAYOUT_2_1,
  164         .num_ele = { 1, 0, 1, 0 },
  165         .pairing = { { 1 },{ 0 },{ 0 } },
  166         .index = { { 0 },{ 0 },{ 0 }, },
  167         .config_map = { 2, TYPE_CPE, TYPE_SCE },
  168         .reorder_map = { 0, 1, 2 },
  169     },
  170     {
  171         .layout = AV_CH_LAYOUT_SURROUND,
  172         .num_ele = { 2, 0, 0, 0 },
  173         .pairing = { { 1, 0 }, },
  174         .index = { { 0, 0 }, },
  175         .config_map = { 2, TYPE_CPE, TYPE_SCE, },
  176         .reorder_map = { 0, 1, 2 },
  177     },
  178     {
  179         .layout = AV_CH_LAYOUT_3POINT1,
  180         .num_ele = { 2, 0, 0, 1 },
  181         .pairing = { { 1, 0 }, },
  182         .index = { { 0, 0 }, { 0 }, { 0 }, { 0 }, },
  183         .config_map = { 3, TYPE_CPE, TYPE_SCE, TYPE_LFE },
  184         .reorder_map = { 0, 1, 2, 3 },
  185     },
  186     {
  187         .layout = AV_CH_LAYOUT_4POINT0,
  188         .num_ele = { 2, 0, 1, 0 },
  189         .pairing = { { 1, 0 }, { 0 }, { 0 }, },
  190         .index = { { 0, 0 }, { 0 }, { 1 } },
  191         .config_map = { 3, TYPE_CPE, TYPE_SCE, TYPE_SCE },
  192         .reorder_map = {  0, 1, 2, 3 },
  193     },
  194     {
  195         .layout = AV_CH_LAYOUT_4POINT1,
  196         .num_ele = { 2, 1, 1, 0 },
  197         .pairing = { { 1, 0 }, { 0 }, { 0 }, },
  198         .index = { { 0, 0 }, { 1 }, { 2 }, { 0 } },
  199         .config_map = { 4, TYPE_CPE, TYPE_SCE, TYPE_SCE, TYPE_SCE },
  200         .reorder_map = { 0, 1, 2, 3, 4 },
  201     },
  202     {
  203         .layout = AV_CH_LAYOUT_2_2,
  204         .num_ele = { 1, 1, 0, 0 },
  205         .pairing = { { 1 }, { 1 }, },
  206         .index = { { 0 }, { 1 }, },
  207         .config_map = { 2, TYPE_CPE, TYPE_CPE },
  208         .reorder_map = { 0, 1, 2, 3 },
  209     },
  210     {
  211         .layout = AV_CH_LAYOUT_QUAD,
  212         .num_ele = { 1, 0, 1, 0 },
  213         .pairing = { { 1 }, { 0 }, { 1 }, },
  214         .index = { { 0 }, { 0 }, { 1 } },
  215         .config_map = { 2, TYPE_CPE, TYPE_CPE },
  216         .reorder_map = { 0, 1, 2, 3 },
  217     },
  218     {
  219         .layout = AV_CH_LAYOUT_5POINT0,
  220         .num_ele = { 2, 1, 0, 0 },
  221         .pairing = { { 1, 0 }, { 1 }, },
  222         .index = { { 0, 0 }, { 1 } },
  223         .config_map = { 3, TYPE_CPE, TYPE_SCE, TYPE_CPE },
  224         .reorder_map = { 0, 1, 2, 3, 4 },
  225     },
  226     {
  227         .layout = AV_CH_LAYOUT_5POINT1,
  228         .num_ele = { 2, 1, 1, 0 },
  229         .pairing = { { 1, 0 }, { 0 }, { 1 }, },
  230         .index = { { 0, 0 }, { 1 }, { 1 } },
  231         .config_map = { 4, TYPE_CPE, TYPE_SCE, TYPE_SCE, TYPE_CPE },
  232         .reorder_map = { 0, 1, 2, 3, 4, 5 },
  233     },
  234     {
  235         .layout = AV_CH_LAYOUT_5POINT0_BACK,
  236         .num_ele = { 2, 0, 1, 0 },
  237         .pairing = { { 1, 0 }, { 0 }, { 1 } },
  238         .index = { { 0, 0 }, { 0 }, { 1 } },
  239         .config_map = { 3, TYPE_CPE, TYPE_SCE, TYPE_CPE },
  240         .reorder_map = { 0, 1, 2, 3, 4 },
  241     },
  242     {
  243         .layout = AV_CH_LAYOUT_5POINT1_BACK,
  244         .num_ele = { 2, 1, 1, 0 },
  245         .pairing = { { 1, 0 }, { 0 }, { 1 }, },
  246         .index = { { 0, 0 }, { 1 }, { 1 } },
  247         .config_map = { 4, TYPE_CPE, TYPE_SCE, TYPE_SCE, TYPE_CPE },
  248         .reorder_map = { 0, 1, 2, 3, 4, 5 },
  249     },
  250     {
  251         .layout = AV_CH_LAYOUT_6POINT0,
  252         .num_ele = { 2, 1, 1, 0 },
  253         .pairing = { { 1, 0 }, { 1 }, { 0 }, },
  254         .index = { { 0, 0 }, { 1 }, { 1 } },
  255         .config_map = { 4, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_SCE },
  256         .reorder_map = { 0, 1, 2, 3, 4, 5 },
  257     },
  258     {
  259         .layout = AV_CH_LAYOUT_6POINT0_FRONT,
  260         .num_ele = { 2, 1, 0, 0 },
  261         .pairing = { { 1, 1 }, { 1 } },
  262         .index = { { 1, 0 }, { 2 }, },
  263         .config_map = { 3, TYPE_CPE, TYPE_CPE, TYPE_CPE, },
  264         .reorder_map = { 0, 1, 2, 3, 4, 5 },
  265     },
  266     {
  267         .layout = AV_CH_LAYOUT_HEXAGONAL,
  268         .num_ele = { 2, 0, 2, 0 },
  269         .pairing = { { 1, 0 },{ 0 },{ 1, 0 }, },
  270         .index = { { 0, 0 },{ 0 },{ 1, 1 } },
  271         .config_map = { 4, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_SCE, },
  272         .reorder_map = { 0, 1, 2, 3, 4, 5 },
  273     },
  274     {
  275         .layout = AV_CH_LAYOUT_6POINT1,
  276         .num_ele = { 2, 1, 2, 0 },
  277         .pairing = { { 1, 0 },{ 0 },{ 1, 0 }, },
  278         .index = { { 0, 0 },{ 1 },{ 1, 2 } },
  279         .config_map = { 5, TYPE_CPE, TYPE_SCE, TYPE_SCE, TYPE_CPE, TYPE_SCE },
  280         .reorder_map = { 0, 1, 2, 3, 4, 5, 6 },
  281     },
  282     {
  283         .layout = AV_CH_LAYOUT_6POINT1_BACK,
  284         .num_ele = { 2, 1, 2, 0 },
  285         .pairing = { { 1, 0 }, { 0 }, { 1, 0 }, },
  286         .index = { { 0, 0 }, { 1 }, { 1, 2 } },
  287         .config_map = { 5, TYPE_CPE, TYPE_SCE, TYPE_SCE, TYPE_CPE, TYPE_SCE },
  288         .reorder_map = { 0, 1, 2, 3, 4, 5, 6 },
  289     },
  290     {
  291         .layout = AV_CH_LAYOUT_6POINT1_FRONT,
  292         .num_ele = { 2, 1, 2, 0 },
  293         .pairing = { { 1, 0 }, { 0 }, { 1, 0 }, },
  294         .index = { { 0, 0 }, { 1 }, { 1, 2 } },
  295         .config_map = { 5, TYPE_CPE, TYPE_SCE, TYPE_SCE, TYPE_CPE, TYPE_SCE },
  296         .reorder_map = { 0, 1, 2, 3, 4, 5, 6 },
  297     },
  298     {
  299         .layout = AV_CH_LAYOUT_7POINT0,
  300         .num_ele = { 2, 1, 1, 0 },
  301         .pairing = { { 1, 0 }, { 1 }, { 1 }, },
  302         .index = { { 0, 0 }, { 1 }, { 2 }, },
  303         .config_map = { 4, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_CPE },
  304         .reorder_map = { 0, 1, 2, 3, 4, 5, 6 },
  305     },
  306     {
  307         .layout = AV_CH_LAYOUT_7POINT0_FRONT,
  308         .num_ele = { 2, 1, 1, 0 },
  309         .pairing = { { 1, 0 }, { 1 }, { 1 }, },
  310         .index = { { 0, 0 }, { 1 }, { 2 }, },
  311         .config_map = { 4, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_CPE },
  312         .reorder_map = { 0, 1, 2, 3, 4, 5, 6 },
  313     },
  314     {
  315         .layout = AV_CH_LAYOUT_7POINT1,
  316         .num_ele = { 2, 1, 2, 0 },
  317         .pairing = { { 1, 0 }, { 0 }, { 1, 1 }, },
  318         .index = { { 0, 0 }, { 1 }, { 1, 2 }, { 0 } },
  319         .config_map = { 5, TYPE_CPE, TYPE_SCE,  TYPE_SCE, TYPE_CPE, TYPE_CPE },
  320         .reorder_map = { 0, 1, 2, 3, 4, 5, 6, 7 },
  321     },
  322     {
  323         .layout = AV_CH_LAYOUT_7POINT1_WIDE,
  324         .num_ele = { 2, 1, 2, 0 },
  325         .pairing = { { 1, 0 }, { 0 },{  1, 1 }, },
  326         .index = { { 0, 0 }, { 1 }, { 1, 2 }, { 0 } },
  327         .config_map = { 5, TYPE_CPE, TYPE_SCE, TYPE_SCE, TYPE_CPE, TYPE_CPE },
  328         .reorder_map = { 0, 1, 2, 3, 4, 5, 6, 7 },
  329     },
  330     {
  331         .layout = AV_CH_LAYOUT_7POINT1_WIDE_BACK,
  332         .num_ele = { 2, 1, 2, 0 },
  333         .pairing = { { 1, 0 }, { 0 }, { 1, 1 }, },
  334         .index = { { 0, 0 }, { 1 }, { 1, 2 }, { 0 } },
  335         .config_map = { 5, TYPE_CPE, TYPE_SCE, TYPE_SCE, TYPE_CPE, TYPE_CPE },
  336         .reorder_map = { 0, 1, 2, 3, 4, 5, 6, 7 },
  337     },
  338     {
  339         .layout = AV_CH_LAYOUT_OCTAGONAL,
  340         .num_ele = { 2, 1, 2, 0 },
  341         .pairing = { { 1, 0 }, { 1 }, { 1, 0 }, },
  342         .index = { { 0, 0 }, { 1 }, { 2, 1 } },
  343         .config_map = { 5, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_SCE },
  344         .reorder_map = { 0, 1, 2, 3, 4, 5, 6, 7 },
  345     },
  346     {   /* Meant for order 2/mixed ambisonics */
  347         .layout = AV_CH_LAYOUT_OCTAGONAL | AV_CH_TOP_CENTER,
  348         .num_ele = { 2, 2, 2, 0 },
  349         .pairing = { { 1, 0 }, { 1, 0 }, { 1, 0 }, },
  350         .index = { { 0, 0 }, { 1, 1 }, { 2, 2 } },
  351         .config_map = { 6, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_SCE },
  352         .reorder_map = { 0, 1, 2, 3, 4, 5, 6, 7, 8 },
  353     },
  354     {   /* Meant for order 2/mixed ambisonics */
  355         .layout = AV_CH_LAYOUT_6POINT0_FRONT | AV_CH_BACK_CENTER |
  356                   AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT | AV_CH_TOP_CENTER,
  357         .num_ele = { 2, 2, 2, 0 },
  358         .pairing = { { 1, 1 }, { 1, 0 }, { 1, 0 }, },
  359         .index = { { 0, 1 }, { 2, 0 }, { 3, 1 } },
  360         .config_map = { 6, TYPE_CPE, TYPE_CPE, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_SCE },
  361         .reorder_map = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
  362     },
  363     {
  364         .layout = AV_CH_LAYOUT_HEXADECAGONAL,
  365         .num_ele = { 4, 2, 4, 0 },
  366         .pairing = { { 1, 0, 1, 0 }, { 1, 1 }, { 1, 0, 1, 0 }, },
  367         .index = { { 0, 0, 1, 1 }, { 2, 3 }, { 4, 2, 5, 3 } },
  368         .config_map = { 10, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_SCE },
  369         .reorder_map = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
  370     },
  371 };
  372 
  373 /**
  374  * AAC encoder context
  375  */
  376 typedef struct AACEncContext {
  377     AVClass *av_class;
  378     AACEncOptions options;                       ///< encoding options
  379     PutBitContext pb;
  380     FFTContext mdct1024;                         ///< long (1024 samples) frame transform context
  381     FFTContext mdct128;                          ///< short (128 samples) frame transform context
  382     AVFloatDSPContext *fdsp;
  383     AACPCEInfo pce;                              ///< PCE data, if needed
  384     float *planar_samples[16];                   ///< saved preprocessed input
  385 
  386     int profile;                                 ///< copied from avctx
  387     int needs_pce;                               ///< flag for non-standard layout
  388     LPCContext lpc;                              ///< used by TNS
  389     int samplerate_index;                        ///< MPEG-4 samplerate index
  390     int channels;                                ///< channel count
  391     const uint8_t *reorder_map;                  ///< lavc to aac reorder map
  392     const uint8_t *chan_map;                     ///< channel configuration map
  393 
  394     ChannelElement *cpe;                         ///< channel elements
  395     FFPsyContext psy;
  396     struct FFPsyPreprocessContext* psypp;
  397     const AACCoefficientsEncoder *coder;
  398     int cur_channel;                             ///< current channel for coder context
  399     int random_state;
  400     float lambda;
  401     int last_frame_pb_count;                     ///< number of bits for the previous frame
  402     float lambda_sum;                            ///< sum(lambda), for Qvg reporting
  403     int lambda_count;                            ///< count(lambda), for Qvg reporting
  404     enum RawDataBlockType cur_type;              ///< channel group type cur_channel belongs to
  405 
  406     AudioFrameQueue afq;
  407     DECLARE_ALIGNED(16, int,   qcoefs)[96];      ///< quantized coefficients
  408     DECLARE_ALIGNED(32, float, scoefs)[1024];    ///< scaled coefficients
  409 
  410     uint16_t quantize_band_cost_cache_generation;
  411     AACQuantizeBandCostCacheEntry quantize_band_cost_cache[256][128]; ///< memoization area for quantize_band_cost
  412 
  413     void (*abs_pow34)(float *out, const float *in, const int size);
  414     void (*quant_bands)(int *out, const float *in, const float *scaled,
  415                         int size, int is_signed, int maxval, const float Q34,
  416                         const float rounding);
  417 
  418     struct {
  419         float *samples;
  420     } buffer;
  421 } AACEncContext;
  422 
  423 void ff_aac_dsp_init_x86(AACEncContext *s);
  424 void ff_aac_coder_init_mips(AACEncContext *c);
  425 void ff_quantize_band_cost_cache_init(struct AACEncContext *s);
  426 
  427 
  428 #endif /* AVCODEC_AACENC_H */