1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Opus encoder
3cabdff1aSopenharmony_ci * Copyright (c) 2017 Rostislav Pehlivanov <atomnuker@gmail.com>
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#ifndef AVCODEC_OPUSENC_PSY_H
23cabdff1aSopenharmony_ci#define AVCODEC_OPUSENC_PSY_H
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#include "opusenc.h"
28cabdff1aSopenharmony_ci#include "opusenc_utils.h"
29cabdff1aSopenharmony_ci#include "libavfilter/window_func.h"
30cabdff1aSopenharmony_ci
31cabdff1aSopenharmony_ci/* Each step is 2.5ms */
32cabdff1aSopenharmony_citypedef struct OpusPsyStep {
33cabdff1aSopenharmony_ci    int   index; /* Current index */
34cabdff1aSopenharmony_ci    int   silence;
35cabdff1aSopenharmony_ci    float energy[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]; /* Masking effects included */
36cabdff1aSopenharmony_ci    float tone[OPUS_MAX_CHANNELS][CELT_MAX_BANDS];   /* Tonality */
37cabdff1aSopenharmony_ci    float stereo[CELT_MAX_BANDS];                    /* IS/MS compatibility */
38cabdff1aSopenharmony_ci    float change_amp[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]; /* Jump over last frame */
39cabdff1aSopenharmony_ci    float total_change; /* Total change */
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_ci    float *bands[OPUS_MAX_CHANNELS][CELT_MAX_BANDS];
42cabdff1aSopenharmony_ci    float coeffs[OPUS_MAX_CHANNELS][OPUS_BLOCK_SIZE(CELT_BLOCK_960)];
43cabdff1aSopenharmony_ci} OpusPsyStep;
44cabdff1aSopenharmony_ci
45cabdff1aSopenharmony_citypedef struct OpusBandExcitation {
46cabdff1aSopenharmony_ci    float excitation;
47cabdff1aSopenharmony_ci    float excitation_dist;
48cabdff1aSopenharmony_ci    float excitation_init;
49cabdff1aSopenharmony_ci} OpusBandExcitation;
50cabdff1aSopenharmony_ci
51cabdff1aSopenharmony_citypedef struct PsyChain {
52cabdff1aSopenharmony_ci    int start;
53cabdff1aSopenharmony_ci    int end;
54cabdff1aSopenharmony_ci} PsyChain;
55cabdff1aSopenharmony_ci
56cabdff1aSopenharmony_citypedef struct OpusPsyContext {
57cabdff1aSopenharmony_ci    AVCodecContext *avctx;
58cabdff1aSopenharmony_ci    AVFloatDSPContext *dsp;
59cabdff1aSopenharmony_ci    struct FFBufQueue *bufqueue;
60cabdff1aSopenharmony_ci    OpusEncOptions *options;
61cabdff1aSopenharmony_ci
62cabdff1aSopenharmony_ci    PsyChain cs[128];
63cabdff1aSopenharmony_ci    int cs_num;
64cabdff1aSopenharmony_ci
65cabdff1aSopenharmony_ci    OpusBandExcitation ex[OPUS_MAX_CHANNELS][CELT_MAX_BANDS];
66cabdff1aSopenharmony_ci    FFBesselFilter bfilter_lo[OPUS_MAX_CHANNELS][CELT_MAX_BANDS];
67cabdff1aSopenharmony_ci    FFBesselFilter bfilter_hi[OPUS_MAX_CHANNELS][CELT_MAX_BANDS];
68cabdff1aSopenharmony_ci
69cabdff1aSopenharmony_ci    OpusPsyStep *steps[FF_BUFQUEUE_SIZE + 1];
70cabdff1aSopenharmony_ci    int max_steps;
71cabdff1aSopenharmony_ci
72cabdff1aSopenharmony_ci    float *window[CELT_BLOCK_NB];
73cabdff1aSopenharmony_ci    MDCT15Context *mdct[CELT_BLOCK_NB];
74cabdff1aSopenharmony_ci    int bsize_analysis;
75cabdff1aSopenharmony_ci
76cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, float, scratch)[2048];
77cabdff1aSopenharmony_ci
78cabdff1aSopenharmony_ci    /* Stats */
79cabdff1aSopenharmony_ci    float rc_waste;
80cabdff1aSopenharmony_ci    float avg_is_band;
81cabdff1aSopenharmony_ci    int64_t dual_stereo_used;
82cabdff1aSopenharmony_ci    int64_t total_packets_out;
83cabdff1aSopenharmony_ci
84cabdff1aSopenharmony_ci    /* State */
85cabdff1aSopenharmony_ci    FFBesselFilter lambda_lp;
86cabdff1aSopenharmony_ci    OpusPacketInfo p;
87cabdff1aSopenharmony_ci    int redo_analysis;
88cabdff1aSopenharmony_ci    int buffered_steps;
89cabdff1aSopenharmony_ci    int steps_to_process;
90cabdff1aSopenharmony_ci    int eof;
91cabdff1aSopenharmony_ci    float lambda;
92cabdff1aSopenharmony_ci    int *inflection_points;
93cabdff1aSopenharmony_ci    int inflection_points_count;
94cabdff1aSopenharmony_ci} OpusPsyContext;
95cabdff1aSopenharmony_ci
96cabdff1aSopenharmony_ciint  ff_opus_psy_process           (OpusPsyContext *s, OpusPacketInfo *p);
97cabdff1aSopenharmony_civoid ff_opus_psy_celt_frame_init   (OpusPsyContext *s, CeltFrame *f, int index);
98cabdff1aSopenharmony_ciint  ff_opus_psy_celt_frame_process(OpusPsyContext *s, CeltFrame *f, int index);
99cabdff1aSopenharmony_civoid ff_opus_psy_postencode_update (OpusPsyContext *s, CeltFrame *f, OpusRangeCoder *rc);
100cabdff1aSopenharmony_ci
101cabdff1aSopenharmony_ciint  ff_opus_psy_init(OpusPsyContext *s, AVCodecContext *avctx,
102cabdff1aSopenharmony_ci                      struct FFBufQueue *bufqueue, OpusEncOptions *options);
103cabdff1aSopenharmony_civoid ff_opus_psy_signal_eof(OpusPsyContext *s);
104cabdff1aSopenharmony_ciint  ff_opus_psy_end(OpusPsyContext *s);
105cabdff1aSopenharmony_ci
106cabdff1aSopenharmony_ci#endif /* AVCODEC_OPUSENC_PSY_H */
107