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