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