Mercurial > libavcodec.hg
annotate lsp.c @ 6920:d02af7474bff libavcodec
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
fixes CID84 RUN2
CID85 RUN2
CID86 RUN2
CID87 RUN2
CID88 RUN2
CID89 RUN2
CID90 RUN2
CID91 RUN2
CID92 RUN2
CID93 RUN2
CID94 RUN2
CID95 RUN2
CID96 RUN2
CID97 RUN2
CID98 RUN2
CID99 RUN2
CID100 RUN2
CID101 RUN2
CID102 RUN2
CID103 RUN2
CID104 RUN2
CID105 RUN2
CID106 RUN2
author | michael |
---|---|
date | Wed, 28 May 2008 11:59:41 +0000 |
parents | ca449dc51bd7 |
children | 30d7b2e3a381 |
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 routines 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 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
23 #include <inttypes.h> |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
24 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
25 #include "avcodec.h" |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
26 #define FRAC_BITS 14 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
27 #include "mathops.h" |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
28 #include "lsp.h" |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
29 #include "acelp_math.h" |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
30 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
31 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
|
32 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
33 int i, j; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
34 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
35 /* sort lsfq in ascending order. float bubble agorithm, |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
36 O(n) if data already sorted, O(n^2) - otherwise */ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
37 for(i=0; i<lp_order-1; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
38 for(j=i; j>=0 && lsfq[j] > lsfq[j+1]; j--) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
39 FFSWAP(int16_t, lsfq[j], lsfq[j+1]); |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
40 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
41 for(i=0; i<lp_order; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
42 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
43 lsfq[i] = FFMAX(lsfq[i], lsfq_min); |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
44 lsfq_min = lsfq[i] + lsfq_min_distance; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
45 } |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
46 lsfq[lp_order-1] = FFMIN(lsfq[lp_order-1], lsfq_max);//Is warning required ? |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
47 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
48 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
49 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
|
50 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
51 int i; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
52 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
53 /* Convert LSF to LSP, lsp=cos(lsf) */ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
54 for(i=0; i<lp_order; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
55 // 20861 = 2.0 / PI in (0.15) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
56 lsp[i] = ff_cos(lsf[i] * 20861 >> 15); // divide by PI and (0,13) -> (0,14) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
57 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
58 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
59 /** |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
60 * \brief decodes polynomial coefficients from LSP |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
61 * \param f [out] decoded polynomial coefficients (-0x20000000 <= (3.22) <= 0x1fffffff) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
62 * \param lsp LSP coefficients (-0x8000 <= (0.15) <= 0x7fff) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
63 */ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
64 static void lsp2poly(int* f, 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
|
65 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
66 int i, j; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
67 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
68 f[0] = 0x400000; // 1.0 in (3.22) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
69 f[1] = -lsp[0] << 8; // *2 and (0.15) -> (3.22) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
70 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
71 for(i=2; i<=lp_half_order; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
72 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
73 f[i] = f[i-2]; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
74 for(j=i; j>1; j--) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
75 f[j] -= MULL(f[j-1], lsp[2*i-2]) - f[j-2]; // (3.22) * (0.15) * 2 -> (3.22) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
76 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
77 f[1] -= lsp[2*i-2] << 8; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
78 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
79 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
80 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
81 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
|
82 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
83 int i; |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
84 int f1[lp_half_order+1]; // (3.22) |
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
85 int f2[lp_half_order+1]; // (3.22) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
86 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
87 lsp2poly(f1, lsp , lp_half_order); |
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
88 lsp2poly(f2, lsp+1, lp_half_order); |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
89 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
90 /* 3.2.6 of G.729, Equations 25 and 26*/ |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
91 lp[0] = 4096; |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
92 for(i=1; i<lp_half_order+1; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
93 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
94 int ff1 = f1[i] + f1[i-1]; // (3.22) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
95 int ff2 = f2[i] - f2[i-1]; // (3.22) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
96 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
97 ff1 += 1 << 10; // for rounding |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
98 lp[i] = (ff1 + ff2) >> 11; // divide by 2 and (3.22) -> (3.12) |
6774 | 99 lp[(lp_half_order << 1) + 1 - i] = (ff1 - ff2) >> 11; // divide by 2 and (3.22) -> (3.12) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
100 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
101 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
102 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
103 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
|
104 { |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
105 int16_t lsp_1st[lp_order]; // (0.15) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
106 int i; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
107 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
108 /* LSP values for first subframe (3.2.5 of G.729, Equation 24)*/ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
109 for(i=0; i<lp_order; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
110 #ifdef G729_BITEXACT |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
111 lsp_1st[i] = (lsp_2nd[i] >> 1) + (lsp_prev[i] >> 1); |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
112 #else |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
113 lsp_1st[i] = (lsp_2nd[i] + lsp_prev[i]) >> 1; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
114 #endif |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
115 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
116 ff_acelp_lsp2lpc(lp_1st, lsp_1st, lp_order >> 1); |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
117 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
118 /* LSP values for second subframe (3.2.5 of G.729)*/ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
119 ff_acelp_lsp2lpc(lp_2nd, lsp_2nd, lp_order >> 1); |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
120 } |