1
0
Fork 0
forked from len0rd/rockbox
foxbox/apps/plugins/imageviewer/jpegp/idct.c
Roman Artiukhin 64ad7354b6 imageviewer: Initial support for JPEG progressive images. Add lib sources
Added unmodified files from RAINBOW library by Attila Tarpai
Full sources:
https://github.com/Halicery/vc_rainbow

Change-Id: I356486b6a332aa3f610ddcae57f8a2044653b051
2024-10-14 09:19:34 -04:00

134 lines
6.4 KiB
C

/**********************************************************************************
*
* Scaled Integer 1-D IDCT based on the LLM-method that
* reduces the number of multiplications from 11 to to 6.
* Here further reduced to 3 using some dyadic decomposition.
*
* The real scaling vector:
* v[0] = v[4] = 1.0;
* v[2] = beta;
* v[6] = alpha;
* v[5] = v[3] = theta*M_SQRT2;
* v[1] = v[7] = theta;
*
* The integer scaling matrix is derived as SCALEM = [v vt] << 12.
*
*
* Copyright (c) 2017 A. Tarpai
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
int SCALEM[64] = { // theta,12
4096, 2276, 5352, 3218, 4096, 3218, 2217, 2276,
2276, 1264, 2973, 1788, 2276, 1788, 1232, 1264,
5352, 2973, 6992, 4205, 5352, 4205, 2896, 2973,
3218, 1788, 4205, 2529, 3218, 2529, 1742, 1788,
4096, 2276, 5352, 3218, 4096, 3218, 2217, 2276,
3218, 1788, 4205, 2529, 3218, 2529, 1742, 1788,
2217, 1232, 2896, 1742, 2217, 1742, 1200, 1232,
2276, 1264, 2973, 1788, 2276, 1788, 1232, 1264,
};
static unsigned char clip_table[3*256] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
};
unsigned char *CLIP = clip_table + 256;
#define XADD(a,b,c,d) p=a+b, n=a-b, a=p+d, b=n+c, c=n-c, d=p-d
static void idct1(int *F, int *f)
{
int p, n;
XADD(F[1],F[7],F[5],F[3]);
p= F[5]*45, n= F[3]*45; //XROT(F[5],F[3],90,542,362);
F[5]= ( n+p + (p<<2) + F[5] ) >> 7; // *181 = 45*4+1
F[3]= ( n-p + (n<<2) + F[3] ) >> 7; // *181
p=F[1]<<8, n=F[7]<<8; //XROT(F[1],F[7],256,639,127);
F[1]= ( n+p + (F[1]<<7) - F[1] ) >> 8; // *127
F[7]= ( n-p + (F[7]<<7) - F[7] ) >> 8; // *127
p= F[6];
F[6]+= F[2];
F[2]= ((F[2]-p) * 181 >> 7) - F[6];
XADD(F[0],F[4],F[2],F[6]);
f[0*8]= F[0]+F[1];
f[1*8]= F[4]+F[5];
f[2*8]= F[2]+F[3];
f[3*8]= F[6]+F[7];
f[4*8]= F[6]-F[7];
f[5*8]= F[2]-F[3];
f[6*8]= F[4]-F[5];
f[7*8]= F[0]-F[1];
}
/////////////// SCALED INTEGER IDCT AND MODIFIED LLM METHOD ///////////////////////////
//
// Input: de-quantized coefficient block
extern void idct_s(int *t, short *y)
{
int i, R[64], C[64];
R[0]= ( t[0] + 4 ) * SCALEM[0];
for (i=1; i<64; i++) R[i] = t[i] * SCALEM[i];
for (i=0; i<8; i++) idct1(R+i*8, C+i);
for (i=0; i<8; i++) idct1(C+i*8, R+i);
for (i=0; i<64; i++) y[i] = CLIP[ R[i] >> 15 ];
}
/////////////// SCALED IDCT WITH DEQUANTIZATION IN ONE STEP /////////////////////////
//
// Input: raw (un-zigzagged) coefficient block and the scaled quantization table
int zigzag[64] = {
0,1,8,16,9,2,3,10,
17,24,32,25,18,11,4,5,
12,19,26,33,40,48,41,34,
27,20,13,6,7,14,21,28,
35,42,49,56,57,50,43,36,
29,22,15,23,30,37,44,51,
58,59,52,45,38,31,39,46,
53,60,61,54,47,55,62,63,
};
extern void idct_sq(short *coef, int *sq)
{
int i, R[64], C[64];
R[0]= coef[0] * sq[0] + ((1024+4)<<12); // DC dequant + scale + level-shift + rounding bias
for (i=1; i<64; i++) R[zigzag[i]] = coef[i] * sq[i]; // AC dequant + scale (with zigzag)
for (i=0; i<8; i++) idct1(R+i*8, C+i);
for (i=0; i<8; i++) idct1(C+i*8, R+i);
for (i=0; i<64; i++) coef[i] = CLIP[ R[i] >> 15 ];
}