]> git.sesse.net Git - ffmpeg/blob - libavcodec/opusenc_psy.h
avformat/argo_brp: allow v1.1 ASF streams to have a non-22050 sample rate in certain...
[ffmpeg] / libavcodec / opusenc_psy.h
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 "opusenc.h"
26 #include "opusenc_utils.h"
27 #include "libavfilter/window_func.h"
28
29 /* Each step is 2.5ms */
30 typedef struct OpusPsyStep {
31     int   index; /* Current index */
32     int   silence;
33     float energy[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]; /* Masking effects included */
34     float tone[OPUS_MAX_CHANNELS][CELT_MAX_BANDS];   /* Tonality */
35     float stereo[CELT_MAX_BANDS];                    /* IS/MS compatibility */
36     float change_amp[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]; /* Jump over last frame */
37     float total_change; /* Total change */
38
39     float *bands[OPUS_MAX_CHANNELS][CELT_MAX_BANDS];
40     float coeffs[OPUS_MAX_CHANNELS][OPUS_BLOCK_SIZE(CELT_BLOCK_960)];
41 } OpusPsyStep;
42
43 typedef struct OpusBandExcitation {
44     float excitation;
45     float excitation_dist;
46     float excitation_init;
47 } OpusBandExcitation;
48
49 typedef struct PsyChain {
50     int start;
51     int end;
52 } PsyChain;
53
54 typedef struct OpusPsyContext {
55     AVCodecContext *avctx;
56     AVFloatDSPContext *dsp;
57     struct FFBufQueue *bufqueue;
58     OpusEncOptions *options;
59
60     PsyChain cs[128];
61     int cs_num;
62
63     OpusBandExcitation ex[OPUS_MAX_CHANNELS][CELT_MAX_BANDS];
64     FFBesselFilter bfilter_lo[OPUS_MAX_CHANNELS][CELT_MAX_BANDS];
65     FFBesselFilter bfilter_hi[OPUS_MAX_CHANNELS][CELT_MAX_BANDS];
66
67     OpusPsyStep *steps[FF_BUFQUEUE_SIZE + 1];
68     int max_steps;
69
70     float *window[CELT_BLOCK_NB];
71     MDCT15Context *mdct[CELT_BLOCK_NB];
72     int bsize_analysis;
73
74     DECLARE_ALIGNED(32, float, scratch)[2048];
75
76     /* Stats */
77     float rc_waste;
78     float avg_is_band;
79     int64_t dual_stereo_used;
80     int64_t total_packets_out;
81
82     /* State */
83     FFBesselFilter lambda_lp;
84     OpusPacketInfo p;
85     int redo_analysis;
86     int buffered_steps;
87     int steps_to_process;
88     int eof;
89     float lambda;
90     int *inflection_points;
91     int inflection_points_count;
92 } OpusPsyContext;
93
94 int  ff_opus_psy_process           (OpusPsyContext *s, OpusPacketInfo *p);
95 void ff_opus_psy_celt_frame_init   (OpusPsyContext *s, CeltFrame *f, int index);
96 int  ff_opus_psy_celt_frame_process(OpusPsyContext *s, CeltFrame *f, int index);
97 void ff_opus_psy_postencode_update (OpusPsyContext *s, CeltFrame *f, OpusRangeCoder *rc);
98
99 int  ff_opus_psy_init(OpusPsyContext *s, AVCodecContext *avctx,
100                       struct FFBufQueue *bufqueue, OpusEncOptions *options);
101 void ff_opus_psy_signal_eof(OpusPsyContext *s);
102 int  ff_opus_psy_end(OpusPsyContext *s);
103
104 #endif /* AVCODEC_OPUSENC_PSY_H */