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