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