14a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ------------------------------------------------------------------
24a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Copyright (C) 1998-2009 PacketVideo
34a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *
44a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
54a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * you may not use this file except in compliance with the License.
64a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * You may obtain a copy of the License at
74a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *
84a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
94a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *
104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Unless required by applicable law or agreed to in writing, software
114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * express or implied.
144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * See the License for the specific language governing permissions
154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * and limitations under the License.
164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * -------------------------------------------------------------------
174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber */
184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include <string.h>
204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include "avclib_common.h"
224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#define MAX_QP 51
244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#define MB_BLOCK_SIZE 16
254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber// NOTE: these 3 tables are for funtion GetStrength() only
274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberconst static int ININT_STRENGTH[4] = {0x04040404, 0x03030303, 0x03030303, 0x03030303};
284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber// NOTE: these 3 tables are for funtion EdgeLoop() only
314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber// NOTE: to change the tables below for instance when the QP doubling is changed from 6 to 8 values
324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas 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} ;
344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas 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} ;
354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberconst static int CLIP_TAB[52][5]  =
364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas 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},
384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas 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},
394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas 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},
404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas 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},
414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas 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},
424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas 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},
434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    { 0, 9, 12, 18, 18}, { 0, 10, 13, 20, 20}, { 0, 11, 15, 23, 23}, { 0, 13, 17, 25, 25}
444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber};
454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber// NOTE: this table is only QP clipping, index = QP + video->FilterOffsetA/B, clipped to [0, 51]
474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//       video->FilterOffsetA/B is in {-12, 12]
484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberconst static int QP_CLIP_TAB[76] =
494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,              // [-12, 0]
514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    13, 14, 15, 16, 17, 18, 19, 20, 21,
534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    22, 23, 24, 25, 26, 27, 28, 29, 30,
544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    31, 32, 33, 34, 35, 36, 37, 38, 39,
554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // [1, 51]
564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51      // [52,63]
574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber};
584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberstatic void DeblockMb(AVCCommonObj *video, int mb_x, int mb_y, uint8 *SrcY, uint8 *SrcU, uint8 *SrcV);
604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//static void GetStrength(AVCCommonObj *video, uint8 *Strength, AVCMacroblock* MbP, AVCMacroblock* MbQ, int dir, int edge);
614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberstatic void GetStrength_Edge0(uint8 *Strength, AVCMacroblock* MbP, AVCMacroblock* MbQ, int dir);
624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberstatic void GetStrength_VerticalEdges(uint8 *Strength, AVCMacroblock* MbQ);
634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberstatic void GetStrength_HorizontalEdges(uint8 Strength[12], AVCMacroblock* MbQ);
644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberstatic void EdgeLoop_Luma_vertical(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch);
654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberstatic void EdgeLoop_Luma_horizontal(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch);
664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberstatic void EdgeLoop_Chroma_vertical(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch);
674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberstatic void EdgeLoop_Chroma_horizontal(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch);
684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/*
704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *****************************************************************************************
714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * \brief Filter all macroblocks in order of increasing macroblock address.
724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *****************************************************************************************
734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber*/
744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF AVCStatus DeblockPicture(AVCCommonObj *video)
764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint   i, j;
784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int   pitch = video->currPic->pitch, pitch_c, width;
794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint8 *SrcY, *SrcU, *SrcV;
804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    SrcY = video->currPic->Sl;      // pointers to source
824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    SrcU = video->currPic->Scb;
834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    SrcV = video->currPic->Scr;
844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    pitch_c = pitch >> 1;
854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    width = video->currPic->width;
864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (i = 0; i < video->PicHeightInMbs; i++)
884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (j = 0; j < video->PicWidthInMbs; j++)
904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            DeblockMb(video, j, i, SrcY, SrcU, SrcV);
924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // update SrcY, SrcU, SrcV
934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcY += MB_BLOCK_SIZE;
944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcU += (MB_BLOCK_SIZE >> 1);
954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcV += (MB_BLOCK_SIZE >> 1);
964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        SrcY += ((pitch << 4) - width);
994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        SrcU += ((pitch_c << 3) - (width >> 1));
1004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        SrcV += ((pitch_c << 3) - (width >> 1));
1014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVC_SUCCESS;
1044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
1054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef MB_BASED_DEBLOCK
1074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/*
1084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *****************************************************************************************
1094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * \brief Filter one macroblocks in a fast macroblock memory and copy it to frame
1104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *****************************************************************************************
1114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber*/
1124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid MBInLoopDeblock(AVCCommonObj *video)
1134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
1144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCPictureData *currPic = video->currPic;
1154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef USE_PRED_BLOCK
1164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint8 *predCb, *predCr, *pred_block;
1174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int i, j, dst_width, dst_height, dst_widthc, dst_heightc;
1184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
1194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int pitch = currPic->pitch;
1204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int x_pos = video->mb_x;
1214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int y_pos = video->mb_y;
1224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint8 *curL, *curCb, *curCr;
1234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int offset;
1244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    offset = (y_pos << 4) * pitch;
1264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    curL = currPic->Sl + offset + (x_pos << 4);
1284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    offset >>= 2;
1304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    offset += (x_pos << 3);
1314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    curCb = currPic->Scb + offset;
1334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    curCr = currPic->Scr + offset;
1344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef USE_PRED_BLOCK
1364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    pred_block = video->pred;
1374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* 1. copy neighboring pixels from frame to the video->pred_block */
1394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (y_pos) /* not the 0th row */
1404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* copy to the top 4 lines of the macroblock */
1424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curL -= (pitch << 2); /* go back 4 lines */
1434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 4, curL, 16);
1454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curL += pitch;
1464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 24, curL, 16);
1474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curL += pitch;
1484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 44, curL, 16);
1494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curL += pitch;
1504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 64, curL, 16);
1514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curL += pitch;
1524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCb -= (pitch << 1); /* go back 4 lines chroma */
1544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCr -= (pitch << 1);
1554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pred_block += 400;
1574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 4, curCb, 8);
1594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCb += (pitch >> 1);
1604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 16, curCb, 8);
1614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCb += (pitch >> 1);
1624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 28, curCb, 8);
1634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCb += (pitch >> 1);
1644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 40, curCb, 8);
1654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCb += (pitch >> 1);
1664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pred_block += 144;
1684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 4, curCr, 8);
1694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCr += (pitch >> 1);
1704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 16, curCr, 8);
1714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCr += (pitch >> 1);
1724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 28, curCr, 8);
1734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCr += (pitch >> 1);
1744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(pred_block + 40, curCr, 8);
1754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCr += (pitch >> 1);
1764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pred_block = video->pred;
1784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* 2. perform deblocking. */
1814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DeblockMb(video, x_pos, y_pos, pred_block + 84, pred_block + 452, pred_block + 596);
1824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* 3. copy it back to the frame and update pred_block */
1844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    predCb = pred_block + 400;
1854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    predCr = predCb + 144;
1864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* find the range of the block inside pred_block to be copied back */
1884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (y_pos)  /* the first row */
1894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curL -= (pitch << 2);
1914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCb -= (pitch << 1);
1924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCr -= (pitch << 1);
1934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        dst_height = 20;
1954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        dst_heightc = 12;
1964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
1984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pred_block += 80;
2004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        predCb += 48;
2014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        predCr += 48;
2024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        dst_height = 16;
2034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        dst_heightc = 8;
2044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (x_pos) /* find the width */
2074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curL -= 4;
2094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCb -= 4;
2104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCr -= 4;
2114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (x_pos == (int)(video->PicWidthInMbs - 1))
2124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            dst_width = 20;
2144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            dst_widthc = 12;
2154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else
2174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            dst_width = 16;
2194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            dst_widthc = 8;
2204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
2234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pred_block += 4;
2254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        predCb += 4;
2264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        predCr += 4;
2274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        dst_width = 12;
2284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        dst_widthc = 4;
2294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* perform copy */
2324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (j = 0; j < dst_height; j++)
2334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(curL, pred_block, dst_width);
2354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curL += pitch;
2364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pred_block += 20;
2374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (j = 0; j < dst_heightc; j++)
2394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(curCb, predCb, dst_widthc);
2414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memcpy(curCr, predCr, dst_widthc);
2424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCb += (pitch >> 1);
2434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        curCr += (pitch >> 1);
2444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        predCb += 12;
2454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        predCr += 12;
2464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (x_pos != (int)(video->PicWidthInMbs - 1)) /* now copy from the right-most 4 columns to the left-most 4 columns */
2494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pred_block = video->pred;
2514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (i = 0; i < 20; i += 4)
2524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 16));
2544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pred_block += 20;
2554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 16));
2564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pred_block += 20;
2574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 16));
2584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pred_block += 20;
2594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 16));
2604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pred_block += 20;
2614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (i = 0; i < 24; i += 4)
2644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 8));
2664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pred_block += 12;
2674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 8));
2684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pred_block += 12;
2694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 8));
2704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pred_block += 12;
2714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            *((uint32*)pred_block) = *((uint32*)(pred_block + 8));
2724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pred_block += 12;
2734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#else
2774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DeblockMb(video, x_pos, y_pos, curL, curCb, curCr);
2784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
2794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return ;
2814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
2824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
2834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/*
2854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *****************************************************************************************
2864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * \brief Deblocking filter for one macroblock.
2874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *****************************************************************************************
2884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber */
2894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid DeblockMb(AVCCommonObj *video, int mb_x, int mb_y, uint8 *SrcY, uint8 *SrcU, uint8 *SrcV)
2914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
2924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCMacroblock *MbP, *MbQ;
2934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     edge, QP, QPC;
2944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     filterLeftMbEdgeFlag = (mb_x != 0);
2954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     filterTopMbEdgeFlag  = (mb_y != 0);
2964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     pitch = video->currPic->pitch;
2974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     indexA, indexB, tmp;
2984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     Alpha, Beta, Alpha_c, Beta_c;
2994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     mbNum = mb_y * video->PicWidthInMbs + mb_x;
3004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     *clipTable, *clipTable_c, *qp_clip_tab;
3014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint8   Strength[16];
3024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    void*     str;
3034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    MbQ = &(video->mblock[mbNum]);      // current Mb
3054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    // If filter is disabled, return
3084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (video->sliceHdr->disable_deblocking_filter_idc == 1) return;
3094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (video->sliceHdr->disable_deblocking_filter_idc == 2)
3114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
3124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        // don't filter at slice boundaries
3134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        filterLeftMbEdgeFlag = mb_is_available(video->mblock, video->PicSizeInMbs, mbNum - 1, mbNum);
3144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        filterTopMbEdgeFlag  = mb_is_available(video->mblock, video->PicSizeInMbs, mbNum - video->PicWidthInMbs, mbNum);
3154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
3164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* NOTE: edge=0 and edge=1~3 are separate cases because of the difference of MbP, index A and indexB calculation */
3184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas 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 */
3194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    qp_clip_tab = (int *)QP_CLIP_TAB + 12;
3214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* 1.VERTICAL EDGE + MB BOUNDARY (edge = 0) */
3234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (filterLeftMbEdgeFlag)
3244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
3254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        MbP = MbQ - 1;
3264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        //GetStrength(video, Strength, MbP, MbQ, 0, 0); // Strength for 4 blks in 1 stripe, 0 => vertical edge
3274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        GetStrength_Edge0(Strength, MbP, MbQ, 0);
3284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        str = (void*)Strength; //de-ref type-punned pointer fix
3304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (*((uint32*)str))    // only if one of the 4 Strength bytes is != 0
3314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
3324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            QP = (MbP->QPy + MbQ->QPy + 1) >> 1; // Average QP of the two blocks;
3334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexA = QP + video->FilterOffsetA;
3344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexB = QP + video->FilterOffsetB;
3354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
3364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
3374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            Alpha  = ALPHA_TABLE[indexA];
3394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            Beta = BETA_TABLE[indexB];
3404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            clipTable = (int *) CLIP_TAB[indexA];
3414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (Alpha > 0 && Beta > 0)
3434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef USE_PRED_BLOCK
3444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Luma_vertical(SrcY, Strength,  Alpha, Beta, clipTable, 20);
3454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#else
3464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Luma_vertical(SrcY, Strength,  Alpha, Beta, clipTable, pitch);
3474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
3484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            QPC = (MbP->QPc + MbQ->QPc + 1) >> 1;
3504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexA = QPC + video->FilterOffsetA;
3514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexB = QPC + video->FilterOffsetB;
3524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
3534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
3544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            Alpha  = ALPHA_TABLE[indexA];
3564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            Beta = BETA_TABLE[indexB];
3574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            clipTable = (int *) CLIP_TAB[indexA];
3584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (Alpha > 0 && Beta > 0)
3594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
3604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef USE_PRED_BLOCK
3614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_vertical(SrcU, Strength, Alpha, Beta, clipTable, 12);
3624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_vertical(SrcV, Strength, Alpha, Beta, clipTable, 12);
3634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#else
3644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_vertical(SrcU, Strength, Alpha, Beta, clipTable, pitch >> 1);
3654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_vertical(SrcV, Strength, Alpha, Beta, clipTable, pitch >> 1);
3664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
3674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
3684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* end of: if(filterLeftMbEdgeFlag) */
3714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* 2.VERTICAL EDGE (no boundary), the edges are all inside a MB */
3734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* First calculate the necesary parameters all at once, outside the loop */
3744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    MbP = MbQ;
3754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    indexA = MbQ->QPy + video->FilterOffsetA;
3774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    indexB = MbQ->QPy + video->FilterOffsetB;
3784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    //  index
3794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
3804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
3814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    Alpha = ALPHA_TABLE[indexA];
3834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    Beta = BETA_TABLE[indexB];
3844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    clipTable = (int *)CLIP_TAB[indexA];
3854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* Save Alpha,  Beta and clipTable for future use, with the obselete variables filterLeftMbEdgeFlag, mbNum amd tmp */
3874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    filterLeftMbEdgeFlag = Alpha;
3884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    mbNum = Beta;
3894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    tmp = (int)clipTable;
3904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    indexA = MbQ->QPc + video->FilterOffsetA;
3924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    indexB = MbQ->QPc + video->FilterOffsetB;
3934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
3944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
3954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    Alpha_c  = ALPHA_TABLE[indexA];
3974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    Beta_c = BETA_TABLE[indexB];
3984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    clipTable_c = (int *)CLIP_TAB[indexA];
3994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    GetStrength_VerticalEdges(Strength + 4, MbQ); // Strength for 4 blks in 1 stripe, 0 => vertical edge
4014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (edge = 1; edge < 4; edge++)  // 4 vertical strips of 16 pel
4034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        //GetStrength_VerticalEdges(video, Strength, MbP, MbQ, 0, edge); // Strength for 4 blks in 1 stripe, 0 => vertical edge
4054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (*((int*)(Strength + (edge << 2))))   // only if one of the 4 Strength bytes is != 0
4064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
4074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (Alpha > 0 && Beta > 0)
4084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef USE_PRED_BLOCK
4094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Luma_vertical(SrcY + (edge << 2), Strength + (edge << 2),  Alpha, Beta, clipTable, 20);
4104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#else
4114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Luma_vertical(SrcY + (edge << 2), Strength + (edge << 2),  Alpha, Beta, clipTable, pitch);
4124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
4134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (!(edge & 1) && Alpha_c > 0 && Beta_c > 0)
4154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
4164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef USE_PRED_BLOCK
4174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_vertical(SrcU + (edge << 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, 12);
4184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_vertical(SrcV + (edge << 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, 12);
4194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#else
4204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_vertical(SrcU + (edge << 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, pitch >> 1);
4214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_vertical(SrcV + (edge << 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, pitch >> 1);
4224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
4234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
4244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
4254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } //end edge
4274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* 3.HORIZONTAL EDGE + MB BOUNDARY (edge = 0) */
4314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (filterTopMbEdgeFlag)
4324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        MbP = MbQ - video->PicWidthInMbs;
4344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        //GetStrength(video, Strength, MbP, MbQ, 1, 0); // Strength for 4 blks in 1 stripe, 0 => vertical edge
4354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        GetStrength_Edge0(Strength, MbP, MbQ, 1);
4364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        str = (void*)Strength; //de-ref type-punned pointer fix
4374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (*((uint32*)str))    // only if one of the 4 Strength bytes is != 0
4384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
4394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            QP = (MbP->QPy + MbQ->QPy + 1) >> 1; // Average QP of the two blocks;
4404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexA = QP + video->FilterOffsetA;
4414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexB = QP + video->FilterOffsetB;
4424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
4434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
4444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            Alpha  = ALPHA_TABLE[indexA];
4464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            Beta = BETA_TABLE[indexB];
4474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            clipTable = (int *)CLIP_TAB[indexA];
4484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (Alpha > 0 && Beta > 0)
4504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
4514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef USE_PRED_BLOCK
4524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Luma_horizontal(SrcY, Strength,  Alpha, Beta, clipTable, 20);
4534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#else
4544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Luma_horizontal(SrcY, Strength,  Alpha, Beta, clipTable, pitch);
4554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
4564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
4574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            QPC = (MbP->QPc + MbQ->QPc + 1) >> 1;
4594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexA = QPC + video->FilterOffsetA;
4604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexB = QPC + video->FilterOffsetB;
4614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexA = qp_clip_tab[indexA]; // IClip(0, MAX_QP, QP+video->FilterOffsetA)
4624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            indexB = qp_clip_tab[indexB]; // IClip(0, MAX_QP, QP+video->FilterOffsetB)
4634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            Alpha  = ALPHA_TABLE[indexA];
4654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            Beta = BETA_TABLE[indexB];
4664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            clipTable = (int *)CLIP_TAB[indexA];
4674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (Alpha > 0 && Beta > 0)
4684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
4694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef USE_PRED_BLOCK
4704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_horizontal(SrcU, Strength, Alpha, Beta, clipTable, 12);
4714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_horizontal(SrcV, Strength, Alpha, Beta, clipTable, 12);
4724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#else
4734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_horizontal(SrcU, Strength, Alpha, Beta, clipTable, pitch >> 1);
4744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_horizontal(SrcV, Strength, Alpha, Beta, clipTable, pitch >> 1);
4754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
4764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
4774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
4784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* end of: if(filterTopMbEdgeFlag) */
4804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* 4.HORIZONTAL EDGE (no boundary), the edges are inside a MB */
4834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    MbP = MbQ;
4844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* Recover Alpha,  Beta and clipTable for edge!=0 with the variables filterLeftMbEdgeFlag, mbNum and tmp */
4864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* Note that Alpha_c, Beta_c and clipTable_c for chroma is already calculated */
4874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    Alpha = filterLeftMbEdgeFlag;
4884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    Beta = mbNum;
4894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    clipTable = (int *)tmp;
4904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    GetStrength_HorizontalEdges(Strength + 4, MbQ); // Strength for 4 blks in 1 stripe, 0 => vertical edge
4924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (edge = 1; edge < 4; edge++)  // 4 horicontal strips of 16 pel
4944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        //GetStrength(video, Strength, MbP, MbQ, 1, edge); // Strength for 4 blks in 1 stripe   1 => horizontal edge
4964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (*((int*)(Strength + (edge << 2)))) // only if one of the 4 Strength bytes is != 0
4974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
4984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (Alpha > 0 && Beta > 0)
4994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
5004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef USE_PRED_BLOCK
5014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Luma_horizontal(SrcY + (edge << 2)*20, Strength + (edge << 2),  Alpha, Beta, clipTable, 20);
5024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#else
5034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Luma_horizontal(SrcY + (edge << 2)*pitch, Strength + (edge << 2),  Alpha, Beta, clipTable, pitch);
5044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
5054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
5064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (!(edge & 1) && Alpha_c > 0 && Beta_c > 0)
5084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
5094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef USE_PRED_BLOCK
5104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_horizontal(SrcU + (edge << 1)*12, Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, 12);
5114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_horizontal(SrcV + (edge << 1)*12, Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, 12);
5124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#else
5134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_horizontal(SrcU + (edge << 1)*(pitch >> 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, pitch >> 1);
5144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                EdgeLoop_Chroma_horizontal(SrcV + (edge << 1)*(pitch >> 1), Strength + (edge << 2), Alpha_c, Beta_c, clipTable_c, pitch >> 1);
5154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
5164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
5174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
5184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } //end edge
5204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return;
5224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
5234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/*
5254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *****************************************************************************************************
5264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * \brief   returns a buffer of 4 Strength values for one stripe in a mb (for different Frame types)
5274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *****************************************************************************************************
5284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber*/
5294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid GetStrength_Edge0(uint8 *Strength, AVCMacroblock* MbP, AVCMacroblock* MbQ, int dir)
5314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
5324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int tmp;
5334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int16 *ptrQ, *ptrP;
5344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    void* vptr;
5354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint8 *pStrength;
5364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    void* refIdx;
5374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (MbP->mbMode == AVC_I4 || MbP->mbMode == AVC_I16 ||
5394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            MbQ->mbMode == AVC_I4 || MbQ->mbMode == AVC_I16)
5404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)Strength) = ININT_STRENGTH[0];      // Start with Strength=3. or Strength=4 for Mb-edge
5434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else // if not intra or SP-frame
5464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)Strength) = 0;
5484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (dir == 0)  // Vertical Edge 0
5504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
5514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //1. Check the ref_frame_id
5534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            refIdx = (void*) MbQ->RefIdx; //de-ref type-punned pointer fix
5544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrQ = (int16*)refIdx;
5554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            refIdx = (void*)MbP->RefIdx; //de-ref type-punned pointer fix
5564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrP = (int16*)refIdx;
5574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength = Strength;
5584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (ptrQ[0] != ptrP[1]) pStrength[0] = 1;
5594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (ptrQ[2] != ptrP[3]) pStrength[2] = 1;
5604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength[1] = pStrength[0];
5614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength[3] = pStrength[2];
5624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //2. Check the non-zero coeff blocks (4x4)
5644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[0] != 0 || MbP->nz_coeff[3] != 0) pStrength[0] = 2;
5654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[4] != 0 || MbP->nz_coeff[7] != 0) pStrength[1] = 2;
5664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[8] != 0 || MbP->nz_coeff[11] != 0) pStrength[2] = 2;
5674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[12] != 0 || MbP->nz_coeff[15] != 0) pStrength[3] = 2;
5684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //3. Only need to check the mv difference
5704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            vptr = (void*)MbQ->mvL0;  // for deref type-punned pointer
5714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrQ = (int16*)vptr;
5724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrP = (int16*)(MbP->mvL0 + 3); // points to 4x4 block #3 (the 4th column)
5734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // 1st blk
5754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStrength == 0)
5764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
5774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // check |mv difference| >= 4
5784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ++ - *ptrP++;
5794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
5804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
5814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ-- - *ptrP--;
5834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
5844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
5854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
5864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength++;
5884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrQ += 8;
5894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrP += 8;
5904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // 2nd blk
5924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStrength == 0)
5934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
5944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // check |mv difference| >= 4
5954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ++ - *ptrP++;
5964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
5974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
5984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ-- - *ptrP--;
6004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
6014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
6024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength++;
6054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrQ += 8;
6064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrP += 8;
6074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // 3rd blk
6094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStrength == 0)
6104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // check |mv difference| >= 4
6124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ++ - *ptrP++;
6134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
6144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
6154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ-- - *ptrP--;
6174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
6184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
6194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength++;
6224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrQ += 8;
6234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrP += 8;
6244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // 4th blk
6264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStrength == 0)
6274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // check |mv difference| >= 4
6294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ++ - *ptrP++;
6304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
6314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
6324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ-- - *ptrP--;
6344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
6354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
6364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
6384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else   // Horizontal Edge 0
6394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
6404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //1. Check the ref_frame_id
6424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            refIdx = (void*)MbQ->RefIdx;  //de-ref type-punned pointer
6434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrQ = (int16*)refIdx;
6444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            refIdx = (void*)MbP->RefIdx;  //de-ref type-punned pointer
6454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrP = (int16*)refIdx;
6464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength = Strength;
6474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (ptrQ[0] != ptrP[2]) pStrength[0] = 1;
6484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (ptrQ[1] != ptrP[3]) pStrength[2] = 1;
6494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength[1] = pStrength[0];
6504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength[3] = pStrength[2];
6514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //2. Check the non-zero coeff blocks (4x4)
6534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[0] != 0 || MbP->nz_coeff[12] != 0) pStrength[0] = 2;
6544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[1] != 0 || MbP->nz_coeff[13] != 0) pStrength[1] = 2;
6554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[2] != 0 || MbP->nz_coeff[14] != 0) pStrength[2] = 2;
6564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[3] != 0 || MbP->nz_coeff[15] != 0) pStrength[3] = 2;
6574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //3. Only need to check the mv difference
6594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            vptr = (void*)MbQ->mvL0;
6604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrQ = (int16*)vptr;
6614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrP = (int16*)(MbP->mvL0 + 12); // points to 4x4 block #12 (the 4th row)
6624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // 1st blk
6644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStrength == 0)
6654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // check |mv difference| >= 4
6674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ++ - *ptrP++;
6684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
6694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
6704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ-- - *ptrP--;
6724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
6734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
6744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength++;
6774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrQ += 2;
6784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrP += 2;
6794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // 2nd blk
6814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStrength  == 0)
6824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // check |mv difference| >= 4
6844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ++ - *ptrP++;
6854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
6864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
6874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ-- - *ptrP--;
6894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
6904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
6914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength++;
6944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrQ += 2;
6954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrP += 2;
6964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // 3rd blk
6984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStrength  == 0)
6994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
7004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // check |mv difference| >= 4
7014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ++ - *ptrP++;
7024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
7034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
7044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ-- - *ptrP--;
7064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
7074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
7084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
7094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength++;
7114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrQ += 2;
7124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ptrP += 2;
7134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // 4th blk
7154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStrength  == 0)
7164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
7174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // check |mv difference| >= 4
7184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ++ - *ptrP++;
7194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
7204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
7214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *ptrQ-- - *ptrP--;
7234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
7244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
7254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
7264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        } /* end of: else if(dir == 0) */
7284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* end of: if( !(MbP->mbMode == AVC_I4 ...) */
7304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
7314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid GetStrength_VerticalEdges(uint8 *Strength, AVCMacroblock* MbQ)
7344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
7354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     idx, tmp;
7364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int16   *ptr, *pmvx, *pmvy;
7374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint8   *pnz;
7384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint8   *pStrength, *pStr;
7394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    void* refIdx;
7404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (MbQ->mbMode == AVC_I4 || MbQ->mbMode == AVC_I16)
7424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
7434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)Strength)     = ININT_STRENGTH[1];      // Start with Strength=3. or Strength=4 for Mb-edge
7444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)(Strength + 4)) = ININT_STRENGTH[2];
7454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)(Strength + 8)) = ININT_STRENGTH[3];
7464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
7474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else   // Not intra or SP-frame
7484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
7494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)Strength)     = 0; // for non-intra MB, strength = 0, 1 or 2.
7514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)(Strength + 4)) = 0;
7524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)(Strength + 8)) = 0;
7534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        //1. Check the ref_frame_id
7554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        refIdx = (void*)MbQ->RefIdx;  //de-ref type-punned pointer fix
7564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ptr = (int16*)refIdx;
7574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pStrength = Strength;
7584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (ptr[0] != ptr[1]) pStrength[4] = 1;
7594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (ptr[2] != ptr[3]) pStrength[6] = 1;
7604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pStrength[5] = pStrength[4];
7614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pStrength[7] = pStrength[6];
7624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        //2. Check the nz_coeff block and mv difference
7644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pmvx = (int16*)(MbQ->mvL0 + 1); // points to 4x4 block #1,not #0
7654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pmvy = pmvx + 1;
7664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (idx = 0; idx < 4; idx += 2) // unroll the loop, make 4 iterations to 2
7674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
7684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // first/third row : 1,2,3 or 9,10,12
7694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Strength = 2 for a whole row
7704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pnz = MbQ->nz_coeff + (idx << 2);
7714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pnz++ != 0) *pStrength = 2;
7724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pnz++ != 0)
7734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
7744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *pStrength = 2;
7754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 4) = 2;
7764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
7774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pnz++ != 0)
7784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
7794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 4) = 2;
7804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 8) = 2;
7814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
7824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pnz != 0) *(pStrength + 8) = 2;
7834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Then Strength = 1
7854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStrength == 0)
7864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
7874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //within the same 8x8 block, no need to check the reference id
7884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //only need to check the |mv difference| >= 4
7894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 2);
7904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
7914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
7924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 2);
7944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
7954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
7964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
7974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx += 2;
7994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy += 2;
8004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStr = pStrength + 4;
8014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStr == 0)
8034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
8044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //check the |mv difference| >= 4
8054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 2);
8064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
8074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
8084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 2);
8104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
8114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
8124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
8134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx += 2;
8154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy += 2;
8164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStr = pStrength + 8;
8174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStr == 0)
8194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
8204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //within the same 8x8 block, no need to check the reference id
8214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //only need to check the |mv difference| >= 4
8224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 2);
8234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
8244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
8254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 2);
8274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
8284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
8294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
8304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Second/fourth row: 5,6,7 or 14,15,16
8324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Strength = 2 for a whole row
8334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pnz = MbQ->nz_coeff + ((idx + 1) << 2);
8344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pnz++ != 0) *(pStrength + 1) = 2;
8354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pnz++ != 0)
8364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
8374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 1) = 2;
8384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 5) = 2;
8394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
8404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pnz++ != 0)
8414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
8424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 5) = 2;
8434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 9) = 2;
8444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
8454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pnz != 0) *(pStrength + 9) = 2;
8464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Then Strength = 1
8484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx += 4;
8494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy += 4;
8504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStr = pStrength + 1;
8514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStr == 0)
8524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
8534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //within the same 8x8 block, no need to check the reference id
8544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //only need to check the |mv difference| >= 4
8554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 2);
8564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
8574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
8584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 2);
8604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
8614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
8624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
8634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx += 2;
8654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy += 2;
8664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStr = pStrength + 5;
8674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStr == 0)
8694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
8704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //check the |mv difference| >= 4
8714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 2);
8724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
8734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
8744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 2);
8764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
8774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
8784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
8794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx += 2;
8814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy += 2;
8824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStr = pStrength + 9;
8834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStr == 0)
8854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
8864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //within the same 8x8 block, no need to check the reference id
8874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //only need to check the |mv difference| >= 4
8884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 2);
8894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
8904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
8914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 2);
8934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
8944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
8954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
8964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // update some variables for the next two rows
8984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx += 4;
8994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy += 4;
9004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength += 2;
9014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        } /* end of: for(idx=0; idx<2; idx++) */
9034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* end of: else if( MbQ->mbMode == AVC_I4 ...) */
9054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
9064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid GetStrength_HorizontalEdges(uint8 Strength[12], AVCMacroblock* MbQ)
9094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
9104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     idx, tmp;
9114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int16   *ptr, *pmvx, *pmvy;
9124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint8   *pStrength, *pStr;
9134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    void* refIdx;
9144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (MbQ->mbMode == AVC_I4 || MbQ->mbMode == AVC_I16)
9164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
9174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)Strength)     = ININT_STRENGTH[1];      // Start with Strength=3. or Strength=4 for Mb-edge
9184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)(Strength + 4)) = ININT_STRENGTH[2];
9194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)(Strength + 8)) = ININT_STRENGTH[3];
9204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
9214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else   // Not intra or SP-frame
9224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
9234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)Strength)     = 0; // for non-intra MB, strength = 0, 1 or 2.
9254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)(Strength + 4)) = 0; // for non-intra MB, strength = 0, 1 or 2.
9264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *((int*)(Strength + 8)) = 0; // for non-intra MB, strength = 0, 1 or 2.
9274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        //1. Check the ref_frame_id
9304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        refIdx = (void*) MbQ->RefIdx; // de-ref type-punned fix
9314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ptr = (int16*) refIdx;
9324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pStrength = Strength;
9334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (ptr[0] != ptr[2]) pStrength[4] = 1;
9344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (ptr[1] != ptr[3]) pStrength[6] = 1;
9354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pStrength[5] = pStrength[4];
9364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pStrength[7] = pStrength[6];
9374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        //2. Check the nz_coeff block and mv difference
9394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pmvx = (int16*)(MbQ->mvL0 + 4); // points to 4x4 block #4,not #0
9404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        pmvy = pmvx + 1;
9414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (idx = 0; idx < 4; idx += 2) // unroll the loop, make 4 iterations to 2
9424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
9434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // first/third row : 1,2,3 or 9,10,12
9444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Strength = 2 for a whole row
9454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[idx] != 0) *pStrength = 2;
9464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[4+idx] != 0)
9474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *pStrength = 2;
9494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 4) = 2;
9504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[8+idx] != 0)
9524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 4) = 2;
9544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 8) = 2;
9554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[12+idx] != 0) *(pStrength + 8) = 2;
9574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Then Strength = 1
9594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStrength == 0)
9604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //within the same 8x8 block, no need to check the reference id
9624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //only need to check the |mv difference| >= 4
9634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 8);
9644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
9654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
9664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 8);
9684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
9694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStrength = 1;
9704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx += 8;
9734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy += 8;
9744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStr = pStrength + 4;
9754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStr == 0)
9774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //check the |mv difference| >= 4
9794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 8);
9804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
9814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
9824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 8);
9844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
9854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
9864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx += 8;
9894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy += 8;
9904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStr = pStrength + 8;
9914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStr == 0)
9934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //within the same 8x8 block, no need to check the reference id
9954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //only need to check the |mv difference| >= 4
9964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 8);
9974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
9984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
9994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 8);
10014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
10024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
10034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Second/fourth row: 5,6,7 or 14,15,16
10064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Strength = 2 for a whole row
10074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[idx+1] != 0) *(pStrength + 1) = 2;
10084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[4+idx+1] != 0)
10094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 1) = 2;
10114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 5) = 2;
10124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[8+idx+1] != 0)
10144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 5) = 2;
10164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                *(pStrength + 9) = 2;
10174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (MbQ->nz_coeff[12+idx+1] != 0) *(pStrength + 9) = 2;
10194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Then Strength = 1
10214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx -= 14;
10224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy -= 14; // -14 = -16 + 2
10234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStr = pStrength + 1;
10244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStr == 0)
10254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //within the same 8x8 block, no need to check the reference id
10274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //only need to check the |mv difference| >= 4
10284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 8);
10294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
10304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
10314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 8);
10334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
10344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
10354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx += 8;
10384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy += 8;
10394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStr = pStrength + 5;
10404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStr == 0)
10424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //check the |mv difference| >= 4
10444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 8);
10454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
10464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
10474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 8);
10494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
10504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
10514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx += 8;
10544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy += 8;
10554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStr = pStrength + 9;
10564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (*pStr == 0)
10584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //within the same 8x8 block, no need to check the reference id
10604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //only need to check the |mv difference| >= 4
10614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvx - *(pmvx - 8);
10624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
10634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
10644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = *pmvy - *(pmvy - 8);
10664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
10674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp >= 4) *pStr = 1;
10684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // update some variables for the next two rows
10714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvx -= 14;
10724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pmvy -= 14; // -14 = -16 + 2
10734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pStrength += 2;
10744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        } /* end of: for(idx=0; idx<2; idx++) */
10764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* end of: else if( MbQ->mbMode == AVC_I4 ...) */
10784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
10794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/*
10814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *****************************************************************************************
10824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * \brief  Filters one edge of 16 (luma) or 8 (chroma) pel
10834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *****************************************************************************************
10844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber*/
10854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid EdgeLoop_Luma_horizontal(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch)
10874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
10884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int  pel, ap = 0, aq = 0, Strng;
10894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int  C0, c0, dif, AbsDelta, tmp, tmp1;
10904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int  L2 = 0, L1, L0, R0, R1, R2 = 0, RL0;
10914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (Strength[0] == 4)  /* INTRA strong filtering */
10944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
10954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (pel = 0; pel < 16; pel++)
10964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
10974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            R0  = SrcPtr[0];
10984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            R1  = SrcPtr[pitch];
10994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            L0  = SrcPtr[-pitch];
11004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            L1  = SrcPtr[-(pitch<<1)];
11014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // |R0 - R1| < Beta
11034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp1 = R0 - R1;
11044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
11054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp = (tmp1 - Beta);
11064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //|L0 - L1| < Beta
11084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp1 = L0 - L1;
11094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
11104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp &= (tmp1 - Beta);
11114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //|R0 - L0| < Alpha
11134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            AbsDelta = R0 - L0;
11144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (AbsDelta < 0) AbsDelta = -AbsDelta;
11154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp &= (AbsDelta - Alpha);
11164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp < 0)
11184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
11194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                AbsDelta -= ((Alpha >> 2) + 2);
11204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                R2 = SrcPtr[pitch<<1]; //inc2
11214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                L2 = SrcPtr[-(pitch+(pitch<<1))]; // -inc3
11224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // |R0 - R2| < Beta && |R0 - L0| < (Alpha/4 + 2)
11244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = R0 - R2;
11254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
11264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                aq = AbsDelta & (tmp - Beta);
11274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // |L0 - L2| < Beta && |R0 - L0| < (Alpha/4 + 2)
11294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = L0 - L2;
11304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
11314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                ap = AbsDelta & (tmp - Beta);
11324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (aq < 0)
11344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
11354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp = R1 + R0 + L0;
11364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[0] = (L1 + (tmp << 1) +  R2 + 4) >> 3;
11374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp += R2;
11384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[pitch]  = (tmp + 2) >> 2;
11394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[pitch<<1] = (((SrcPtr[(pitch+(pitch<<1))] + R2) << 1) + tmp + 4) >> 3;
11404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
11414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else
11424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[0] = ((R1 << 1) + R0 + L1 + 2) >> 2;
11434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (ap < 0)
11454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
11464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp = L1 + R0 + L0;
11474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[-pitch]  = (R1 + (tmp << 1) +  L2 + 4) >> 3;
11484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp += L2;
11494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[-(pitch<<1)] = (tmp + 2) >> 2;
11504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[-(pitch+(pitch<<1))] = (((SrcPtr[-(pitch<<2)] + L2) << 1) + tmp + 4) >> 3;
11514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
11524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else
11534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[-pitch] = ((L1 << 1) + L0 + R1 + 2) >> 2;
11544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            } /* if(tmp < 0) */
11564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcPtr ++; // Increment to next set of pixel
11584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        } /* end of: for(pel=0; pel<16; pel++) */
11604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* if(Strength[0] == 4) */
11624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else   /* Normal filtering */
11644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
11654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (pel = 0; pel < 16; pel++)
11664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
11674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            Strng = Strength[pel >> 2];
11684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (Strng)
11694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
11704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                R0  = SrcPtr[0];
11714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                R1  = SrcPtr[pitch];
11724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                L0  = SrcPtr[-pitch];
11734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                L1  = SrcPtr[-(pitch<<1)]; // inc2
11744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //|R0 - L0| < Alpha
11764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp1 = R0 - L0;
11774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
11784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = (tmp1 - Alpha);
11794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // |R0 - R1| < Beta
11814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp1 = R0 - R1;
11824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
11834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp &= (tmp1 - Beta);
11844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //|L0 - L1| < Beta
11864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp1 = L0 - L1;
11874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
11884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp &= (tmp1 - Beta);
11894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0)
11914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
11924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    R2 = SrcPtr[pitch<<1]; //inc2
11934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    L2 = SrcPtr[-(pitch+(pitch<<1))]; // -inc3
11944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    // |R0 - R2| < Beta
11964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp = R0 - R2;
11974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (tmp < 0) tmp = -tmp;
11984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    aq = tmp - Beta;
11994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    // |L0 - L2| < Beta
12014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp = L0 - L2;
12024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (tmp < 0) tmp = -tmp;
12034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    ap = tmp - Beta;
12044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    c0 = C0 = clipTable[Strng];
12074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (ap < 0) c0++;
12084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (aq < 0) c0++;
12094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //dif = IClip(-c0, c0, ((Delta << 2) + (L1 - R1) + 4) >> 3);
12114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    dif = (((R0 - L0) << 2) + (L1 - R1) + 4) >> 3;
12124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp = dif + c0;
12134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)tmp > (uint)c0 << 1)
12144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
12154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~(tmp >> 31);
12164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        dif = (tmp & (c0 << 1)) - c0;
12174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
12184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //SrcPtr[0]    = (uint8)IClip(0, 255, R0 - dif);
12204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //SrcPtr[-inc] = (uint8)IClip(0, 255, L0 + dif);
12214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    RL0 = R0 + L0;
12224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    R0 -= dif;
12234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    L0 += dif;
12244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)R0 > 255)
12254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
12264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~(R0 >> 31);
12274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        R0 = tmp & 255;
12284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
12294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)L0 > 255)
12304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
12314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~(L0 >> 31);
12324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        L0 = tmp & 255;
12334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
12344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[-pitch] = L0;
12354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[0] = R0;
12364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (C0 != 0) /* Multiple zeros in the clip tables */
12384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
12394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        if (aq < 0)  // SrcPtr[inc]   += IClip(-C0, C0,(R2 + ((RL0 + 1) >> 1) - (R1<<1)) >> 1);
12404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        {
12414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            R2 = (R2 + ((RL0 + 1) >> 1) - (R1 << 1)) >> 1;
12424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            tmp = R2 + C0;
12434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            if ((uint)tmp > (uint)C0 << 1)
12444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            {
12454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                tmp = ~(tmp >> 31);
12464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                R2 = (tmp & (C0 << 1)) - C0;
12474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            }
12484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            SrcPtr[pitch] += R2;
12494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        }
12504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        if (ap < 0)  //SrcPtr[-inc2] += IClip(-C0, C0,(L2 + ((RL0 + 1) >> 1) - (L1<<1)) >> 1);
12524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        {
12534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            L2 = (L2 + ((RL0 + 1) >> 1) - (L1 << 1)) >> 1;
12544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            tmp = L2 + C0;
12554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            if ((uint)tmp > (uint)C0 << 1)
12564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            {
12574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                tmp = ~(tmp >> 31);
12584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                L2 = (tmp & (C0 << 1)) - C0;
12594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            }
12604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            SrcPtr[-(pitch<<1)] += L2;
12614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        }
12624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
12634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                } /* if(tmp < 0) */
12654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            } /* end of:  if((Strng = Strength[pel >> 2])) */
12674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcPtr ++; // Increment to next set of pixel
12694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        } /* for(pel=0; pel<16; pel++) */
12714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* else if(Strength[0] == 4) */
12734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
12744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid EdgeLoop_Luma_vertical(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch)
12764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
12774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int  pel, ap = 1, aq = 1;
12784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int  C0, c0, dif, AbsDelta, Strng, tmp, tmp1;
12794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int  L2 = 0, L1, L0, R0, R1, R2 = 0;
12804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint8 *ptr, *ptr1;
12814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    register uint R_in, L_in;
12824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint R_out, L_out;
12834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (Strength[0] == 4)  /* INTRA strong filtering */
12864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
12874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (pel = 0; pel < 16; pel++)
12894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
12904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Read 8 pels
12924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            R_in = *((uint *)SrcPtr);       // R_in = {R3, R2, R1, R0}
12934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            L_in = *((uint *)(SrcPtr - 4)); // L_in = {L0, L1, L2, L3}
12944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            R1   = (R_in >> 8) & 0xff;
12954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            R0   = R_in & 0xff;
12964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            L0   = L_in >> 24;
12974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            L1   = (L_in >> 16) & 0xff;
12984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // |R0 - R1| < Beta
13004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp1 = (R_in & 0xff) - R1;
13014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
13024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp = (tmp1 - Beta);
13034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //|L0 - L1| < Beta
13064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp1 = (L_in >> 24) - L1;
13074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
13084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp &= (tmp1 - Beta);
13094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //|R0 - L0| < Alpha
13114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            AbsDelta = (R_in & 0xff) - (L_in >> 24);
13124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (AbsDelta < 0) AbsDelta = -AbsDelta;
13134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp &= (AbsDelta - Alpha);
13144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp < 0)
13164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
13174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                AbsDelta -= ((Alpha >> 2) + 2);
13184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                R2   = (R_in >> 16) & 0xff;
13194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                L2   = (L_in >> 8) & 0xff;
13204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // |R0 - R2| < Beta && |R0 - L0| < (Alpha/4 + 2)
13224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp1 = (R_in & 0xff) - R2;
13234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
13244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                aq = AbsDelta & (tmp1 - Beta);
13254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // |L0 - L2| < Beta && |R0 - L0| < (Alpha/4 + 2)
13274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp1 = (L_in >> 24) - L2;
13284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
13294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                ap = AbsDelta & (tmp1 - Beta);
13304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                ptr = SrcPtr;
13334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (aq < 0)
13344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
13354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    R_out = (R_in >> 24) << 24; // Keep R3 at the fourth byte
13364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp  = R0 + L0 + R1;
13384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    R_out |= (((tmp << 1) +  L1 + R2 + 4) >> 3);
13394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp += R2;
13404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    R_out |= (((tmp + 2) >> 2) << 8);
13414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp1 = ((R_in >> 24) + R2) << 1;
13424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    R_out |= (((tmp1 + tmp + 4) >> 3) << 16);
13434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    *((uint *)SrcPtr) = R_out;
13454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
13464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else
13474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    *ptr = ((R1 << 1) + R0 + L1 + 2) >> 2;
13484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (ap < 0)
13514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
13524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    L_out = (L_in << 24) >> 24; // Keep L3 at the first byte
13534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp  = R0 + L0 + L1;
13554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    L_out |= ((((tmp << 1) + R1 + L2 + 4) >> 3) << 24);
13564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp += L2;
13574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    L_out |= (((tmp + 2) >> 2) << 16);
13584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp1 = ((L_in & 0xff) + L2) << 1;
13594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    L_out |= (((tmp1 + tmp + 4) >> 3) << 8);
13604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    *((uint *)(SrcPtr - 4)) = L_out;
13624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
13634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else
13644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    *(--ptr) = ((L1 << 1) + L0 + R1 + 2) >> 2;
13654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            } /* if(tmp < 0) */
13674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcPtr += pitch;    // Increment to next set of pixel
13694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        } /* end of: for(pel=0; pel<16; pel++) */
13714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* if(Strength[0] == 4) */
13734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else   /* Normal filtering */
13754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
13764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (pel = 0; pel < 16; pel++)
13784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
13794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            Strng = Strength[pel >> 2];
13804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (Strng)
13814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
13824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // Read 8 pels
13834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                R_in = *((uint *)SrcPtr);       // R_in = {R3, R2, R1, R0}
13844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                L_in = *((uint *)(SrcPtr - 4)); // L_in = {L0, L1, L2, L3}
13854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                R1   = (R_in >> 8) & 0xff;
13864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                R0   = R_in & 0xff;
13874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                L0   = L_in >> 24;
13884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                L1   = (L_in >> 16) & 0xff;
13894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //|R0 - L0| < Alpha
13914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp = R0 - L0;
13924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0) tmp = -tmp;
13934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp -= Alpha;
13944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                // |R0 - R1| < Beta
13964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp1 = R0 - R1;
13974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
13984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp &= (tmp1 - Beta);
13994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                //|L0 - L1| < Beta
14014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp1 = L0 - L1;
14024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp1 < 0) tmp1 = -tmp1;
14034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                tmp &= (tmp1 - Beta);
14044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (tmp < 0)
14064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
14074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    L2 = SrcPtr[-3];
14084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    R2 = SrcPtr[2];
14094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    // |R0 - R2| < Beta
14114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp = R0 - R2;
14124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (tmp < 0) tmp = -tmp;
14134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    aq = tmp - Beta;
14144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    // |L0 - L2| < Beta
14164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp = L0 - L2;
14174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (tmp < 0) tmp = -tmp;
14184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    ap = tmp - Beta;
14194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    c0 = C0 = clipTable[Strng];
14224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (ap < 0) c0++;
14234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (aq < 0) c0++;
14244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //dif = IClip(-c0, c0, ((Delta << 2) + (L1 - R1) + 4) >> 3);
14264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    dif = (((R0 - L0) << 2) + (L1 - R1) + 4) >> 3;
14274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp = dif + c0;
14284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)tmp > (uint)c0 << 1)
14294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
14304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~(tmp >> 31);
14314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        dif = (tmp & (c0 << 1)) - c0;
14324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
14334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    ptr = SrcPtr;
14354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    ptr1 = SrcPtr - 1;
14364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //SrcPtr[0]    = (uint8)IClip(0, 255, R0 - dif);
14374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //SrcPtr[-inc] = (uint8)IClip(0, 255, L0 + dif);
14384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    R_in = R0 - dif;
14394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    L_in = L0 + dif; /* cannot re-use R0 and L0 here */
14404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)R_in > 255)
14414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
14424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~((int)R_in >> 31);
14434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        R_in = tmp & 255;
14444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
14454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)L_in > 255)
14464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
14474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~((int)L_in >> 31);
14484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        L_in = tmp & 255;
14494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
14504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    *ptr1-- = L_in;
14514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    *ptr++  = R_in;
14524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (C0 != 0) // Multiple zeros in the clip tables
14544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
14554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        if (ap < 0)  //SrcPtr[-inc2] += IClip(-C0, C0,(L2 + ((RL0 + 1) >> 1) - (L1<<1)) >> 1);
14564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        {
14574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            L2 = (L2 + ((R0 + L0 + 1) >> 1) - (L1 << 1)) >> 1;
14584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            tmp = L2 + C0;
14594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            if ((uint)tmp > (uint)C0 << 1)
14604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            {
14614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                tmp = ~(tmp >> 31);
14624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                L2 = (tmp & (C0 << 1)) - C0;
14634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            }
14644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            *ptr1 += L2;
14654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        }
14664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        if (aq < 0)  // SrcPtr[inc] += IClip(-C0, C0,(R2 + ((RL0 + 1) >> 1) - (R1<<1)) >> 1);
14684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        {
14694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            R2 = (R2 + ((R0 + L0 + 1) >> 1) - (R1 << 1)) >> 1;
14704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            tmp = R2 + C0;
14714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            if ((uint)tmp > (uint)C0 << 1)
14724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            {
14734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                tmp = ~(tmp >> 31);
14744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                R2 = (tmp & (C0 << 1)) - C0;
14754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            }
14764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            *ptr += R2;
14774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        }
14784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
14794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                } /* if(tmp < 0) */
14814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            } /* end of:  if((Strng = Strength[pel >> 2])) */
14834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcPtr += pitch;    // Increment to next set of pixel
14854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        } /* for(pel=0; pel<16; pel++) */
14874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* else if(Strength[0] == 4) */
14894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
14914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
14924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid EdgeLoop_Chroma_vertical(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch)
14934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
14944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     pel, Strng;
14954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     c0, dif;
14964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     L1, L0, R0, R1, tmp, tmp1;
14974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint8   *ptr;
14984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint    R_in, L_in;
14994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (pel = 0; pel < 16; pel++)
15024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
15034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        Strng = Strength[pel>>2];
15044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (Strng)
15054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
15064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // Read 8 pels
15074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            R_in = *((uint *)SrcPtr);       // R_in = {R3, R2, R1, R0}
15084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            L_in = *((uint *)(SrcPtr - 4)); // L_in = {L0, L1, L2, L3}
15094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            R1   = (R_in >> 8) & 0xff;
15104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            R0   = R_in & 0xff;
15114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            L0   = L_in >> 24;
15124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            L1   = (L_in >> 16) & 0xff;
15134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // |R0 - R1| < Beta
15154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp1 = R0 - R1;
15164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
15174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp = (tmp1 - Beta);
15184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //|L0 - L1| < Beta
15204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp1 = L0 - L1;
15214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
15224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp &= (tmp1 - Beta);
15234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //|R0 - L0| < Alpha
15254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp1 = R0 - L0;
15264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
15274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp &= (tmp1 - Alpha);
15284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp < 0)
15304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
15314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                ptr = SrcPtr;
15324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (Strng == 4) /* INTRA strong filtering */
15334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
15344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    *ptr-- = ((R1 << 1) + R0 + L1 + 2) >> 2;
15354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    *ptr   = ((L1 << 1) + L0 + R1 + 2) >> 2;
15364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
15374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else  /* normal filtering */
15384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
15394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    c0  = clipTable[Strng] + 1;
15404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //dif = IClip(-c0, c0, ((Delta << 2) + (L1 - R1) + 4) >> 3);
15414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    dif = (((R0 - L0) << 2) + (L1 - R1) + 4) >> 3;
15424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp = dif + c0;
15434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)tmp > (uint)c0 << 1)
15444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
15454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~(tmp >> 31);
15464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        dif = (tmp & (c0 << 1)) - c0;
15474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
15484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //SrcPtr[0]    = (uint8)IClip(0, 255, R0 - dif);
15504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //SrcPtr[-inc] = (uint8)IClip(0, 255, L0 + dif);
15514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    L0 += dif;
15524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    R0 -= dif;
15534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)L0 > 255)
15544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
15554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~(L0 >> 31);
15564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        L0 = tmp & 255;
15574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
15584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)R0 > 255)
15594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
15604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~(R0 >> 31);
15614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        R0 = tmp & 255;
15624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
15634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    *ptr-- = R0;
15654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    *ptr = L0;
15664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
15674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
15684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pel ++;
15694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcPtr += pitch;   // Increment to next set of pixel
15704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        } /* end of: if((Strng = Strength[pel >> 2])) */
15724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else
15734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
15744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pel += 3;
15754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcPtr += (pitch << 1); //PtrInc << 1;
15764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
15774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* end of: for(pel=0; pel<16; pel++) */
15794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
15804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid EdgeLoop_Chroma_horizontal(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta, int *clipTable, int pitch)
15834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
15844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int  pel, Strng;
15854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int  c0, dif;
15864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int  L1, L0, R0, R1, tmp, tmp1;
15874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (pel = 0; pel < 16; pel++)
15894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
15904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        Strng = Strength[pel>>2];
15914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (Strng)
15924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
15934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            R0  = SrcPtr[0];
15944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            L0  = SrcPtr[-pitch];
15954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            L1  = SrcPtr[-(pitch<<1)]; //inc2
15964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            R1  = SrcPtr[pitch];
15974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
15984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            // |R0 - R1| < Beta
15994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp1 = R0 - R1;
16004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
16014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp = (tmp1 - Beta);
16024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
16034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //|L0 - L1| < Beta
16044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp1 = L0 - L1;
16054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
16064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp &= (tmp1 - Beta);
16074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
16084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            //|R0 - L0| < Alpha
16094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp1 = R0 - L0;
16104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp1 < 0) tmp1 = -tmp1;
16114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            tmp &= (tmp1 - Alpha);
16124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
16134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (tmp < 0)
16144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
16154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (Strng == 4) /* INTRA strong filtering */
16164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
16174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[0]      = ((R1 << 1) + R0 + L1 + 2) >> 2;
16184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[-pitch] = ((L1 << 1) + L0 + R1 + 2) >> 2;
16194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
16204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else  /* normal filtering */
16214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
16224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    c0  = clipTable[Strng] + 1;
16234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //dif = IClip(-c0, c0, ((Delta << 2) + (L1 - R1) + 4) >> 3);
16244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    dif = (((R0 - L0) << 2) + (L1 - R1) + 4) >> 3;
16254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    tmp = dif + c0;
16264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)tmp > (uint)c0 << 1)
16274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
16284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~(tmp >> 31);
16294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        dif = (tmp & (c0 << 1)) - c0;
16304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
16314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
16324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //SrcPtr[-inc] = (uint8)IClip(0, 255, L0 + dif);
16334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    //SrcPtr[0]    = (uint8)IClip(0, 255, R0 - dif);
16344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    L0 += dif;
16354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    R0 -= dif;
16364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)L0 > 255)
16374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
16384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~(L0 >> 31);
16394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        L0 = tmp & 255;
16404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
16414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if ((uint)R0 > 255)
16424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
16434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        tmp = ~(R0 >> 31);
16444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        R0 = tmp & 255;
16454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
16464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[0] = R0;
16474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    SrcPtr[-pitch] = L0;
16484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
16494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
16504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
16514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pel ++;
16524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcPtr ++; // Increment to next set of pixel
16534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
16544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        } /* end of: if((Strng = Strength[pel >> 2])) */
16554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else
16564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
16574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            pel += 3;
16584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            SrcPtr += 2;
16594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
16604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
16614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    } /* end of: for(pel=0; pel<16; pel++) */
16624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
16634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
16644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
16654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
16664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1667