1609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* ------------------------------------------------------------------
2609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *
4609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * you may not use this file except in compliance with the License.
6609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * You may obtain a copy of the License at
7609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *
8609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *
10609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * Unless required by applicable law or agreed to in writing, software
11609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * express or implied.
14609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * See the License for the specific language governing permissions
15609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * and limitations under the License.
16609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * -------------------------------------------------------------------
17609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber */
18609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
19609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#include <string.h>
20609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
21609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#include "avclib_common.h"
22609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
23609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#define MAX_QP 51
24609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#define MB_BLOCK_SIZE 16
25609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
26609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber// NOTE: these 3 tables are for funtion GetStrength() only
27609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberconst static int ININT_STRENGTH[4] = {0x04040404, 0x03030303, 0x03030303, 0x03030303};
28609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
29609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
30609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber// NOTE: these 3 tables are for funtion EdgeLoop() only
31609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber// NOTE: to change the tables below for instance when the QP doubling is changed from 6 to 8 values
32609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
33609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberconst static int ALPHA_TABLE[52]  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 5, 6,  7, 8, 9, 10, 12, 13, 15, 17,  20, 22, 25, 28, 32, 36, 40, 45,  50, 56, 63, 71, 80, 90, 101, 113,  127, 144, 162, 182, 203, 226, 255, 255} ;
34609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberconst static int BETA_TABLE[52]   = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3,  3, 3, 3, 4, 4, 4, 6, 6,   7, 7, 8, 8, 9, 9, 10, 10,  11, 11, 12, 12, 13, 13, 14, 14,   15, 15, 16, 16, 17, 17, 18, 18} ;
35609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberconst static int CLIP_TAB[52][5]  =
36609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
37609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    { 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},
38609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    { 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},
39609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    { 0, 0, 0, 0, 0}, { 0, 0, 0, 1, 1}, { 0, 0, 0, 1, 1}, { 0, 0, 0, 1, 1}, { 0, 0, 0, 1, 1}, { 0, 0, 1, 1, 1}, { 0, 0, 1, 1, 1}, { 0, 1, 1, 1, 1},
40609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    { 0, 1, 1, 1, 1}, { 0, 1, 1, 1, 1}, { 0, 1, 1, 1, 1}, { 0, 1, 1, 2, 2}, { 0, 1, 1, 2, 2}, { 0, 1, 1, 2, 2}, { 0, 1, 1, 2, 2}, { 0, 1, 2, 3, 3},
41609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    { 0, 1, 2, 3, 3}, { 0, 2, 2, 3, 3}, { 0, 2, 2, 4, 4}, { 0, 2, 3, 4, 4}, { 0, 2, 3, 4, 4}, { 0, 3, 3, 5, 5}, { 0, 3, 4, 6, 6}, { 0, 3, 4, 6, 6},
42609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    { 0, 4, 5, 7, 7}, { 0, 4, 5, 8, 8}, { 0, 4, 6, 9, 9}, { 0, 5, 7, 10, 10}, { 0, 6, 8, 11, 11}, { 0, 6, 8, 13, 13}, { 0, 7, 10, 14, 14}, { 0, 8, 11, 16, 16},
43609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    { 0, 9, 12, 18, 18}, { 0, 10, 13, 20, 20}, { 0, 11, 15, 23, 23}, { 0, 13, 17, 25, 25}
44609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber};
45609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
46609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber// NOTE: this table is only QP clipping, index = QP + video->FilterOffsetA/B, clipped to [0, 51]
47609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber//       video->FilterOffsetA/B is in {-12, 12]
48609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberconst static int QP_CLIP_TAB[76] =
49609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
50609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,              // [-12, 0]
51609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
52609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    13, 14, 15, 16, 17, 18, 19, 20, 21,
53609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    22, 23, 24, 25, 26, 27, 28, 29, 30,
54609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    31, 32, 33, 34, 35, 36, 37, 38, 39,
55609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // [1, 51]
56609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51      // [52,63]
57609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber};
58609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
59609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberstatic void DeblockMb(AVCCommonObj *video, int mb_x, int mb_y, uint8 *SrcY, uint8 *SrcU, uint8 *SrcV);
60609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber//static void GetStrength(AVCCommonObj *video, uint8 *Strength, AVCMacroblock* MbP, AVCMacroblock* MbQ, int dir, int edge);
61609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberstatic void GetStrength_Edge0(uint8 *Strength, AVCMacroblock* MbP, AVCMacroblock* MbQ, int dir);
62609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberstatic void GetStrength_VerticalEdges(uint8 *Strength, AVCMacroblock* MbQ);
63609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberstatic void GetStrength_HorizontalEdges(uint8 Strength[12], AVCMacroblock* MbQ);
64609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberstatic void EdgeLoop_Luma_vertical(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch);
65609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberstatic void EdgeLoop_Luma_horizontal(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch);
66609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberstatic void EdgeLoop_Chroma_vertical(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch);
67609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberstatic void EdgeLoop_Chroma_horizontal(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch);
68609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
69609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/*
70609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *****************************************************************************************
71609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * \brief Filter all macroblocks in order of increasing macroblock address.
72609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *****************************************************************************************
73609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber*/
74609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
75609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberOSCL_EXPORT_REF AVCStatus DeblockPicture(AVCCommonObj *video)
76609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
77609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint   i, j;
78609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int   pitch = video->currPic->pitch, pitch_c, width;
79609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint8 *SrcY, *SrcU, *SrcV;
80609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
81609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    SrcY = video->currPic->Sl;      // pointers to source
82609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    SrcU = video->currPic->Scb;
83609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    SrcV = video->currPic->Scr;
84609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    pitch_c = pitch >> 1;
85609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    width = video->currPic->width;
86609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
87609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (i = 0; i < video->PicHeightInMbs; i++)
88609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
89609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (j = 0; j < video->PicWidthInMbs; j++)
90609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
91609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            DeblockMb(video, j, i, SrcY, SrcU, SrcV);
92609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // update SrcY, SrcU, SrcV
93609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcY += MB_BLOCK_SIZE;
94609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcU += (MB_BLOCK_SIZE >> 1);
95609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcV += (MB_BLOCK_SIZE >> 1);
96609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
97609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
98609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        SrcY += ((pitch << 4) - width);
99609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        SrcU += ((pitch_c << 3) - (width >> 1));
100609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        SrcV += ((pitch_c << 3) - (width >> 1));
101609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
102609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
103609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    return AVC_SUCCESS;
104609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
105609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
106609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef MB_BASED_DEBLOCK
107609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/*
108609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *****************************************************************************************
109609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * \brief Filter one macroblocks in a fast macroblock memory and copy it to frame
110609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *****************************************************************************************
111609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber*/
112609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid MBInLoopDeblock(AVCCommonObj *video)
113609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
114609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    AVCPictureData *currPic = video->currPic;
115609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef USE_PRED_BLOCK
116609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint8 *predCb, *predCr, *pred_block;
117609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int i, j, dst_width, dst_height, dst_widthc, dst_heightc;
118609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
119609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int pitch = currPic->pitch;
120609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int x_pos = video->mb_x;
121609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int y_pos = video->mb_y;
122609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint8 *curL, *curCb, *curCr;
123609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int offset;
124609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
125609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    offset = (y_pos << 4) * pitch;
126609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
127609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    curL = currPic->Sl + offset + (x_pos << 4);
128609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
129609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    offset >>= 2;
130609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    offset += (x_pos << 3);
131609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
132609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    curCb = currPic->Scb + offset;
133609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    curCr = currPic->Scr + offset;
134609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
135609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef USE_PRED_BLOCK
136609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    pred_block = video->pred;
137609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
138609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* 1. copy neighboring pixels from frame to the video->pred_block */
139609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (y_pos) /* not the 0th row */
140609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
141609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        /* copy to the top 4 lines of the macroblock */
142609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curL -= (pitch << 2); /* go back 4 lines */
143609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
144609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 4, curL, 16);
145609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curL += pitch;
146609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 24, curL, 16);
147609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curL += pitch;
148609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 44, curL, 16);
149609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curL += pitch;
150609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 64, curL, 16);
151609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curL += pitch;
152609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
153609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCb -= (pitch << 1); /* go back 4 lines chroma */
154609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCr -= (pitch << 1);
155609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
156609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pred_block += 400;
157609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
158609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 4, curCb, 8);
159609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCb += (pitch >> 1);
160609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 16, curCb, 8);
161609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCb += (pitch >> 1);
162609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 28, curCb, 8);
163609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCb += (pitch >> 1);
164609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 40, curCb, 8);
165609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCb += (pitch >> 1);
166609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
167609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pred_block += 144;
168609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 4, curCr, 8);
169609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCr += (pitch >> 1);
170609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 16, curCr, 8);
171609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCr += (pitch >> 1);
172609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 28, curCr, 8);
173609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCr += (pitch >> 1);
174609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(pred_block + 40, curCr, 8);
175609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCr += (pitch >> 1);
176609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
177609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pred_block = video->pred;
178609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
179609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
180609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* 2. perform deblocking. */
181609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    DeblockMb(video, x_pos, y_pos, pred_block + 84, pred_block + 452, pred_block + 596);
182609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
183609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* 3. copy it back to the frame and update pred_block */
184609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    predCb = pred_block + 400;
185609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    predCr = predCb + 144;
186609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
187609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* find the range of the block inside pred_block to be copied back */
188609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (y_pos)  /* the first row */
189609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
190609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curL -= (pitch << 2);
191609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCb -= (pitch << 1);
192609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCr -= (pitch << 1);
193609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
194609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        dst_height = 20;
195609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        dst_heightc = 12;
196609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
197609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    else
198609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
199609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pred_block += 80;
200609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        predCb += 48;
201609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        predCr += 48;
202609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        dst_height = 16;
203609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        dst_heightc = 8;
204609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
205609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
206609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (x_pos) /* find the width */
207609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
208609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curL -= 4;
209609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCb -= 4;
210609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCr -= 4;
211609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (x_pos == (int)(video->PicWidthInMbs - 1))
212609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
213609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            dst_width = 20;
214609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            dst_widthc = 12;
215609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
216609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        else
217609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
218609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            dst_width = 16;
219609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            dst_widthc = 8;
220609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
221609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
222609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    else
223609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
224609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pred_block += 4;
225609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        predCb += 4;
226609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        predCr += 4;
227609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        dst_width = 12;
228609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        dst_widthc = 4;
229609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
230609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
231609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* perform copy */
232609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (j = 0; j < dst_height; j++)
233609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
234609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(curL, pred_block, dst_width);
235609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curL += pitch;
236609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pred_block += 20;
237609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
238609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (j = 0; j < dst_heightc; j++)
239609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
240609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(curCb, predCb, dst_widthc);
241609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memcpy(curCr, predCr, dst_widthc);
242609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCb += (pitch >> 1);
243609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        curCr += (pitch >> 1);
244609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        predCb += 12;
245609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        predCr += 12;
246609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
247609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
248609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (x_pos != (int)(video->PicWidthInMbs - 1)) /* now copy from the right-most 4 columns to the left-most 4 columns */
249609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
250609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pred_block = video->pred;
251609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (i = 0; i < 20; i += 4)
252609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
253609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 16));
254609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pred_block += 20;
255609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 16));
256609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pred_block += 20;
257609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 16));
258609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pred_block += 20;
259609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 16));
260609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pred_block += 20;
261609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
262609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
263609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (i = 0; i < 24; i += 4)
264609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
265609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 8));
266609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pred_block += 12;
267609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 8));
268609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pred_block += 12;
269609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 8));
270609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pred_block += 12;
271609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 8));
272609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pred_block += 12;
273609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
274609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
275609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
276609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#else
277609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    DeblockMb(video, x_pos, y_pos, curL, curCb, curCr);
278609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
279609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
280609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    return ;
281609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
282609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
283609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
284609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/*
285609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *****************************************************************************************
286609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * \brief Deblocking filter for one macroblock.
287609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *****************************************************************************************
288609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber */
289609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
290609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid DeblockMb(AVCCommonObj *video, int mb_x, int mb_y, uint8 *SrcY, uint8 *SrcU, uint8 *SrcV)
291609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
292609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    AVCMacroblock *MbP, *MbQ;
293609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     edge, QP, QPC;
294609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     filterLeftMbEdgeFlag = (mb_x != 0);
295609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     filterTopMbEdgeFlag  = (mb_y != 0);
296609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     pitch = video->currPic->pitch;
2974e1d7b8d16abbe8a60fa3957646297b552e82fb0Martin Storsjo    int     indexA, indexB;
2984e1d7b8d16abbe8a60fa3957646297b552e82fb0Martin Storsjo    int     *tmp;
299609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     Alpha, Beta, Alpha_c, Beta_c;
300609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     mbNum = mb_y * video->PicWidthInMbs + mb_x;
301609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     *clipTable, *clipTable_c, *qp_clip_tab;
302609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint8   Strength[16];
303609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    void*     str;
304609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
305609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    MbQ = &(video->mblock[mbNum]);      // current Mb
306609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
307609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
308609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    // If filter is disabled, return
309609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (video->sliceHdr->disable_deblocking_filter_idc == 1) return;
310609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
311609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (video->sliceHdr->disable_deblocking_filter_idc == 2)
312609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
313609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        // don't filter at slice boundaries
314609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        filterLeftMbEdgeFlag = mb_is_available(video->mblock, video->PicSizeInMbs, mbNum - 1, mbNum);
315609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        filterTopMbEdgeFlag  = mb_is_available(video->mblock, video->PicSizeInMbs, mbNum - video->PicWidthInMbs, mbNum);
316609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
317609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
318609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* NOTE: edge=0 and edge=1~3 are separate cases because of the difference of MbP, index A and indexB calculation */
319609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /*       for edge = 1~3, MbP, indexA and indexB remain the same, and thus there is no need to re-calculate them for each edge */
320609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
321609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    qp_clip_tab = (int *)QP_CLIP_TAB + 12;
322609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
323609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* 1.VERTICAL EDGE + MB BOUNDARY (edge = 0) */
324609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (filterLeftMbEdgeFlag)
325609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
326609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        MbP = MbQ - 1;
327609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        //GetStrength(video, Strength, MbP, MbQ, 0, 0); // Strength for 4 blks in 1 stripe, 0 => vertical edge
328609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        GetStrength_Edge0(Strength, MbP, MbQ, 0);
329609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
330609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        str = (void*)Strength; //de-ref type-punned pointer fix
331609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (*((uint32*)str))    // only if one of the 4 Strength bytes is != 0
332609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
333609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            QP = (MbP->QPy + MbQ->QPy + 1) >> 1; // Average QP of the two blocks;
334609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexA = QP + video->FilterOffsetA;
335609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexB = QP + video->FilterOffsetB;
336609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
337609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
338609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
339609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            Alpha  = ALPHA_TABLE[indexA];
340609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            Beta = BETA_TABLE[indexB];
341609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            clipTable = (int *) CLIP_TAB[indexA];
342609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
343609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (Alpha > 0 && Beta > 0)
344609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef USE_PRED_BLOCK
345609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Luma_vertical(SrcY, Strength,  Alpha, Beta, clipTable, 20);
346609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#else
347609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Luma_vertical(SrcY, Strength,  Alpha, Beta, clipTable, pitch);
348609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
349609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
350609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            QPC = (MbP->QPc + MbQ->QPc + 1) >> 1;
351609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexA = QPC + video->FilterOffsetA;
352609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexB = QPC + video->FilterOffsetB;
353609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
354609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
355609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
356609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            Alpha  = ALPHA_TABLE[indexA];
357609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            Beta = BETA_TABLE[indexB];
358609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            clipTable = (int *) CLIP_TAB[indexA];
359609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (Alpha > 0 && Beta > 0)
360609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
361609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef USE_PRED_BLOCK
362609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_vertical(SrcU, Strength, Alpha, Beta, clipTable, 12);
363609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_vertical(SrcV, Strength, Alpha, Beta, clipTable, 12);
364609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#else
365609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_vertical(SrcU, Strength, Alpha, Beta, clipTable, pitch >> 1);
366609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_vertical(SrcV, Strength, Alpha, Beta, clipTable, pitch >> 1);
367609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
368609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
369609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
370609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
371609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* end of: if(filterLeftMbEdgeFlag) */
372609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
373609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* 2.VERTICAL EDGE (no boundary), the edges are all inside a MB */
374609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* First calculate the necesary parameters all at once, outside the loop */
375609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    MbP = MbQ;
376609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
377609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    indexA = MbQ->QPy + video->FilterOffsetA;
378609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    indexB = MbQ->QPy + video->FilterOffsetB;
379609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    //  index
380609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
381609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
382609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
383609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    Alpha = ALPHA_TABLE[indexA];
384609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    Beta = BETA_TABLE[indexB];
385609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    clipTable = (int *)CLIP_TAB[indexA];
386609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
387609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* Save Alpha,  Beta and clipTable for future use, with the obselete variables filterLeftMbEdgeFlag, mbNum amd tmp */
388609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    filterLeftMbEdgeFlag = Alpha;
389609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    mbNum = Beta;
3904e1d7b8d16abbe8a60fa3957646297b552e82fb0Martin Storsjo    tmp = clipTable;
391609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
392609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    indexA = MbQ->QPc + video->FilterOffsetA;
393609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    indexB = MbQ->QPc + video->FilterOffsetB;
394609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
395609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
396609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
397609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    Alpha_c  = ALPHA_TABLE[indexA];
398609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    Beta_c = BETA_TABLE[indexB];
399609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    clipTable_c = (int *)CLIP_TAB[indexA];
400609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
401609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    GetStrength_VerticalEdges(Strength + 4, MbQ); // Strength for 4 blks in 1 stripe, 0 => vertical edge
402609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
403609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (edge = 1; edge < 4; edge++)  // 4 vertical strips of 16 pel
404609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
405609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        //GetStrength_VerticalEdges(video, Strength, MbP, MbQ, 0, edge); // Strength for 4 blks in 1 stripe, 0 => vertical edge
406609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (*((int*)(Strength + (edge << 2))))   // only if one of the 4 Strength bytes is != 0
407609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
408609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (Alpha > 0 && Beta > 0)
409609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef USE_PRED_BLOCK
410609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Luma_vertical(SrcY + (edge << 2), Strength + (edge << 2),  Alpha, Beta, clipTable, 20);
411609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#else
412609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Luma_vertical(SrcY + (edge << 2), Strength + (edge << 2),  Alpha, Beta, clipTable, pitch);
413609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
414609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
415609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (!(edge & 1) && Alpha_c > 0 && Beta_c > 0)
416609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
417609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef USE_PRED_BLOCK
418609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_vertical(SrcU + (edge << 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, 12);
419609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_vertical(SrcV + (edge << 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, 12);
420609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#else
421609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_vertical(SrcU + (edge << 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, pitch >> 1);
422609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_vertical(SrcV + (edge << 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, pitch >> 1);
423609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
424609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
425609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
426609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
427609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } //end edge
428609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
429609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
430609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
431609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* 3.HORIZONTAL EDGE + MB BOUNDARY (edge = 0) */
432609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (filterTopMbEdgeFlag)
433609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
434609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        MbP = MbQ - video->PicWidthInMbs;
435609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        //GetStrength(video, Strength, MbP, MbQ, 1, 0); // Strength for 4 blks in 1 stripe, 0 => vertical edge
436609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        GetStrength_Edge0(Strength, MbP, MbQ, 1);
437609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        str = (void*)Strength; //de-ref type-punned pointer fix
438609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (*((uint32*)str))    // only if one of the 4 Strength bytes is != 0
439609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
440609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            QP = (MbP->QPy + MbQ->QPy + 1) >> 1; // Average QP of the two blocks;
441609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexA = QP + video->FilterOffsetA;
442609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexB = QP + video->FilterOffsetB;
443609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
444609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
445609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
446609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            Alpha  = ALPHA_TABLE[indexA];
447609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            Beta = BETA_TABLE[indexB];
448609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            clipTable = (int *)CLIP_TAB[indexA];
449609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
450609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (Alpha > 0 && Beta > 0)
451609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
452609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef USE_PRED_BLOCK
453609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Luma_horizontal(SrcY, Strength,  Alpha, Beta, clipTable, 20);
454609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#else
455609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Luma_horizontal(SrcY, Strength,  Alpha, Beta, clipTable, pitch);
456609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
457609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
458609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
459609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            QPC = (MbP->QPc + MbQ->QPc + 1) >> 1;
460609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexA = QPC + video->FilterOffsetA;
461609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexB = QPC + video->FilterOffsetB;
462609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
463609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
464609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
465609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            Alpha  = ALPHA_TABLE[indexA];
466609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            Beta = BETA_TABLE[indexB];
467609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            clipTable = (int *)CLIP_TAB[indexA];
468609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (Alpha > 0 && Beta > 0)
469609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
470609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef USE_PRED_BLOCK
471609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_horizontal(SrcU, Strength, Alpha, Beta, clipTable, 12);
472609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_horizontal(SrcV, Strength, Alpha, Beta, clipTable, 12);
473609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#else
474609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_horizontal(SrcU, Strength, Alpha, Beta, clipTable, pitch >> 1);
475609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_horizontal(SrcV, Strength, Alpha, Beta, clipTable, pitch >> 1);
476609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
477609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
478609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
479609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
480609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* end of: if(filterTopMbEdgeFlag) */
481609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
482609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
483609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* 4.HORIZONTAL EDGE (no boundary), the edges are inside a MB */
484609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    MbP = MbQ;
485609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
486609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* Recover Alpha,  Beta and clipTable for edge!=0 with the variables filterLeftMbEdgeFlag, mbNum and tmp */
487609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    /* Note that Alpha_c, Beta_c and clipTable_c for chroma is already calculated */
488609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    Alpha = filterLeftMbEdgeFlag;
489609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    Beta = mbNum;
4904e1d7b8d16abbe8a60fa3957646297b552e82fb0Martin Storsjo    clipTable = tmp;
491609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
492609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    GetStrength_HorizontalEdges(Strength + 4, MbQ); // Strength for 4 blks in 1 stripe, 0 => vertical edge
493609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
494609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (edge = 1; edge < 4; edge++)  // 4 horicontal strips of 16 pel
495609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
496609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        //GetStrength(video, Strength, MbP, MbQ, 1, edge); // Strength for 4 blks in 1 stripe   1 => horizontal edge
497609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (*((int*)(Strength + (edge << 2)))) // only if one of the 4 Strength bytes is != 0
498609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
499609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (Alpha > 0 && Beta > 0)
500609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
501609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef USE_PRED_BLOCK
502609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Luma_horizontal(SrcY + (edge << 2)*20, Strength + (edge << 2),  Alpha, Beta, clipTable, 20);
503609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#else
504609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Luma_horizontal(SrcY + (edge << 2)*pitch, Strength + (edge << 2),  Alpha, Beta, clipTable, pitch);
505609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
506609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
507609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
508609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (!(edge & 1) && Alpha_c > 0 && Beta_c > 0)
509609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
510609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#ifdef USE_PRED_BLOCK
511609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_horizontal(SrcU + (edge << 1)*12, Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, 12);
512609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_horizontal(SrcV + (edge << 1)*12, Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, 12);
513609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#else
514609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_horizontal(SrcU + (edge << 1)*(pitch >> 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, pitch >> 1);
515609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                EdgeLoop_Chroma_horizontal(SrcV + (edge << 1)*(pitch >> 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, pitch >> 1);
516609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#endif
517609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
518609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
519609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
520609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } //end edge
521609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
522609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    return;
523609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
524609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
525609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/*
526609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *****************************************************************************************************
527609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * \brief   returns a buffer of 4 Strength values for one stripe in a mb (for different Frame types)
528609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *****************************************************************************************************
529609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber*/
530609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
531609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid GetStrength_Edge0(uint8 *Strength, AVCMacroblock* MbP, AVCMacroblock* MbQ, int dir)
532609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
533609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int tmp;
534609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int16 *ptrQ, *ptrP;
535609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    void* vptr;
536609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint8 *pStrength;
537609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    void* refIdx;
538609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
539609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (MbP->mbMode == AVC_I4 || MbP->mbMode == AVC_I16 ||
540609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            MbQ->mbMode == AVC_I4 || MbQ->mbMode == AVC_I16)
541609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
542609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
543609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)Strength) = ININT_STRENGTH[0];      // Start with Strength=3. or Strength=4 for Mb-edge
544609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
545609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
546609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    else // if not intra or SP-frame
547609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
548609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)Strength) = 0;
549609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
550609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (dir == 0)  // Vertical Edge 0
551609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
552609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
553609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //1. Check the ref_frame_id
554609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            refIdx = (void*) MbQ->RefIdx; //de-ref type-punned pointer fix
555609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrQ = (int16*)refIdx;
556609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            refIdx = (void*)MbP->RefIdx; //de-ref type-punned pointer fix
557609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrP = (int16*)refIdx;
558609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength = Strength;
559609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (ptrQ[0] != ptrP[1]) pStrength[0] = 1;
560609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (ptrQ[2] != ptrP[3]) pStrength[2] = 1;
561609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength[1] = pStrength[0];
562609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength[3] = pStrength[2];
563609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
564609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //2. Check the non-zero coeff blocks (4x4)
565609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[0] != 0 || MbP->nz_coeff[3] != 0) pStrength[0] = 2;
566609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[4] != 0 || MbP->nz_coeff[7] != 0) pStrength[1] = 2;
567609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[8] != 0 || MbP->nz_coeff[11] != 0) pStrength[2] = 2;
568609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[12] != 0 || MbP->nz_coeff[15] != 0) pStrength[3] = 2;
569609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
570609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //3. Only need to check the mv difference
571609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            vptr = (void*)MbQ->mvL0;  // for deref type-punned pointer
572609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrQ = (int16*)vptr;
573609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrP = (int16*)(MbP->mvL0 + 3); // points to 4x4 block #3 (the 4th column)
574609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
575609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // 1st blk
576609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStrength == 0)
577609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
578609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // check |mv difference| >= 4
579609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ++ - *ptrP++;
580609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
581609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
582609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
583609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ-- - *ptrP--;
584609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
585609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
586609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
587609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
588609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength++;
589609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrQ += 8;
590609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrP += 8;
591609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
592609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // 2nd blk
593609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStrength == 0)
594609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
595609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // check |mv difference| >= 4
596609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ++ - *ptrP++;
597609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
598609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
599609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
600609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ-- - *ptrP--;
601609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
602609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
603609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
604609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
605609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength++;
606609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrQ += 8;
607609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrP += 8;
608609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
609609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // 3rd blk
610609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStrength == 0)
611609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
612609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // check |mv difference| >= 4
613609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ++ - *ptrP++;
614609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
615609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
616609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
617609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ-- - *ptrP--;
618609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
619609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
620609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
621609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
622609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength++;
623609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrQ += 8;
624609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrP += 8;
625609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
626609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // 4th blk
627609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStrength == 0)
628609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
629609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // check |mv difference| >= 4
630609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ++ - *ptrP++;
631609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
632609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
633609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
634609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ-- - *ptrP--;
635609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
636609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
637609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
638609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
639609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        else   // Horizontal Edge 0
640609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
641609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
642609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //1. Check the ref_frame_id
643609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            refIdx = (void*)MbQ->RefIdx;  //de-ref type-punned pointer
644609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrQ = (int16*)refIdx;
645609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            refIdx = (void*)MbP->RefIdx;  //de-ref type-punned pointer
646609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrP = (int16*)refIdx;
647609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength = Strength;
648609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (ptrQ[0] != ptrP[2]) pStrength[0] = 1;
649609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (ptrQ[1] != ptrP[3]) pStrength[2] = 1;
650609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength[1] = pStrength[0];
651609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength[3] = pStrength[2];
652609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
653609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //2. Check the non-zero coeff blocks (4x4)
654609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[0] != 0 || MbP->nz_coeff[12] != 0) pStrength[0] = 2;
655609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[1] != 0 || MbP->nz_coeff[13] != 0) pStrength[1] = 2;
656609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[2] != 0 || MbP->nz_coeff[14] != 0) pStrength[2] = 2;
657609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[3] != 0 || MbP->nz_coeff[15] != 0) pStrength[3] = 2;
658609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
659609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //3. Only need to check the mv difference
660609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            vptr = (void*)MbQ->mvL0;
661609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrQ = (int16*)vptr;
662609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrP = (int16*)(MbP->mvL0 + 12); // points to 4x4 block #12 (the 4th row)
663609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
664609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // 1st blk
665609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStrength == 0)
666609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
667609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // check |mv difference| >= 4
668609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ++ - *ptrP++;
669609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
670609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
671609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
672609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ-- - *ptrP--;
673609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
674609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
675609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
676609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
677609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength++;
678609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrQ += 2;
679609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrP += 2;
680609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
681609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // 2nd blk
682609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStrength  == 0)
683609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
684609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // check |mv difference| >= 4
685609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ++ - *ptrP++;
686609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
687609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
688609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
689609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ-- - *ptrP--;
690609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
691609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
692609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
693609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
694609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength++;
695609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrQ += 2;
696609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrP += 2;
697609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
698609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // 3rd blk
699609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStrength  == 0)
700609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
701609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // check |mv difference| >= 4
702609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ++ - *ptrP++;
703609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
704609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
705609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
706609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ-- - *ptrP--;
707609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
708609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
709609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
710609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
711609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength++;
712609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrQ += 2;
713609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            ptrP += 2;
714609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
715609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // 4th blk
716609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStrength  == 0)
717609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
718609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // check |mv difference| >= 4
719609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ++ - *ptrP++;
720609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
721609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
722609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
723609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *ptrQ-- - *ptrP--;
724609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
725609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
726609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
727609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
728609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        } /* end of: else if(dir == 0) */
729609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
730609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* end of: if( !(MbP->mbMode == AVC_I4 ...) */
731609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
732609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
733609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
734609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid GetStrength_VerticalEdges(uint8 *Strength, AVCMacroblock* MbQ)
735609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
736609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     idx, tmp;
737609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int16   *ptr, *pmvx, *pmvy;
738609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint8   *pnz;
739609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint8   *pStrength, *pStr;
740609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    void* refIdx;
741609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
742609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (MbQ->mbMode == AVC_I4 || MbQ->mbMode == AVC_I16)
743609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
744609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)Strength)     = ININT_STRENGTH[1];      // Start with Strength=3. or Strength=4 for Mb-edge
745609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)(Strength + 4)) = ININT_STRENGTH[2];
746609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)(Strength + 8)) = ININT_STRENGTH[3];
747609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
748609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    else   // Not intra or SP-frame
749609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
750609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
751609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)Strength)     = 0; // for non-intra MB, strength = 0, 1 or 2.
752609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)(Strength + 4)) = 0;
753609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)(Strength + 8)) = 0;
754609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
755609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        //1. Check the ref_frame_id
756609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        refIdx = (void*)MbQ->RefIdx;  //de-ref type-punned pointer fix
757609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        ptr = (int16*)refIdx;
758609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pStrength = Strength;
759609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (ptr[0] != ptr[1]) pStrength[4] = 1;
760609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (ptr[2] != ptr[3]) pStrength[6] = 1;
761609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pStrength[5] = pStrength[4];
762609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pStrength[7] = pStrength[6];
763609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
764609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        //2. Check the nz_coeff block and mv difference
765609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pmvx = (int16*)(MbQ->mvL0 + 1); // points to 4x4 block #1,not #0
766609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pmvy = pmvx + 1;
767609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (idx = 0; idx < 4; idx += 2) // unroll the loop, make 4 iterations to 2
768609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
769609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // first/third row : 1,2,3 or 9,10,12
770609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Strength = 2 for a whole row
771609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pnz = MbQ->nz_coeff + (idx << 2);
772609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pnz++ != 0) *pStrength = 2;
773609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pnz++ != 0)
774609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
775609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *pStrength = 2;
776609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 4) = 2;
777609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
778609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pnz++ != 0)
779609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
780609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 4) = 2;
781609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 8) = 2;
782609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
783609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pnz != 0) *(pStrength + 8) = 2;
784609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
785609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Then Strength = 1
786609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStrength == 0)
787609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
788609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //within the same 8x8 block, no need to check the reference id
789609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //only need to check the |mv difference| >= 4
790609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 2);
791609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
792609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
793609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
794609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 2);
795609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
796609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
797609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
798609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
799609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx += 2;
800609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy += 2;
801609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStr = pStrength + 4;
802609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
803609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStr == 0)
804609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
805609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //check the |mv difference| >= 4
806609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 2);
807609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
808609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
809609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
810609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 2);
811609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
812609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
813609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
814609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
815609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx += 2;
816609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy += 2;
817609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStr = pStrength + 8;
818609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
819609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStr == 0)
820609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
821609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //within the same 8x8 block, no need to check the reference id
822609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //only need to check the |mv difference| >= 4
823609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 2);
824609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
825609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
826609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
827609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 2);
828609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
829609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
830609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
831609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
832609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Second/fourth row: 5,6,7 or 14,15,16
833609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Strength = 2 for a whole row
834609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pnz = MbQ->nz_coeff + ((idx + 1) << 2);
835609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pnz++ != 0) *(pStrength + 1) = 2;
836609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pnz++ != 0)
837609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
838609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 1) = 2;
839609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 5) = 2;
840609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
841609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pnz++ != 0)
842609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
843609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 5) = 2;
844609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 9) = 2;
845609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
846609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pnz != 0) *(pStrength + 9) = 2;
847609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
848609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Then Strength = 1
849609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx += 4;
850609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy += 4;
851609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStr = pStrength + 1;
852609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStr == 0)
853609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
854609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //within the same 8x8 block, no need to check the reference id
855609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //only need to check the |mv difference| >= 4
856609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 2);
857609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
858609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
859609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
860609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 2);
861609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
862609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
863609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
864609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
865609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx += 2;
866609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy += 2;
867609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStr = pStrength + 5;
868609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
869609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStr == 0)
870609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
871609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //check the |mv difference| >= 4
872609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 2);
873609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
874609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
875609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
876609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 2);
877609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
878609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
879609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
880609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
881609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx += 2;
882609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy += 2;
883609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStr = pStrength + 9;
884609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
885609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStr == 0)
886609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
887609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //within the same 8x8 block, no need to check the reference id
888609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //only need to check the |mv difference| >= 4
889609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 2);
890609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
891609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
892609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
893609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 2);
894609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
895609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
896609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
897609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
898609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // update some variables for the next two rows
899609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx += 4;
900609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy += 4;
901609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength += 2;
902609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
903609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        } /* end of: for(idx=0; idx<2; idx++) */
904609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
905609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* end of: else if( MbQ->mbMode == AVC_I4 ...) */
906609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
907609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
908609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
909609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid GetStrength_HorizontalEdges(uint8 Strength[12], AVCMacroblock* MbQ)
910609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
911609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     idx, tmp;
912609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int16   *ptr, *pmvx, *pmvy;
913609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint8   *pStrength, *pStr;
914609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    void* refIdx;
915609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
916609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (MbQ->mbMode == AVC_I4 || MbQ->mbMode == AVC_I16)
917609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
918609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)Strength)     = ININT_STRENGTH[1];      // Start with Strength=3. or Strength=4 for Mb-edge
919609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)(Strength + 4)) = ININT_STRENGTH[2];
920609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)(Strength + 8)) = ININT_STRENGTH[3];
921609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
922609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    else   // Not intra or SP-frame
923609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
924609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
925609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)Strength)     = 0; // for non-intra MB, strength = 0, 1 or 2.
926609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)(Strength + 4)) = 0; // for non-intra MB, strength = 0, 1 or 2.
927609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        *((int*)(Strength + 8)) = 0; // for non-intra MB, strength = 0, 1 or 2.
928609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
929609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
930609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        //1. Check the ref_frame_id
931609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        refIdx = (void*) MbQ->RefIdx; // de-ref type-punned fix
932609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        ptr = (int16*) refIdx;
933609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pStrength = Strength;
934609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (ptr[0] != ptr[2]) pStrength[4] = 1;
935609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (ptr[1] != ptr[3]) pStrength[6] = 1;
936609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pStrength[5] = pStrength[4];
937609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pStrength[7] = pStrength[6];
938609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
939609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        //2. Check the nz_coeff block and mv difference
940609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pmvx = (int16*)(MbQ->mvL0 + 4); // points to 4x4 block #4,not #0
941609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        pmvy = pmvx + 1;
942609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (idx = 0; idx < 4; idx += 2) // unroll the loop, make 4 iterations to 2
943609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
944609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // first/third row : 1,2,3 or 9,10,12
945609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Strength = 2 for a whole row
946609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[idx] != 0) *pStrength = 2;
947609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[4+idx] != 0)
948609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
949609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *pStrength = 2;
950609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 4) = 2;
951609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
952609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[8+idx] != 0)
953609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
954609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 4) = 2;
955609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 8) = 2;
956609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
957609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[12+idx] != 0) *(pStrength + 8) = 2;
958609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
959609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Then Strength = 1
960609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStrength == 0)
961609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
962609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //within the same 8x8 block, no need to check the reference id
963609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //only need to check the |mv difference| >= 4
964609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 8);
965609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
966609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
967609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
968609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 8);
969609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
970609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStrength = 1;
971609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
972609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
973609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx += 8;
974609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy += 8;
975609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStr = pStrength + 4;
976609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
977609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStr == 0)
978609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
979609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //check the |mv difference| >= 4
980609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 8);
981609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
982609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
983609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
984609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 8);
985609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
986609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
987609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
988609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
989609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx += 8;
990609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy += 8;
991609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStr = pStrength + 8;
992609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
993609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStr == 0)
994609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
995609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //within the same 8x8 block, no need to check the reference id
996609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //only need to check the |mv difference| >= 4
997609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 8);
998609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
999609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
1000609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1001609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 8);
1002609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
1003609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
1004609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
1005609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1006609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Second/fourth row: 5,6,7 or 14,15,16
1007609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Strength = 2 for a whole row
1008609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[idx+1] != 0) *(pStrength + 1) = 2;
1009609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[4+idx+1] != 0)
1010609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1011609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 1) = 2;
1012609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 5) = 2;
1013609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
1014609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[8+idx+1] != 0)
1015609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1016609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 5) = 2;
1017609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                *(pStrength + 9) = 2;
1018609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
1019609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (MbQ->nz_coeff[12+idx+1] != 0) *(pStrength + 9) = 2;
1020609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1021609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Then Strength = 1
1022609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx -= 14;
1023609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy -= 14; // -14 = -16 + 2
1024609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStr = pStrength + 1;
1025609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStr == 0)
1026609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1027609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //within the same 8x8 block, no need to check the reference id
1028609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //only need to check the |mv difference| >= 4
1029609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 8);
1030609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
1031609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
1032609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1033609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 8);
1034609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
1035609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
1036609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
1037609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1038609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx += 8;
1039609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy += 8;
1040609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStr = pStrength + 5;
1041609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1042609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStr == 0)
1043609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1044609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //check the |mv difference| >= 4
1045609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 8);
1046609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
1047609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
1048609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1049609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 8);
1050609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
1051609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
1052609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
1053609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1054609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx += 8;
1055609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy += 8;
1056609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStr = pStrength + 9;
1057609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1058609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (*pStr == 0)
1059609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1060609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //within the same 8x8 block, no need to check the reference id
1061609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //only need to check the |mv difference| >= 4
1062609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvx - *(pmvx - 8);
1063609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
1064609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
1065609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1066609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = *pmvy - *(pmvy - 8);
1067609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
1068609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp >= 4) *pStr = 1;
1069609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
1070609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1071609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // update some variables for the next two rows
1072609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvx -= 14;
1073609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pmvy -= 14; // -14 = -16 + 2
1074609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pStrength += 2;
1075609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1076609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        } /* end of: for(idx=0; idx<2; idx++) */
1077609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1078609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* end of: else if( MbQ->mbMode == AVC_I4 ...) */
1079609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
1080609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1081609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/*
1082609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *****************************************************************************************
1083609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * \brief  Filters one edge of 16 (luma) or 8 (chroma) pel
1084609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *****************************************************************************************
1085609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber*/
1086609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1087609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid EdgeLoop_Luma_horizontal(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch)
1088609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
1089609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int  pel, ap = 0, aq = 0, Strng;
1090609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int  C0, c0, dif, AbsDelta, tmp, tmp1;
1091609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int  L2 = 0, L1, L0, R0, R1, R2 = 0, RL0;
1092609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1093609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1094609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (Strength[0] == 4)  /* INTRA strong filtering */
1095609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
1096609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (pel = 0; pel < 16; pel++)
1097609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
1098609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            R0  = SrcPtr[0];
1099609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            R1  = SrcPtr[pitch];
1100609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            L0  = SrcPtr[-pitch];
1101609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            L1  = SrcPtr[-(pitch<<1)];
1102609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1103609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // |R0 - R1| < Beta
1104609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp1 = R0 - R1;
1105609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
1106609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp = (tmp1 - Beta);
1107609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1108609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //|L0 - L1| < Beta
1109609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp1 = L0 - L1;
1110609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
1111609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp &= (tmp1 - Beta);
1112609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1113609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //|R0 - L0| < Alpha
1114609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            AbsDelta = R0 - L0;
1115609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (AbsDelta < 0) AbsDelta = -AbsDelta;
1116609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp &= (AbsDelta - Alpha);
1117609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1118609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp < 0)
1119609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1120609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                AbsDelta -= ((Alpha >> 2) + 2);
1121609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                R2 = SrcPtr[pitch<<1]; //inc2
1122609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                L2 = SrcPtr[-(pitch+(pitch<<1))]; // -inc3
1123609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1124609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // |R0 - R2| < Beta && |R0 - L0| < (Alpha/4 + 2)
1125609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = R0 - R2;
1126609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
1127609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                aq = AbsDelta & (tmp - Beta);
1128609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1129609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // |L0 - L2| < Beta && |R0 - L0| < (Alpha/4 + 2)
1130609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = L0 - L2;
1131609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
1132609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                ap = AbsDelta & (tmp - Beta);
1133609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1134609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (aq < 0)
1135609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                {
1136609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp = R1 + R0 + L0;
1137609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[0] = (L1 + (tmp << 1) +  R2 + 4) >> 3;
1138609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp += R2;
1139609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[pitch]  = (tmp + 2) >> 2;
1140609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[pitch<<1] = (((SrcPtr[(pitch+(pitch<<1))] + R2) << 1) + tmp + 4) >> 3;
1141609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                }
1142609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                else
1143609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[0] = ((R1 << 1) + R0 + L1 + 2) >> 2;
1144609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1145609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (ap < 0)
1146609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                {
1147609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp = L1 + R0 + L0;
1148609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[-pitch]  = (R1 + (tmp << 1) +  L2 + 4) >> 3;
1149609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp += L2;
1150609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[-(pitch<<1)] = (tmp + 2) >> 2;
1151609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[-(pitch+(pitch<<1))] = (((SrcPtr[-(pitch<<2)] + L2) << 1) + tmp + 4) >> 3;
1152609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                }
1153609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                else
1154609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[-pitch] = ((L1 << 1) + L0 + R1 + 2) >> 2;
1155609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1156609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            } /* if(tmp < 0) */
1157609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1158609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcPtr ++; // Increment to next set of pixel
1159609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1160609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        } /* end of: for(pel=0; pel<16; pel++) */
1161609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1162609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* if(Strength[0] == 4) */
1163609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1164609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    else   /* Normal filtering */
1165609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
1166609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (pel = 0; pel < 16; pel++)
1167609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
1168609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            Strng = Strength[pel >> 2];
1169609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (Strng)
1170609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1171609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                R0  = SrcPtr[0];
1172609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                R1  = SrcPtr[pitch];
1173609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                L0  = SrcPtr[-pitch];
1174609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                L1  = SrcPtr[-(pitch<<1)]; // inc2
1175609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1176609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //|R0 - L0| < Alpha
1177609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp1 = R0 - L0;
1178609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
1179609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = (tmp1 - Alpha);
1180609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1181609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // |R0 - R1| < Beta
1182609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp1 = R0 - R1;
1183609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
1184609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp &= (tmp1 - Beta);
1185609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1186609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //|L0 - L1| < Beta
1187609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp1 = L0 - L1;
1188609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
1189609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp &= (tmp1 - Beta);
1190609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1191609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0)
1192609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                {
1193609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    R2 = SrcPtr[pitch<<1]; //inc2
1194609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    L2 = SrcPtr[-(pitch+(pitch<<1))]; // -inc3
1195609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1196609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    // |R0 - R2| < Beta
1197609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp = R0 - R2;
1198609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if (tmp < 0) tmp = -tmp;
1199609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    aq = tmp - Beta;
1200609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1201609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    // |L0 - L2| < Beta
1202609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp = L0 - L2;
1203609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if (tmp < 0) tmp = -tmp;
1204609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    ap = tmp - Beta;
1205609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1206609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1207609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    c0 = C0 = clipTable[Strng];
1208609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if (ap < 0) c0++;
1209609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if (aq < 0) c0++;
1210609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1211609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //dif = IClip(-c0, c0, ((Delta << 2) + (L1 - R1) + 4) >> 3);
1212609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    dif = (((R0 - L0) << 2) + (L1 - R1) + 4) >> 3;
1213609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp = dif + c0;
1214609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)tmp > (uint)c0 << 1)
1215609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1216609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~(tmp >> 31);
1217609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        dif = (tmp & (c0 << 1)) - c0;
1218609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1219609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1220609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //SrcPtr[0]    = (uint8)IClip(0, 255, R0 - dif);
1221609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //SrcPtr[-inc] = (uint8)IClip(0, 255, L0 + dif);
1222609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    RL0 = R0 + L0;
1223609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    R0 -= dif;
1224609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    L0 += dif;
1225609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)R0 > 255)
1226609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1227609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~(R0 >> 31);
1228609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        R0 = tmp & 255;
1229609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1230609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)L0 > 255)
1231609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1232609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~(L0 >> 31);
1233609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        L0 = tmp & 255;
1234609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1235609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[-pitch] = L0;
1236609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[0] = R0;
1237609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1238609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if (C0 != 0) /* Multiple zeros in the clip tables */
1239609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1240609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        if (aq < 0)  // SrcPtr[inc]   += IClip(-C0, C0,(R2 + ((RL0 + 1) >> 1) - (R1<<1)) >> 1);
1241609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        {
1242609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            R2 = (R2 + ((RL0 + 1) >> 1) - (R1 << 1)) >> 1;
1243609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            tmp = R2 + C0;
1244609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            if ((uint)tmp > (uint)C0 << 1)
1245609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            {
1246609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                tmp = ~(tmp >> 31);
1247609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                R2 = (tmp & (C0 << 1)) - C0;
1248609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            }
1249609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            SrcPtr[pitch] += R2;
1250609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        }
1251609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1252609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        if (ap < 0)  //SrcPtr[-inc2] += IClip(-C0, C0,(L2 + ((RL0 + 1) >> 1) - (L1<<1)) >> 1);
1253609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        {
1254609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            L2 = (L2 + ((RL0 + 1) >> 1) - (L1 << 1)) >> 1;
1255609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            tmp = L2 + C0;
1256609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            if ((uint)tmp > (uint)C0 << 1)
1257609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            {
1258609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                tmp = ~(tmp >> 31);
1259609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                L2 = (tmp & (C0 << 1)) - C0;
1260609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            }
1261609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            SrcPtr[-(pitch<<1)] += L2;
1262609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        }
1263609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1264609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1265609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                } /* if(tmp < 0) */
1266609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1267609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            } /* end of:  if((Strng = Strength[pel >> 2])) */
1268609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1269609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcPtr ++; // Increment to next set of pixel
1270609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1271609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        } /* for(pel=0; pel<16; pel++) */
1272609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1273609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* else if(Strength[0] == 4) */
1274609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
1275609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1276609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid EdgeLoop_Luma_vertical(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch)
1277609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
1278609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int  pel, ap = 1, aq = 1;
1279609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int  C0, c0, dif, AbsDelta, Strng, tmp, tmp1;
1280609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int  L2 = 0, L1, L0, R0, R1, R2 = 0;
1281609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint8 *ptr, *ptr1;
12824cb1a255bc134c4ee001ca7e38a0720cbd49c0b2Bernhard Rosenkränzer    uint R_in, L_in;
1283609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint R_out, L_out;
1284609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1285609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1286609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (Strength[0] == 4)  /* INTRA strong filtering */
1287609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
1288609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1289609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (pel = 0; pel < 16; pel++)
1290609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
1291609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1292609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Read 8 pels
1293609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            R_in = *((uint *)SrcPtr);       // R_in = {R3, R2, R1, R0}
1294609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            L_in = *((uint *)(SrcPtr - 4)); // L_in = {L0, L1, L2, L3}
1295609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            R1   = (R_in >> 8) & 0xff;
1296609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            R0   = R_in & 0xff;
1297609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            L0   = L_in >> 24;
1298609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            L1   = (L_in >> 16) & 0xff;
1299609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1300609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // |R0 - R1| < Beta
1301609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp1 = (R_in & 0xff) - R1;
1302609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
1303609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp = (tmp1 - Beta);
1304609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1305609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1306609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //|L0 - L1| < Beta
1307609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp1 = (L_in >> 24) - L1;
1308609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
1309609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp &= (tmp1 - Beta);
1310609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1311609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //|R0 - L0| < Alpha
1312609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            AbsDelta = (R_in & 0xff) - (L_in >> 24);
1313609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (AbsDelta < 0) AbsDelta = -AbsDelta;
1314609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp &= (AbsDelta - Alpha);
1315609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1316609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp < 0)
1317609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1318609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                AbsDelta -= ((Alpha >> 2) + 2);
1319609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                R2   = (R_in >> 16) & 0xff;
1320609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                L2   = (L_in >> 8) & 0xff;
1321609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1322609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // |R0 - R2| < Beta && |R0 - L0| < (Alpha/4 + 2)
1323609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp1 = (R_in & 0xff) - R2;
1324609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
1325609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                aq = AbsDelta & (tmp1 - Beta);
1326609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1327609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // |L0 - L2| < Beta && |R0 - L0| < (Alpha/4 + 2)
1328609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp1 = (L_in >> 24) - L2;
1329609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
1330609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                ap = AbsDelta & (tmp1 - Beta);
1331609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1332609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1333609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                ptr = SrcPtr;
1334609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (aq < 0)
1335609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                {
1336609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    R_out = (R_in >> 24) << 24; // Keep R3 at the fourth byte
1337609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1338609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp  = R0 + L0 + R1;
1339609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    R_out |= (((tmp << 1) +  L1 + R2 + 4) >> 3);
1340609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp += R2;
1341609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    R_out |= (((tmp + 2) >> 2) << 8);
1342609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp1 = ((R_in >> 24) + R2) << 1;
1343609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    R_out |= (((tmp1 + tmp + 4) >> 3) << 16);
1344609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1345609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    *((uint *)SrcPtr) = R_out;
1346609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                }
1347609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                else
1348609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    *ptr = ((R1 << 1) + R0 + L1 + 2) >> 2;
1349609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1350609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1351609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (ap < 0)
1352609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                {
1353609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    L_out = (L_in << 24) >> 24; // Keep L3 at the first byte
1354609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1355609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp  = R0 + L0 + L1;
1356609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    L_out |= ((((tmp << 1) + R1 + L2 + 4) >> 3) << 24);
1357609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp += L2;
1358609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    L_out |= (((tmp + 2) >> 2) << 16);
1359609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp1 = ((L_in & 0xff) + L2) << 1;
1360609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    L_out |= (((tmp1 + tmp + 4) >> 3) << 8);
1361609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1362609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    *((uint *)(SrcPtr - 4)) = L_out;
1363609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                }
1364609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                else
1365609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    *(--ptr) = ((L1 << 1) + L0 + R1 + 2) >> 2;
1366609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1367609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            } /* if(tmp < 0) */
1368609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1369609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcPtr += pitch;    // Increment to next set of pixel
1370609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1371609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        } /* end of: for(pel=0; pel<16; pel++) */
1372609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1373609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* if(Strength[0] == 4) */
1374609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1375609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    else   /* Normal filtering */
1376609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
1377609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1378609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (pel = 0; pel < 16; pel++)
1379609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
1380609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            Strng = Strength[pel >> 2];
1381609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (Strng)
1382609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1383609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // Read 8 pels
1384609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                R_in = *((uint *)SrcPtr);       // R_in = {R3, R2, R1, R0}
1385609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                L_in = *((uint *)(SrcPtr - 4)); // L_in = {L0, L1, L2, L3}
1386609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                R1   = (R_in >> 8) & 0xff;
1387609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                R0   = R_in & 0xff;
1388609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                L0   = L_in >> 24;
1389609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                L1   = (L_in >> 16) & 0xff;
1390609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1391609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //|R0 - L0| < Alpha
1392609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp = R0 - L0;
1393609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0) tmp = -tmp;
1394609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp -= Alpha;
1395609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1396609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                // |R0 - R1| < Beta
1397609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp1 = R0 - R1;
1398609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
1399609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp &= (tmp1 - Beta);
1400609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1401609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                //|L0 - L1| < Beta
1402609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp1 = L0 - L1;
1403609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
1404609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                tmp &= (tmp1 - Beta);
1405609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1406609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (tmp < 0)
1407609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                {
1408609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    L2 = SrcPtr[-3];
1409609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    R2 = SrcPtr[2];
1410609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1411609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    // |R0 - R2| < Beta
1412609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp = R0 - R2;
1413609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if (tmp < 0) tmp = -tmp;
1414609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    aq = tmp - Beta;
1415609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1416609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    // |L0 - L2| < Beta
1417609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp = L0 - L2;
1418609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if (tmp < 0) tmp = -tmp;
1419609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    ap = tmp - Beta;
1420609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1421609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1422609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    c0 = C0 = clipTable[Strng];
1423609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if (ap < 0) c0++;
1424609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if (aq < 0) c0++;
1425609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1426609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //dif = IClip(-c0, c0, ((Delta << 2) + (L1 - R1) + 4) >> 3);
1427609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    dif = (((R0 - L0) << 2) + (L1 - R1) + 4) >> 3;
1428609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp = dif + c0;
1429609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)tmp > (uint)c0 << 1)
1430609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1431609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~(tmp >> 31);
1432609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        dif = (tmp & (c0 << 1)) - c0;
1433609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1434609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1435609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    ptr = SrcPtr;
1436609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    ptr1 = SrcPtr - 1;
1437609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //SrcPtr[0]    = (uint8)IClip(0, 255, R0 - dif);
1438609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //SrcPtr[-inc] = (uint8)IClip(0, 255, L0 + dif);
1439609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    R_in = R0 - dif;
1440609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    L_in = L0 + dif; /* cannot re-use R0 and L0 here */
1441609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)R_in > 255)
1442609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1443609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~((int)R_in >> 31);
1444609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        R_in = tmp & 255;
1445609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1446609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)L_in > 255)
1447609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1448609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~((int)L_in >> 31);
1449609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        L_in = tmp & 255;
1450609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1451609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    *ptr1-- = L_in;
1452609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    *ptr++  = R_in;
1453609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1454609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if (C0 != 0) // Multiple zeros in the clip tables
1455609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1456609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        if (ap < 0)  //SrcPtr[-inc2] += IClip(-C0, C0,(L2 + ((RL0 + 1) >> 1) - (L1<<1)) >> 1);
1457609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        {
1458609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            L2 = (L2 + ((R0 + L0 + 1) >> 1) - (L1 << 1)) >> 1;
1459609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            tmp = L2 + C0;
1460609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            if ((uint)tmp > (uint)C0 << 1)
1461609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            {
1462609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                tmp = ~(tmp >> 31);
1463609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                L2 = (tmp & (C0 << 1)) - C0;
1464609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            }
1465609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            *ptr1 += L2;
1466609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        }
1467609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1468609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        if (aq < 0)  // SrcPtr[inc] += IClip(-C0, C0,(R2 + ((RL0 + 1) >> 1) - (R1<<1)) >> 1);
1469609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        {
1470609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            R2 = (R2 + ((R0 + L0 + 1) >> 1) - (R1 << 1)) >> 1;
1471609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            tmp = R2 + C0;
1472609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            if ((uint)tmp > (uint)C0 << 1)
1473609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            {
1474609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                tmp = ~(tmp >> 31);
1475609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                R2 = (tmp & (C0 << 1)) - C0;
1476609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            }
1477609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                            *ptr += R2;
1478609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        }
1479609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1480609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1481609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                } /* if(tmp < 0) */
1482609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1483609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            } /* end of:  if((Strng = Strength[pel >> 2])) */
1484609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1485609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcPtr += pitch;    // Increment to next set of pixel
1486609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1487609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        } /* for(pel=0; pel<16; pel++) */
1488609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1489609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* else if(Strength[0] == 4) */
1490609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1491609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
1492609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1493609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid EdgeLoop_Chroma_vertical(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch)
1494609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
1495609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     pel, Strng;
1496609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     c0, dif;
1497609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int     L1, L0, R0, R1, tmp, tmp1;
1498609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint8   *ptr;
1499609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint    R_in, L_in;
1500609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1501609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1502609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (pel = 0; pel < 16; pel++)
1503609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
1504609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        Strng = Strength[pel>>2];
1505609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (Strng)
1506609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
1507609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // Read 8 pels
1508609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            R_in = *((uint *)SrcPtr);       // R_in = {R3, R2, R1, R0}
1509609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            L_in = *((uint *)(SrcPtr - 4)); // L_in = {L0, L1, L2, L3}
1510609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            R1   = (R_in >> 8) & 0xff;
1511609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            R0   = R_in & 0xff;
1512609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            L0   = L_in >> 24;
1513609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            L1   = (L_in >> 16) & 0xff;
1514609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1515609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // |R0 - R1| < Beta
1516609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp1 = R0 - R1;
1517609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
1518609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp = (tmp1 - Beta);
1519609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1520609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //|L0 - L1| < Beta
1521609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp1 = L0 - L1;
1522609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
1523609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp &= (tmp1 - Beta);
1524609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1525609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //|R0 - L0| < Alpha
1526609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp1 = R0 - L0;
1527609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
1528609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp &= (tmp1 - Alpha);
1529609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1530609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp < 0)
1531609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1532609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                ptr = SrcPtr;
1533609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (Strng == 4) /* INTRA strong filtering */
1534609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                {
1535609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    *ptr-- = ((R1 << 1) + R0 + L1 + 2) >> 2;
1536609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    *ptr   = ((L1 << 1) + L0 + R1 + 2) >> 2;
1537609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                }
1538609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                else  /* normal filtering */
1539609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                {
1540609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    c0  = clipTable[Strng] + 1;
1541609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //dif = IClip(-c0, c0, ((Delta << 2) + (L1 - R1) + 4) >> 3);
1542609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    dif = (((R0 - L0) << 2) + (L1 - R1) + 4) >> 3;
1543609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp = dif + c0;
1544609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)tmp > (uint)c0 << 1)
1545609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1546609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~(tmp >> 31);
1547609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        dif = (tmp & (c0 << 1)) - c0;
1548609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1549609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1550609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //SrcPtr[0]    = (uint8)IClip(0, 255, R0 - dif);
1551609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //SrcPtr[-inc] = (uint8)IClip(0, 255, L0 + dif);
1552609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    L0 += dif;
1553609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    R0 -= dif;
1554609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)L0 > 255)
1555609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1556609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~(L0 >> 31);
1557609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        L0 = tmp & 255;
1558609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1559609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)R0 > 255)
1560609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1561609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~(R0 >> 31);
1562609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        R0 = tmp & 255;
1563609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1564609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1565609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    *ptr-- = R0;
1566609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    *ptr = L0;
1567609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                }
1568609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
1569609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pel ++;
1570609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcPtr += pitch;   // Increment to next set of pixel
1571609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1572609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        } /* end of: if((Strng = Strength[pel >> 2])) */
1573609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        else
1574609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
1575609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pel += 3;
1576609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcPtr += (pitch << 1); //PtrInc << 1;
1577609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
1578609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1579609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* end of: for(pel=0; pel<16; pel++) */
1580609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
1581609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1582609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1583609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid EdgeLoop_Chroma_horizontal(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch)
1584609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
1585609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int  pel, Strng;
1586609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int  c0, dif;
1587609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int  L1, L0, R0, R1, tmp, tmp1;
1588609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1589609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (pel = 0; pel < 16; pel++)
1590609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
1591609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        Strng = Strength[pel>>2];
1592609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (Strng)
1593609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
1594609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            R0  = SrcPtr[0];
1595609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            L0  = SrcPtr[-pitch];
1596609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            L1  = SrcPtr[-(pitch<<1)]; //inc2
1597609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            R1  = SrcPtr[pitch];
1598609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1599609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            // |R0 - R1| < Beta
1600609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp1 = R0 - R1;
1601609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
1602609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp = (tmp1 - Beta);
1603609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1604609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //|L0 - L1| < Beta
1605609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp1 = L0 - L1;
1606609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
1607609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp &= (tmp1 - Beta);
1608609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1609609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            //|R0 - L0| < Alpha
1610609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp1 = R0 - L0;
1611609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
1612609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            tmp &= (tmp1 - Alpha);
1613609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1614609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (tmp < 0)
1615609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
1616609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                if (Strng == 4) /* INTRA strong filtering */
1617609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                {
1618609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[0]      = ((R1 << 1) + R0 + L1 + 2) >> 2;
1619609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[-pitch] = ((L1 << 1) + L0 + R1 + 2) >> 2;
1620609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                }
1621609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                else  /* normal filtering */
1622609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                {
1623609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    c0  = clipTable[Strng] + 1;
1624609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //dif = IClip(-c0, c0, ((Delta << 2) + (L1 - R1) + 4) >> 3);
1625609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    dif = (((R0 - L0) << 2) + (L1 - R1) + 4) >> 3;
1626609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    tmp = dif + c0;
1627609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)tmp > (uint)c0 << 1)
1628609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1629609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~(tmp >> 31);
1630609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        dif = (tmp & (c0 << 1)) - c0;
1631609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1632609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1633609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //SrcPtr[-inc] = (uint8)IClip(0, 255, L0 + dif);
1634609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    //SrcPtr[0]    = (uint8)IClip(0, 255, R0 - dif);
1635609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    L0 += dif;
1636609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    R0 -= dif;
1637609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)L0 > 255)
1638609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1639609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~(L0 >> 31);
1640609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        L0 = tmp & 255;
1641609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1642609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    if ((uint)R0 > 255)
1643609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    {
1644609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        tmp = ~(R0 >> 31);
1645609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                        R0 = tmp & 255;
1646609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    }
1647609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[0] = R0;
1648609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                    SrcPtr[-pitch] = L0;
1649609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                }
1650609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
1651609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1652609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pel ++;
1653609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcPtr ++; // Increment to next set of pixel
1654609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1655609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        } /* end of: if((Strng = Strength[pel >> 2])) */
1656609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        else
1657609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
1658609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            pel += 3;
1659609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            SrcPtr += 2;
1660609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
1661609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1662609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    } /* end of: for(pel=0; pel<16; pel++) */
1663609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
1664609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1665609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1666609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1667609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
1668