annotate lsp.h @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 1921e24d5886
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
1 /*
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
2 * LSP computing for ACELP-based codecs
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
3 *
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
4 * Copyright (c) 2008 Vladimir Voroshilov
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
5 *
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
6 * This file is part of FFmpeg.
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
7 *
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
12 *
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
16 * Lesser General Public License for more details.
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
17 *
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
21 */
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
22
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7248
diff changeset
23 #ifndef AVCODEC_LSP_H
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7248
diff changeset
24 #define AVCODEC_LSP_H
6735
459fe563a4dc add necessary #includes in headers
mru
parents: 6709
diff changeset
25
459fe563a4dc add necessary #includes in headers
mru
parents: 6709
diff changeset
26 #include <stdint.h>
459fe563a4dc add necessary #includes in headers
mru
parents: 6709
diff changeset
27
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
28 /**
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
29 (I.F) means fixed-point value with F fractional and I integer bits
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
30 */
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
31
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
32 /**
6706
2cb901474f6f Grammar fixes and improvements for the new ACELP code
superdump
parents: 6685
diff changeset
33 * \brief ensure a minimum distance between LSFs
12181
0885e7a93ed4 Fix Doxygen @param command attribute syntax.
diego
parents: 12165
diff changeset
34 * \param[in,out] lsfq LSF to check and adjust
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
35 * \param lsfq_min_distance minimum distance between LSFs
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
36 * \param lsfq_min minimum allowed LSF value
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
37 * \param lsfq_max maximum allowed LSF value
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6735
diff changeset
38 * \param lp_order LP filter order
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
39 */
7248
37dd0809921a Correct a couple of typos
superdump
parents: 6770
diff changeset
40 void ff_acelp_reorder_lsf(int16_t* lsfq, int lsfq_min_distance, int lsfq_min, int lsfq_max, int lp_order);
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
41
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
42 /**
10463
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
43 * Adjust the quantized LSFs so they are increasing and not too close.
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
44 *
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
45 * This step is not mentioned in the AMR spec but is in the reference C decoder.
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
46 * Omitting this step creates audible distortion on the sinusoidal sweep
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
47 * test vectors in 3GPP TS 26.074.
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
48 *
12165
4f06422196ee Restore mistakenly removed [in]/[out] Doxygen parameter attributes.
diego
parents: 12066
diff changeset
49 * @param[in,out] lsf LSFs in Hertz
10463
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
50 * @param min_spacing minimum distance between two consecutive lsf values
12066
57fba1b7867b Fix the signature of ff_set_min_dist_lsf() to match the implementation
diego
parents: 12062
diff changeset
51 * @param size size of the lsf vector
10463
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
52 */
12066
57fba1b7867b Fix the signature of ff_set_min_dist_lsf() to match the implementation
diego
parents: 12062
diff changeset
53 void ff_set_min_dist_lsf(float *lsf, double min_spacing, int size);
10463
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
54
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
55 /**
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
56 * \brief Convert LSF to LSP
12181
0885e7a93ed4 Fix Doxygen @param command attribute syntax.
diego
parents: 12165
diff changeset
57 * \param[out] lsp LSP coefficients (-0x8000 <= (0.15) < 0x8000)
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
58 * \param lsf normalized LSF coefficients (0 <= (2.13) < 0x2000 * PI)
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6735
diff changeset
59 * \param lp_order LP filter order
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
60 *
6706
2cb901474f6f Grammar fixes and improvements for the new ACELP code
superdump
parents: 6685
diff changeset
61 * \remark It is safe to pass the same array into the lsf and lsp parameters.
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
62 */
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6735
diff changeset
63 void ff_acelp_lsf2lsp(int16_t *lsp, const int16_t *lsf, int lp_order);
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
64
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
65 /**
12464
2dd67ed2f947 Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents: 12181
diff changeset
66 * Floating point version of ff_acelp_lsf2lsp()
2dd67ed2f947 Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents: 12181
diff changeset
67 */
2dd67ed2f947 Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents: 12181
diff changeset
68 void ff_acelp_lsf2lspd(double *lsp, const float *lsf, int lp_order);
2dd67ed2f947 Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents: 12181
diff changeset
69
2dd67ed2f947 Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents: 12181
diff changeset
70 /**
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
71 * \brief LSP to LP conversion (3.2.6 of G.729)
12181
0885e7a93ed4 Fix Doxygen @param command attribute syntax.
diego
parents: 12165
diff changeset
72 * \param[out] lp decoded LP coefficients (-0x8000 <= (3.12) < 0x8000)
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
73 * \param lsp LSP coefficients (-0x8000 <= (0.15) < 0x8000)
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6735
diff changeset
74 * \param lp_half_order LP filter order, divided by 2
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
75 */
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6735
diff changeset
76 void ff_acelp_lsp2lpc(int16_t* lp, const int16_t* lsp, int lp_half_order);
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
77
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
78 /**
12465
1921e24d5886 Move lsp2lpc_sipr() function to common code so it can be reused in a
vitor
parents: 12464
diff changeset
79 * LSP to LP conversion (5.2.4 of AMR-WB)
1921e24d5886 Move lsp2lpc_sipr() function to common code so it can be reused in a
vitor
parents: 12464
diff changeset
80 */
1921e24d5886 Move lsp2lpc_sipr() function to common code so it can be reused in a
vitor
parents: 12464
diff changeset
81 void ff_amrwb_lsp2lpc(const double *lsp, float *lp, int lp_order);
1921e24d5886 Move lsp2lpc_sipr() function to common code so it can be reused in a
vitor
parents: 12464
diff changeset
82
1921e24d5886 Move lsp2lpc_sipr() function to common code so it can be reused in a
vitor
parents: 12464
diff changeset
83 /**
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
84 * \brief Interpolate LSP for the first subframe and convert LSP -> LP for both subframes (3.2.5 and 3.2.6 of G.729)
12181
0885e7a93ed4 Fix Doxygen @param command attribute syntax.
diego
parents: 12165
diff changeset
85 * \param[out] lp_1st decoded LP coefficients for first subframe (-0x8000 <= (3.12) < 0x8000)
0885e7a93ed4 Fix Doxygen @param command attribute syntax.
diego
parents: 12165
diff changeset
86 * \param[out] lp_2nd decoded LP coefficients for second subframe (-0x8000 <= (3.12) < 0x8000)
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
87 * \param lsp_2nd LSP coefficients of the second subframe (-0x8000 <= (0.15) < 0x8000)
6706
2cb901474f6f Grammar fixes and improvements for the new ACELP code
superdump
parents: 6685
diff changeset
88 * \param lsp_prev LSP coefficients from the second subframe of the previous frame (-0x8000 <= (0.15) < 0x8000)
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6735
diff changeset
89 * \param lp_order LP filter order
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
90 */
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6735
diff changeset
91 void ff_acelp_lp_decode(int16_t* lp_1st, int16_t* lp_2nd, const int16_t* lsp_2nd, const int16_t* lsp_prev, int lp_order);
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
92
10506
a1d84a5cf21d Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents: 10502
diff changeset
93
a1d84a5cf21d Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents: 10502
diff changeset
94 #define MAX_LP_HALF_ORDER 8
11961
d7808ddcbcee lsp: convert variable-length arrays to fixed size
mru
parents: 10567
diff changeset
95 #define MAX_LP_ORDER (2*MAX_LP_HALF_ORDER)
10506
a1d84a5cf21d Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents: 10502
diff changeset
96
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 7760
diff changeset
97 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11961
diff changeset
98 * Reconstruct LPC coefficients from the line spectral pair frequencies.
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 7760
diff changeset
99 *
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 7760
diff changeset
100 * @param lsp line spectral pairs in cosine domain
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 7760
diff changeset
101 * @param lpc linear predictive coding coefficients
10506
a1d84a5cf21d Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents: 10502
diff changeset
102 * @param lp_half_order half the number of the amount of LPCs to be
a1d84a5cf21d Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents: 10502
diff changeset
103 * reconstructed, need to be smaller or equal to MAX_LP_HALF_ORDER
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 7760
diff changeset
104 *
10502
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
105 * @note buffers should have a minimux size of 2*lp_half_order elements.
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
106 *
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 7760
diff changeset
107 * TIA/EIA/IS-733 2.4.3.3.5
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 7760
diff changeset
108 */
10502
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
109 void ff_acelp_lspd2lpc(const double *lsp, float *lpc, int lp_half_order);
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 7760
diff changeset
110
10557
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
111 /**
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
112 * Sort values in ascending order.
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
113 *
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
114 * @note O(n) if data already sorted, O(n^2) - otherwise
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
115 */
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
116 void ff_sort_nearly_sorted_floats(float *vals, int len);
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
117
10567
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
118 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11961
diff changeset
119 * Compute the Pa / (1 + z(-1)) or Qa / (1 - z(-1)) coefficients
10567
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
120 * needed for LSP to LPC conversion.
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
121 * We only need to calculate the 6 first elements of the polynomial.
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
122 *
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
123 * @param lsp line spectral pairs in cosine domain
12181
0885e7a93ed4 Fix Doxygen @param command attribute syntax.
diego
parents: 12165
diff changeset
124 * @param[out] f polynomial input/output as a vector
10567
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
125 *
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
126 * TIA/EIA/IS-733 2.4.3.3.5-1/2
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
127 */
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
128 void ff_lsp2polyf(const double *lsp, double *f, int lp_half_order);
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
129
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7248
diff changeset
130 #endif /* AVCODEC_LSP_H */