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/* contains 1929a84457aed4c45bc900998b5e11c03023264208James Dongint AVCHalfPel1_SAD_MB(uint8 *ref,uint8 *blk,int dmin,int width,int ih,int jh) 2029a84457aed4c45bc900998b5e11c03023264208James Dongint AVCHalfPel2_SAD_MB(uint8 *ref,uint8 *blk,int dmin,int width) 2129a84457aed4c45bc900998b5e11c03023264208James Dongint AVCHalfPel1_SAD_Blk(uint8 *ref,uint8 *blk,int dmin,int width,int ih,int jh) 2229a84457aed4c45bc900998b5e11c03023264208James Dongint AVCHalfPel2_SAD_Blk(uint8 *ref,uint8 *blk,int dmin,int width) 2329a84457aed4c45bc900998b5e11c03023264208James Dong 2429a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HalfPel_C(uint8 *ref,uint8 *blk,int dmin,int width,int rx,int xh,int yh,void *extra_info) 2529a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HP_HTFM_Collect(uint8 *ref,uint8 *blk,int dmin,int width,int rx,int xh,int yh,void *extra_info) 2629a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HP_HTFM(uint8 *ref,uint8 *blk,int dmin,int width,int rx,int xh,int yh,void *extra_info) 2729a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_Blk_HalfPel_C(uint8 *ref,uint8 *blk,int dmin,int width,int rx,int xh,int yh,void *extra_info) 2829a84457aed4c45bc900998b5e11c03023264208James Dong*/ 2929a84457aed4c45bc900998b5e11c03023264208James Dong 3029a84457aed4c45bc900998b5e11c03023264208James Dong#include "avcenc_lib.h" 3129a84457aed4c45bc900998b5e11c03023264208James Dong#include "sad_halfpel_inline.h" 3229a84457aed4c45bc900998b5e11c03023264208James Dong 3329a84457aed4c45bc900998b5e11c03023264208James Dong#ifdef _SAD_STAT 3429a84457aed4c45bc900998b5e11c03023264208James Donguint32 num_sad_HP_MB = 0; 3529a84457aed4c45bc900998b5e11c03023264208James Donguint32 num_sad_HP_Blk = 0; 3629a84457aed4c45bc900998b5e11c03023264208James Donguint32 num_sad_HP_MB_call = 0; 3729a84457aed4c45bc900998b5e11c03023264208James Donguint32 num_sad_HP_Blk_call = 0; 3829a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_HP_MB_CALL() num_sad_HP_MB_call++ 3929a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_HP_MB() num_sad_HP_MB++ 4029a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_HP_BLK_CALL() num_sad_HP_Blk_call++ 4129a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_HP_BLK() num_sad_HP_Blk++ 4229a84457aed4c45bc900998b5e11c03023264208James Dong#else 4329a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_HP_MB_CALL() 4429a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_HP_MB() 4529a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_HP_BLK_CALL() 4629a84457aed4c45bc900998b5e11c03023264208James Dong#define NUM_SAD_HP_BLK() 4729a84457aed4c45bc900998b5e11c03023264208James Dong#endif 4829a84457aed4c45bc900998b5e11c03023264208James Dong 4929a84457aed4c45bc900998b5e11c03023264208James Dong 5029a84457aed4c45bc900998b5e11c03023264208James Dong 5129a84457aed4c45bc900998b5e11c03023264208James Dong/*=============================================================== 5229a84457aed4c45bc900998b5e11c03023264208James Dong Function: SAD_MB_HalfPel 5329a84457aed4c45bc900998b5e11c03023264208James Dong Date: 09/17/2000 5429a84457aed4c45bc900998b5e11c03023264208James Dong Purpose: Compute the SAD on the half-pel resolution 5529a84457aed4c45bc900998b5e11c03023264208James Dong Input/Output: hmem is assumed to be a pointer to the starting 5629a84457aed4c45bc900998b5e11c03023264208James Dong point of the search in the 33x33 matrix search region 5729a84457aed4c45bc900998b5e11c03023264208James Dong Changes: 5829a84457aed4c45bc900998b5e11c03023264208James Dong 11/7/00: implemented MMX 5929a84457aed4c45bc900998b5e11c03023264208James Dong ===============================================================*/ 6029a84457aed4c45bc900998b5e11c03023264208James Dong/*================================================================== 6129a84457aed4c45bc900998b5e11c03023264208James Dong Function: AVCSAD_MB_HalfPel_C 6229a84457aed4c45bc900998b5e11c03023264208James Dong Date: 04/30/2001 6329a84457aed4c45bc900998b5e11c03023264208James Dong Purpose: Compute SAD 16x16 between blk and ref in halfpel 6429a84457aed4c45bc900998b5e11c03023264208James Dong resolution, 6529a84457aed4c45bc900998b5e11c03023264208James Dong Changes: 6629a84457aed4c45bc900998b5e11c03023264208James Dong ==================================================================*/ 6729a84457aed4c45bc900998b5e11c03023264208James Dong/* One component is half-pel */ 6829a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HalfPel_Cxhyh(uint8 *ref, uint8 *blk, int dmin_rx, void *extra_info) 6929a84457aed4c45bc900998b5e11c03023264208James Dong{ 7029a84457aed4c45bc900998b5e11c03023264208James Dong (void)(extra_info); 7129a84457aed4c45bc900998b5e11c03023264208James Dong 7229a84457aed4c45bc900998b5e11c03023264208James Dong int i, j; 7329a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0; 7429a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *kk, *p1, *p2, *p3, *p4; 7529a84457aed4c45bc900998b5e11c03023264208James Dong// int sumref=0; 7629a84457aed4c45bc900998b5e11c03023264208James Dong int temp; 7729a84457aed4c45bc900998b5e11c03023264208James Dong int rx = dmin_rx & 0xFFFF; 7829a84457aed4c45bc900998b5e11c03023264208James Dong 7929a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB_CALL(); 8029a84457aed4c45bc900998b5e11c03023264208James Dong 8129a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref; 8229a84457aed4c45bc900998b5e11c03023264208James Dong p2 = ref + 1; 8329a84457aed4c45bc900998b5e11c03023264208James Dong p3 = ref + rx; 8429a84457aed4c45bc900998b5e11c03023264208James Dong p4 = ref + rx + 1; 8529a84457aed4c45bc900998b5e11c03023264208James Dong kk = blk; 8629a84457aed4c45bc900998b5e11c03023264208James Dong 8729a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) 8829a84457aed4c45bc900998b5e11c03023264208James Dong { 8929a84457aed4c45bc900998b5e11c03023264208James Dong for (j = 0; j < 16; j++) 9029a84457aed4c45bc900998b5e11c03023264208James Dong { 9129a84457aed4c45bc900998b5e11c03023264208James Dong 9229a84457aed4c45bc900998b5e11c03023264208James Dong temp = ((p1[j] + p2[j] + p3[j] + p4[j] + 2) >> 2) - *kk++; 9329a84457aed4c45bc900998b5e11c03023264208James Dong sad += AVC_ABS(temp); 9429a84457aed4c45bc900998b5e11c03023264208James Dong } 9529a84457aed4c45bc900998b5e11c03023264208James Dong 9629a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB(); 9729a84457aed4c45bc900998b5e11c03023264208James Dong 9829a84457aed4c45bc900998b5e11c03023264208James Dong if (sad > (int)((uint32)dmin_rx >> 16)) 9929a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 10029a84457aed4c45bc900998b5e11c03023264208James Dong 10129a84457aed4c45bc900998b5e11c03023264208James Dong p1 += rx; 10229a84457aed4c45bc900998b5e11c03023264208James Dong p3 += rx; 10329a84457aed4c45bc900998b5e11c03023264208James Dong p2 += rx; 10429a84457aed4c45bc900998b5e11c03023264208James Dong p4 += rx; 10529a84457aed4c45bc900998b5e11c03023264208James Dong } 10629a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 10729a84457aed4c45bc900998b5e11c03023264208James Dong} 10829a84457aed4c45bc900998b5e11c03023264208James Dong 10929a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HalfPel_Cyh(uint8 *ref, uint8 *blk, int dmin_rx, void *extra_info) 11029a84457aed4c45bc900998b5e11c03023264208James Dong{ 11129a84457aed4c45bc900998b5e11c03023264208James Dong (void)(extra_info); 11229a84457aed4c45bc900998b5e11c03023264208James Dong 11329a84457aed4c45bc900998b5e11c03023264208James Dong int i, j; 11429a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0; 11529a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *kk, *p1, *p2; 11629a84457aed4c45bc900998b5e11c03023264208James Dong// int sumref=0; 11729a84457aed4c45bc900998b5e11c03023264208James Dong int temp; 11829a84457aed4c45bc900998b5e11c03023264208James Dong int rx = dmin_rx & 0xFFFF; 11929a84457aed4c45bc900998b5e11c03023264208James Dong 12029a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB_CALL(); 12129a84457aed4c45bc900998b5e11c03023264208James Dong 12229a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref; 12329a84457aed4c45bc900998b5e11c03023264208James Dong p2 = ref + rx; /* either left/right or top/bottom pixel */ 12429a84457aed4c45bc900998b5e11c03023264208James Dong kk = blk; 12529a84457aed4c45bc900998b5e11c03023264208James Dong 12629a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) 12729a84457aed4c45bc900998b5e11c03023264208James Dong { 12829a84457aed4c45bc900998b5e11c03023264208James Dong for (j = 0; j < 16; j++) 12929a84457aed4c45bc900998b5e11c03023264208James Dong { 13029a84457aed4c45bc900998b5e11c03023264208James Dong 13129a84457aed4c45bc900998b5e11c03023264208James Dong temp = ((p1[j] + p2[j] + 1) >> 1) - *kk++; 13229a84457aed4c45bc900998b5e11c03023264208James Dong sad += AVC_ABS(temp); 13329a84457aed4c45bc900998b5e11c03023264208James Dong } 13429a84457aed4c45bc900998b5e11c03023264208James Dong 13529a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB(); 13629a84457aed4c45bc900998b5e11c03023264208James Dong 13729a84457aed4c45bc900998b5e11c03023264208James Dong if (sad > (int)((uint32)dmin_rx >> 16)) 13829a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 13929a84457aed4c45bc900998b5e11c03023264208James Dong p1 += rx; 14029a84457aed4c45bc900998b5e11c03023264208James Dong p2 += rx; 14129a84457aed4c45bc900998b5e11c03023264208James Dong } 14229a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 14329a84457aed4c45bc900998b5e11c03023264208James Dong} 14429a84457aed4c45bc900998b5e11c03023264208James Dong 14529a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HalfPel_Cxh(uint8 *ref, uint8 *blk, int dmin_rx, void *extra_info) 14629a84457aed4c45bc900998b5e11c03023264208James Dong{ 14729a84457aed4c45bc900998b5e11c03023264208James Dong (void)(extra_info); 14829a84457aed4c45bc900998b5e11c03023264208James Dong 14929a84457aed4c45bc900998b5e11c03023264208James Dong int i, j; 15029a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0; 15129a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *kk, *p1; 15229a84457aed4c45bc900998b5e11c03023264208James Dong int temp; 15329a84457aed4c45bc900998b5e11c03023264208James Dong int rx = dmin_rx & 0xFFFF; 15429a84457aed4c45bc900998b5e11c03023264208James Dong 15529a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB_CALL(); 15629a84457aed4c45bc900998b5e11c03023264208James Dong 15729a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref; 15829a84457aed4c45bc900998b5e11c03023264208James Dong kk = blk; 15929a84457aed4c45bc900998b5e11c03023264208James Dong 16029a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) 16129a84457aed4c45bc900998b5e11c03023264208James Dong { 16229a84457aed4c45bc900998b5e11c03023264208James Dong for (j = 0; j < 16; j++) 16329a84457aed4c45bc900998b5e11c03023264208James Dong { 16429a84457aed4c45bc900998b5e11c03023264208James Dong 16529a84457aed4c45bc900998b5e11c03023264208James Dong temp = ((p1[j] + p1[j+1] + 1) >> 1) - *kk++; 16629a84457aed4c45bc900998b5e11c03023264208James Dong sad += AVC_ABS(temp); 16729a84457aed4c45bc900998b5e11c03023264208James Dong } 16829a84457aed4c45bc900998b5e11c03023264208James Dong 16929a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB(); 17029a84457aed4c45bc900998b5e11c03023264208James Dong 17129a84457aed4c45bc900998b5e11c03023264208James Dong if (sad > (int)((uint32)dmin_rx >> 16)) 17229a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 17329a84457aed4c45bc900998b5e11c03023264208James Dong p1 += rx; 17429a84457aed4c45bc900998b5e11c03023264208James Dong } 17529a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 17629a84457aed4c45bc900998b5e11c03023264208James Dong} 17729a84457aed4c45bc900998b5e11c03023264208James Dong 17829a84457aed4c45bc900998b5e11c03023264208James Dong#ifdef HTFM /* HTFM with uniform subsampling implementation, 2/28/01 */ 17929a84457aed4c45bc900998b5e11c03023264208James Dong 18029a84457aed4c45bc900998b5e11c03023264208James Dong//Checheck here 18129a84457aed4c45bc900998b5e11c03023264208James Dongint AVCAVCSAD_MB_HP_HTFM_Collectxhyh(uint8 *ref, uint8 *blk, int dmin_rx, void *extra_info) 18229a84457aed4c45bc900998b5e11c03023264208James Dong{ 18329a84457aed4c45bc900998b5e11c03023264208James Dong int i, j; 18429a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0; 18529a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *p1, *p2; 18629a84457aed4c45bc900998b5e11c03023264208James Dong int rx = dmin_rx & 0xFFFF; 18729a84457aed4c45bc900998b5e11c03023264208James Dong int refwx4 = rx << 2; 18829a84457aed4c45bc900998b5e11c03023264208James Dong int saddata[16]; /* used when collecting flag (global) is on */ 18929a84457aed4c45bc900998b5e11c03023264208James Dong int difmad, tmp, tmp2; 19029a84457aed4c45bc900998b5e11c03023264208James Dong int madstar; 19129a84457aed4c45bc900998b5e11c03023264208James Dong HTFM_Stat *htfm_stat = (HTFM_Stat*) extra_info; 19229a84457aed4c45bc900998b5e11c03023264208James Dong int *abs_dif_mad_avg = &(htfm_stat->abs_dif_mad_avg); 19329a84457aed4c45bc900998b5e11c03023264208James Dong UInt *countbreak = &(htfm_stat->countbreak); 19429a84457aed4c45bc900998b5e11c03023264208James Dong int *offsetRef = htfm_stat->offsetRef; 19529a84457aed4c45bc900998b5e11c03023264208James Dong uint32 cur_word; 19629a84457aed4c45bc900998b5e11c03023264208James Dong 19729a84457aed4c45bc900998b5e11c03023264208James Dong madstar = (uint32)dmin_rx >> 20; 19829a84457aed4c45bc900998b5e11c03023264208James Dong 19929a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB_CALL(); 20029a84457aed4c45bc900998b5e11c03023264208James Dong 20129a84457aed4c45bc900998b5e11c03023264208James Dong blk -= 4; 20229a84457aed4c45bc900998b5e11c03023264208James Dong 20329a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) /* 16 stages */ 20429a84457aed4c45bc900998b5e11c03023264208James Dong { 20529a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref + offsetRef[i]; 20629a84457aed4c45bc900998b5e11c03023264208James Dong p2 = p1 + rx; 20729a84457aed4c45bc900998b5e11c03023264208James Dong 20829a84457aed4c45bc900998b5e11c03023264208James Dong j = 4;/* 4 lines */ 20929a84457aed4c45bc900998b5e11c03023264208James Dong do 21029a84457aed4c45bc900998b5e11c03023264208James Dong { 21129a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 21229a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12] + p2[12]; 21329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[13] + p2[13]; 21429a84457aed4c45bc900998b5e11c03023264208James Dong tmp += tmp2; 21529a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 24) & 0xFF; 21629a84457aed4c45bc900998b5e11c03023264208James Dong tmp += 2; 21729a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP2_SUB_SAD(sad, tmp, tmp2);; 21829a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8] + p2[8]; 21929a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[9] + p2[9]; 22029a84457aed4c45bc900998b5e11c03023264208James Dong tmp += tmp2; 22129a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 16) & 0xFF; 22229a84457aed4c45bc900998b5e11c03023264208James Dong tmp += 2; 22329a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP2_SUB_SAD(sad, tmp, tmp2);; 22429a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4] + p2[4]; 22529a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[5] + p2[5]; 22629a84457aed4c45bc900998b5e11c03023264208James Dong tmp += tmp2; 22729a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 8) & 0xFF; 22829a84457aed4c45bc900998b5e11c03023264208James Dong tmp += 2; 22929a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP2_SUB_SAD(sad, tmp, tmp2);; 23029a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[1] + p2[1]; 23129a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0] + p2[0]; 23229a84457aed4c45bc900998b5e11c03023264208James Dong p1 += refwx4; 23329a84457aed4c45bc900998b5e11c03023264208James Dong p2 += refwx4; 23429a84457aed4c45bc900998b5e11c03023264208James Dong tmp += tmp2; 23529a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word & 0xFF); 23629a84457aed4c45bc900998b5e11c03023264208James Dong tmp += 2; 23729a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP2_SUB_SAD(sad, tmp, tmp2);; 23829a84457aed4c45bc900998b5e11c03023264208James Dong } 23929a84457aed4c45bc900998b5e11c03023264208James Dong while (--j); 24029a84457aed4c45bc900998b5e11c03023264208James Dong 24129a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB(); 24229a84457aed4c45bc900998b5e11c03023264208James Dong 24329a84457aed4c45bc900998b5e11c03023264208James Dong saddata[i] = sad; 24429a84457aed4c45bc900998b5e11c03023264208James Dong 24529a84457aed4c45bc900998b5e11c03023264208James Dong if (i > 0) 24629a84457aed4c45bc900998b5e11c03023264208James Dong { 24729a84457aed4c45bc900998b5e11c03023264208James Dong if (sad > ((uint32)dmin_rx >> 16)) 24829a84457aed4c45bc900998b5e11c03023264208James Dong { 24929a84457aed4c45bc900998b5e11c03023264208James Dong difmad = saddata[0] - ((saddata[1] + 1) >> 1); 25029a84457aed4c45bc900998b5e11c03023264208James Dong (*abs_dif_mad_avg) += ((difmad > 0) ? difmad : -difmad); 25129a84457aed4c45bc900998b5e11c03023264208James Dong (*countbreak)++; 25229a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 25329a84457aed4c45bc900998b5e11c03023264208James Dong } 25429a84457aed4c45bc900998b5e11c03023264208James Dong } 25529a84457aed4c45bc900998b5e11c03023264208James Dong } 25629a84457aed4c45bc900998b5e11c03023264208James Dong difmad = saddata[0] - ((saddata[1] + 1) >> 1); 25729a84457aed4c45bc900998b5e11c03023264208James Dong (*abs_dif_mad_avg) += ((difmad > 0) ? difmad : -difmad); 25829a84457aed4c45bc900998b5e11c03023264208James Dong (*countbreak)++; 25929a84457aed4c45bc900998b5e11c03023264208James Dong 26029a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 26129a84457aed4c45bc900998b5e11c03023264208James Dong} 26229a84457aed4c45bc900998b5e11c03023264208James Dong 26329a84457aed4c45bc900998b5e11c03023264208James Dongint AVCAVCSAD_MB_HP_HTFM_Collectyh(uint8 *ref, uint8 *blk, int dmin_rx, void *extra_info) 26429a84457aed4c45bc900998b5e11c03023264208James Dong{ 26529a84457aed4c45bc900998b5e11c03023264208James Dong int i, j; 26629a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0; 26729a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *p1, *p2; 26829a84457aed4c45bc900998b5e11c03023264208James Dong int rx = dmin_rx & 0xFFFF; 26929a84457aed4c45bc900998b5e11c03023264208James Dong int refwx4 = rx << 2; 27029a84457aed4c45bc900998b5e11c03023264208James Dong int saddata[16]; /* used when collecting flag (global) is on */ 27129a84457aed4c45bc900998b5e11c03023264208James Dong int difmad, tmp, tmp2; 27229a84457aed4c45bc900998b5e11c03023264208James Dong int madstar; 27329a84457aed4c45bc900998b5e11c03023264208James Dong HTFM_Stat *htfm_stat = (HTFM_Stat*) extra_info; 27429a84457aed4c45bc900998b5e11c03023264208James Dong int *abs_dif_mad_avg = &(htfm_stat->abs_dif_mad_avg); 27529a84457aed4c45bc900998b5e11c03023264208James Dong UInt *countbreak = &(htfm_stat->countbreak); 27629a84457aed4c45bc900998b5e11c03023264208James Dong int *offsetRef = htfm_stat->offsetRef; 27729a84457aed4c45bc900998b5e11c03023264208James Dong uint32 cur_word; 27829a84457aed4c45bc900998b5e11c03023264208James Dong 27929a84457aed4c45bc900998b5e11c03023264208James Dong madstar = (uint32)dmin_rx >> 20; 28029a84457aed4c45bc900998b5e11c03023264208James Dong 28129a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB_CALL(); 28229a84457aed4c45bc900998b5e11c03023264208James Dong 28329a84457aed4c45bc900998b5e11c03023264208James Dong blk -= 4; 28429a84457aed4c45bc900998b5e11c03023264208James Dong 28529a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) /* 16 stages */ 28629a84457aed4c45bc900998b5e11c03023264208James Dong { 28729a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref + offsetRef[i]; 28829a84457aed4c45bc900998b5e11c03023264208James Dong p2 = p1 + rx; 28929a84457aed4c45bc900998b5e11c03023264208James Dong j = 4; 29029a84457aed4c45bc900998b5e11c03023264208James Dong do 29129a84457aed4c45bc900998b5e11c03023264208James Dong { 29229a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 29329a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 29429a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p2[12]; 29529a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 29629a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 29729a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 24) & 0xFF; 29829a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 29929a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 30029a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p2[8]; 30129a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 30229a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 30329a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 16) & 0xFF; 30429a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 30529a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 30629a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p2[4]; 30729a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 30829a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 30929a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 8) & 0xFF; 31029a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 31129a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 31229a84457aed4c45bc900998b5e11c03023264208James Dong p1 += refwx4; 31329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p2[0]; 31429a84457aed4c45bc900998b5e11c03023264208James Dong p2 += refwx4; 31529a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 31629a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 31729a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word & 0xFF); 31829a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 31929a84457aed4c45bc900998b5e11c03023264208James Dong } 32029a84457aed4c45bc900998b5e11c03023264208James Dong while (--j); 32129a84457aed4c45bc900998b5e11c03023264208James Dong 32229a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB(); 32329a84457aed4c45bc900998b5e11c03023264208James Dong 32429a84457aed4c45bc900998b5e11c03023264208James Dong saddata[i] = sad; 32529a84457aed4c45bc900998b5e11c03023264208James Dong 32629a84457aed4c45bc900998b5e11c03023264208James Dong if (i > 0) 32729a84457aed4c45bc900998b5e11c03023264208James Dong { 32829a84457aed4c45bc900998b5e11c03023264208James Dong if (sad > ((uint32)dmin_rx >> 16)) 32929a84457aed4c45bc900998b5e11c03023264208James Dong { 33029a84457aed4c45bc900998b5e11c03023264208James Dong difmad = saddata[0] - ((saddata[1] + 1) >> 1); 33129a84457aed4c45bc900998b5e11c03023264208James Dong (*abs_dif_mad_avg) += ((difmad > 0) ? difmad : -difmad); 33229a84457aed4c45bc900998b5e11c03023264208James Dong (*countbreak)++; 33329a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 33429a84457aed4c45bc900998b5e11c03023264208James Dong } 33529a84457aed4c45bc900998b5e11c03023264208James Dong } 33629a84457aed4c45bc900998b5e11c03023264208James Dong } 33729a84457aed4c45bc900998b5e11c03023264208James Dong difmad = saddata[0] - ((saddata[1] + 1) >> 1); 33829a84457aed4c45bc900998b5e11c03023264208James Dong (*abs_dif_mad_avg) += ((difmad > 0) ? difmad : -difmad); 33929a84457aed4c45bc900998b5e11c03023264208James Dong (*countbreak)++; 34029a84457aed4c45bc900998b5e11c03023264208James Dong 34129a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 34229a84457aed4c45bc900998b5e11c03023264208James Dong} 34329a84457aed4c45bc900998b5e11c03023264208James Dong 34429a84457aed4c45bc900998b5e11c03023264208James Dongint AVCAVCSAD_MB_HP_HTFM_Collectxh(uint8 *ref, uint8 *blk, int dmin_rx, void *extra_info) 34529a84457aed4c45bc900998b5e11c03023264208James Dong{ 34629a84457aed4c45bc900998b5e11c03023264208James Dong int i, j; 34729a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0; 34829a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *p1; 34929a84457aed4c45bc900998b5e11c03023264208James Dong int rx = dmin_rx & 0xFFFF; 35029a84457aed4c45bc900998b5e11c03023264208James Dong int refwx4 = rx << 2; 35129a84457aed4c45bc900998b5e11c03023264208James Dong int saddata[16]; /* used when collecting flag (global) is on */ 35229a84457aed4c45bc900998b5e11c03023264208James Dong int difmad, tmp, tmp2; 35329a84457aed4c45bc900998b5e11c03023264208James Dong int madstar; 35429a84457aed4c45bc900998b5e11c03023264208James Dong HTFM_Stat *htfm_stat = (HTFM_Stat*) extra_info; 35529a84457aed4c45bc900998b5e11c03023264208James Dong int *abs_dif_mad_avg = &(htfm_stat->abs_dif_mad_avg); 35629a84457aed4c45bc900998b5e11c03023264208James Dong UInt *countbreak = &(htfm_stat->countbreak); 35729a84457aed4c45bc900998b5e11c03023264208James Dong int *offsetRef = htfm_stat->offsetRef; 35829a84457aed4c45bc900998b5e11c03023264208James Dong uint32 cur_word; 35929a84457aed4c45bc900998b5e11c03023264208James Dong 36029a84457aed4c45bc900998b5e11c03023264208James Dong madstar = (uint32)dmin_rx >> 20; 36129a84457aed4c45bc900998b5e11c03023264208James Dong 36229a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB_CALL(); 36329a84457aed4c45bc900998b5e11c03023264208James Dong 36429a84457aed4c45bc900998b5e11c03023264208James Dong blk -= 4; 36529a84457aed4c45bc900998b5e11c03023264208James Dong 36629a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) /* 16 stages */ 36729a84457aed4c45bc900998b5e11c03023264208James Dong { 36829a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref + offsetRef[i]; 36929a84457aed4c45bc900998b5e11c03023264208James Dong 37029a84457aed4c45bc900998b5e11c03023264208James Dong j = 4; /* 4 lines */ 37129a84457aed4c45bc900998b5e11c03023264208James Dong do 37229a84457aed4c45bc900998b5e11c03023264208James Dong { 37329a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 37429a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 37529a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[13]; 37629a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 37729a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 37829a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 24) & 0xFF; 37929a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 38029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 38129a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[9]; 38229a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 38329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 38429a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 16) & 0xFF; 38529a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 38629a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 38729a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[5]; 38829a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 38929a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 39029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 8) & 0xFF; 39129a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 39229a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 39329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[1]; 39429a84457aed4c45bc900998b5e11c03023264208James Dong p1 += refwx4; 39529a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 39629a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 39729a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word & 0xFF); 39829a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 39929a84457aed4c45bc900998b5e11c03023264208James Dong } 40029a84457aed4c45bc900998b5e11c03023264208James Dong while (--j); 40129a84457aed4c45bc900998b5e11c03023264208James Dong 40229a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB(); 40329a84457aed4c45bc900998b5e11c03023264208James Dong 40429a84457aed4c45bc900998b5e11c03023264208James Dong saddata[i] = sad; 40529a84457aed4c45bc900998b5e11c03023264208James Dong 40629a84457aed4c45bc900998b5e11c03023264208James Dong if (i > 0) 40729a84457aed4c45bc900998b5e11c03023264208James Dong { 40829a84457aed4c45bc900998b5e11c03023264208James Dong if (sad > ((uint32)dmin_rx >> 16)) 40929a84457aed4c45bc900998b5e11c03023264208James Dong { 41029a84457aed4c45bc900998b5e11c03023264208James Dong difmad = saddata[0] - ((saddata[1] + 1) >> 1); 41129a84457aed4c45bc900998b5e11c03023264208James Dong (*abs_dif_mad_avg) += ((difmad > 0) ? difmad : -difmad); 41229a84457aed4c45bc900998b5e11c03023264208James Dong (*countbreak)++; 41329a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 41429a84457aed4c45bc900998b5e11c03023264208James Dong } 41529a84457aed4c45bc900998b5e11c03023264208James Dong } 41629a84457aed4c45bc900998b5e11c03023264208James Dong } 41729a84457aed4c45bc900998b5e11c03023264208James Dong difmad = saddata[0] - ((saddata[1] + 1) >> 1); 41829a84457aed4c45bc900998b5e11c03023264208James Dong (*abs_dif_mad_avg) += ((difmad > 0) ? difmad : -difmad); 41929a84457aed4c45bc900998b5e11c03023264208James Dong (*countbreak)++; 42029a84457aed4c45bc900998b5e11c03023264208James Dong 42129a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 42229a84457aed4c45bc900998b5e11c03023264208James Dong} 42329a84457aed4c45bc900998b5e11c03023264208James Dong 42429a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HP_HTFMxhyh(uint8 *ref, uint8 *blk, int dmin_rx, void *extra_info) 42529a84457aed4c45bc900998b5e11c03023264208James Dong{ 42629a84457aed4c45bc900998b5e11c03023264208James Dong int i, j; 42729a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0, tmp, tmp2; 42829a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *p1, *p2; 42929a84457aed4c45bc900998b5e11c03023264208James Dong int rx = dmin_rx & 0xFFFF; 43029a84457aed4c45bc900998b5e11c03023264208James Dong int refwx4 = rx << 2; 43129a84457aed4c45bc900998b5e11c03023264208James Dong int sadstar = 0, madstar; 43229a84457aed4c45bc900998b5e11c03023264208James Dong int *nrmlz_th = (int*) extra_info; 43329a84457aed4c45bc900998b5e11c03023264208James Dong int *offsetRef = nrmlz_th + 32; 43429a84457aed4c45bc900998b5e11c03023264208James Dong uint32 cur_word; 43529a84457aed4c45bc900998b5e11c03023264208James Dong 43629a84457aed4c45bc900998b5e11c03023264208James Dong madstar = (uint32)dmin_rx >> 20; 43729a84457aed4c45bc900998b5e11c03023264208James Dong 43829a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB_CALL(); 43929a84457aed4c45bc900998b5e11c03023264208James Dong 44029a84457aed4c45bc900998b5e11c03023264208James Dong blk -= 4; 44129a84457aed4c45bc900998b5e11c03023264208James Dong 44229a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) /* 16 stages */ 44329a84457aed4c45bc900998b5e11c03023264208James Dong { 44429a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref + offsetRef[i]; 44529a84457aed4c45bc900998b5e11c03023264208James Dong p2 = p1 + rx; 44629a84457aed4c45bc900998b5e11c03023264208James Dong 44729a84457aed4c45bc900998b5e11c03023264208James Dong j = 4; /* 4 lines */ 44829a84457aed4c45bc900998b5e11c03023264208James Dong do 44929a84457aed4c45bc900998b5e11c03023264208James Dong { 45029a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 45129a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12] + p2[12]; 45229a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[13] + p2[13]; 45329a84457aed4c45bc900998b5e11c03023264208James Dong tmp += tmp2; 45429a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 24) & 0xFF; 45529a84457aed4c45bc900998b5e11c03023264208James Dong tmp += 2; 45629a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP2_SUB_SAD(sad, tmp, tmp2);; 45729a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8] + p2[8]; 45829a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[9] + p2[9]; 45929a84457aed4c45bc900998b5e11c03023264208James Dong tmp += tmp2; 46029a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 16) & 0xFF; 46129a84457aed4c45bc900998b5e11c03023264208James Dong tmp += 2; 46229a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP2_SUB_SAD(sad, tmp, tmp2);; 46329a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4] + p2[4]; 46429a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[5] + p2[5]; 46529a84457aed4c45bc900998b5e11c03023264208James Dong tmp += tmp2; 46629a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word >> 8) & 0xFF; 46729a84457aed4c45bc900998b5e11c03023264208James Dong tmp += 2; 46829a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP2_SUB_SAD(sad, tmp, tmp2);; 46929a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[1] + p2[1]; 47029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0] + p2[0]; 47129a84457aed4c45bc900998b5e11c03023264208James Dong p1 += refwx4; 47229a84457aed4c45bc900998b5e11c03023264208James Dong p2 += refwx4; 47329a84457aed4c45bc900998b5e11c03023264208James Dong tmp += tmp2; 47429a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = (cur_word & 0xFF); 47529a84457aed4c45bc900998b5e11c03023264208James Dong tmp += 2; 47629a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP2_SUB_SAD(sad, tmp, tmp2);; 47729a84457aed4c45bc900998b5e11c03023264208James Dong } 47829a84457aed4c45bc900998b5e11c03023264208James Dong while (--j); 47929a84457aed4c45bc900998b5e11c03023264208James Dong 48029a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB(); 48129a84457aed4c45bc900998b5e11c03023264208James Dong 48229a84457aed4c45bc900998b5e11c03023264208James Dong sadstar += madstar; 48329a84457aed4c45bc900998b5e11c03023264208James Dong if (sad > sadstar - nrmlz_th[i] || sad > ((uint32)dmin_rx >> 16)) 48429a84457aed4c45bc900998b5e11c03023264208James Dong { 48529a84457aed4c45bc900998b5e11c03023264208James Dong return 65536; 48629a84457aed4c45bc900998b5e11c03023264208James Dong } 48729a84457aed4c45bc900998b5e11c03023264208James Dong } 48829a84457aed4c45bc900998b5e11c03023264208James Dong 48929a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 49029a84457aed4c45bc900998b5e11c03023264208James Dong} 49129a84457aed4c45bc900998b5e11c03023264208James Dong 49229a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HP_HTFMyh(uint8 *ref, uint8 *blk, int dmin_rx, void *extra_info) 49329a84457aed4c45bc900998b5e11c03023264208James Dong{ 49429a84457aed4c45bc900998b5e11c03023264208James Dong int i, j; 49529a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0, tmp, tmp2; 49629a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *p1, *p2; 49729a84457aed4c45bc900998b5e11c03023264208James Dong int rx = dmin_rx & 0xFFFF; 49829a84457aed4c45bc900998b5e11c03023264208James Dong int refwx4 = rx << 2; 49929a84457aed4c45bc900998b5e11c03023264208James Dong int sadstar = 0, madstar; 50029a84457aed4c45bc900998b5e11c03023264208James Dong int *nrmlz_th = (int*) extra_info; 50129a84457aed4c45bc900998b5e11c03023264208James Dong int *offsetRef = nrmlz_th + 32; 50229a84457aed4c45bc900998b5e11c03023264208James Dong uint32 cur_word; 50329a84457aed4c45bc900998b5e11c03023264208James Dong 50429a84457aed4c45bc900998b5e11c03023264208James Dong madstar = (uint32)dmin_rx >> 20; 50529a84457aed4c45bc900998b5e11c03023264208James Dong 50629a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB_CALL(); 50729a84457aed4c45bc900998b5e11c03023264208James Dong 50829a84457aed4c45bc900998b5e11c03023264208James Dong blk -= 4; 50929a84457aed4c45bc900998b5e11c03023264208James Dong 51029a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) /* 16 stages */ 51129a84457aed4c45bc900998b5e11c03023264208James Dong { 51229a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref + offsetRef[i]; 51329a84457aed4c45bc900998b5e11c03023264208James Dong p2 = p1 + rx; 51429a84457aed4c45bc900998b5e11c03023264208James Dong j = 4; 51529a84457aed4c45bc900998b5e11c03023264208James Dong do 51629a84457aed4c45bc900998b5e11c03023264208James Dong { 51729a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 51829a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 51929a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p2[12]; 52029a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 52129a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 52229a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 24) & 0xFF; 52329a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 52429a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 52529a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p2[8]; 52629a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 52729a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 52829a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 16) & 0xFF; 52929a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 53029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 53129a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p2[4]; 53229a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 53329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 53429a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 8) & 0xFF; 53529a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 53629a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 53729a84457aed4c45bc900998b5e11c03023264208James Dong p1 += refwx4; 53829a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p2[0]; 53929a84457aed4c45bc900998b5e11c03023264208James Dong p2 += refwx4; 54029a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 54129a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 54229a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word & 0xFF); 54329a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 54429a84457aed4c45bc900998b5e11c03023264208James Dong } 54529a84457aed4c45bc900998b5e11c03023264208James Dong while (--j); 54629a84457aed4c45bc900998b5e11c03023264208James Dong 54729a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB(); 54829a84457aed4c45bc900998b5e11c03023264208James Dong sadstar += madstar; 54929a84457aed4c45bc900998b5e11c03023264208James Dong if (sad > sadstar - nrmlz_th[i] || sad > ((uint32)dmin_rx >> 16)) 55029a84457aed4c45bc900998b5e11c03023264208James Dong { 55129a84457aed4c45bc900998b5e11c03023264208James Dong return 65536; 55229a84457aed4c45bc900998b5e11c03023264208James Dong } 55329a84457aed4c45bc900998b5e11c03023264208James Dong } 55429a84457aed4c45bc900998b5e11c03023264208James Dong 55529a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 55629a84457aed4c45bc900998b5e11c03023264208James Dong} 55729a84457aed4c45bc900998b5e11c03023264208James Dong 55829a84457aed4c45bc900998b5e11c03023264208James Dongint AVCSAD_MB_HP_HTFMxh(uint8 *ref, uint8 *blk, int dmin_rx, void *extra_info) 55929a84457aed4c45bc900998b5e11c03023264208James Dong{ 56029a84457aed4c45bc900998b5e11c03023264208James Dong int i, j; 56129a84457aed4c45bc900998b5e11c03023264208James Dong int sad = 0, tmp, tmp2; 56229a84457aed4c45bc900998b5e11c03023264208James Dong uint8 *p1; 56329a84457aed4c45bc900998b5e11c03023264208James Dong int rx = dmin_rx & 0xFFFF; 56429a84457aed4c45bc900998b5e11c03023264208James Dong int refwx4 = rx << 2; 56529a84457aed4c45bc900998b5e11c03023264208James Dong int sadstar = 0, madstar; 56629a84457aed4c45bc900998b5e11c03023264208James Dong int *nrmlz_th = (int*) extra_info; 56729a84457aed4c45bc900998b5e11c03023264208James Dong int *offsetRef = nrmlz_th + 32; 56829a84457aed4c45bc900998b5e11c03023264208James Dong uint32 cur_word; 56929a84457aed4c45bc900998b5e11c03023264208James Dong 57029a84457aed4c45bc900998b5e11c03023264208James Dong madstar = (uint32)dmin_rx >> 20; 57129a84457aed4c45bc900998b5e11c03023264208James Dong 57229a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB_CALL(); 57329a84457aed4c45bc900998b5e11c03023264208James Dong 57429a84457aed4c45bc900998b5e11c03023264208James Dong blk -= 4; 57529a84457aed4c45bc900998b5e11c03023264208James Dong 57629a84457aed4c45bc900998b5e11c03023264208James Dong for (i = 0; i < 16; i++) /* 16 stages */ 57729a84457aed4c45bc900998b5e11c03023264208James Dong { 57829a84457aed4c45bc900998b5e11c03023264208James Dong p1 = ref + offsetRef[i]; 57929a84457aed4c45bc900998b5e11c03023264208James Dong 58029a84457aed4c45bc900998b5e11c03023264208James Dong j = 4;/* 4 lines */ 58129a84457aed4c45bc900998b5e11c03023264208James Dong do 58229a84457aed4c45bc900998b5e11c03023264208James Dong { 58329a84457aed4c45bc900998b5e11c03023264208James Dong cur_word = *((uint32*)(blk += 4)); 58429a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[12]; 58529a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[13]; 58629a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 58729a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 58829a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 24) & 0xFF; 58929a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 59029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[8]; 59129a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[9]; 59229a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 59329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 59429a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 16) & 0xFF; 59529a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 59629a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[4]; 59729a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[5]; 59829a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 59929a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 60029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word >> 8) & 0xFF; 60129a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 60229a84457aed4c45bc900998b5e11c03023264208James Dong tmp = p1[0]; 60329a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 = p1[1]; 60429a84457aed4c45bc900998b5e11c03023264208James Dong p1 += refwx4; 60529a84457aed4c45bc900998b5e11c03023264208James Dong tmp++; 60629a84457aed4c45bc900998b5e11c03023264208James Dong tmp2 += tmp; 60729a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (cur_word & 0xFF); 60829a84457aed4c45bc900998b5e11c03023264208James Dong sad = INTERP1_SUB_SAD(sad, tmp, tmp2);; 60929a84457aed4c45bc900998b5e11c03023264208James Dong } 61029a84457aed4c45bc900998b5e11c03023264208James Dong while (--j); 61129a84457aed4c45bc900998b5e11c03023264208James Dong 61229a84457aed4c45bc900998b5e11c03023264208James Dong NUM_SAD_HP_MB(); 61329a84457aed4c45bc900998b5e11c03023264208James Dong 61429a84457aed4c45bc900998b5e11c03023264208James Dong sadstar += madstar; 61529a84457aed4c45bc900998b5e11c03023264208James Dong if (sad > sadstar - nrmlz_th[i] || sad > ((uint32)dmin_rx >> 16)) 61629a84457aed4c45bc900998b5e11c03023264208James Dong { 61729a84457aed4c45bc900998b5e11c03023264208James Dong return 65536; 61829a84457aed4c45bc900998b5e11c03023264208James Dong } 61929a84457aed4c45bc900998b5e11c03023264208James Dong } 62029a84457aed4c45bc900998b5e11c03023264208James Dong 62129a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 62229a84457aed4c45bc900998b5e11c03023264208James Dong} 62329a84457aed4c45bc900998b5e11c03023264208James Dong 62429a84457aed4c45bc900998b5e11c03023264208James Dong#endif /* HTFM */ 62529a84457aed4c45bc900998b5e11c03023264208James Dong 62629a84457aed4c45bc900998b5e11c03023264208James Dong 62729a84457aed4c45bc900998b5e11c03023264208James Dong 62829a84457aed4c45bc900998b5e11c03023264208James Dong 62929a84457aed4c45bc900998b5e11c03023264208James Dong 630