blob: 2441c2baa62cc502b09910ad7b8add0afe0b8dfa
1 | /* |
2 | * TAK decoder |
3 | * Copyright (c) 2015 Paul B Mahol |
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 | #include "libavutil/attributes.h" |
23 | #include "takdsp.h" |
24 | #include "config.h" |
25 | |
26 | static void decorrelate_ls(int32_t *p1, int32_t *p2, int length) |
27 | { |
28 | int i; |
29 | |
30 | for (i = 0; i < length; i++) { |
31 | int32_t a = p1[i]; |
32 | int32_t b = p2[i]; |
33 | p2[i] = a + b; |
34 | } |
35 | } |
36 | |
37 | static void decorrelate_sr(int32_t *p1, int32_t *p2, int length) |
38 | { |
39 | int i; |
40 | |
41 | for (i = 0; i < length; i++) { |
42 | int32_t a = p1[i]; |
43 | int32_t b = p2[i]; |
44 | p1[i] = b - a; |
45 | } |
46 | } |
47 | |
48 | static void decorrelate_sm(int32_t *p1, int32_t *p2, int length) |
49 | { |
50 | int i; |
51 | |
52 | for (i = 0; i < length; i++) { |
53 | int32_t a = p1[i]; |
54 | int32_t b = p2[i]; |
55 | a -= b >> 1; |
56 | p1[i] = a; |
57 | p2[i] = a + b; |
58 | } |
59 | } |
60 | |
61 | static void decorrelate_sf(int32_t *p1, int32_t *p2, int length, int dshift, int dfactor) |
62 | { |
63 | int i; |
64 | |
65 | for (i = 0; i < length; i++) { |
66 | int32_t a = p1[i]; |
67 | int32_t b = p2[i]; |
68 | b = dfactor * (b >> dshift) + 128 >> 8 << dshift; |
69 | p1[i] = b - a; |
70 | } |
71 | } |
72 | |
73 | av_cold void ff_takdsp_init(TAKDSPContext *c) |
74 | { |
75 | c->decorrelate_ls = decorrelate_ls; |
76 | c->decorrelate_sr = decorrelate_sr; |
77 | c->decorrelate_sm = decorrelate_sm; |
78 | c->decorrelate_sf = decorrelate_sf; |
79 | |
80 | if (ARCH_X86) |
81 | ff_takdsp_init_x86(c); |
82 | } |
83 |