159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong/* ------------------------------------------------------------------
259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * Copyright (C) 1998-2009 PacketVideo
359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong *
459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * Licensed under the Apache License, Version 2.0 (the "License");
559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * you may not use this file except in compliance with the License.
659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * You may obtain a copy of the License at
759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong *
859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong *      http://www.apache.org/licenses/LICENSE-2.0
959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong *
1059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * Unless required by applicable law or agreed to in writing, software
1159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * express or implied.
1459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * See the License for the specific language governing permissions
1559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * and limitations under the License.
1659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * -------------------------------------------------------------------
1759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong */
1859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#include "mp4enc_lib.h"
1959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#include "mp4lib_int.h"
2059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#include "dct_inline.h"
2159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
2259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#define FDCT_SHIFT 10
2359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
2459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#ifdef __cplusplus
2559f566c4ec3dfc097ad8163523e522280b27e5c3James Dongextern "C"
2659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong{
2759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#endif
2859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
2959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /**************************************************************************/
3059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /*  Function:   BlockDCT_AANwSub
3159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Date:       7/31/01
3259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Input:
3359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Output:     out[64] ==> next block
3459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Purpose:    Do subtraction for zero MV first
3559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Modified:
3659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    **************************************************************************/
3759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
3859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    Void BlockDCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width)
3959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    {
4059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Short *dst;
4159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k0, k1, k2, k3, k4, k5, k6, k7;
4259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int round;
4359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k12 = 0x022A02D4;
4459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k14 = 0x0188053A;
4559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int abs_sum;
4659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int mask;
4759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int tmp, tmp2;
4859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int ColTh;
4959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
5059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 64 ;
5159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        ColTh = *dst;
5259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out += 128;
5359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        round = 1 << (FDCT_SHIFT - 1);
5459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
5559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* fdct_nextrow */
5659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
5759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assuming the block is word-aligned */
5859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            mask = 0x1FE;
5959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = *((Int*) cur);    /* contains 4 pixels */
6059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp2 = *((Int*) pred); /* prediction 4 pixels */
6159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = tmp2 & 0xFF;
6259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mask & (tmp << 1);
6359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k1 - (k0 << 1);
6459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = (tmp2 >> 8) & 0xFF;
6559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = mask & (tmp >> 7);
6659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k2 - (k1 << 1);
6759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = (tmp2 >> 16) & 0xFF;
6859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = mask & (tmp >> 15);
6959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k3 - (k2 << 1);
7059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = (tmp2 >> 24) & 0xFF;
7159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = mask & (tmp >> 23);
7259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k4 - (k3 << 1);
7359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = *((Int*)(cur + 4));   /* another 4 pixels */
7459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp2 = *((Int*)(pred + 4));
7559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = tmp2 & 0xFF;
7659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = mask & (tmp << 1);
7759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k5 - (k4 << 1);
7859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = (tmp2 >> 8) & 0xFF;
7959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = mask & (tmp >> 7);
8059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k6 - (k5 << 1);
8159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = (tmp2 >> 16) & 0xFF;
8259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = mask & (tmp >> 15);
8359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k7 - (k6 << 1);
8459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (tmp2 >> 24) & 0xFF;
8559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = mask & (tmp >> 23);
8659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = tmp - (k7 << 1);
8759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            cur += width;
8859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            pred += 16;
8959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
9059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
9159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
9259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
9359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
9459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
9559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
9659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
9759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
9859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
9959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
10059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
10159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
10259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
10359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
10459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
10559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
10659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k0 - (k1 << 1);
10759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
10859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[0] = k0;
10959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[4] = k1; /* col. 4 */
11059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
11159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
11259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
11359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
11459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
11559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
11659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
11759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
11859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
11959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla724(k12, k2, round);
12059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
12159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
12259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k0 >> FDCT_SHIFT;
12359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
12459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
12559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = (k3 << 1) - k2;
12659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
12759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[2] = k2;        /* col. 2 */
12859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 <<= 1;       /* scale up col. 6 */
12959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[6] = k3; /* col. 6 */
13059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
13159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
13259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
13359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
13459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k4 - k6;
13559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
13659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k0, k14, round);
13759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla554(k4, k12, k1);
13859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla1338(k6, k14, k1);
13959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
14059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k0 >> FDCT_SHIFT;
14159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
14259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
14359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
14459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k5;
14559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k7;
14659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k4;
14759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
14859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 <<= 1;       /* scale up col.5 */
14959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k5 - (k6 << 1);
15059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
15159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[5] = k4;    /* col. 5 */
15259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 <<= 2;       /* scale up col. 7 */
15359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[1] = k5;    /* col. 1 */
15459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[7] = k6;    /* col. 7 */
15559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[3] = k7;    /* col. 3 */
15659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst += 8;
15759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
15859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while (dst < out);
15959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
16059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out -= 64;
16159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 8;
16259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
16359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        /*  Vertical Block Loop  */
16459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* Vertical 8xDCT loop */
16559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
16659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = out[0];
16759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = out[8];
16859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = out[16];
16959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = out[24];
17059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = out[32];
17159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = out[40];
17259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = out[48];
17359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = out[56];
17459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* deadzone thresholding for column */
17559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
17659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
17759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
17859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            if (abs_sum < ColTh)
17959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            {
18059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out[0] = 0x7fff;
18159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out++;
18259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                continue;
18359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            }
18459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
18559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
18659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
18759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
18859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
18959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
19059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
19159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
19259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
19359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
19459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
19559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
19659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
19759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
19859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
19959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
20059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
20159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k0 - (k1 << 1);
20259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
20359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[32] = k1; /* row 4 */
20459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[0] = k0; /* row 0 */
20559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
20659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
20759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
20859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
20959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
21059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
21159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
21259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
21359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
21459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla724(k12, k2, round);
21559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
21659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
21759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k0 >> FDCT_SHIFT;
21859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
21959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
22059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = (k3 << 1) - k2;
22159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 <<= 1;       /* scale up col. 6 */
22259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
22359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[48] = k3;   /* row 6 */
22459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[16] = k2;   /* row 2 */
22559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
22659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
22759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
22859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
22959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k4 - k6;
23059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
23159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k0, k14, round);
23259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla554(k4, k12, k1);
23359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla1338(k6, k14, k1);
23459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
23559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k0 >> FDCT_SHIFT;
23659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
23759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
23859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
23959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k5;
24059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k7;
24159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k4;
24259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
24359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 <<= 1;       /* scale up col. 5 */
24459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k5 - (k6 << 1);
24559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
24659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[24] = k7 ;    /* row 3 */
24759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 <<= 2;       /* scale up col. 7 */
24859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[56] = k6 ;   /* row 7 */
24959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[8] = k5 ;    /* row 1 */
25059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[40] = k4 ;   /* row 5 */
25159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out++;
25259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
25359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while ((UInt)out < (UInt)dst) ;
25459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
25559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        return ;
25659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    }
25759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
25859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /**************************************************************************/
25959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /*  Function:   Block4x4DCT_AANwSub
26059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Date:       7/31/01
26159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Input:
26259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Output:     out[64] ==> next block
26359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Purpose:    Do subtraction for zero MV first before 4x4 DCT
26459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Modified:
26559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    **************************************************************************/
26659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
26759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    Void Block4x4DCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width)
26859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    {
26959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Short *dst;
27059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        register Int k0, k1, k2, k3, k4, k5, k6, k7;
27159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int round;
27259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k12 = 0x022A02D4;
27359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k14 = 0x0188053A;
27459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int mask;
27559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int tmp, tmp2;
27659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int abs_sum;
27759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int ColTh;
27859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
27959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 64 ;
28059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        ColTh = *dst;
28159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out += 128;
28259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        round = 1 << (FDCT_SHIFT - 1);
28359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
28459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* fdct_nextrow */
28559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
28659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assuming the block is word-aligned */
28759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            mask = 0x1FE;
28859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = *((Int*) cur);    /* contains 4 pixels */
28959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp2 = *((Int*) pred); /* prediction 4 pixels */
29059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = tmp2 & 0xFF;
29159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mask & (tmp << 1);
29259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k1 - (k0 << 1);
29359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = (tmp2 >> 8) & 0xFF;
29459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = mask & (tmp >> 7);
29559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k2 - (k1 << 1);
29659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = (tmp2 >> 16) & 0xFF;
29759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = mask & (tmp >> 15);
29859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k3 - (k2 << 1);
29959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = (tmp2 >> 24) & 0xFF;
30059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = mask & (tmp >> 23);
30159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k4 - (k3 << 1);
30259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = *((Int*)(cur + 4));   /* another 4 pixels */
30359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp2 = *((Int*)(pred + 4));
30459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = tmp2 & 0xFF;
30559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = mask & (tmp << 1);
30659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k5 - (k4 << 1);
30759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = (tmp2 >> 8) & 0xFF;
30859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = mask & (tmp >> 7);
30959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k6 - (k5 << 1);
31059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = (tmp2 >> 16) & 0xFF;
31159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = mask & (tmp >> 15);
31259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k7 - (k6 << 1);
31359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (tmp2 >> 24) & 0xFF;
31459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = mask & (tmp >> 23);
31559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = tmp - (k7 << 1);
31659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            cur += width;
31759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            pred += 16;
31859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
31959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
32059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
32159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
32259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
32359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
32459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
32559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
32659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
32759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
32859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
32959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
33059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
33159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
33259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
33359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
33459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
33559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
33659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[0] = k0;
33759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
33859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
33959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
34059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
34159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
34259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
34359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
34459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
34559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
34659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla724(k12, k2, round);
34759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
34859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
34959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k0 >> FDCT_SHIFT;
35059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
35159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
35259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
35359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[2] = k2;        /* col. 2 */
35459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
35559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
35659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
35759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
35859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k4 - k6;
35959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
36059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k0, k14, round);
36159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla554(k4, k12, k1);
36259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla1338(k6, k14, k1);
36359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
36459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k0 >> FDCT_SHIFT;
36559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
36659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
36759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
36859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k5;
36959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k7 - k4;
37059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
37159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
37259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[1] = k5;        /* col. 1 */
37359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[3] = k7;        /* col. 3 */
37459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst += 8;
37559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
37659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while (dst < out);
37759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
37859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out -= 64;
37959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 4;
38059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
38159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        /*  Vertical Block Loop  */
38259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* Vertical 8xDCT loop */
38359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
38459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = out[0];
38559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = out[8];
38659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = out[16];
38759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = out[24];
38859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = out[32];
38959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = out[40];
39059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = out[48];
39159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = out[56];
39259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
39359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
39459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
39559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            if (abs_sum < ColTh)
39659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            {
39759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out[0] = 0x7fff;
39859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out++;
39959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                continue;
40059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            }
40159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
40259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
40359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
40459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
40559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
40659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
40759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
40859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
40959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
41059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
41159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
41259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
41359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
41459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
41559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
41659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
41759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
41859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[0] = k0;   /* row 0 */
41959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
42059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
42159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
42259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
42359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
42459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
42559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
42659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
42759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
42859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla724(k12, k2, round);
42959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
43059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
43159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k0 >> FDCT_SHIFT;
43259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
43359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
43459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
43559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[16] = k2;           /* row 2 */
43659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
43759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
43859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
43959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
44059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k4 - k6;
44159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
44259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k0, k14, round);
44359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla554(k4, k12, k1);
44459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla1338(k6, k14, k1);
44559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
44659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k0 >> FDCT_SHIFT;
44759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
44859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
44959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
45059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k5;
45159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k7 - k4 ;
45259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
45359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
45459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[24] = k7 ;      /* row 3 */
45559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[8] = k5 ;       /* row 1 */
45659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out++;
45759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
45859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while ((UInt)out < (UInt)dst) ;
45959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
46059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        return ;
46159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    }
46259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
46359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /**************************************************************************/
46459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /*  Function:   Block2x2DCT_AANwSub
46559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Date:       7/31/01
46659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Input:
46759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Output:     out[64] ==> next block
46859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Purpose:    Do subtraction for zero MV first before 2x2 DCT
46959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Modified:
47059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    **************************************************************************/
47159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
47259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
47359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    Void Block2x2DCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width)
47459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    {
47559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Short *dst;
47659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        register Int k0, k1, k2, k3, k4, k5, k6, k7;
47759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int round;
47859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k12 = 0x022A02D4;
47959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k14 = 0x018803B2;
48059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int mask;
48159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int tmp, tmp2;
48259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int abs_sum;
48359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int ColTh;
48459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
48559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 64 ;
48659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        ColTh = *dst;
48759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out += 128;
48859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        round = 1 << (FDCT_SHIFT - 1);
48959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
49059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* fdct_nextrow */
49159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
49259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assuming the block is word-aligned */
49359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            mask = 0x1FE;
49459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = *((Int*) cur);    /* contains 4 pixels */
49559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp2 = *((Int*) pred); /* prediction 4 pixels */
49659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = tmp2 & 0xFF;
49759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mask & (tmp << 1);
49859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k1 - (k0 << 1);
49959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = (tmp2 >> 8) & 0xFF;
50059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = mask & (tmp >> 7);
50159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k2 - (k1 << 1);
50259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = (tmp2 >> 16) & 0xFF;
50359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = mask & (tmp >> 15);
50459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k3 - (k2 << 1);
50559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = (tmp2 >> 24) & 0xFF;
50659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = mask & (tmp >> 23);
50759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k4 - (k3 << 1);
50859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = *((Int*)(cur + 4));   /* another 4 pixels */
50959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp2 = *((Int*)(pred + 4));
51059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = tmp2 & 0xFF;
51159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = mask & (tmp << 1);
51259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k5 - (k4 << 1);
51359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = (tmp2 >> 8) & 0xFF;
51459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = mask & (tmp >> 7);
51559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k6 - (k5 << 1);
51659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = (tmp2 >> 16) & 0xFF;
51759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = mask & (tmp >> 15);
51859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k7 - (k6 << 1);
51959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (tmp2 >> 24) & 0xFF;
52059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = mask & (tmp >> 23);
52159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = tmp - (k7 << 1);
52259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            cur += width;
52359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            pred += 16;
52459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
52559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
52659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
52759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
52859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
52959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
53059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
53159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
53259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
53359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
53459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
53559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
53659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
53759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
53859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
53959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
54059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
54159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
54259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[0] = k0;
54359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
54459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
54559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
54659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
54759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
54859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
54959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
55059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
55159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
55259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
55359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
55459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
55559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
55659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
55759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
55859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
55959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k4, k14, round);
56059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla946(k6, k14, k1);
56159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
56259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
56359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
56459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
56559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
56659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
56759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[1] = k5;
56859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst += 8;
56959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
57059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while (dst < out);
57159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out -= 64;
57259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 2;
57359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        /*  Vertical Block Loop  */
57459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* Vertical 8xDCT loop */
57559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
57659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = out[0];
57759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = out[8];
57859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = out[16];
57959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = out[24];
58059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = out[32];
58159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = out[40];
58259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = out[48];
58359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = out[56];
58459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
58559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
58659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
58759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            if (abs_sum < ColTh)
58859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            {
58959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out[0] = 0x7fff;
59059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out++;
59159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                continue;
59259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            }
59359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
59459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
59559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
59659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
59759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
59859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
59959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
60059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
60159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
60259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
60359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
60459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
60559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
60659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
60759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
60859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
60959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
61059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[0] = k0;        /* row 0 */
61159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
61259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
61359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
61459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
61559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
61659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
61759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
61859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
61959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
62059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
62159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
62259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
62359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
62459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
62559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
62659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
62759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k4, k14, round);
62859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla946(k6, k14, k1);
62959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
63059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
63159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
63259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
63359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
63459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
63559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[8] = k5 ;       /* row 1 */
63659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out++;
63759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
63859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while ((UInt)out < (UInt)dst) ;
63959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
64059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        return ;
64159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    }
64259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
64359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /**************************************************************************/
64459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /*  Function:   BlockDCT_AANIntra
64559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Date:       8/9/01
64659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Input:      rec
64759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Output:     out[64] ==> next block
64859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Purpose:    Input directly from rec frame.
64959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Modified:
65059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    **************************************************************************/
65159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
65259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    Void BlockDCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width)
65359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    {
65459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Short *dst;
65559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k0, k1, k2, k3, k4, k5, k6, k7;
65659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int round;
65759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k12 = 0x022A02D4;
65859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k14 = 0x0188053A;
65959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int abs_sum;
66059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int mask;
66159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int *curInt, tmp;
66259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int ColTh;
66359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
66459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        OSCL_UNUSED_ARG(dummy2);
66559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
66659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 64 ;
66759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        ColTh = *dst;
66859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out += 128;
66959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        round = 1 << (FDCT_SHIFT - 1);
67059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
67159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* fdct_nextrow */
67259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
67359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            mask = 0x1FE;
67459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            curInt = (Int*) cur;
67559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = curInt[0];    /* contains 4 pixels */
67659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mask & (tmp << 1);
67759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mask & (tmp >> 7);
67859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = mask & (tmp >> 15);
67959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = mask & (tmp >> 23);
68059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = curInt[1];    /* another 4 pixels */
68159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 =  mask & (tmp << 1);
68259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 =  mask & (tmp >> 7);
68359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 =  mask & (tmp >> 15);
68459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 =  mask & (tmp >> 23);
68559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            cur += width;
68659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
68759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
68859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
68959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
69059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
69159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
69259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
69359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
69459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
69559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
69659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
69759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
69859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
69959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
70059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
70159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
70259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k0 - (k1 << 1);
70359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
70459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[0] = k0;
70559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[4] = k1; /* col. 4 */
70659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
70759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
70859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
70959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
71059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
71159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
71259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
71359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
71459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
71559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla724(k12, k2, round);
71659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
71759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
71859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k0 >> FDCT_SHIFT;
71959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
72059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
72159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = (k3 << 1) - k2;
72259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
72359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[2] = k2;        /* col. 2 */
72459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 <<= 1;       /* scale up col. 6 */
72559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[6] = k3; /* col. 6 */
72659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
72759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
72859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
72959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
73059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k4 - k6;
73159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
73259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k0, k14, round);
73359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla554(k4, k12, k1);
73459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla1338(k6, k14, k1);
73559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
73659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k0 >> FDCT_SHIFT;
73759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
73859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
73959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
74059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k5;
74159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k7;
74259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k4;
74359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
74459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 <<= 1;       /* scale up col.5 */
74559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k5 - (k6 << 1);
74659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
74759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[5] = k4;    /* col. 5 */
74859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 <<= 2;       /* scale up col. 7 */
74959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[1] = k5;    /* col. 1 */
75059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[7] = k6;    /* col. 7 */
75159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[3] = k7;    /* col. 3 */
75259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst += 8;
75359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
75459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while (dst < out);
75559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
75659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out -= 64;
75759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 8;
75859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
75959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        /*  Vertical Block Loop  */
76059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* Vertical 8xDCT loop */
76159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
76259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = out[0];
76359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = out[8];
76459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = out[16];
76559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = out[24];
76659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = out[32];
76759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = out[40];
76859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = out[48];
76959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = out[56];
77059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* deadzone thresholding for column */
77159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
77259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
77359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
77459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            if (abs_sum < ColTh)
77559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            {
77659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out[0] = 0x7fff;
77759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out++;
77859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                continue;
77959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            }
78059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
78159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
78259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
78359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
78459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
78559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
78659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
78759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
78859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
78959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
79059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
79159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
79259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
79359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
79459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
79559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
79659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
79759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k0 - (k1 << 1);
79859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
79959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[32] = k1; /* row 4 */
80059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[0] = k0; /* row 0 */
80159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
80259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
80359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
80459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
80559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
80659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
80759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
80859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
80959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
81059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla724(k12, k2, round);
81159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
81259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
81359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k0 >> FDCT_SHIFT;
81459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
81559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
81659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = (k3 << 1) - k2;
81759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 <<= 1;       /* scale up col. 6 */
81859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
81959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[48] = k3;   /* row 6 */
82059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[16] = k2;   /* row 2 */
82159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
82259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
82359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
82459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
82559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k4 - k6;
82659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
82759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k0, k14, round);
82859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla554(k4, k12, k1);
82959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla1338(k6, k14, k1);
83059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
83159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k0 >> FDCT_SHIFT;
83259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
83359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
83459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
83559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k5;
83659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k7;
83759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k4;
83859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
83959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 <<= 1;       /* scale up col. 5 */
84059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k5 - (k6 << 1);
84159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
84259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[24] = k7 ;    /* row 3 */
84359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 <<= 2;       /* scale up col. 7 */
84459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[56] = k6 ;   /* row 7 */
84559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[8] = k5 ;    /* row 1 */
84659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[40] = k4 ;   /* row 5 */
84759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out++;
84859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
84959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while ((UInt)out < (UInt)dst) ;
85059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
85159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        return ;
85259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    }
85359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
85459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /**************************************************************************/
85559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /*  Function:   Block4x4DCT_AANIntra
85659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Date:       8/9/01
85759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Input:      prev
85859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Output:     out[64] ==> next block
85959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Purpose:    Input directly from prev frame. output 2x2 DCT
86059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Modified:
86159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    **************************************************************************/
86259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
86359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    Void Block4x4DCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width)
86459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    {
86559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Short *dst;
86659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        register Int k0, k1, k2, k3, k4, k5, k6, k7;
86759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int round;
86859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k12 = 0x022A02D4;
86959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k14 = 0x0188053A;
87059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int mask;
87159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int *curInt, tmp;
87259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int abs_sum;
87359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int ColTh;
87459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
87559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        OSCL_UNUSED_ARG(dummy2);
87659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
87759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 64 ;
87859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        ColTh = *dst;
87959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out += 128;
88059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        round = 1 << (FDCT_SHIFT - 1);
88159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
88259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* fdct_nextrow */
88359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
88459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            mask = 0x1FE;
88559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            curInt = (Int*) cur;
88659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = curInt[0];    /* contains 4 pixels */
88759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mask & (tmp << 1);
88859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mask & (tmp >> 7);
88959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = mask & (tmp >> 15);
89059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = mask & (tmp >> 23);
89159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = curInt[1];    /* another 4 pixels */
89259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 =  mask & (tmp << 1);
89359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 =  mask & (tmp >> 7);
89459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 =  mask & (tmp >> 15);
89559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 =  mask & (tmp >> 23);
89659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            cur += width;
89759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
89859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
89959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
90059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
90159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
90259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
90359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
90459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
90559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
90659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
90759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
90859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
90959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
91059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
91159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
91259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
91359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
91459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[0] = k0;
91559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
91659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
91759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
91859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
91959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
92059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
92159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
92259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
92359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
92459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla724(k12, k2, round);
92559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
92659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
92759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k0 >> FDCT_SHIFT;
92859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
92959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
93059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
93159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[2] = k2;        /* col. 2 */
93259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
93359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
93459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
93559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
93659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k4 - k6;
93759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
93859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k0, k14, round);
93959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla554(k4, k12, k1);
94059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla1338(k6, k14, k1);
94159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
94259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k0 >> FDCT_SHIFT;
94359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
94459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
94559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
94659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k5;
94759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k7 - k4;
94859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
94959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
95059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[1] = k5;        /* col. 1 */
95159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[3] = k7;        /* col. 3 */
95259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst += 8;
95359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
95459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while (dst < out);
95559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
95659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out -= 64;
95759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 4;
95859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
95959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        /*  Vertical Block Loop  */
96059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* Vertical 8xDCT loop */
96159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
96259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = out[0];
96359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = out[8];
96459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = out[16];
96559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = out[24];
96659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = out[32];
96759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = out[40];
96859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = out[48];
96959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = out[56];
97059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
97159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
97259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
97359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            if (abs_sum < ColTh)
97459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            {
97559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out[0] = 0x7fff;
97659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out++;
97759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                continue;
97859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            }
97959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
98059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
98159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
98259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
98359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
98459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
98559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
98659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
98759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
98859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
98959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
99059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
99159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
99259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
99359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
99459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
99559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
99659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[0] = k0;   /* row 0 */
99759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
99859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
99959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
100059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
100159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
100259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
100359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
100459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
100559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
100659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla724(k12, k2, round);
100759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
100859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
100959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k0 >> FDCT_SHIFT;
101059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
101159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k3;
101259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
101359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[16] = k2;           /* row 2 */
101459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
101559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
101659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
101759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
101859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k4 - k6;
101959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
102059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k0, k14, round);
102159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mla554(k4, k12, k1);
102259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla1338(k6, k14, k1);
102359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
102459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k0 >> FDCT_SHIFT;
102559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
102659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
102759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
102859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = (k7 << 1) - k5;
102959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k7 - k4 ;
103059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
103159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
103259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[24] = k7 ;      /* row 3 */
103359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[8] = k5 ;       /* row 1 */
103459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out++;
103559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
103659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while ((UInt)out < (UInt)dst) ;
103759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
103859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        return ;
103959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    }
104059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
104159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /**************************************************************************/
104259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /*  Function:   Block2x2DCT_AANIntra
104359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Date:       8/9/01
104459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Input:      prev
104559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Output:     out[64] ==> next block
104659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Purpose:    Input directly from prev frame. output 2x2 DCT
104759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Modified:
104859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    **************************************************************************/
104959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
105059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    Void Block2x2DCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width)
105159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    {
105259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Short *dst;
105359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        register Int k0, k1, k2, k3, k4, k5, k6, k7;
105459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int round;
105559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k12 = 0x022A02D4;
105659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int k14 = 0x018803B2;
105759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int mask;
105859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int *curInt, tmp;
105959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int abs_sum;
106059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int ColTh;
106159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
106259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        OSCL_UNUSED_ARG(dummy2);
106359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
106459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 64 ;
106559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        ColTh = *dst;
106659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out += 128;
106759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        round = 1 << (FDCT_SHIFT - 1);
106859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
106959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* fdct_nextrow */
107059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
107159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            mask = 0x1FE;
107259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            curInt = (Int*) cur;
107359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = curInt[0];    /* contains 4 pixels */
107459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = mask & (tmp << 1);
107559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mask & (tmp >> 7);
107659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = mask & (tmp >> 15);
107759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = mask & (tmp >> 23);
107859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            tmp = curInt[1];    /* another 4 pixels */
107959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 =  mask & (tmp << 1);
108059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 =  mask & (tmp >> 7);
108159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 =  mask & (tmp >> 15);
108259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 =  mask & (tmp >> 23);
108359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            cur += width;
108459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
108559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
108659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
108759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
108859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
108959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
109059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
109159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
109259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
109359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
109459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
109559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
109659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
109759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
109859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
109959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
110059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
110159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
110259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[0] = k0;
110359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
110459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
110559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
110659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
110759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
110859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
110959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
111059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
111159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
111259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
111359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
111459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
111559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
111659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
111759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
111859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
111959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k4, k14, round);
112059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla946(k6, k14, k1);
112159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
112259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
112359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
112459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
112559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
112659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
112759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst[1] = k5;
112859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            dst += 8;
112959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
113059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while (dst < out);
113159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out -= 64;
113259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        dst = out + 2;
113359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        /*  Vertical Block Loop  */
113459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do  /* Vertical 8xDCT loop */
113559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
113659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = out[0];
113759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = out[8];
113859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = out[16];
113959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = out[24];
114059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = out[32];
114159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = out[40];
114259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = out[48];
114359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = out[56];
114459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
114559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
114659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
114759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            if (abs_sum < ColTh)
114859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            {
114959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out[0] = 0x7fff;
115059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                out++;
115159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong                continue;
115259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            }
115359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_1 */
115459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k7;
115559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k7 = k0 - (k7 << 1);
115659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k6;
115759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 - (k6 << 1);
115859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k2 + k5;
115959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k2 - (k5 << 1);
116059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k3 + k4;
116159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k3 - (k4 << 1);
116259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
116359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k3;
116459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k3 = k0 - (k3 << 1);
116559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = k1 + k2;
116659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k2 = k1 - (k2 << 1);
116759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
116859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k0 = k0 + k1;
116959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /**********/
117059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[0] = k0;        /* row 0 */
117159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_2 */
117259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k4 = k4 + k5;
117359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
117459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k6 + k7;
117559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* MUL2C k2,k5,724,FDCT_SHIFT */
117659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 become scratch */
117759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
117859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla724(k12, k5, round);
117959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
118059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k1 >> FDCT_SHIFT;
118159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /*****************/
118259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
118359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* fdct_3 */
118459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
118559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* assume FAST MULTIPLY */
118659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /* k0, k1 are output */
118759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla392(k4, k14, round);
118859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k1 = mla946(k6, k14, k1);
118959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
119059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k6 = k1 >> FDCT_SHIFT;
119159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /***********************/
119259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k7;
119359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            k5 = k5 + k6;
119459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            /********/
119559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out[8] = k5 ;       /* row 1 */
119659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            out++;
119759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
119859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while ((UInt)out < (UInt)dst) ;
119959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
120059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        return ;
120159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    }
120259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /**************************************************************************/
120359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /*  Function:   Block1x1DCTwSub
120459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Date:       8/9/01
120559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Input:      block
120659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Output:     y
120759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Purpose:    Compute DC value only
120859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Modified:
120959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    **************************************************************************/
121059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    void Block1x1DCTwSub(Short *out, UChar *cur, UChar *pred, Int width)
121159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    {
121259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        UChar *end;
121359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int temp = 0;
121459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int offset2;
121559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
121659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        offset2 = width - 8;
121759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        end = pred + (16 << 3);
121859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do
121959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
122059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (*cur++ - *pred++);
122159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (*cur++ - *pred++);
122259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (*cur++ - *pred++);
122359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (*cur++ - *pred++);
122459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (*cur++ - *pred++);
122559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (*cur++ - *pred++);
122659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (*cur++ - *pred++);
122759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (*cur++ - *pred++);
122859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            cur += offset2;
122959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            pred += 8;
123059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
123159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while (pred < end) ;
123259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
123359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = out[7] = 0;
123459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out[0] = temp >> 3;
123559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
123659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        return ;
123759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    }
123859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
123959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /**************************************************************************/
124059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    /*  Function:   Block1x1DCTIntra
124159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Date:       8/9/01
124259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Input:      prev
124359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Output:     out
124459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Purpose:    Compute DC value only
124559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Modified:
124659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    **************************************************************************/
124759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    void Block1x1DCTIntra(Short *out, UChar *cur, UChar *dummy2, Int width)
124859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    {
124959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        UChar *end;
125059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        Int temp = 0;
125159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        ULong word;
125259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
125359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        OSCL_UNUSED_ARG(dummy2);
125459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
125559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        end = cur + (width << 3);
125659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        do
125759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        {
125859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            word = *((ULong*)cur);
125959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (word >> 24);
126059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += ((word >> 16) & 0xFF);
126159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += ((word >> 8) & 0xFF);
126259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (word & 0xFF);
126359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
126459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            word = *((ULong*)(cur + 4));
126559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (word >> 24);
126659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += ((word >> 16) & 0xFF);
126759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += ((word >> 8) & 0xFF);
126859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            temp += (word & 0xFF);
126959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
127059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong            cur += width;
127159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        }
127259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        while (cur < end) ;
127359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
127459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = out[7] = 0;
127559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        out[0] = temp >> 3;
127659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
127759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong        return ;
127859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong    }
127959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
128059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#ifdef __cplusplus
128159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong}
128259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#endif
128359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
1284