opus_celt.h 4.66 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
 * Opus decoder/demuxer common functions
 * Copyright (c) 2012 Andrew D'Addesio
 * Copyright (c) 2013-2014 Mozilla Corporation
 * Copyright (c) 2016 Rostislav Pehlivanov <atomnuker@gmail.com>
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef AVCODEC_OPUS_CELT_H
#define AVCODEC_OPUS_CELT_H

27 28
#include <float.h>

29
#include "opus.h"
30
#include "opus_pvq.h"
31 32 33 34 35 36 37 38 39 40 41 42

#include "mdct15.h"
#include "libavutil/float_dsp.h"
#include "libavutil/libm.h"

#define CELT_VECTORS                 11
#define CELT_ALLOC_STEPS             6
#define CELT_FINE_OFFSET             21
#define CELT_MAX_FINE_BITS           8
#define CELT_NORM_SCALE              16384
#define CELT_QTHETA_OFFSET           4
#define CELT_QTHETA_OFFSET_TWOPHASE  16
43
#define CELT_EMPH_COEFF              0.85000610f
44 45 46
#define CELT_POSTFILTER_MINPERIOD    15
#define CELT_ENERGY_SILENCE          (-28.0f)

47 48
typedef struct CeltPVQ CeltPVQ;

49 50 51 52 53 54 55
enum CeltSpread {
    CELT_SPREAD_NONE,
    CELT_SPREAD_LIGHT,
    CELT_SPREAD_NORMAL,
    CELT_SPREAD_AGGRESSIVE
};

56 57 58 59 60 61 62 63 64 65
enum CeltBlockSize {
    CELT_BLOCK_120,
    CELT_BLOCK_240,
    CELT_BLOCK_480,
    CELT_BLOCK_960,

    CELT_BLOCK_NB
};

typedef struct CeltBlock {
66
    float energy[CELT_MAX_BANDS];
67 68
    float lin_energy[CELT_MAX_BANDS];
    float error_energy[CELT_MAX_BANDS];
69 70 71 72 73 74
    float prev_energy[2][CELT_MAX_BANDS];

    uint8_t collapse_masks[CELT_MAX_BANDS];

    /* buffer for mdct output + postfilter */
    DECLARE_ALIGNED(32, float, buf)[2048];
75
    DECLARE_ALIGNED(32, float, coeffs)[CELT_MAX_FRAME_SIZE];
76

77
    /* Used by the encoder */
78 79
    DECLARE_ALIGNED(32, float, overlap)[FFALIGN(CELT_OVERLAP, 16)];
    DECLARE_ALIGNED(32, float, samples)[FFALIGN(CELT_MAX_FRAME_SIZE, 16)];
80

81
    /* postfilter parameters */
82
    int   pf_period_new;
83
    float pf_gains_new[3];
84
    int   pf_period;
85
    float pf_gains[3];
86
    int   pf_period_old;
87 88
    float pf_gains_old[3];

89 90
    float emph_coeff;
} CeltBlock;
91

92
struct CeltFrame {
93
    // constant values that do not change during context lifetime
94 95 96 97
    AVCodecContext      *avctx;
    MDCT15Context       *imdct[4];
    AVFloatDSPContext   *dsp;
    CeltBlock           block[2];
98
    CeltPVQ             *pvq;
99
    int channels;
100
    int output_channels;
101
    int apply_phase_inv;
102

103 104 105 106 107
    enum CeltBlockSize size;
    int start_band;
    int end_band;
    int coded_bands;
    int transient;
108 109 110 111 112
    int pfilter;
    int skip_band_floor;
    int tf_select;
    int alloc_trim;
    int alloc_boost[CELT_MAX_BANDS];
113 114 115 116 117 118 119
    int blocks;        /* number of iMDCT blocks in the frame, depends on transient */
    int blocksize;     /* size of each block */
    int silence;       /* Frame is filled with silence */
    int anticollapse_needed; /* Whether to expect an anticollapse bit */
    int anticollapse;  /* Encoded anticollapse bit */
    int intensity_stereo;
    int dual_stereo;
120
    int flushed;
121
    uint32_t seed;
122 123
    enum CeltSpread spread;

124 125 126 127 128 129
    /* Encoder PF coeffs */
    int pf_octave;
    int pf_period;
    int pf_tapset;
    float pf_gain;

130 131
    /* Bit allocation */
    int framebits;
132 133
    int remaining;
    int remaining2;
134
    int caps         [CELT_MAX_BANDS];
135 136 137 138 139 140 141
    int fine_bits    [CELT_MAX_BANDS];
    int fine_priority[CELT_MAX_BANDS];
    int pulses       [CELT_MAX_BANDS];
    int tf_change    [CELT_MAX_BANDS];
};

/* LCG for noise generation */
142
static av_always_inline uint32_t celt_rng(CeltFrame *f)
143
{
144 145
    f->seed = 1664525 * f->seed + 1013904223;
    return f->seed;
146 147 148 149 150 151 152 153 154 155 156 157 158 159
}

static av_always_inline void celt_renormalize_vector(float *X, int N, float gain)
{
    int i;
    float g = 1e-15f;
    for (i = 0; i < N; i++)
        g += X[i] * X[i];
    g = gain / sqrtf(g);

    for (i = 0; i < N; i++)
        X[i] *= g;
}

160 161
int ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels,
                 int apply_phase_inv);
162 163 164 165 166 167 168 169

void ff_celt_free(CeltFrame **f);

void ff_celt_flush(CeltFrame *f);

int ff_celt_decode_frame(CeltFrame *f, OpusRangeCoder *rc, float **output,
                         int coded_channels, int frame_size, int startband, int endband);

170
#endif /* AVCODEC_OPUS_CELT_H */