FFmpeg  4.3
lpc.h
Go to the documentation of this file.
1 /*
2  * LPC utility code
3  * Copyright (c) 2006 Justin Ruggles <justin.ruggles@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_LPC_H
23 #define AVCODEC_LPC_H
24 
25 #include <stdint.h>
26 #include "libavutil/avassert.h"
27 #include "libavutil/lls.h"
28 #include "aac_defines.h"
29 
30 #define ORDER_METHOD_EST 0
31 #define ORDER_METHOD_2LEVEL 1
32 #define ORDER_METHOD_4LEVEL 2
33 #define ORDER_METHOD_8LEVEL 3
34 #define ORDER_METHOD_SEARCH 4
35 #define ORDER_METHOD_LOG 5
36 
37 #define MIN_LPC_ORDER 1
38 #define MAX_LPC_ORDER 32
39 
40 /**
41  * LPC analysis type
42  */
43 enum FFLPCType {
44  FF_LPC_TYPE_DEFAULT = -1, ///< use the codec default LPC type
45  FF_LPC_TYPE_NONE = 0, ///< do not use LPC prediction or use all zero coefficients
46  FF_LPC_TYPE_FIXED = 1, ///< fixed LPC coefficients
47  FF_LPC_TYPE_LEVINSON = 2, ///< Levinson-Durbin recursion
48  FF_LPC_TYPE_CHOLESKY = 3, ///< Cholesky factorization
49  FF_LPC_TYPE_NB , ///< Not part of ABI
50 };
51 
52 typedef struct LPCContext {
53  int blocksize;
54  int max_order;
56  double *windowed_buffer;
58 
59  /**
60  * Apply a Welch window to an array of input samples.
61  * The output samples have the same scale as the input, but are in double
62  * sample format.
63  * @param data input samples
64  * @param len number of input samples
65  * @param w_data output samples
66  */
68  double *w_data);
69  /**
70  * Perform autocorrelation on input samples with delay of 0 to lag.
71  * @param data input samples.
72  * constraints: no alignment needed, but must have at
73  * least lag*sizeof(double) valid bytes preceding it, and
74  * size must be at least (len+1)*sizeof(double) if data is
75  * 16-byte aligned or (len+2)*sizeof(double) if data is
76  * unaligned.
77  * @param len number of input samples to process
78  * @param lag maximum delay to calculate
79  * @param autoc output autocorrelation coefficients.
80  * constraints: array size must be at least lag+1.
81  */
82  void (*lpc_compute_autocorr)(const double *data, int len, int lag,
83  double *autoc);
84 
85  // TODO: these should be allocated to reduce ABI compatibility issues
87 } LPCContext;
88 
89 
90 /**
91  * Calculate LPC coefficients for multiple orders
92  */
94  const int32_t *samples, int blocksize, int min_order,
95  int max_order, int precision,
96  int32_t coefs[][MAX_LPC_ORDER], int *shift,
97  enum FFLPCType lpc_type, int lpc_passes,
98  int omethod, int min_shift, int max_shift, int zero_shift);
99 
101  const int32_t *samples, int order, double *ref);
102 
103 double ff_lpc_calc_ref_coefs_f(LPCContext *s, const float *samples, int len,
104  int order, double *ref);
105 
106 /**
107  * Initialize LPCContext.
108  */
109 int ff_lpc_init(LPCContext *s, int blocksize, int max_order,
110  enum FFLPCType lpc_type);
112 
113 /**
114  * Uninitialize LPCContext.
115  */
116 void ff_lpc_end(LPCContext *s);
117 
118 #if USE_FIXED
119 typedef int LPC_TYPE;
120 typedef unsigned LPC_TYPE_U;
121 #else
122 #ifdef LPC_USE_DOUBLE
123 typedef double LPC_TYPE;
124 typedef double LPC_TYPE_U;
125 #else
126 typedef float LPC_TYPE;
127 typedef float LPC_TYPE_U;
128 #endif
129 #endif // USE_FIXED
130 
131 /**
132  * Schur recursion.
133  * Produces reflection coefficients from autocorrelation data.
134  */
135 static inline void compute_ref_coefs(const LPC_TYPE *autoc, int max_order,
137 {
138  int i, j;
139  LPC_TYPE err;
140  LPC_TYPE gen0[MAX_LPC_ORDER], gen1[MAX_LPC_ORDER];
141 
142  for (i = 0; i < max_order; i++)
143  gen0[i] = gen1[i] = autoc[i + 1];
144 
145  err = autoc[0];
146  ref[0] = -gen1[0] / err;
147  err += gen1[0] * ref[0];
148  if (error)
149  error[0] = err;
150  for (i = 1; i < max_order; i++) {
151  for (j = 0; j < max_order - i; j++) {
152  gen1[j] = gen1[j + 1] + ref[i - 1] * gen0[j];
153  gen0[j] = gen1[j + 1] * ref[i - 1] + gen0[j];
154  }
155  ref[i] = -gen1[0] / err;
156  err += gen1[0] * ref[i];
157  if (error)
158  error[i] = err;
159  }
160 }
161 
162 /**
163  * Levinson-Durbin recursion.
164  * Produce LPC coefficients from autocorrelation data.
165  */
166 static inline int AAC_RENAME(compute_lpc_coefs)(const LPC_TYPE *autoc, int max_order,
167  LPC_TYPE *lpc, int lpc_stride, int fail,
168  int normalize)
169 {
170  int i, j;
171  LPC_TYPE err = 0;
172  LPC_TYPE *lpc_last = lpc;
173 
175 
176  if (normalize)
177  err = *autoc++;
178 
179  if (fail && (autoc[max_order - 1] == 0 || err <= 0))
180  return -1;
181 
182  for(i=0; i<max_order; i++) {
183  LPC_TYPE r = AAC_SRA_R(-autoc[i], 5);
184 
185  if (normalize) {
186  for(j=0; j<i; j++)
187  r -= lpc_last[j] * autoc[i-j-1];
188 
189  r /= err;
190  err *= FIXR(1.0) - (r * r);
191  }
192 
193  lpc[i] = r;
194 
195  for(j=0; j < (i+1)>>1; j++) {
196  LPC_TYPE f = lpc_last[ j];
197  LPC_TYPE b = lpc_last[i-1-j];
198  lpc[ j] = f + (LPC_TYPE_U)AAC_MUL26(r, b);
199  lpc[i-1-j] = b + (LPC_TYPE_U)AAC_MUL26(r, f);
200  }
201 
202  if (fail && err < 0)
203  return -1;
204 
205  lpc_last = lpc;
206  lpc += lpc_stride;
207  }
208 
209  return 0;
210 }
211 
212 #endif /* AVCODEC_LPC_H */
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:29
LLSModel
Linear least squares model.
Definition: lls.h:38
FFLPCType
FFLPCType
LPC analysis type.
Definition: lpc.h:43
ff_lpc_end
void ff_lpc_end(LPCContext *s)
Uninitialize LPCContext.
Definition: lpc.c:322
FF_LPC_TYPE_CHOLESKY
@ FF_LPC_TYPE_CHOLESKY
Cholesky factorization.
Definition: lpc.h:48
compute_lpc_coefs
static int AAC_RENAME() compute_lpc_coefs(const LPC_TYPE *autoc, int max_order, LPC_TYPE *lpc, int lpc_stride, int fail, int normalize)
Levinson-Durbin recursion.
Definition: lpc.h:166
b
#define b
Definition: input.c:41
data
const char data[16]
Definition: mxf.c:91
samples
FFmpeg Automated Testing Environment ************************************Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server Uploading new samples to the fate suite FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg’s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg’s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass ‘ target exec’ to ‘configure’ or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script ‘tests fate sh’ from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at ‘doc fate_config sh template’ Create a configuration that suits your based on the configuration template The ‘slot’ configuration variable can be any string that is not yet but it is suggested that you name it adhering to the following pattern ‘ARCH OS COMPILER COMPILER VERSION’ The configuration file itself will be sourced in a shell therefore all shell features may be used This enables you to setup the environment as you need it for your build For your first test runs the ‘fate_recv’ variable should be empty or commented out This will run everything as normal except that it will omit the submission of the results to the server The following files should be present in $workdir as specified in the configuration it may help to try out the ‘ssh’ command with one or more ‘ v’ options You should get detailed output concerning your SSH configuration and the authentication process The only thing left is to automate the execution of the fate sh script and the synchronisation of the samples directory Uploading new samples to the fate suite *****************************************If you need a sample uploaded send a mail to samples request This is for developers who have an account on the fate suite server If you upload new samples
Definition: fate.txt:139
LPCContext::windowed_buffer
double * windowed_buffer
Definition: lpc.h:56
LPCContext
Definition: lpc.h:52
fail
#define fail()
Definition: checkasm.h:123
ff_lpc_init
int ff_lpc_init(LPCContext *s, int blocksize, int max_order, enum FFLPCType lpc_type)
Initialize LPCContext.
Definition: lpc.c:300
LPCContext::lpc_apply_welch_window
void(* lpc_apply_welch_window)(const int32_t *data, int len, double *w_data)
Apply a Welch window to an array of input samples.
Definition: lpc.h:67
FF_LPC_TYPE_DEFAULT
@ FF_LPC_TYPE_DEFAULT
use the codec default LPC type
Definition: lpc.h:44
avassert.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
LPCContext::lpc_type
enum FFLPCType lpc_type
Definition: lpc.h:55
LPC_TYPE
float LPC_TYPE
Definition: lpc.h:126
lls.h
f
#define f(width, name)
Definition: cbs_vp9.c:255
int32_t
int32_t
Definition: audio_convert.c:194
LPCContext::lls_models
LLSModel lls_models[2]
Definition: lpc.h:86
ff_lpc_calc_ref_coefs_f
double ff_lpc_calc_ref_coefs_f(LPCContext *s, const float *samples, int len, int order, double *ref)
Definition: lpc.c:171
LPCContext::max_order
int max_order
Definition: lpc.h:54
ff_lpc_calc_ref_coefs
int ff_lpc_calc_ref_coefs(LPCContext *s, const int32_t *samples, int order, double *ref)
Definition: lpc.c:159
LPCContext::lpc_compute_autocorr
void(* lpc_compute_autocorr)(const double *data, int len, int lag, double *autoc)
Perform autocorrelation on input samples with delay of 0 to lag.
Definition: lpc.h:82
LPCContext::blocksize
int blocksize
Definition: lpc.h:53
ff_lpc_calc_coefs
int ff_lpc_calc_coefs(LPCContext *s, const int32_t *samples, int blocksize, int min_order, int max_order, int precision, int32_t coefs[][MAX_LPC_ORDER], int *shift, enum FFLPCType lpc_type, int lpc_passes, int omethod, int min_shift, int max_shift, int zero_shift)
Calculate LPC coefficients for multiple orders.
Definition: lpc.c:200
FF_LPC_TYPE_NB
@ FF_LPC_TYPE_NB
Not part of ABI.
Definition: lpc.h:49
MAX_LPC_ORDER
#define MAX_LPC_ORDER
Definition: lpc.h:38
ff_lpc_init_x86
void ff_lpc_init_x86(LPCContext *s)
Definition: lpc.c:152
LPCContext::windowed_samples
double * windowed_samples
Definition: lpc.h:57
r
#define r
Definition: input.c:40
normalize
Definition: normalize.py:1
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
AAC_MUL26
#define AAC_MUL26(x, y)
Definition: aac_defines.h:100
AAC_RENAME
#define AAC_RENAME(x)
Definition: aac_defines.h:84
len
int len
Definition: vorbis_enc_data.h:452
compute_ref_coefs
static void compute_ref_coefs(const LPC_TYPE *autoc, int max_order, LPC_TYPE *ref, LPC_TYPE *error)
Schur recursion.
Definition: lpc.h:135
AAC_SRA_R
#define AAC_SRA_R(x, y)
Definition: aac_defines.h:112
normalize
static void normalize(NormalizeContext *s, AVFrame *in, AVFrame *out)
Definition: vf_normalize.c:291
void
typedef void(RENAME(mix_any_func_type))
Definition: rematrix_template.c:52
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
shift
static int shift(int a, int b)
Definition: sonic.c:82
aac_defines.h
FF_LPC_TYPE_NONE
@ FF_LPC_TYPE_NONE
do not use LPC prediction or use all zero coefficients
Definition: lpc.h:45
FF_LPC_TYPE_LEVINSON
@ FF_LPC_TYPE_LEVINSON
Levinson-Durbin recursion.
Definition: lpc.h:47
FF_LPC_TYPE_FIXED
@ FF_LPC_TYPE_FIXED
fixed LPC coefficients
Definition: lpc.h:46
FIXR
#define FIXR(x)
Definition: aac_defines.h:92
LPC_TYPE_U
float LPC_TYPE_U
Definition: lpc.h:127