1991-10-06 20:00:00 -04:00
|
|
|
/*
|
|
|
|
* jbsmooth.c
|
|
|
|
*
|
|
|
|
* Copyright (C) 1991, Thomas G. Lane.
|
|
|
|
* This file is part of the Independent JPEG Group's software.
|
|
|
|
* For conditions of distribution and use, see the accompanying README file.
|
|
|
|
*
|
|
|
|
* This file contains cross-block smoothing routines.
|
|
|
|
* These routines are invoked via the smooth_coefficients method.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "jinclude.h"
|
|
|
|
|
|
|
|
#ifdef BLOCK_SMOOTHING_SUPPORTED
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Cross-block coefficient smoothing.
|
|
|
|
*/
|
|
|
|
|
|
|
|
METHODDEF void
|
|
|
|
smooth_coefficients (decompress_info_ptr cinfo,
|
|
|
|
jpeg_component_info *compptr,
|
|
|
|
JBLOCKROW above,
|
|
|
|
JBLOCKROW currow,
|
|
|
|
JBLOCKROW below,
|
|
|
|
JBLOCKROW output)
|
|
|
|
{
|
|
|
|
QUANT_TBL_PTR Qptr = cinfo->quant_tbl_ptrs[compptr->quant_tbl_no];
|
|
|
|
long blocks_in_row = compptr->subsampled_width / DCTSIZE;
|
|
|
|
long col;
|
|
|
|
|
|
|
|
/* First, copy the block row as-is.
|
|
|
|
* This takes care of the first & last blocks in the row, the top/bottom
|
|
|
|
* special cases, and the higher-order coefficients in each block.
|
|
|
|
*/
|
|
|
|
jcopy_block_row(currow, output, blocks_in_row);
|
|
|
|
|
|
|
|
/* Now apply the smoothing calculation, but not to any blocks on the
|
|
|
|
* edges of the image.
|
|
|
|
*/
|
|
|
|
|
|
|
|
if (above != NULL && below != NULL) {
|
|
|
|
for (col = 1; col < blocks_in_row-1; col++) {
|
|
|
|
|
|
|
|
/* See section 13.10 of JPEG-8-R8, or K.8 of JPEG-9-R6.
|
|
|
|
*
|
|
|
|
* As I understand it, this produces approximations
|
|
|
|
* for the low frequency AC components, based on the
|
|
|
|
* DC values of the block and its eight neighboring blocks.
|
|
|
|
* (Thus it can't be used for blocks on the image edges.)
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* The layout of these variables corresponds to
|
|
|
|
* the text in 13.10
|
|
|
|
*/
|
|
|
|
|
|
|
|
JCOEF DC1, DC2, DC3;
|
|
|
|
JCOEF DC4, DC5, DC6;
|
|
|
|
JCOEF DC7, DC8, DC9;
|
|
|
|
|
|
|
|
long AC01, AC02;
|
|
|
|
long AC10, AC11;
|
|
|
|
long AC20;
|
|
|
|
|
|
|
|
DC1 = above [col-1][0];
|
|
|
|
DC2 = above [col ][0];
|
|
|
|
DC3 = above [col+1][0];
|
|
|
|
DC4 = currow[col-1][0];
|
|
|
|
DC5 = currow[col ][0];
|
|
|
|
DC6 = currow[col+1][0];
|
|
|
|
DC7 = below [col-1][0];
|
|
|
|
DC8 = below [col ][0];
|
|
|
|
DC9 = below [col+1][0];
|
|
|
|
|
|
|
|
#define DIVIDE_256(x) x = ( (x) < 0 ? -((128-(x))/256) : ((x)+128)/256 )
|
|
|
|
|
|
|
|
AC01 = (36 * (DC4 - DC6));
|
|
|
|
DIVIDE_256(AC01);
|
|
|
|
AC10 = (36 * (DC2 - DC8));
|
|
|
|
DIVIDE_256(AC10);
|
|
|
|
AC20 = (9 * (DC2 + DC8 - 2*DC5));
|
|
|
|
DIVIDE_256(AC20);
|
|
|
|
AC11 = (5 * ((DC1 - DC3) - (DC7 - DC9)));
|
|
|
|
DIVIDE_256(AC11);
|
|
|
|
AC02 = (9 * (DC4 + DC6 - 2*DC5));
|
|
|
|
DIVIDE_256(AC02);
|
|
|
|
|
|
|
|
/* I think that this checks to see if the quantisation
|
|
|
|
* on the transmitting side would have produced this
|
|
|
|
* answer. If so, then we use our (hopefully better)
|
|
|
|
* estimate.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define ABS(x) ((x) < 0 ? -(x) : (x))
|
|
|
|
|
1991-12-12 19:00:00 -05:00
|
|
|
#define COND_ASSIGN(_ac,_n,_z) if ((ABS(output[col][_n] - (_ac))<<1) <= Qptr[_z]) output[col][_n] = (JCOEF) (_ac)
|
1991-10-06 20:00:00 -04:00
|
|
|
|
|
|
|
COND_ASSIGN(AC01, 1, 1);
|
|
|
|
COND_ASSIGN(AC02, 2, 5);
|
|
|
|
COND_ASSIGN(AC10, 8, 2);
|
|
|
|
COND_ASSIGN(AC11, 9, 4);
|
|
|
|
COND_ASSIGN(AC20, 16, 3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The method selection routine for cross-block smoothing.
|
|
|
|
*/
|
|
|
|
|
|
|
|
GLOBAL void
|
|
|
|
jselbsmooth (decompress_info_ptr cinfo)
|
|
|
|
{
|
|
|
|
/* just one implementation for now */
|
|
|
|
cinfo->methods->smooth_coefficients = smooth_coefficients;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* BLOCK_SMOOTHING_SUPPORTED */
|