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