1 |
|
|
/* |
2 |
|
|
* Copyright (c) 2012 Mans Rullgard <mans@mansr.com> |
3 |
|
|
* |
4 |
|
|
* This file is part of FFmpeg. |
5 |
|
|
* |
6 |
|
|
* FFmpeg is free software; you can redistribute it and/or |
7 |
|
|
* modify it under the terms of the GNU Lesser General Public |
8 |
|
|
* License as published by the Free Software Foundation; either |
9 |
|
|
* version 2.1 of the License, or (at your option) any later version. |
10 |
|
|
* |
11 |
|
|
* FFmpeg is distributed in the hope that it will be useful, |
12 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 |
|
|
* Lesser General Public License for more details. |
15 |
|
|
* |
16 |
|
|
* You should have received a copy of the GNU Lesser General Public |
17 |
|
|
* License along with FFmpeg; if not, write to the Free Software |
18 |
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 |
|
|
*/ |
20 |
|
|
|
21 |
|
|
#include "libavutil/attributes.h" |
22 |
|
|
#include "libavutil/samplefmt.h" |
23 |
|
|
#include "flacdsp.h" |
24 |
|
|
#include "config.h" |
25 |
|
|
|
26 |
|
|
#define SAMPLE_SIZE 16 |
27 |
|
|
#define PLANAR 0 |
28 |
|
|
#include "flacdsp_template.c" |
29 |
|
|
#include "flacdsp_lpc_template.c" |
30 |
|
|
|
31 |
|
|
#undef PLANAR |
32 |
|
|
#define PLANAR 1 |
33 |
|
|
#include "flacdsp_template.c" |
34 |
|
|
|
35 |
|
|
#undef SAMPLE_SIZE |
36 |
|
|
#undef PLANAR |
37 |
|
|
#define SAMPLE_SIZE 32 |
38 |
|
|
#define PLANAR 0 |
39 |
|
|
#include "flacdsp_template.c" |
40 |
|
|
#include "flacdsp_lpc_template.c" |
41 |
|
|
|
42 |
|
|
#undef PLANAR |
43 |
|
|
#define PLANAR 1 |
44 |
|
|
#include "flacdsp_template.c" |
45 |
|
|
|
46 |
|
6171 |
static void flac_lpc_16_c(int32_t *decoded, const int coeffs[32], |
47 |
|
|
int pred_order, int qlevel, int len) |
48 |
|
|
{ |
49 |
|
|
int i, j; |
50 |
|
|
|
51 |
✓✓ |
18997124 |
for (i = pred_order; i < len - 1; i += 2, decoded += 2) { |
52 |
|
18990953 |
SUINT c = coeffs[0]; |
53 |
|
18990953 |
SUINT d = decoded[0]; |
54 |
|
18990953 |
int s0 = 0, s1 = 0; |
55 |
✓✓ |
33122306 |
for (j = 1; j < pred_order; j++) { |
56 |
|
14131353 |
s0 += c*d; |
57 |
|
14131353 |
d = decoded[j]; |
58 |
|
14131353 |
s1 += c*d; |
59 |
|
14131353 |
c = coeffs[j]; |
60 |
|
|
} |
61 |
|
18990953 |
s0 += c*d; |
62 |
|
18990953 |
d = decoded[j] += (SUINT)(s0 >> qlevel); |
63 |
|
18990953 |
s1 += c*d; |
64 |
|
18990953 |
decoded[j + 1] += (SUINT)(s1 >> qlevel); |
65 |
|
|
} |
66 |
✓✓ |
6171 |
if (i < len) { |
67 |
|
5728 |
int sum = 0; |
68 |
✓✓ |
14984 |
for (j = 0; j < pred_order; j++) |
69 |
|
9256 |
sum += coeffs[j] * (SUINT)decoded[j]; |
70 |
|
5728 |
decoded[j] = decoded[j] + (unsigned)(sum >> qlevel); |
71 |
|
|
} |
72 |
|
6171 |
} |
73 |
|
|
|
74 |
|
2173 |
static void flac_lpc_32_c(int32_t *decoded, const int coeffs[32], |
75 |
|
|
int pred_order, int qlevel, int len) |
76 |
|
|
{ |
77 |
|
|
int i, j; |
78 |
|
|
|
79 |
✓✓ |
12360568 |
for (i = pred_order; i < len; i++, decoded++) { |
80 |
|
12358395 |
int64_t sum = 0; |
81 |
✓✓ |
120745733 |
for (j = 0; j < pred_order; j++) |
82 |
|
108387338 |
sum += (int64_t)coeffs[j] * decoded[j]; |
83 |
|
12358395 |
decoded[j] += sum >> qlevel; |
84 |
|
|
} |
85 |
|
|
|
86 |
|
2173 |
} |
87 |
|
|
|
88 |
|
5979 |
av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt, int channels, |
89 |
|
|
int bps) |
90 |
|
|
{ |
91 |
|
5979 |
c->lpc16 = flac_lpc_16_c; |
92 |
|
5979 |
c->lpc32 = flac_lpc_32_c; |
93 |
|
5979 |
c->lpc16_encode = flac_lpc_encode_c_16; |
94 |
|
5979 |
c->lpc32_encode = flac_lpc_encode_c_32; |
95 |
|
|
|
96 |
✓✗✓✗ ✗ |
5979 |
switch (fmt) { |
97 |
|
503 |
case AV_SAMPLE_FMT_S32: |
98 |
|
503 |
c->decorrelate[0] = flac_decorrelate_indep_c_32; |
99 |
|
503 |
c->decorrelate[1] = flac_decorrelate_ls_c_32; |
100 |
|
503 |
c->decorrelate[2] = flac_decorrelate_rs_c_32; |
101 |
|
503 |
c->decorrelate[3] = flac_decorrelate_ms_c_32; |
102 |
|
503 |
break; |
103 |
|
|
|
104 |
|
|
case AV_SAMPLE_FMT_S32P: |
105 |
|
|
c->decorrelate[0] = flac_decorrelate_indep_c_32p; |
106 |
|
|
c->decorrelate[1] = flac_decorrelate_ls_c_32p; |
107 |
|
|
c->decorrelate[2] = flac_decorrelate_rs_c_32p; |
108 |
|
|
c->decorrelate[3] = flac_decorrelate_ms_c_32p; |
109 |
|
|
break; |
110 |
|
|
|
111 |
|
5476 |
case AV_SAMPLE_FMT_S16: |
112 |
|
5476 |
c->decorrelate[0] = flac_decorrelate_indep_c_16; |
113 |
|
5476 |
c->decorrelate[1] = flac_decorrelate_ls_c_16; |
114 |
|
5476 |
c->decorrelate[2] = flac_decorrelate_rs_c_16; |
115 |
|
5476 |
c->decorrelate[3] = flac_decorrelate_ms_c_16; |
116 |
|
5476 |
break; |
117 |
|
|
|
118 |
|
|
case AV_SAMPLE_FMT_S16P: |
119 |
|
|
c->decorrelate[0] = flac_decorrelate_indep_c_16p; |
120 |
|
|
c->decorrelate[1] = flac_decorrelate_ls_c_16p; |
121 |
|
|
c->decorrelate[2] = flac_decorrelate_rs_c_16p; |
122 |
|
|
c->decorrelate[3] = flac_decorrelate_ms_c_16p; |
123 |
|
|
break; |
124 |
|
|
} |
125 |
|
|
|
126 |
|
5979 |
if (ARCH_ARM) |
127 |
|
|
ff_flacdsp_init_arm(c, fmt, channels, bps); |
128 |
|
|
if (ARCH_X86) |
129 |
|
5979 |
ff_flacdsp_init_x86(c, fmt, channels, bps); |
130 |
|
5979 |
} |