yading@10
|
1 /*
|
yading@10
|
2 * This file is part of FFmpeg.
|
yading@10
|
3 *
|
yading@10
|
4 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
5 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
6 * License as published by the Free Software Foundation; either
|
yading@10
|
7 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
8 *
|
yading@10
|
9 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
12 * Lesser General Public License for more details.
|
yading@10
|
13 *
|
yading@10
|
14 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
15 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
17 */
|
yading@10
|
18
|
yading@10
|
19 #include <stdint.h>
|
yading@10
|
20 #include "libavutil/avutil.h"
|
yading@10
|
21 #include "mathops.h"
|
yading@10
|
22
|
yading@10
|
23 #undef FUNC
|
yading@10
|
24 #undef sum_type
|
yading@10
|
25 #undef MUL
|
yading@10
|
26 #undef CLIP
|
yading@10
|
27 #undef FSUF
|
yading@10
|
28
|
yading@10
|
29 #define FUNC(n) AV_JOIN(n ## _, SAMPLE_SIZE)
|
yading@10
|
30
|
yading@10
|
31 #if SAMPLE_SIZE == 32
|
yading@10
|
32 # define sum_type int64_t
|
yading@10
|
33 # define MUL(a, b) MUL64(a, b)
|
yading@10
|
34 # define CLIP(x) av_clipl_int32(x)
|
yading@10
|
35 #else
|
yading@10
|
36 # define sum_type int32_t
|
yading@10
|
37 # define MUL(a, b) ((a) * (b))
|
yading@10
|
38 # define CLIP(x) (x)
|
yading@10
|
39 #endif
|
yading@10
|
40
|
yading@10
|
41 #define LPC1(x) { \
|
yading@10
|
42 int c = coefs[(x)-1]; \
|
yading@10
|
43 p0 += MUL(c, s); \
|
yading@10
|
44 s = smp[i-(x)+1]; \
|
yading@10
|
45 p1 += MUL(c, s); \
|
yading@10
|
46 }
|
yading@10
|
47
|
yading@10
|
48 static av_always_inline void FUNC(lpc_encode_unrolled)(int32_t *res,
|
yading@10
|
49 const int32_t *smp, int len, int order,
|
yading@10
|
50 const int32_t *coefs, int shift, int big)
|
yading@10
|
51 {
|
yading@10
|
52 int i;
|
yading@10
|
53 for (i = order; i < len; i += 2) {
|
yading@10
|
54 int s = smp[i-order];
|
yading@10
|
55 sum_type p0 = 0, p1 = 0;
|
yading@10
|
56 if (big) {
|
yading@10
|
57 switch (order) {
|
yading@10
|
58 case 32: LPC1(32)
|
yading@10
|
59 case 31: LPC1(31)
|
yading@10
|
60 case 30: LPC1(30)
|
yading@10
|
61 case 29: LPC1(29)
|
yading@10
|
62 case 28: LPC1(28)
|
yading@10
|
63 case 27: LPC1(27)
|
yading@10
|
64 case 26: LPC1(26)
|
yading@10
|
65 case 25: LPC1(25)
|
yading@10
|
66 case 24: LPC1(24)
|
yading@10
|
67 case 23: LPC1(23)
|
yading@10
|
68 case 22: LPC1(22)
|
yading@10
|
69 case 21: LPC1(21)
|
yading@10
|
70 case 20: LPC1(20)
|
yading@10
|
71 case 19: LPC1(19)
|
yading@10
|
72 case 18: LPC1(18)
|
yading@10
|
73 case 17: LPC1(17)
|
yading@10
|
74 case 16: LPC1(16)
|
yading@10
|
75 case 15: LPC1(15)
|
yading@10
|
76 case 14: LPC1(14)
|
yading@10
|
77 case 13: LPC1(13)
|
yading@10
|
78 case 12: LPC1(12)
|
yading@10
|
79 case 11: LPC1(11)
|
yading@10
|
80 case 10: LPC1(10)
|
yading@10
|
81 case 9: LPC1( 9)
|
yading@10
|
82 LPC1( 8)
|
yading@10
|
83 LPC1( 7)
|
yading@10
|
84 LPC1( 6)
|
yading@10
|
85 LPC1( 5)
|
yading@10
|
86 LPC1( 4)
|
yading@10
|
87 LPC1( 3)
|
yading@10
|
88 LPC1( 2)
|
yading@10
|
89 LPC1( 1)
|
yading@10
|
90 }
|
yading@10
|
91 } else {
|
yading@10
|
92 switch (order) {
|
yading@10
|
93 case 8: LPC1( 8)
|
yading@10
|
94 case 7: LPC1( 7)
|
yading@10
|
95 case 6: LPC1( 6)
|
yading@10
|
96 case 5: LPC1( 5)
|
yading@10
|
97 case 4: LPC1( 4)
|
yading@10
|
98 case 3: LPC1( 3)
|
yading@10
|
99 case 2: LPC1( 2)
|
yading@10
|
100 case 1: LPC1( 1)
|
yading@10
|
101 }
|
yading@10
|
102 }
|
yading@10
|
103 res[i ] = smp[i ] - CLIP(p0 >> shift);
|
yading@10
|
104 res[i+1] = smp[i+1] - CLIP(p1 >> shift);
|
yading@10
|
105 }
|
yading@10
|
106 }
|
yading@10
|
107
|
yading@10
|
108 static void FUNC(flac_lpc_encode_c)(int32_t *res, const int32_t *smp, int len,
|
yading@10
|
109 int order, const int32_t *coefs, int shift)
|
yading@10
|
110 {
|
yading@10
|
111 int i;
|
yading@10
|
112 for (i = 0; i < order; i++)
|
yading@10
|
113 res[i] = smp[i];
|
yading@10
|
114 #if CONFIG_SMALL
|
yading@10
|
115 for (i = order; i < len; i += 2) {
|
yading@10
|
116 int j;
|
yading@10
|
117 int s = smp[i];
|
yading@10
|
118 sum_type p0 = 0, p1 = 0;
|
yading@10
|
119 for (j = 0; j < order; j++) {
|
yading@10
|
120 int c = coefs[j];
|
yading@10
|
121 p1 += MUL(c, s);
|
yading@10
|
122 s = smp[i-j-1];
|
yading@10
|
123 p0 += MUL(c, s);
|
yading@10
|
124 }
|
yading@10
|
125 res[i ] = smp[i ] - CLIP(p0 >> shift);
|
yading@10
|
126 res[i+1] = smp[i+1] - CLIP(p1 >> shift);
|
yading@10
|
127 }
|
yading@10
|
128 #else
|
yading@10
|
129 switch (order) {
|
yading@10
|
130 case 1: FUNC(lpc_encode_unrolled)(res, smp, len, 1, coefs, shift, 0); break;
|
yading@10
|
131 case 2: FUNC(lpc_encode_unrolled)(res, smp, len, 2, coefs, shift, 0); break;
|
yading@10
|
132 case 3: FUNC(lpc_encode_unrolled)(res, smp, len, 3, coefs, shift, 0); break;
|
yading@10
|
133 case 4: FUNC(lpc_encode_unrolled)(res, smp, len, 4, coefs, shift, 0); break;
|
yading@10
|
134 case 5: FUNC(lpc_encode_unrolled)(res, smp, len, 5, coefs, shift, 0); break;
|
yading@10
|
135 case 6: FUNC(lpc_encode_unrolled)(res, smp, len, 6, coefs, shift, 0); break;
|
yading@10
|
136 case 7: FUNC(lpc_encode_unrolled)(res, smp, len, 7, coefs, shift, 0); break;
|
yading@10
|
137 case 8: FUNC(lpc_encode_unrolled)(res, smp, len, 8, coefs, shift, 0); break;
|
yading@10
|
138 default: FUNC(lpc_encode_unrolled)(res, smp, len, order, coefs, shift, 1); break;
|
yading@10
|
139 }
|
yading@10
|
140 #endif
|
yading@10
|
141 }
|