FFmpeg
opusenc_psy.h
Go to the documentation of this file.
1 /*
2  * Opus encoder
3  * Copyright (c) 2017 Rostislav Pehlivanov <atomnuker@gmail.com>
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_OPUSENC_PSY_H
23 #define AVCODEC_OPUSENC_PSY_H
24 
25 #include "libavutil/mem_internal.h"
26 
27 #include "opusenc.h"
28 #include "opusenc_utils.h"
30 
31 /* Each step is 2.5ms */
32 typedef struct OpusPsyStep {
33  int index; /* Current index */
34  int silence;
35  float energy[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]; /* Masking effects included */
36  float tone[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]; /* Tonality */
37  float stereo[CELT_MAX_BANDS]; /* IS/MS compatibility */
38  float change_amp[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]; /* Jump over last frame */
39  float total_change; /* Total change */
40 
43 } OpusPsyStep;
44 
45 typedef struct OpusBandExcitation {
46  float excitation;
50 
51 typedef struct PsyChain {
52  int start;
53  int end;
54 } PsyChain;
55 
56 typedef struct OpusPsyContext {
61 
62  PsyChain cs[128];
63  int cs_num;
64 
68 
70  int max_steps;
71 
75 
76  DECLARE_ALIGNED(32, float, scratch)[2048];
77 
78  /* Stats */
79  float rc_waste;
80  float avg_is_band;
83 
84  /* State */
90  int eof;
91  float lambda;
95 
100 
102  struct FFBufQueue *bufqueue, OpusEncOptions *options);
105 
106 #endif /* AVCODEC_OPUSENC_PSY_H */
OpusPsyStep::stereo
float stereo[CELT_MAX_BANDS]
Definition: opusenc_psy.h:37
mem_internal.h
OpusPsyContext::buffered_steps
int buffered_steps
Definition: opusenc_psy.h:88
OpusBandExcitation::excitation
float excitation
Definition: opusenc_psy.h:46
OpusPsyContext::bsize_analysis
int bsize_analysis
Definition: opusenc_psy.h:74
PsyChain
Definition: opusenc_psy.h:51
OpusBandExcitation::excitation_init
float excitation_init
Definition: opusenc_psy.h:48
FF_BUFQUEUE_SIZE
#define FF_BUFQUEUE_SIZE
Definition: audiotoolboxenc.c:25
ff_opus_psy_init
int ff_opus_psy_init(OpusPsyContext *s, AVCodecContext *avctx, struct FFBufQueue *bufqueue, OpusEncOptions *options)
Definition: opusenc_psy.c:516
ff_opus_psy_end
int ff_opus_psy_end(OpusPsyContext *s)
Definition: opusenc_psy.c:593
OpusPsyStep::silence
int silence
Definition: opusenc_psy.h:34
CELT_BLOCK_960
@ CELT_BLOCK_960
Definition: opus_celt.h:61
OpusPsyStep::coeffs
float coeffs[OPUS_MAX_CHANNELS][OPUS_BLOCK_SIZE(CELT_BLOCK_960)]
Definition: opusenc_psy.h:42
OpusPsyContext::steps
OpusPsyStep * steps[FF_BUFQUEUE_SIZE+1]
Definition: opusenc_psy.h:69
OpusPsyContext::lambda
float lambda
Definition: opusenc_psy.h:91
OpusPsyContext::bfilter_lo
FFBesselFilter bfilter_lo[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]
Definition: opusenc_psy.h:66
PsyChain::end
int end
Definition: opusenc_psy.h:53
ff_opus_psy_signal_eof
void ff_opus_psy_signal_eof(OpusPsyContext *s)
Definition: opusenc_psy.c:588
OpusPsyContext::avctx
AVCodecContext * avctx
Definition: opusenc_psy.h:57
OpusPsyStep::change_amp
float change_amp[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]
Definition: opusenc_psy.h:38
OpusPsyContext::lambda_lp
FFBesselFilter lambda_lp
Definition: opusenc_psy.h:85
OpusPsyContext::ex
OpusBandExcitation ex[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]
Definition: opusenc_psy.h:65
ff_opus_psy_celt_frame_process
int ff_opus_psy_celt_frame_process(OpusPsyContext *s, CeltFrame *f, int index)
Definition: opusenc_psy.c:455
OPUS_BLOCK_SIZE
#define OPUS_BLOCK_SIZE(x)
Definition: opusenc.h:39
OpusPsyContext::steps_to_process
int steps_to_process
Definition: opusenc_psy.h:89
ff_opus_psy_postencode_update
void ff_opus_psy_postencode_update(OpusPsyContext *s, CeltFrame *f, OpusRangeCoder *rc)
Definition: opusenc_psy.c:479
OpusPsyStep
Definition: opusenc_psy.h:32
s
#define s(width, name)
Definition: cbs_vp9.c:257
MDCT15Context
Definition: mdct15.h:30
f
#define f(width, name)
Definition: cbs_vp9.c:255
OpusPsyContext
Definition: opusenc_psy.h:56
OpusBandExcitation::excitation_dist
float excitation_dist
Definition: opusenc_psy.h:47
OpusPacketInfo
Definition: opusenc.h:48
opusenc.h
OpusPsyStep::total_change
float total_change
Definition: opusenc_psy.h:39
OpusPsyContext::dual_stereo_used
int64_t dual_stereo_used
Definition: opusenc_psy.h:81
CELT_MAX_BANDS
#define CELT_MAX_BANDS
Definition: opus.h:46
OpusPsyContext::inflection_points
int * inflection_points
Definition: opusenc_psy.h:92
index
int index
Definition: gxfenc.c:89
options
const OptionDef options[]
OpusPsyContext::max_steps
int max_steps
Definition: opusenc_psy.h:70
OpusPsyStep::bands
float * bands[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]
Definition: opusenc_psy.h:41
OpusPsyStep::index
int index
Definition: opusenc_psy.h:33
OpusPsyContext::redo_analysis
int redo_analysis
Definition: opusenc_psy.h:87
OpusPsyContext::dsp
AVFloatDSPContext * dsp
Definition: opusenc_psy.h:58
OpusPsyStep::tone
float tone[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]
Definition: opusenc_psy.h:36
OpusRangeCoder
Definition: opus_rc.h:40
AVFloatDSPContext
Definition: float_dsp.h:24
OpusPsyContext::eof
int eof
Definition: opusenc_psy.h:90
OpusPsyContext::avg_is_band
float avg_is_band
Definition: opusenc_psy.h:80
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:117
FFBufQueue
Structure holding the queue.
Definition: bufferqueue.h:49
OpusPsyContext::cs_num
int cs_num
Definition: opusenc_psy.h:63
ff_opus_psy_process
int ff_opus_psy_process(OpusPsyContext *s, OpusPacketInfo *p)
Definition: opusenc_psy.c:223
OPUS_MAX_CHANNELS
#define OPUS_MAX_CHANNELS
Definition: opusenc.h:34
OpusPsyStep::energy
float energy[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]
Definition: opusenc_psy.h:35
FFBesselFilter
Definition: opusenc_utils.h:27
OpusPsyContext::inflection_points_count
int inflection_points_count
Definition: opusenc_psy.h:93
OpusPsyContext::bfilter_hi
FFBesselFilter bfilter_hi[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]
Definition: opusenc_psy.h:67
OpusPsyContext::mdct
MDCT15Context * mdct[CELT_BLOCK_NB]
Definition: opusenc_psy.h:73
OpusPsyContext::total_packets_out
int64_t total_packets_out
Definition: opusenc_psy.h:82
OpusPsyContext::rc_waste
float rc_waste
Definition: opusenc_psy.h:79
window_func.h
OpusPsyContext::cs
PsyChain cs[128]
Definition: opusenc_psy.h:62
AVCodecContext
main external API structure.
Definition: avcodec.h:536
OpusPsyContext::p
OpusPacketInfo p
Definition: opusenc_psy.h:86
OpusBandExcitation
Definition: opusenc_psy.h:45
opusenc_utils.h
PsyChain::start
int start
Definition: opusenc_psy.h:52
OpusPsyContext::options
OpusEncOptions * options
Definition: opusenc_psy.h:60
OpusEncOptions
Definition: opusenc.h:43
CELT_BLOCK_NB
@ CELT_BLOCK_NB
Definition: opus_celt.h:63
OpusPsyContext::bufqueue
struct FFBufQueue * bufqueue
Definition: opusenc_psy.h:59
OpusPsyContext::scratch
float scratch[2048]
Definition: opusenc_psy.h:76
ff_opus_psy_celt_frame_init
void ff_opus_psy_celt_frame_init(OpusPsyContext *s, CeltFrame *f, int index)
Definition: opusenc_psy.c:254
OpusPsyContext::window
float * window[CELT_BLOCK_NB]
Definition: opusenc_psy.h:72
CeltFrame
Definition: opus_celt.h:93