1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * JPEG 2000 DSP functions
3cabdff1aSopenharmony_ci * Copyright (c) 2007 Kamil Nowosad
4cabdff1aSopenharmony_ci * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com>
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * This file is part of FFmpeg.
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cabdff1aSopenharmony_ci * Lesser General Public License for more details.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21cabdff1aSopenharmony_ci */
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci#include "config.h"
24cabdff1aSopenharmony_ci#include "libavutil/attributes.h"
25cabdff1aSopenharmony_ci#include "jpeg2000dsp.h"
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci/* Inverse ICT parameters in float and integer.
28cabdff1aSopenharmony_ci * int value = (float value) * (1<<16) */
29cabdff1aSopenharmony_cistatic const float f_ict_params[4] = {
30cabdff1aSopenharmony_ci    1.402f,
31cabdff1aSopenharmony_ci    0.34413f,
32cabdff1aSopenharmony_ci    0.71414f,
33cabdff1aSopenharmony_ci    1.772f
34cabdff1aSopenharmony_ci};
35cabdff1aSopenharmony_ci
36cabdff1aSopenharmony_cistatic const int i_ict_params[4] = {
37cabdff1aSopenharmony_ci     91881,
38cabdff1aSopenharmony_ci     22553,
39cabdff1aSopenharmony_ci     46802,
40cabdff1aSopenharmony_ci    116130
41cabdff1aSopenharmony_ci};
42cabdff1aSopenharmony_ci
43cabdff1aSopenharmony_cistatic void ict_float(void *_src0, void *_src1, void *_src2, int csize)
44cabdff1aSopenharmony_ci{
45cabdff1aSopenharmony_ci    float *src0 = _src0, *src1 = _src1, *src2 = _src2;
46cabdff1aSopenharmony_ci    float i0f, i1f, i2f;
47cabdff1aSopenharmony_ci    int i;
48cabdff1aSopenharmony_ci
49cabdff1aSopenharmony_ci    for (i = 0; i < csize; i++) {
50cabdff1aSopenharmony_ci        i0f = *src0 + (f_ict_params[0] * *src2);
51cabdff1aSopenharmony_ci        i1f = *src0 - (f_ict_params[1] * *src1)
52cabdff1aSopenharmony_ci                    - (f_ict_params[2] * *src2);
53cabdff1aSopenharmony_ci        i2f = *src0 + (f_ict_params[3] * *src1);
54cabdff1aSopenharmony_ci        *src0++ = i0f;
55cabdff1aSopenharmony_ci        *src1++ = i1f;
56cabdff1aSopenharmony_ci        *src2++ = i2f;
57cabdff1aSopenharmony_ci    }
58cabdff1aSopenharmony_ci}
59cabdff1aSopenharmony_ci
60cabdff1aSopenharmony_cistatic void ict_int(void *_src0, void *_src1, void *_src2, int csize)
61cabdff1aSopenharmony_ci{
62cabdff1aSopenharmony_ci    int32_t *src0 = _src0, *src1 = _src1, *src2 = _src2;
63cabdff1aSopenharmony_ci    int32_t i0, i1, i2;
64cabdff1aSopenharmony_ci    int i;
65cabdff1aSopenharmony_ci
66cabdff1aSopenharmony_ci    for (i = 0; i < csize; i++) {
67cabdff1aSopenharmony_ci        i0 = *src0 + *src2 + ((int)((26345U * *src2) + (1 << 15)) >> 16);
68cabdff1aSopenharmony_ci        i1 = *src0 - ((int)(((unsigned)i_ict_params[1] * *src1) + (1 << 15)) >> 16)
69cabdff1aSopenharmony_ci                   - ((int)(((unsigned)i_ict_params[2] * *src2) + (1 << 15)) >> 16);
70cabdff1aSopenharmony_ci        i2 = *src0 + (2 * *src1) + ((int)((-14942U * *src1) + (1 << 15)) >> 16);
71cabdff1aSopenharmony_ci        *src0++ = i0;
72cabdff1aSopenharmony_ci        *src1++ = i1;
73cabdff1aSopenharmony_ci        *src2++ = i2;
74cabdff1aSopenharmony_ci    }
75cabdff1aSopenharmony_ci}
76cabdff1aSopenharmony_ci
77cabdff1aSopenharmony_cistatic void rct_int(void *_src0, void *_src1, void *_src2, int csize)
78cabdff1aSopenharmony_ci{
79cabdff1aSopenharmony_ci    int32_t *src0 = _src0, *src1 = _src1, *src2 = _src2;
80cabdff1aSopenharmony_ci    int32_t i0, i1, i2;
81cabdff1aSopenharmony_ci    int i;
82cabdff1aSopenharmony_ci
83cabdff1aSopenharmony_ci    for (i = 0; i < csize; i++) {
84cabdff1aSopenharmony_ci        i1 = *src0 - (*src2 + *src1 >> 2);
85cabdff1aSopenharmony_ci        i0 = i1 + *src2;
86cabdff1aSopenharmony_ci        i2 = i1 + *src1;
87cabdff1aSopenharmony_ci        *src0++ = i0;
88cabdff1aSopenharmony_ci        *src1++ = i1;
89cabdff1aSopenharmony_ci        *src2++ = i2;
90cabdff1aSopenharmony_ci    }
91cabdff1aSopenharmony_ci}
92cabdff1aSopenharmony_ci
93cabdff1aSopenharmony_ciav_cold void ff_jpeg2000dsp_init(Jpeg2000DSPContext *c)
94cabdff1aSopenharmony_ci{
95cabdff1aSopenharmony_ci    c->mct_decode[FF_DWT97]     = ict_float;
96cabdff1aSopenharmony_ci    c->mct_decode[FF_DWT53]     = rct_int;
97cabdff1aSopenharmony_ci    c->mct_decode[FF_DWT97_INT] = ict_int;
98cabdff1aSopenharmony_ci
99cabdff1aSopenharmony_ci#if ARCH_X86
100cabdff1aSopenharmony_ci    ff_jpeg2000dsp_init_x86(c);
101cabdff1aSopenharmony_ci#endif
102cabdff1aSopenharmony_ci}
103