129a84457aed4c45bc900998b5e11c03023264208James Dong/* ------------------------------------------------------------------ 229a84457aed4c45bc900998b5e11c03023264208James Dong * Copyright (C) 1998-2009 PacketVideo 329a84457aed4c45bc900998b5e11c03023264208James Dong * 429a84457aed4c45bc900998b5e11c03023264208James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 529a84457aed4c45bc900998b5e11c03023264208James Dong * you may not use this file except in compliance with the License. 629a84457aed4c45bc900998b5e11c03023264208James Dong * You may obtain a copy of the License at 729a84457aed4c45bc900998b5e11c03023264208James Dong * 829a84457aed4c45bc900998b5e11c03023264208James Dong * http://www.apache.org/licenses/LICENSE-2.0 929a84457aed4c45bc900998b5e11c03023264208James Dong * 1029a84457aed4c45bc900998b5e11c03023264208James Dong * Unless required by applicable law or agreed to in writing, software 1129a84457aed4c45bc900998b5e11c03023264208James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1229a84457aed4c45bc900998b5e11c03023264208James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 1329a84457aed4c45bc900998b5e11c03023264208James Dong * express or implied. 1429a84457aed4c45bc900998b5e11c03023264208James Dong * See the License for the specific language governing permissions 1529a84457aed4c45bc900998b5e11c03023264208James Dong * and limitations under the License. 1629a84457aed4c45bc900998b5e11c03023264208James Dong * ------------------------------------------------------------------- 1729a84457aed4c45bc900998b5e11c03023264208James Dong */ 1829a84457aed4c45bc900998b5e11c03023264208James Dong#include "avcenc_lib.h" 1929a84457aed4c45bc900998b5e11c03023264208James Dong#include "sad_inline.h" 2029a84457aed4c45bc900998b5e11c03023264208James Dong 2129a84457aed4c45bc900998b5e11c03023264208James Dong#define Cached_lx 176 2229a84457aed4c45bc900998b5e11c03023264208James Dong 2329a84457aed4c45bc900998b5e11c03023264208James Dong#ifdef _SAD_STAT 2429a84457aed4c45bc900998b5e11c03023264208James Donguint32 num_sad_MB = 0; 2529a84457aed4c45bc900998b5e11c03023264208James Donguint32 num_sad_Blk = 0; 2629a84457aed4c45bc900998b5e11c03023264208James Donguint32 num_sad_MB_call = 0; 2729a84457aed4c45bc900998b5e11c03023264208James Donguint32 num_sad_Blk_call = 0; 2829a84457aed4c45bc900998b5e11c03023264208James Dong 2929a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_MB_CALL() num_sad_MB_call++ 3029a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_MB() num_sad_MB++ 3129a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_BLK_CALL() num_sad_Blk_call++ 3229a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_BLK() num_sad_Blk++ 3329a84457aed4c45bc900998b5e11c03023264208James Dong 3429a84457aed4c45bc900998b5e11c03023264208James Dong#else 3529a84457aed4c45bc900998b5e11c03023264208James Dong 3629a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_MB_CALL() 3729a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_MB() 3829a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_BLK_CALL() 3929a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_BLK() 4029a84457aed4c45bc900998b5e11c03023264208James Dong 4129a84457aed4c45bc900998b5e11c03023264208James Dong#endif 4229a84457aed4c45bc900998b5e11c03023264208James Dong 4329a84457aed4c45bc900998b5e11c03023264208James Dong 4429a84457aed4c45bc900998b5e11c03023264208James Dong/* consist of 4529a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_Macroblock_C(uint8 *ref,uint8 *blk,int dmin,int lx,void *extra_info) 4629a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HTFM_Collect(uint8 *ref,uint8 *blk,int dmin,int lx,void *extra_info) 4729a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HTFM(uint8 *ref,uint8 *blk,int dmin,int lx,void *extra_info) 4829a84457aed4c45bc900998b5e11c03023264208James Dong*/ 4929a84457aed4c45bc900998b5e11c03023264208James Dong 5029a84457aed4c45bc900998b5e11c03023264208James Dong 5129a84457aed4c45bc900998b5e11c03023264208James Dong/*================================================================== 5229a84457aed4c45bc900998b5e11c03023264208James Dong Function: SAD_Macroblock 5329a84457aed4c45bc900998b5e11c03023264208James Dong Date: 09/07/2000 5429a84457aed4c45bc900998b5e11c03023264208James Dong Purpose: Compute SAD 16x16 between blk and ref. 5529a84457aed4c45bc900998b5e11c03023264208James Dong To do: Uniform subsampling will be inserted later! 5629a84457aed4c45bc900998b5e11c03023264208James Dong Hypothesis Testing Fast Matching to be used later! 5729a84457aed4c45bc900998b5e11c03023264208James Dong Changes: 5829a84457aed4c45bc900998b5e11c03023264208James Dong 11/7/00: implemented MMX 5929a84457aed4c45bc900998b5e11c03023264208James Dong 1/24/01: implemented SSE 6029a84457aed4c45bc900998b5e11c03023264208James Dong==================================================================*/ 6129a84457aed4c45bc900998b5e11c03023264208James Dong/********** C ************/ 6229a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_Macroblock_C(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info) 6329a84457aed4c45bc900998b5e11c03023264208James Dong{ 6429a84457aed4c45bc900998b5e11c03023264208James Dong (void)(extra_info); 6529a84457aed4c45bc900998b5e11c03023264208James Dong 6629a84457aed4c45bc900998b5e11c03023264208James Dong int32 x10; 6729a84457aed4c45bc900998b5e11c03023264208James Dong int dmin = (uint32)dmin_lx >> 16; 6829a84457aed4c45bc900998b5e11c03023264208James Dong int lx = dmin_lx & 0xFFFF; 6929a84457aed4c45bc900998b5e11c03023264208James Dong 7029a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_MB_CALL(); 7129a84457aed4c45bc900998b5e11c03023264208James Dong 7229a84457aed4c45bc900998b5e11c03023264208James Dong x10 = simd_sad_mb(ref, blk, dmin, lx); 7329a84457aed4c45bc900998b5e11c03023264208James Dong 7429a84457aed4c45bc900998b5e11c03023264208James Dong return x10; 7529a84457aed4c45bc900998b5e11c03023264208James Dong} 7629a84457aed4c45bc900998b5e11c03023264208James Dong 7729a84457aed4c45bc900998b5e11c03023264208James Dong#ifdef HTFM /* HTFM with uniform subsampling implementation 2/28/01 */ 7829a84457aed4c45bc900998b5e11c03023264208James Dong/*=============================================================== 7929a84457aed4c45bc900998b5e11c03023264208James Dong Function: AVCAVCSAD_MB_HTFM_Collect and AVCSAD_MB_HTFM 8029a84457aed4c45bc900998b5e11c03023264208James Dong Date: 3/2/1 8129a84457aed4c45bc900998b5e11c03023264208James Dong Purpose: Compute the SAD on a 16x16 block using 8229a84457aed4c45bc900998b5e11c03023264208James Dong uniform subsampling and hypothesis testing fast matching 8329a84457aed4c45bc900998b5e11c03023264208James Dong for early dropout. SAD_MB_HP_HTFM_Collect is to collect 8429a84457aed4c45bc900998b5e11c03023264208James Dong the statistics to compute the thresholds to be used in 8529a84457aed4c45bc900998b5e11c03023264208James Dong SAD_MB_HP_HTFM. 8629a84457aed4c45bc900998b5e11c03023264208James Dong Input/Output: 8729a84457aed4c45bc900998b5e11c03023264208James Dong Changes: 8829a84457aed4c45bc900998b5e11c03023264208James Dong ===============================================================*/ 8929a84457aed4c45bc900998b5e11c03023264208James Dong 9029a84457aed4c45bc900998b5e11c03023264208James Dongint AVCAVCSAD_MB_HTFM_Collect(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info) 9129a84457aed4c45bc900998b5e11c03023264208James Dong{ 9229a84457aed4c45bc900998b5e11c03023264208James Dong int i; 9329a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0; 9429a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *p1; 9529a84457aed4c45bc900998b5e11c03023264208James Dong int lx4 = (dmin_lx << 2) & 0x3FFFC; 9629a84457aed4c45bc900998b5e11c03023264208James Dong uint32 cur_word; 9729a84457aed4c45bc900998b5e11c03023264208James Dong int saddata[16], tmp, tmp2; /* used when collecting flag (global) is on */ 9829a84457aed4c45bc900998b5e11c03023264208James Dong int difmad; 9929a84457aed4c45bc900998b5e11c03023264208James Dong int madstar; 10029a84457aed4c45bc900998b5e11c03023264208James Dong HTFM_Stat *htfm_stat = (HTFM_Stat*) extra_info; 10129a84457aed4c45bc900998b5e11c03023264208James Dong int *abs_dif_mad_avg = &(htfm_stat->abs_dif_mad_avg); 10229a84457aed4c45bc900998b5e11c03023264208James Dong uint *countbreak = &(htfm_stat->countbreak); 10329a84457aed4c45bc900998b5e11c03023264208James Dong int *offsetRef = htfm_stat->offsetRef; 10429a84457aed4c45bc900998b5e11c03023264208James Dong 10529a84457aed4c45bc900998b5e11c03023264208James Dong madstar = (uint32)dmin_lx >> 20; 10629a84457aed4c45bc900998b5e11c03023264208James Dong 10729a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_MB_CALL(); 10829a84457aed4c45bc900998b5e11c03023264208James Dong 10929a84457aed4c45bc900998b5e11c03023264208James Dong blk -= 4; 11029a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) 11129a84457aed4c45bc900998b5e11c03023264208James Dong { 11229a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref + offsetRef[i]; 11329a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 11429a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 11529a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 24) & 0xFF; 11629a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 11729a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 11829a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 16) & 0xFF; 11929a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 12029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 12129a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 8) & 0xFF; 12229a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 12329a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 12429a84457aed4c45bc900998b5e11c03023264208James Dong p1 += lx4; 12529a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word & 0xFF); 12629a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 12729a84457aed4c45bc900998b5e11c03023264208James Dong 12829a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 12929a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 13029a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 24) & 0xFF; 13129a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 13229a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 13329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 16) & 0xFF; 13429a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 13529a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 13629a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 8) & 0xFF; 13729a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 13829a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 13929a84457aed4c45bc900998b5e11c03023264208James Dong p1 += lx4; 14029a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word & 0xFF); 14129a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 14229a84457aed4c45bc900998b5e11c03023264208James Dong 14329a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 14429a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 14529a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 24) & 0xFF; 14629a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 14729a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 14829a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 16) & 0xFF; 14929a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 15029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 15129a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 8) & 0xFF; 15229a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 15329a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 15429a84457aed4c45bc900998b5e11c03023264208James Dong p1 += lx4; 15529a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word & 0xFF); 15629a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 15729a84457aed4c45bc900998b5e11c03023264208James Dong 15829a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 15929a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 16029a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 24) & 0xFF; 16129a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 16229a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 16329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 16) & 0xFF; 16429a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 16529a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 16629a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 8) & 0xFF; 16729a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 16829a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 16929a84457aed4c45bc900998b5e11c03023264208James Dong p1 += lx4; 17029a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word & 0xFF); 17129a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 17229a84457aed4c45bc900998b5e11c03023264208James Dong 17329a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_MB(); 17429a84457aed4c45bc900998b5e11c03023264208James Dong 17529a84457aed4c45bc900998b5e11c03023264208James Dong saddata[i] = sad; 17629a84457aed4c45bc900998b5e11c03023264208James Dong 17729a84457aed4c45bc900998b5e11c03023264208James Dong if (i > 0) 17829a84457aed4c45bc900998b5e11c03023264208James Dong { 17929a84457aed4c45bc900998b5e11c03023264208James Dong if ((uint32)sad > ((uint32)dmin_lx >> 16)) 18029a84457aed4c45bc900998b5e11c03023264208James Dong { 18129a84457aed4c45bc900998b5e11c03023264208James Dong difmad = saddata[0] - ((saddata[1] + 1) >> 1); 18229a84457aed4c45bc900998b5e11c03023264208James Dong (*abs_dif_mad_avg) += ((difmad > 0) ? difmad : -difmad); 18329a84457aed4c45bc900998b5e11c03023264208James Dong (*countbreak)++; 18429a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 18529a84457aed4c45bc900998b5e11c03023264208James Dong } 18629a84457aed4c45bc900998b5e11c03023264208James Dong } 18729a84457aed4c45bc900998b5e11c03023264208James Dong } 18829a84457aed4c45bc900998b5e11c03023264208James Dong 18929a84457aed4c45bc900998b5e11c03023264208James Dong difmad = saddata[0] - ((saddata[1] + 1) >> 1); 19029a84457aed4c45bc900998b5e11c03023264208James Dong (*abs_dif_mad_avg) += ((difmad > 0) ? difmad : -difmad); 19129a84457aed4c45bc900998b5e11c03023264208James Dong (*countbreak)++; 19229a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 19329a84457aed4c45bc900998b5e11c03023264208James Dong} 19429a84457aed4c45bc900998b5e11c03023264208James Dong 19529a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HTFM(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info) 19629a84457aed4c45bc900998b5e11c03023264208James Dong{ 19729a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0; 19829a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *p1; 19929a84457aed4c45bc900998b5e11c03023264208James Dong 20029a84457aed4c45bc900998b5e11c03023264208James Dong int i; 20129a84457aed4c45bc900998b5e11c03023264208James Dong int tmp, tmp2; 20229a84457aed4c45bc900998b5e11c03023264208James Dong int lx4 = (dmin_lx << 2) & 0x3FFFC; 20329a84457aed4c45bc900998b5e11c03023264208James Dong int sadstar = 0, madstar; 20429a84457aed4c45bc900998b5e11c03023264208James Dong int *nrmlz_th = (int*) extra_info; 20529a84457aed4c45bc900998b5e11c03023264208James Dong int *offsetRef = (int*) extra_info + 32; 20629a84457aed4c45bc900998b5e11c03023264208James Dong uint32 cur_word; 20729a84457aed4c45bc900998b5e11c03023264208James Dong 20829a84457aed4c45bc900998b5e11c03023264208James Dong madstar = (uint32)dmin_lx >> 20; 20929a84457aed4c45bc900998b5e11c03023264208James Dong 21029a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_MB_CALL(); 21129a84457aed4c45bc900998b5e11c03023264208James Dong 21229a84457aed4c45bc900998b5e11c03023264208James Dong blk -= 4; 21329a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) 21429a84457aed4c45bc900998b5e11c03023264208James Dong { 21529a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref + offsetRef[i]; 21629a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 21729a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 21829a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 24) & 0xFF; 21929a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 22029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 22129a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 16) & 0xFF; 22229a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 22329a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 22429a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 8) & 0xFF; 22529a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 22629a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 22729a84457aed4c45bc900998b5e11c03023264208James Dong p1 += lx4; 22829a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word & 0xFF); 22929a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 23029a84457aed4c45bc900998b5e11c03023264208James Dong 23129a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 23229a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 23329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 24) & 0xFF; 23429a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 23529a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 23629a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 16) & 0xFF; 23729a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 23829a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 23929a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 8) & 0xFF; 24029a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 24129a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 24229a84457aed4c45bc900998b5e11c03023264208James Dong p1 += lx4; 24329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word & 0xFF); 24429a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 24529a84457aed4c45bc900998b5e11c03023264208James Dong 24629a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 24729a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 24829a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 24) & 0xFF; 24929a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 25029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 25129a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 16) & 0xFF; 25229a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 25329a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 25429a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 8) & 0xFF; 25529a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 25629a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 25729a84457aed4c45bc900998b5e11c03023264208James Dong p1 += lx4; 25829a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word & 0xFF); 25929a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 26029a84457aed4c45bc900998b5e11c03023264208James Dong 26129a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 26229a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 26329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 24) & 0xFF; 26429a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 26529a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 26629a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 16) & 0xFF; 26729a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 26829a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 26929a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 8) & 0xFF; 27029a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 27129a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 27229a84457aed4c45bc900998b5e11c03023264208James Dong p1 += lx4; 27329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word & 0xFF); 27429a84457aed4c45bc900998b5e11c03023264208James Dong sad = SUB_SAD(sad, tmp, tmp2); 27529a84457aed4c45bc900998b5e11c03023264208James Dong 27629a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_MB(); 27729a84457aed4c45bc900998b5e11c03023264208James Dong 27829a84457aed4c45bc900998b5e11c03023264208James Dong sadstar += madstar; 27929a84457aed4c45bc900998b5e11c03023264208James Dong if (((uint32)sad <= ((uint32)dmin_lx >> 16)) && (sad <= (sadstar - *nrmlz_th++))) 28029a84457aed4c45bc900998b5e11c03023264208James Dong ; 28129a84457aed4c45bc900998b5e11c03023264208James Dong else 28229a84457aed4c45bc900998b5e11c03023264208James Dong return 65536; 28329a84457aed4c45bc900998b5e11c03023264208James Dong } 28429a84457aed4c45bc900998b5e11c03023264208James Dong 28529a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 28629a84457aed4c45bc900998b5e11c03023264208James Dong} 28729a84457aed4c45bc900998b5e11c03023264208James Dong#endif /* HTFM */ 28829a84457aed4c45bc900998b5e11c03023264208James Dong 28929a84457aed4c45bc900998b5e11c03023264208James Dong 29029a84457aed4c45bc900998b5e11c03023264208James Dong 291