/src/ffmpeg/libavcodec/takdsp.c
Line | Count | Source |
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(const int32_t *p1, int32_t *p2, int length) |
27 | 2.96k | { |
28 | 2.96k | int i; |
29 | | |
30 | 19.1M | for (i = 0; i < length; i++) { |
31 | 19.1M | uint32_t a = p1[i]; |
32 | 19.1M | uint32_t b = p2[i]; |
33 | 19.1M | p2[i] = a + b; |
34 | 19.1M | } |
35 | 2.96k | } |
36 | | |
37 | | static void decorrelate_sr(int32_t *p1, const int32_t *p2, int length) |
38 | 495 | { |
39 | 495 | int i; |
40 | | |
41 | 1.11M | for (i = 0; i < length; i++) { |
42 | 1.11M | uint32_t a = p1[i]; |
43 | 1.11M | uint32_t b = p2[i]; |
44 | 1.11M | p1[i] = b - a; |
45 | 1.11M | } |
46 | 495 | } |
47 | | |
48 | | static void decorrelate_sm(int32_t *p1, int32_t *p2, int length) |
49 | 507 | { |
50 | 507 | int i; |
51 | | |
52 | 4.45M | for (i = 0; i < length; i++) { |
53 | 4.45M | uint32_t a = p1[i]; |
54 | 4.45M | int32_t b = p2[i]; |
55 | 4.45M | a -= b >> 1; |
56 | 4.45M | p1[i] = a; |
57 | 4.45M | p2[i] = a + b; |
58 | 4.45M | } |
59 | 507 | } |
60 | | |
61 | | static void decorrelate_sf(int32_t *p1, const int32_t *p2, int length, int dshift, int dfactor) |
62 | 1.60k | { |
63 | 1.60k | int i; |
64 | | |
65 | 6.66M | for (i = 0; i < length; i++) { |
66 | 6.65M | uint32_t a = p1[i]; |
67 | 6.65M | int32_t b = p2[i]; |
68 | 6.65M | b = (unsigned)((int)(dfactor * (unsigned)(b >> dshift) + 128) >> 8) << dshift; |
69 | 6.65M | p1[i] = b - a; |
70 | 6.65M | } |
71 | 1.60k | } |
72 | | |
73 | | av_cold void ff_takdsp_init(TAKDSPContext *c) |
74 | 1.59k | { |
75 | 1.59k | c->decorrelate_ls = decorrelate_ls; |
76 | 1.59k | c->decorrelate_sr = decorrelate_sr; |
77 | 1.59k | c->decorrelate_sm = decorrelate_sm; |
78 | 1.59k | c->decorrelate_sf = decorrelate_sf; |
79 | | |
80 | | #if ARCH_RISCV |
81 | | ff_takdsp_init_riscv(c); |
82 | | #elif ARCH_X86 |
83 | | ff_takdsp_init_x86(c); |
84 | 1.59k | #endif |
85 | 1.59k | } |