You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/kopete/protocols/msn/webcam/libmimic/idct_dequant.c

135 lines
3.7 KiB

/* Copyright (C) 2005 Ole André Vadla Ravnås <oleavr@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "mimic-private.h"
void _idct_dequant_block(MimCtx *ctx, gint *block, gboolean is_chrom)
{
gdouble f;
gint i, *p;
/*
* De-quantize.
*/
f = (10000 - ctx->quality) * 10.0 * (gfloat) 9.9999997e-5;
if (f > 10.0)
f = 10.0;
if (!is_chrom) {
if (f < 2.0)
f = 2.0;
} else {
if (f < 1.0)
f = 1.0;
}
block[0] <<= 1;
block[1] <<= 2;
block[8] <<= 2;
for (i = 2; i < 64; i++) {
if (i == 8)
continue;
block[i] *= f;
}
/*
* Inverse DCT, first pass (horizontal).
*/
p = block;
for (i = 0; i < 8; i++) {
gint v1, v2, v3, v4, v5, v6, v7, v8;
gint va, vb;
va = (p[0] << 11) + (p[4] << 11);
vb = ((p[2] << 2) * 392) + (((p[2] << 2) + (p[6] << 2)) * 277);
v1 = va + vb + 512;
v2 = va - vb + 512;
va = (p[0] << 11) - (p[4] << 11);
vb = (((p[2] << 2) + (p[6] << 2)) * 277) - ((p[6] << 2) * 946);
v3 = va + vb + 512;
v4 = va - vb + 512;
va = (p[1] << 9) + (p[3] * 724) + (p[7] << 9);
vb = (p[1] << 9) + (p[5] * 724) - (p[7] << 9);
v5 = (((va + vb) * 213) - (vb * 71)) >> 6;
v6 = (((va + vb) * 213) - (va * 355)) >> 6;
va = (p[1] << 9) - (p[3] * 724) + (p[7] << 9);
vb = (p[1] << 9) - (p[5] * 724) - (p[7] << 9);
v7 = (((va + vb) * 251) - (va * 201)) >> 6;
v8 = (((va + vb) * 251) - (vb * 301)) >> 6;
p[0] = (v1 + v5) >> 10;
p[1] = (v3 + v7) >> 10;
p[2] = (v4 + v8) >> 10;
p[3] = (v2 + v6) >> 10;
p[4] = (v2 - v6) >> 10;
p[5] = (v4 - v8) >> 10;
p[6] = (v3 - v7) >> 10;
p[7] = (v1 - v5) >> 10;
p += 8;
}
/*
* Inverse dct, second pass (vertical).
*/
p = block;
for (i = 0; i < 8; i++) {
gint v1, v2, v3, v4, v5, v6, v7, v8;
gint va, vb;
va = (p[0] << 9) + (p[32] << 9);
vb = ((p[16] + p[48]) * 277) + (p[16] * 392);
v1 = va + vb + 1024;
v2 = va - vb + 1024;
va = (p[0] << 9) - (p[32] << 9);
vb = ((p[16] + p[48]) * 277) - (p[48] * 946);
v3 = va + vb + 1024;
v4 = va - vb + 1024;
va = ((p[8] << 7) + (p[24] * 181) + (p[56] << 7)) >> 6;
vb = ((p[8] << 7) + (p[40] * 181) - (p[56] << 7)) >> 6;
v5 = ((va + vb) * 213) - (vb * 71);
v6 = ((va + vb) * 213) - (va * 355);
va = ((p[8] << 7) - (p[24] * 181) + (p[56] << 7)) >> 6;
vb = ((p[8] << 7) - (p[40] * 181) - (p[56] << 7)) >> 6;
v7 = ((va + vb) * 251) - (va * 201);
v8 = ((va + vb) * 251) - (vb * 301);
p[0] = (v1 + v5) >> 11;
p[8] = (v3 + v7) >> 11;
p[16] = (v4 + v8) >> 11;
p[24] = (v2 + v6) >> 11;
p[32] = (v2 - v6) >> 11;
p[40] = (v4 - v8) >> 11;
p[48] = (v3 - v7) >> 11;
p[56] = (v1 - v5) >> 11;
p++;
}
}