Leaked source code of windows server 2003
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.
 
 
 
 
 
 

357 lines
10 KiB

/* *************************************************************************
** INTEL Corporation Proprietary Information
**
** This listing is supplied under the terms of a license
** agreement with INTEL Corporation and may not be copied
** nor disclosed except in accordance with the terms of
** that agreement.
**
** Copyright (c) 1996 Intel Corporation.
** All Rights Reserved.
**
** *************************************************************************
*/
/*****************************************************************************
*
* d1bef.cpp
*
* DESCRIPTION: Performs post filter on block edges of decompressed Y Plane.
* This is a 1:2:1 filter.
* Edges are processed in macroblock order across the width.
* That is for FCIF GOB's 1&2 are processed across the width not
* GOB 1 followed by GOB 2.
*
* A series of tests determine if an edge should be filtered.
* Edge of Y Plane edges are not filtered.
* For blocks 1-4:
* if block type == empty
* if MV != 0 && Quant > INTER_QUANT_THRESHOLD
* want to filter
* else if block type == INTRA
* if Quant > INTRA_QUANT_THRESHOLD &&
* total run length < HIGH_FREQ_CUTOFF
* want to filter
* else
* if Quant > INTER_QUANT_THRESHOLD &&
* total run lenght < HIGH_FREQ_CUTOFF
* want to filter
*
* Examine edges in pairs, top and left that is:
*
* -----------------------
* | 1 | 2 | 1 | 2 | to filter top of block 1 edge
* ----------------------- examine block 1 if want filter and
* | 3 | 4 | 3 | 4 | previous row block 3 if want filter
* ----------------------- to filter left of block 1 edge
* | 1 | 2 | 1 | 2 | examine block 1 if want filter and
* ----------------------- previous in current row block 2 if
* | 3 | 4 | 3 | 4 | want filter
* -----------------------
*
* Filter all edges that want to be filtered except Plane
* edges.
*
* Routine: BlockEdgeFilter
*
* Inputs: Pointer to decompressed Y Plane, Y Plane height and width,
* decompressed Y Plane pitch, pointer to block
* action stream.
* Whether an block was under the HIGH_FREQ_CUTOFF was
* determined in d1block (variable length decode) and
* overloaded in Block type field of block action stream.
*
* Notes: Investigate 1:6:1 filter as possible intermediate strength.
*
*****************************************************************************
*/
// $Header: S:\h26x\src\dec\d1bef.cpv 1.0 05 Apr 1996 13:25:28 AKASAI $
//
// $Log: S:\h26x\src\dec\d1bef.cpv $
//
// Rev 1.0 05 Apr 1996 13:25:28 AKASAI
// Initial revision.
//
#include "precomp.h"
#define INTER_QUANT_THRESHOLD 18 - 8
#define INTRA_QUANT_THRESHOLD 14 - 6
void BlockEdgeFilter(U8 * YPlane, int height, int width, int Pitch,
T_BlkAction *lpBlockAction)
{
T_BlkAction *fpBlockAction;
I32 Pitch16 = (Pitch<<4);
I32 Pitch8 = (Pitch<<3);
I32 i,j,k;
I8 do_filter_1;
I8 do_filter_2;
I8 do_filter_3;
I8 do_filter_4;
I8 Prev_row_BEF_descr[2*22]; /* 2 Y block * 22 (MB) */
I8 Prev2, Prev4;
U8 *r_2, *r_1, *r, *r1;
U8 *rb_2, *rb_1, *rb, *rb1;
U8 *col, *lcol;
/* horizontal edges */
r = YPlane;
r_2 = r - 2*Pitch;
r_1 = r - Pitch;
r1 = r + Pitch;
rb = r + 8*Pitch;
rb_2 = rb - 2*Pitch;
rb_1 = rb - Pitch;
rb1 = rb + Pitch;
fpBlockAction = lpBlockAction;
col = YPlane;
for (i = 0; i<44; i++)
{
Prev_row_BEF_descr[i] = -1;
}
if (width > 176) {
fpBlockAction += 198; /* predecrement pointer */
}
for (j = 0; j < height; j += 16)
{
Prev2 = -1;
Prev4 = -1;
for (i = 0; i < width; i += 16) /* do left & top of blks 1,2,3,4 */
{
if (width > 176) {
if (i == 0) fpBlockAction -= 198;
else if (i == 176) fpBlockAction +=132;
}
do_filter_1 = 0;
do_filter_2 = 0;
do_filter_3 = 0;
do_filter_4 = 0;
if ((fpBlockAction->u8BlkType & 0x7f) == BT_EMPTY)
{
if ( ((fpBlockAction->i8MVX != 0) ||
(fpBlockAction->i8MVY != 0)) &&
(fpBlockAction->u8Quant > INTER_QUANT_THRESHOLD) )
do_filter_1 = 1;
}
else if ((fpBlockAction->u8BlkType & 0x7f) == BT_INTRA)
{
if ((fpBlockAction->u8Quant > INTRA_QUANT_THRESHOLD) &&
((fpBlockAction->u8BlkType & 0x80) == 0x80))
do_filter_1 = 1;
}
else /* know inter block */
{
if ((fpBlockAction->u8Quant > INTER_QUANT_THRESHOLD) &&
((fpBlockAction->u8BlkType & 0x80) == 0x80))
do_filter_1 = 1;
}
if (((fpBlockAction+1)->u8BlkType & 0x7f )== BT_EMPTY)
{
if ( (((fpBlockAction+1)->i8MVX != 0) ||
((fpBlockAction+1)->i8MVY != 0)) &&
((fpBlockAction+1)->u8Quant > INTER_QUANT_THRESHOLD) &&
(((fpBlockAction+1)->u8BlkType & 0x80) == 0x80))
do_filter_2 = 1;
}
else if (((fpBlockAction+1)->u8BlkType & 0x7f) == BT_INTRA)
{
if (((fpBlockAction+1)->u8Quant > INTRA_QUANT_THRESHOLD) &&
(((fpBlockAction+1)->u8BlkType & 0x80) == 0x80))
do_filter_2 = 1;
}
else /* know inter block */
{
if (((fpBlockAction+1)->u8Quant > INTER_QUANT_THRESHOLD) &&
(((fpBlockAction+1)->u8BlkType & 0x80) == 0x80))
do_filter_2 = 1;
}
if (((fpBlockAction+2)->u8BlkType & 0x7f) == BT_EMPTY)
{
if ( (((fpBlockAction+2)->i8MVX != 0) ||
((fpBlockAction+2)->i8MVY != 0)) &&
((fpBlockAction+2)->u8Quant > INTER_QUANT_THRESHOLD) &&
(((fpBlockAction+2)->u8BlkType & 0x80) == 0x80))
do_filter_3 = 1;
}
else if (((fpBlockAction+2)->u8BlkType & 0x7f) == BT_INTRA)
{
if (((fpBlockAction+2)->u8Quant > INTRA_QUANT_THRESHOLD) &&
(((fpBlockAction+2)->u8BlkType & 0x80) == 0x80))
do_filter_3 = 1;
}
else /* know inter block */
{
if (((fpBlockAction+2)->u8Quant > INTER_QUANT_THRESHOLD) &&
(((fpBlockAction+2)->u8BlkType & 0x80) == 0x80))
do_filter_3 = 1;
}
if (((fpBlockAction+3)->u8BlkType & 0x7f) == BT_EMPTY)
{
if ( (((fpBlockAction+3)->i8MVX != 0) ||
((fpBlockAction+3)->i8MVY != 0)) &&
((fpBlockAction+3)->u8Quant > INTER_QUANT_THRESHOLD) &&
(((fpBlockAction+3)->u8BlkType & 0x80) == 0x80))
do_filter_4 = 1;
}
else if (((fpBlockAction+3)->u8BlkType & 0x7f)== BT_INTRA)
{
if (((fpBlockAction+3)->u8Quant > INTRA_QUANT_THRESHOLD) &&
(((fpBlockAction+3)->u8BlkType & 0x80) == 0x80))
do_filter_4 = 1;
}
else /* know inter block */
{
if (((fpBlockAction+3)->u8Quant > INTER_QUANT_THRESHOLD) &&
(((fpBlockAction+3)->u8BlkType & 0x80) == 0x80))
do_filter_4 = 1;
}
/* Process block 1 top */
if (do_filter_1 + Prev_row_BEF_descr[(i>>3)] > 0) {
for (k = i; k < i+8; k++) {
#ifdef BLACK_LINE_H
*(r_1 + k) = 60;
*(r + k) = 10;
#else
*(r_1 + k) = (*(r_2 + k) + ((*(r_1+k))<<1) + *(r + k))>>2;
*(r + k) = (*(r_1 + k) + ((*(r + k))<<1) + *(r1 + k))>>2;
#endif
}
}
lcol = col;
/* Process block 1 left */
if (do_filter_1 + Prev2 > 0) {
for (k = 0; k < 8; k++) {
#ifdef BLACK_LINE_V
*(lcol + i-1 ) = 10;
*(lcol + i ) = 60;
#else
*(lcol + i-1 ) = (*(lcol + i-2) + ((*(lcol + i-1))<<1) + *(lcol + i))>>2;
*(lcol + i ) = (*(lcol + i-1) + ((*(lcol + i))<<1) + *(lcol + i+1))>>2;
#endif
lcol += Pitch;
}
}
/* Process block 2 top */
if (do_filter_2 + Prev_row_BEF_descr[((i+8)>>3)] > 0) {
for (k = i+8; k < i+16; k++) {
#ifdef BLACK_LINE_H
*(r_1 + k) = 60;
*(r + k) = 10;
#else
*(r_1 + k) = (*(r_2 + k) + ((*(r_1+k))<<1) + *(r + k))>>2;
*(r + k) = (*(r_1 + k) + ((*(r + k))<<1) + *(r1 + k))>>2;
#endif
}
}
lcol = col;
/* Process block 2 left */
if (do_filter_2 + do_filter_1 > 0) {
for (k = 0; k < 8; k++) {
#ifdef BLACK_LINE_V
*(lcol + i+8-1 ) = 10;
*(lcol + i+8 ) = 60;
#else
*(lcol + i+8-1 ) = (*(lcol + i+8-2) + ((*(lcol + i+8-1))<<1) + *(lcol + i+8))>>2;
*(lcol + i+8 ) = (*(lcol + i+8-1) + ((*(lcol + i+8))<<1) + *(lcol + i+8+1))>>2;
#endif
lcol += Pitch;
}
}
/* bottom row of blocks in macro block */
if (j+8 < height)
{
/* Process Block 3 top */
if (do_filter_3 + do_filter_1 > 0) {
for (k = i; k < i+8; k++) {
#ifdef BLACK_LINE_H
*(rb_1 + k) = 60;
*(rb + k) = 10;
#else
*(rb_1+k) = (*(rb_2+k) + ((*(rb_1+k))<<1) + *(rb+k))>>2;
*(rb + k) = (*(rb_1 + k) + ((*(rb + k))<<1) + *(rb1 + k))>>2;
#endif
}
}
lcol = col + Pitch8;
/* Process Block 3 left */
if (do_filter_3 + Prev4 > 0) {
for (k = 0; k < 8; k++) {
#ifdef BLACK_LINE_V
*(lcol + i-1 ) = 10;
*(lcol + i ) = 60;
#else
*(lcol + i-1 ) = (*(lcol + i-2) + ((*(lcol + i-1))<<1) + *(lcol + i))>>2;
*(lcol + i ) = (*(lcol + i-1) + ((*(lcol + i))<<1) + *(lcol + i+1))>>2;
#endif
lcol += Pitch;
}
}
/* Process block 4 top */
if (do_filter_4 + do_filter_2 > 0) {
for (k = i+8; k < i+16; k++) {
#ifdef BLACK_LINE_H
*(rb_1 + k) = 60;
*(rb + k) = 10;
#else
*(rb_1 + k) = (*(rb_2 + k) + ((*(rb_1+k))<<1) + *(rb + k))>>2;
*(rb + k) = (*(rb_1 + k) + ((*(rb + k))<<1) + *(rb1 + k))>>2;
#endif
}
}
lcol = col + Pitch8;
/* Process block 4 left */
if (do_filter_4 + do_filter_3 > 0) {
for (k = 0; k < 8; k++) {
#ifdef BLACK_LINE_V
*(lcol + i+8-1 ) = 10;
*(lcol + i+8 ) = 60;
#else
*(lcol + i+8-1 ) = (*(lcol + i+8-2) + ((*(lcol + i+8-1))<<1) + *(lcol + i+8))>>2;
*(lcol + i+8 ) = (*(lcol + i+8-1) + ((*(lcol + i+8))<<1) + *(lcol + i+8+1))>>2;
#endif
lcol += Pitch;
}
}
}
fpBlockAction+=6;
Prev_row_BEF_descr[(i>>3)] = do_filter_1;
Prev_row_BEF_descr[((i+8)>>3)] = do_filter_2;
Prev2 = do_filter_2;
Prev4 = do_filter_4;
}
col += Pitch16;
r += Pitch16;
r1 += Pitch16;
r_1 += Pitch16;
r_2 += Pitch16;
rb += Pitch16;
rb1 += Pitch16;
rb_1 += Pitch16;
rb_2 += Pitch16;
}
return;
}