dct.cpp revision 377b2ec9a2885f9b6405b07ba900a9e3f4349c38
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* ------------------------------------------------------------------
2d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines * Copyright (C) 1998-2009 PacketVideo
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *      http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * express or implied.
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * and limitations under the License.
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * -------------------------------------------------------------------
176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr */
186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "mp4enc_lib.h"
19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "mp4lib_int.h"
206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "dct_inline.h"
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2243730fe3c839af391efe6bdf56b0479860121924Shih-wei Liao#define FDCT_SHIFT 10
2323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifdef __cplusplus
25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoextern "C"
269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao{
2723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#endif
2823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
2923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines    /**************************************************************************/
300a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao    /*  Function:   BlockDCT_AANwSub
316e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines        Date:       7/31/01
326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        Input:
336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        Output:     out[64] ==> next block
34d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines        Purpose:    Do subtraction for zero MV first
35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        Modified:
36641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    **************************************************************************/
37641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang
38641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    Void BlockDCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width)
39641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    {
40e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines        Short *dst;
41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        Int k0, k1, k2, k3, k4, k5, k6, k7;
42e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        Int round;
43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        Int k12 = 0x022A02D4;
447682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        Int k14 = 0x0188053A;
457682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        Int abs_sum;
467682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        Int mask;
477682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        Int tmp, tmp2;
487682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        Int ColTh;
497682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala
507682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        dst = out + 64 ;
517682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        ColTh = *dst;
527682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        out += 128;
537682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        round = 1 << (FDCT_SHIFT - 1);
547682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala
557682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        do  /* fdct_nextrow */
567682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala        {
577682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            /* assuming the block is word-aligned */
587682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            mask = 0x1FE;
597682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            tmp = *((Int*) cur);    /* contains 4 pixels */
60fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines            tmp2 = *((Int*) pred); /* prediction 4 pixels */
617682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k0 = tmp2 & 0xFF;
627682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k1 = mask & (tmp << 1);
637682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k0 = k1 - (k0 << 1);
647682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k1 = (tmp2 >> 8) & 0xFF;
657682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k2 = mask & (tmp >> 7);
667682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k1 = k2 - (k1 << 1);
677682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k2 = (tmp2 >> 16) & 0xFF;
687682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k3 = mask & (tmp >> 15);
697682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k2 = k3 - (k2 << 1);
707682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k3 = (tmp2 >> 24) & 0xFF;
717682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k4 = mask & (tmp >> 23);
727682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k3 = k4 - (k3 << 1);
737682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            tmp = *((Int*)(cur + 4));   /* another 4 pixels */
747682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            tmp2 = *((Int*)(pred + 4));
757682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k4 = tmp2 & 0xFF;
767682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k5 = mask & (tmp << 1);
777682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k4 = k5 - (k4 << 1);
785f3da4bf52b327dbf5b6a33f340196f43d542159Nicolas Collin            k5 = (tmp2 >> 8) & 0xFF;
795f3da4bf52b327dbf5b6a33f340196f43d542159Nicolas Collin            k6 = mask & (tmp >> 7);
805f3da4bf52b327dbf5b6a33f340196f43d542159Nicolas Collin            k5 = k6 - (k5 << 1);
817682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k6 = (tmp2 >> 16) & 0xFF;
827682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k7 = mask & (tmp >> 15);
837682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k6 = k7 - (k6 << 1);
847682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k7 = (tmp2 >> 24) & 0xFF;
857682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            tmp = mask & (tmp >> 23);
867682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k7 = tmp - (k7 << 1);
877682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            cur += width;
887682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            pred += 16;
897682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala
907682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            /* fdct_1 */
917682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k0 = k0 + k7;
927682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k7 = k0 - (k7 << 1);
937682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k1 = k1 + k6;
947682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k6 = k1 - (k6 << 1);
957682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k2 = k2 + k5;
967682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala            k5 = k2 - (k5 << 1);
97474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k3 = k3 + k4;
98474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k4 = k3 - (k4 << 1);
99474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet
100474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k0 = k0 + k3;
101474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k3 = k0 - (k3 << 1);
102474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k1 = k1 + k2;
103cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k2 = k1 - (k2 << 1);
104474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet
105474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k0 = k0 + k1;
106474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k1 = k0 - (k1 << 1);
107474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /**********/
108474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            dst[0] = k0;
109474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            dst[4] = k1; /* col. 4 */
110cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            /* fdct_2 */
111474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k4 = k4 + k5;
112cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k5 = k5 + k6;
113474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k6 = k6 + k7;
114cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k2 = k2 + k3;
115474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* MUL2C k2,k5,724,FDCT_SHIFT */
116cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            /* k0, k1 become scratch */
117474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* assume FAST MULTIPLY */
118cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k1 = mla724(k12, k5, round);
119474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k0 = mla724(k12, k2, round);
120cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet
121474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k5 = k1 >> FDCT_SHIFT;
122cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k2 = k0 >> FDCT_SHIFT;
123474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /*****************/
124cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k2 = k2 + k3;
125474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k3 = (k3 << 1) - k2;
126e46265d27df092fbd911075403ec04d9c7ef8de1Tim Murray            /********/
127e46265d27df092fbd911075403ec04d9c7ef8de1Tim Murray            dst[2] = k2;        /* col. 2 */
128cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k3 <<= 1;       /* scale up col. 6 */
129474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            dst[6] = k3; /* col. 6 */
130474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* fdct_3 */
131cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
132474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* assume FAST MULTIPLY */
133cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            /* k0, k1 are output */
134474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k0 = k4 - k6;
135cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet
136474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k1 = mla392(k0, k14, round);
137cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k0 = mla554(k4, k12, k1);
138474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k1 = mla1338(k6, k14, k1);
139cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet
140474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k4 = k0 >> FDCT_SHIFT;
141cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k6 = k1 >> FDCT_SHIFT;
142474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /***********************/
143e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar            k5 = k5 + k7;
144e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar            k7 = (k7 << 1) - k5;
145cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k4 = k4 + k7;
146474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k7 = (k7 << 1) - k4;
147cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k5 = k5 + k6;
148474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k4 <<= 1;       /* scale up col.5 */
149474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k6 = k5 - (k6 << 1);
150474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /********/
151474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            dst[5] = k4;    /* col. 5 */
152474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k6 <<= 2;       /* scale up col. 7 */
153474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            dst[1] = k5;    /* col. 1 */
154cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            dst[7] = k6;    /* col. 7 */
155474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            dst[3] = k7;    /* col. 3 */
156474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            dst += 8;
157474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet        }
158cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet        while (dst < out);
159cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet
160cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet        out -= 64;
161cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet        dst = out + 8;
162cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet
163cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet        /*  Vertical Block Loop  */
164cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet        do  /* Vertical 8xDCT loop */
165cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet        {
166cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k0 = out[0];
167cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k1 = out[8];
168cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k2 = out[16];
169cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k3 = out[24];
170cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k4 = out[32];
171cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k5 = out[40];
172cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k6 = out[48];
173fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines            k7 = out[56];
174fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines            /* deadzone thresholding for column */
175474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet
176474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
177474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet
17824e79f69125cf87fcaa78c04510a831037203eebStephen Hines            if (abs_sum < ColTh)
17924e79f69125cf87fcaa78c04510a831037203eebStephen Hines            {
18024e79f69125cf87fcaa78c04510a831037203eebStephen Hines                out[0] = 0x7fff;
18148d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines                out++;
18224e79f69125cf87fcaa78c04510a831037203eebStephen Hines                continue;
18313fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            }
18413fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines
18524e79f69125cf87fcaa78c04510a831037203eebStephen Hines            /* fdct_1 */
186ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray            k0 = k0 + k7;
187d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k7 = k0 - (k7 << 1);
18811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k1 = k1 + k6;
18924e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k6 = k1 - (k6 << 1);
190ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray            k2 = k2 + k5;
191d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k5 = k2 - (k5 << 1);
19224e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k3 = k3 + k4;
19324e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k4 = k3 - (k4 << 1);
19424e79f69125cf87fcaa78c04510a831037203eebStephen Hines
19524e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k0 = k0 + k3;
196d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k3 = k0 - (k3 << 1);
197d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k1 = k1 + k2;
19811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k2 = k1 - (k2 << 1);
199d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet
200d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k0 = k0 + k1;
20124e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k1 = k0 - (k1 << 1);
2026e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines            /**********/
20324e79f69125cf87fcaa78c04510a831037203eebStephen Hines            out[32] = k1; /* row 4 */
20424e79f69125cf87fcaa78c04510a831037203eebStephen Hines            out[0] = k0; /* row 0 */
20524e79f69125cf87fcaa78c04510a831037203eebStephen Hines            /* fdct_2 */
20624e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k4 = k4 + k5;
20724e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k5 = k5 + k6;
20824e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k6 = k6 + k7;
20948d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            k2 = k2 + k3;
21024e79f69125cf87fcaa78c04510a831037203eebStephen Hines            /* MUL2C k2,k5,724,FDCT_SHIFT */
21113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            /* k0, k1 become scratch */
21213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            /* assume FAST MULTIPLY */
21324e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k1 = mla724(k12, k5, round);
214b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k0 = mla724(k12, k2, round);
21524e79f69125cf87fcaa78c04510a831037203eebStephen Hines
216d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k5 = k1 >> FDCT_SHIFT;
2179207a2e495c8363606861e4f034504ec5c153dabLogan Chien            k2 = k0 >> FDCT_SHIFT;
2185abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            /*****************/
21924e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k2 = k2 + k3;
22024e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k3 = (k3 << 1) - k2;
22124e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k3 <<= 1;       /* scale up col. 6 */
22224e79f69125cf87fcaa78c04510a831037203eebStephen Hines            /********/
22324e79f69125cf87fcaa78c04510a831037203eebStephen Hines            out[48] = k3;   /* row 6 */
224b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            out[16] = k2;   /* row 2 */
22524e79f69125cf87fcaa78c04510a831037203eebStephen Hines            /* fdct_3 */
226d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
2279207a2e495c8363606861e4f034504ec5c153dabLogan Chien            /* assume FAST MULTIPLY */
2285abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            /* k0, k1 are output */
22924e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k0 = k4 - k6;
23024e79f69125cf87fcaa78c04510a831037203eebStephen Hines
23124e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k1 = mla392(k0, k14, round);
232d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k0 = mla554(k4, k12, k1);
2339207a2e495c8363606861e4f034504ec5c153dabLogan Chien            k1 = mla1338(k6, k14, k1);
2345abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes
23524e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k4 = k0 >> FDCT_SHIFT;
23624e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k6 = k1 >> FDCT_SHIFT;
23724e79f69125cf87fcaa78c04510a831037203eebStephen Hines            /***********************/
23848d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            k5 = k5 + k7;
23913fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k7 = (k7 << 1) - k5;
2405abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k4 = k4 + k7;
241d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k7 = (k7 << 1) - k4;
24224e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k5 = k5 + k6;
243d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k4 <<= 1;       /* scale up col. 5 */
24424e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k6 = k5 - (k6 << 1);
24524e79f69125cf87fcaa78c04510a831037203eebStephen Hines            /********/
246474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            out[24] = k7 ;    /* row 3 */
247474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k6 <<= 2;       /* scale up col. 7 */
248474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            out[56] = k6 ;   /* row 7 */
249474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            out[8] = k5 ;    /* row 1 */
250474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            out[40] = k4 ;   /* row 5 */
251474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            out++;
2525abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        }
253474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet        while ((uintptr_t)out < (uintptr_t)dst) ;
254474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet
25524e79f69125cf87fcaa78c04510a831037203eebStephen Hines        return ;
256e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines    }
257e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines
25848d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines    /**************************************************************************/
259e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines    /*  Function:   Block4x4DCT_AANwSub
26013fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines        Date:       7/31/01
26113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines        Input:
2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Output:     out[64] ==> next block
2635abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        Purpose:    Do subtraction for zero MV first before 4x4 DCT
2645abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        Modified:
265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    **************************************************************************/
2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    Void Block4x4DCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width)
2681f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao    {
269b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet        Short *dst;
270b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet        register Int k0, k1, k2, k3, k4, k5, k6, k7;
2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int round;
2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int k12 = 0x022A02D4;
273b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet        Int k14 = 0x0188053A;
2745abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        Int mask;
2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int tmp, tmp2;
2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int abs_sum;
277cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet        Int ColTh;
2786315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
279d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines        dst = out + 64 ;
280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        ColTh = *dst;
2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        out += 128;
282cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines        round = 1 << (FDCT_SHIFT - 1);
283d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet
2849207a2e495c8363606861e4f034504ec5c153dabLogan Chien        do  /* fdct_nextrow */
2855abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        {
286cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines            /* assuming the block is word-aligned */
2876e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines            mask = 0x1FE;
2885abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            tmp = *((Int*) cur);    /* contains 4 pixels */
289cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines            tmp2 = *((Int*) pred); /* prediction 4 pixels */
290cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines            k0 = tmp2 & 0xFF;
29124e79f69125cf87fcaa78c04510a831037203eebStephen Hines            k1 = mask & (tmp << 1);
2925abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k0 = k1 - (k0 << 1);
2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = (tmp2 >> 8) & 0xFF;
2945abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k2 = mask & (tmp >> 7);
2955abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k1 = k2 - (k1 << 1);
2969207a2e495c8363606861e4f034504ec5c153dabLogan Chien            k2 = (tmp2 >> 16) & 0xFF;
2975abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k3 = mask & (tmp >> 15);
2982ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines            k2 = k3 - (k2 << 1);
2992ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines            k3 = (tmp2 >> 24) & 0xFF;
300f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            k4 = mask & (tmp >> 23);
301e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k3 = k4 - (k3 << 1);
302e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            tmp = *((Int*)(cur + 4));   /* another 4 pixels */
303e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            tmp2 = *((Int*)(pred + 4));
304e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k4 = tmp2 & 0xFF;
3055abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k5 = mask & (tmp << 1);
3069207a2e495c8363606861e4f034504ec5c153dabLogan Chien            k4 = k5 - (k4 << 1);
3075abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k5 = (tmp2 >> 8) & 0xFF;
308e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k6 = mask & (tmp >> 7);
309e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k5 = k6 - (k5 << 1);
3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k6 = (tmp2 >> 16) & 0xFF;
3119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k7 = mask & (tmp >> 15);
3125abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k6 = k7 - (k6 << 1);
313f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            k7 = (tmp2 >> 24) & 0xFF;
3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            tmp = mask & (tmp >> 23);
3159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k7 = tmp - (k7 << 1);
316f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            cur += width;
3179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            pred += 16;
3189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* fdct_1 */
3209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = k0 + k7;
3219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k7 = k0 - (k7 << 1);
3220da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang            k1 = k1 + k6;
323e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k6 = k1 - (k6 << 1);
324b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k2 = k2 + k5;
325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k5 = k2 - (k5 << 1);
32613fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k3 = k3 + k4;
32713fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k4 = k3 - (k4 << 1);
3285abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes
3290da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang            k0 = k0 + k3;
3302ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines            k3 = k0 - (k3 << 1);
3312ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines            k1 = k1 + k2;
3322ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines            k2 = k1 - (k2 << 1);
3332ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines
3342ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines            k0 = k0 + k1;
335d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            /**********/
336d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            dst[0] = k0;
337d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            /* fdct_2 */
338d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k4 = k4 + k5;
3395abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k5 = k5 + k6;
3402ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines            k6 = k6 + k7;
3419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k2 = k2 + k3;
342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* MUL2C k2,k5,724,FDCT_SHIFT */
3439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* k0, k1 become scratch */
3449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* assume FAST MULTIPLY */
3459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = mla724(k12, k5, round);
346e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k0 = mla724(k12, k2, round);
347d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet
348ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k5 = k1 >> FDCT_SHIFT;
349ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k2 = k0 >> FDCT_SHIFT;
350ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /*****************/
3515abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k2 = k2 + k3;
352c808a99831115928b4648f4c8b86dc682594217aStephen Hines            /********/
35324e79f69125cf87fcaa78c04510a831037203eebStephen Hines            dst[2] = k2;        /* col. 2 */
354b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            /* fdct_3 */
355b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
356462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* assume FAST MULTIPLY */
357aa82e74b08fcdc2e4e6c1f6796699566b331b656Stephen Hines            /* k0, k1 are output */
358d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k0 = k4 - k6;
359aa82e74b08fcdc2e4e6c1f6796699566b331b656Stephen Hines
3605abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k1 = mla392(k0, k14, round);
361aa82e74b08fcdc2e4e6c1f6796699566b331b656Stephen Hines            k0 = mla554(k4, k12, k1);
36213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k1 = mla1338(k6, k14, k1);
36313fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines
36413fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k4 = k0 >> FDCT_SHIFT;
36513fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k6 = k1 >> FDCT_SHIFT;
36613fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            /***********************/
36713fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k5 = k5 + k7;
36813fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k7 = (k7 << 1) - k5;
36913fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k7 = k7 - k4;
37013fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k5 = k5 + k6;
3712e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang            /********/
3722e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang            dst[1] = k5;        /* col. 1 */
3732e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang            dst[3] = k7;        /* col. 3 */
37448d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            dst += 8;
37513fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines        }
3765abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        while (dst < out);
3779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        out -= 64;
3799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        dst = out + 4;
3809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        /*  Vertical Block Loop  */
382b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet        do  /* Vertical 8xDCT loop */
3839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        {
3849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = out[0];
3855abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k1 = out[8];
386f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            k2 = out[16];
3879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k3 = out[24];
388b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k4 = out[32];
389462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k5 = out[40];
3909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k6 = out[48];
39148d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            k7 = out[56];
39213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines
3935abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
3949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (abs_sum < ColTh)
3969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            {
3972e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                out[0] = 0x7fff;
3982e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                out++;
399b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet                continue;
4002e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang            }
40148d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            /* fdct_1 */
40213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k0 = k0 + k7;
4032e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang            k7 = k0 - (k7 << 1);
40448d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            k1 = k1 + k6;
40548d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            k6 = k1 - (k6 << 1);
40648d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            k2 = k2 + k5;
40748d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            k5 = k2 - (k5 << 1);
40848d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            k3 = k3 + k4;
4099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k4 = k3 - (k4 << 1);
41048d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines
4115abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k0 = k0 + k3;
412462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k3 = k0 - (k3 << 1);
4139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = k1 + k2;
4149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k2 = k1 - (k2 << 1);
415462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
416e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k0 = k0 + k1;
4175abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            /**********/
4185abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            out[0] = k0;   /* row 0 */
4195abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            /* fdct_2 */
4205abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k4 = k4 + k5;
4215abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k5 = k5 + k6;
4225abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k6 = k6 + k7;
4235abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k2 = k2 + k3;
424e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /* MUL2C k2,k5,724,FDCT_SHIFT */
42548d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            /* k0, k1 become scratch */
42613fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            /* assume FAST MULTIPLY */
42713fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k1 = mla724(k12, k5, round);
428e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k0 = mla724(k12, k2, round);
429e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines
430e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k5 = k1 >> FDCT_SHIFT;
43113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k2 = k0 >> FDCT_SHIFT;
43278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /*****************/
43378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k2 = k2 + k3;
434d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            /********/
435d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            out[16] = k2;           /* row 2 */
436d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            /* fdct_3 */
437d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
438d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            /* assume FAST MULTIPLY */
439d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            /* k0, k1 are output */
440d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k0 = k4 - k6;
44144f10063c2c08dab103a44cded0c3a288d65d43bStephen Hines
44244f10063c2c08dab103a44cded0c3a288d65d43bStephen Hines            k1 = mla392(k0, k14, round);
443d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k0 = mla554(k4, k12, k1);
444b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k1 = mla1338(k6, k14, k1);
445d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines
4465abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k4 = k0 >> FDCT_SHIFT;
447d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k6 = k1 >> FDCT_SHIFT;
448d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            /***********************/
449d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k5 = k5 + k7;
450d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k7 = (k7 << 1) - k5;
451d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k7 = k7 - k4 ;
452d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k5 = k5 + k6;
453d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            /********/
454d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            out[24] = k7 ;      /* row 3 */
455d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            out[8] = k5 ;       /* row 1 */
456d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            out++;
457d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines        }
458d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines        while ((uintptr_t)out < (uintptr_t)dst) ;
45911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines
460d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines        return ;
461d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines    }
462d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines
463d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines    /**************************************************************************/
464d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines    /*  Function:   Block2x2DCT_AANwSub
46511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines        Date:       7/31/01
46611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines        Input:
46711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines        Output:     out[64] ==> next block
468d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines        Purpose:    Do subtraction for zero MV first before 2x2 DCT
469d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines        Modified:
470d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines    **************************************************************************/
471d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines
47211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines
473ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines    Void Block2x2DCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width)
474ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines    {
47511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines        Short *dst;
476d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet        register Int k0, k1, k2, k3, k4, k5, k6, k7;
47711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines        Int round;
47878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines        Int k12 = 0x022A02D4;
47911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines        Int k14 = 0x018803B2;
48011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines        Int mask;
48178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines        Int tmp, tmp2;
482d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines        Int abs_sum;
483d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines        Int ColTh;
48411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines
485ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines        dst = out + 64 ;
486ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines        ColTh = *dst;
4875abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        out += 128;
48878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines        round = 1 << (FDCT_SHIFT - 1);
48978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines
49078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines        do  /* fdct_nextrow */
49178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines        {
49278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* assuming the block is word-aligned */
493b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            mask = 0x1FE;
494b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            tmp = *((Int*) cur);    /* contains 4 pixels */
49578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            tmp2 = *((Int*) pred); /* prediction 4 pixels */
49678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k0 = tmp2 & 0xFF;
497d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k1 = mask & (tmp << 1);
4985abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k0 = k1 - (k0 << 1);
499d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k1 = (tmp2 >> 8) & 0xFF;
500d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k2 = mask & (tmp >> 7);
501d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k1 = k2 - (k1 << 1);
502d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k2 = (tmp2 >> 16) & 0xFF;
503d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k3 = mask & (tmp >> 15);
504d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k2 = k3 - (k2 << 1);
505cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k3 = (tmp2 >> 24) & 0xFF;
50678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k4 = mask & (tmp >> 23);
50778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k3 = k4 - (k3 << 1);
50878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            tmp = *((Int*)(cur + 4));   /* another 4 pixels */
5095abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            tmp2 = *((Int*)(pred + 4));
51078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k4 = tmp2 & 0xFF;
51178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k5 = mask & (tmp << 1);
51278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k4 = k5 - (k4 << 1);
51378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k5 = (tmp2 >> 8) & 0xFF;
51478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k6 = mask & (tmp >> 7);
5155abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k5 = k6 - (k5 << 1);
51678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k6 = (tmp2 >> 16) & 0xFF;
51778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k7 = mask & (tmp >> 15);
51878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k6 = k7 - (k6 << 1);
51978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k7 = (tmp2 >> 24) & 0xFF;
52078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            tmp = mask & (tmp >> 23);
52178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k7 = tmp - (k7 << 1);
52278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            cur += width;
52378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            pred += 16;
52478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines
52578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* fdct_1 */
52678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k0 = k0 + k7;
52778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k7 = k0 - (k7 << 1);
5285abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k1 = k1 + k6;
52978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k6 = k1 - (k6 << 1);
5305abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k2 = k2 + k5;
53178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k5 = k2 - (k5 << 1);
53278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k3 = k3 + k4;
53378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k4 = k3 - (k4 << 1);
53478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines
53578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k0 = k0 + k3;
53678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k3 = k0 - (k3 << 1);
53778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k1 = k1 + k2;
53878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k2 = k1 - (k2 << 1);
53978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines
54078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k0 = k0 + k1;
54178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /**********/
54278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            dst[0] = k0;
54378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* fdct_2 */
54478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k4 = k4 + k5;
54578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k5 = k5 + k6;
54678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k6 = k6 + k7;
54778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* MUL2C k2,k5,724,FDCT_SHIFT */
54878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* k0, k1 become scratch */
54978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* assume FAST MULTIPLY */
550b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k1 = mla724(k12, k5, round);
55178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines
552d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k5 = k1 >> FDCT_SHIFT;
553ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /*****************/
55478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /********/
55578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* fdct_3 */
55678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
55778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* assume FAST MULTIPLY */
55878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* k0, k1 are output */
55978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k1 = mla392(k4, k14, round);
56078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k1 = mla946(k6, k14, k1);
56178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines
56211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k6 = k1 >> FDCT_SHIFT;
56311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            /***********************/
56411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k5 = k5 + k7;
56511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k5 = k5 + k6;
56611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            /********/
56711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            dst[1] = k5;
56811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            dst += 8;
569d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet        }
570d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet        while (dst < out);
57111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines        out -= 64;
572d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet        dst = out + 2;
573d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet        /*  Vertical Block Loop  */
57411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines        do  /* Vertical 8xDCT loop */
575d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet        {
576d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k0 = out[0];
57711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k1 = out[8];
578d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k2 = out[16];
57911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k3 = out[24];
58011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k4 = out[32];
58111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k5 = out[40];
58211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k6 = out[48];
58378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k7 = out[56];
58478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines
58578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
58678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines
58711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            if (abs_sum < ColTh)
58811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            {
589d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet                out[0] = 0x7fff;
590d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet                out++;
591d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet                continue;
59211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            }
59311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            /* fdct_1 */
59411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k0 = k0 + k7;
59511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k7 = k0 - (k7 << 1);
59611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k1 = k1 + k6;
59711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k6 = k1 - (k6 << 1);
59811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k2 = k2 + k5;
59911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k5 = k2 - (k5 << 1);
60011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k3 = k3 + k4;
601ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k4 = k3 - (k4 << 1);
602ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines
603ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k0 = k0 + k3;
604ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k3 = k0 - (k3 << 1);
605ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k1 = k1 + k2;
606ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k2 = k1 - (k2 << 1);
607ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines
608ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k0 = k0 + k1;
609ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /**********/
610ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            out[0] = k0;        /* row 0 */
611ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /* fdct_2 */
612ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k4 = k4 + k5;
613ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k5 = k5 + k6;
614ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k6 = k6 + k7;
615ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /* MUL2C k2,k5,724,FDCT_SHIFT */
616ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /* k0, k1 become scratch */
617ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /* assume FAST MULTIPLY */
618b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k1 = mla724(k12, k5, round);
619b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet
62078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k5 = k1 >> FDCT_SHIFT;
621d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            /*****************/
622d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            /********/
623ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /* fdct_3 */
62478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
62578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* assume FAST MULTIPLY */
62678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /* k0, k1 are output */
62778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k1 = mla392(k4, k14, round);
628b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k1 = mla946(k6, k14, k1);
629b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet
630b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines            k6 = k1 >> FDCT_SHIFT;
631b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines            /***********************/
632fdae63e8142f56521813f59e0c506ed3a1636021Stephen Hines            k5 = k5 + k7;
633fdae63e8142f56521813f59e0c506ed3a1636021Stephen Hines            k5 = k5 + k6;
63444f10063c2c08dab103a44cded0c3a288d65d43bStephen Hines            /********/
6355abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            out[8] = k5 ;       /* row 1 */
636b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines            out++;
637b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines        }
638b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines        while ((uintptr_t)out < (uintptr_t)dst) ;
639b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines
640d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet        return ;
641ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines    }
64278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines
64378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines    /**************************************************************************/
64478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines    /*  Function:   BlockDCT_AANIntra
645b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet        Date:       8/9/01
646b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet        Input:      rec
647d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet        Output:     out[64] ==> next block
648ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines        Purpose:    Input directly from rec frame.
64978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines        Modified:
65078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines    **************************************************************************/
65178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines
65278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines    Void BlockDCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width)
65378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines    {
65478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines        Short *dst;
65578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines        Int k0, k1, k2, k3, k4, k5, k6, k7;
65678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines        Int round;
657e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        Int k12 = 0x022A02D4;
658e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        Int k14 = 0x0188053A;
659e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        Int abs_sum;
660e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        Int mask;
661eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet        Int *curInt, tmp;
662eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet        Int ColTh;
663eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet
664eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet        OSCL_UNUSED_ARG(dummy2);
665eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet
666eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet        dst = out + 64 ;
667eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet        ColTh = *dst;
668eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet        out += 128;
669eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet        round = 1 << (FDCT_SHIFT - 1);
670eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet
671e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        do  /* fdct_nextrow */
672e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        {
673e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            mask = 0x1FE;
67448d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            curInt = (Int*) cur;
67513fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            tmp = curInt[0];    /* contains 4 pixels */
67613fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k0 = mask & (tmp << 1);
67713fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k1 = mask & (tmp >> 7);
678e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k2 = mask & (tmp >> 15);
679e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k3 = mask & (tmp >> 23);
680e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            tmp = curInt[1];    /* another 4 pixels */
681e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k4 =  mask & (tmp << 1);
68248d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            k5 =  mask & (tmp >> 7);
68348d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            k6 =  mask & (tmp >> 15);
684d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k7 =  mask & (tmp >> 23);
685d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            cur += width;
68648d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines            /* fdct_1 */
687d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k0 = k0 + k7;
688e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k7 = k0 - (k7 << 1);
689e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k1 = k1 + k6;
690e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k6 = k1 - (k6 << 1);
691e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k2 = k2 + k5;
692e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k5 = k2 - (k5 << 1);
693e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k3 = k3 + k4;
694e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k4 = k3 - (k4 << 1);
695d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet
696d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k0 = k0 + k3;
697d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k3 = k0 - (k3 << 1);
698ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k1 = k1 + k2;
699ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k2 = k1 - (k2 << 1);
70011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines
70178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k0 = k0 + k1;
70278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k1 = k0 - (k1 << 1);
70378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            /**********/
704ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            dst[0] = k0;
705ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            dst[4] = k1; /* col. 4 */
70633ea573b6df7b7fe48d2b68d4c479f33082e3c0dStephen Hines            /* fdct_2 */
707ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k4 = k4 + k5;
70813fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k5 = k5 + k6;
709ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k6 = k6 + k7;
710ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k2 = k2 + k3;
711ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /* MUL2C k2,k5,724,FDCT_SHIFT */
712ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /* k0, k1 become scratch */
7135abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            /* assume FAST MULTIPLY */
714ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k1 = mla724(k12, k5, round);
71511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            k0 = mla724(k12, k2, round);
71611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines
717d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k5 = k1 >> FDCT_SHIFT;
718d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k2 = k0 >> FDCT_SHIFT;
71911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines            /*****************/
720d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k2 = k2 + k3;
721ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            k3 = (k3 << 1) - k2;
722ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines            /********/
72378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            dst[2] = k2;        /* col. 2 */
72478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines            k3 <<= 1;       /* scale up col. 6 */
725e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            dst[6] = k3; /* col. 6 */
726e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /* fdct_3 */
727e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
7288de1922e037612f2521acac2f4c4289a9f71450dStephen Hines            /* assume FAST MULTIPLY */
729e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /* k0, k1 are output */
730e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k0 = k4 - k6;
7315abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes
732e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k1 = mla392(k0, k14, round);
733e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k0 = mla554(k4, k12, k1);
734e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k1 = mla1338(k6, k14, k1);
7355abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes
736e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k4 = k0 >> FDCT_SHIFT;
737e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k6 = k1 >> FDCT_SHIFT;
738e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /***********************/
739b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k5 = k5 + k7;
7405abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k7 = (k7 << 1) - k5;
741e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k4 = k4 + k7;
742e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k7 = (k7 << 1) - k4;
743b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k5 = k5 + k6;
744b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k4 <<= 1;       /* scale up col.5 */
745e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k6 = k5 - (k6 << 1);
746e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /********/
747b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            dst[5] = k4;    /* col. 5 */
748474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k6 <<= 2;       /* scale up col. 7 */
7495abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            dst[1] = k5;    /* col. 1 */
750474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            dst[7] = k6;    /* col. 7 */
751e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            dst[3] = k7;    /* col. 3 */
752474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            dst += 8;
753e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        }
754e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        while (dst < out);
755e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines
756cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines        out -= 64;
757cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines        dst = out + 8;
758cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines
759dd6206bb61bf8df2ed6b643abe8a29c48a315685Stephen Hines        /*  Vertical Block Loop  */
760cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines        do  /* Vertical 8xDCT loop */
761cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines        {
762cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines            k0 = out[0];
763e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k1 = out[8];
764e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k2 = out[16];
7655abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k3 = out[24];
76683f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao            k4 = out[32];
76783f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao            k5 = out[40];
76883f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao            k6 = out[48];
76983f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao            k7 = out[56];
77083f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao            /* deadzone thresholding for column */
77183f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao
77283f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
77383f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao
77483f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao            if (abs_sum < ColTh)
7755abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            {
77683f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao                out[0] = 0x7fff;
77783f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao                out++;
77883f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao                continue;
77983f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao            }
78083f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao
78183f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao            /* fdct_1 */
782e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k0 = k0 + k7;
783e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k7 = k0 - (k7 << 1);
784e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k1 = k1 + k6;
785e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k6 = k1 - (k6 << 1);
786e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k2 = k2 + k5;
787b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k5 = k2 - (k5 << 1);
788b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k3 = k3 + k4;
789e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k4 = k3 - (k4 << 1);
79013fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines
79113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k0 = k0 + k3;
792e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k3 = k0 - (k3 << 1);
793e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k1 = k1 + k2;
794e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k2 = k1 - (k2 << 1);
795e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines
796e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k0 = k0 + k1;
797e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k1 = k0 - (k1 << 1);
798e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /**********/
799e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            out[32] = k1; /* row 4 */
800e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            out[0] = k0; /* row 0 */
801e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /* fdct_2 */
802b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k4 = k4 + k5;
803e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k5 = k5 + k6;
804e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k6 = k6 + k7;
805e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k2 = k2 + k3;
806e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /* MUL2C k2,k5,724,FDCT_SHIFT */
807e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /* k0, k1 become scratch */
808340b5550cf63b6beae3b12c2e91377bce7704c34Stephen Hines            /* assume FAST MULTIPLY */
809e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k1 = mla724(k12, k5, round);
810e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k0 = mla724(k12, k2, round);
811e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines
812e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k5 = k1 >> FDCT_SHIFT;
813e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k2 = k0 >> FDCT_SHIFT;
814e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /*****************/
815e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k2 = k2 + k3;
816e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k3 = (k3 << 1) - k2;
817e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            k3 <<= 1;       /* scale up col. 6 */
818e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            /********/
8199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            out[48] = k3;   /* row 6 */
8209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            out[16] = k2;   /* row 2 */
82113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            /* fdct_3 */
82213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
8239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* assume FAST MULTIPLY */
8249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* k0, k1 are output */
8259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = k4 - k6;
8269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = mla392(k0, k14, round);
8289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = mla554(k4, k12, k1);
8299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = mla1338(k6, k14, k1);
8309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
831b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k4 = k0 >> FDCT_SHIFT;
832b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k6 = k1 >> FDCT_SHIFT;
8335abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            /***********************/
8349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k5 = k5 + k7;
8359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k7 = (k7 << 1) - k5;
836cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k4 = k4 + k7;
8379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k7 = (k7 << 1) - k4;
838cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k5 = k5 + k6;
83992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            k4 <<= 1;       /* scale up col. 5 */
8409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k6 = k5 - (k6 << 1);
8419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /********/
8429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            out[24] = k7 ;    /* row 3 */
8439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k6 <<= 2;       /* scale up col. 7 */
8449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            out[56] = k6 ;   /* row 7 */
845cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            out[8] = k5 ;    /* row 1 */
84692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            out[40] = k4 ;   /* row 5 */
84792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            out++;
84892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        }
84992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        while ((uintptr_t)out < (uintptr_t)dst) ;
85092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
85192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        return ;
85292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    }
853cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet
85492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    /**************************************************************************/
85592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    /*  Function:   Block4x4DCT_AANIntra
85692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Date:       8/9/01
85792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Input:      prev
85892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Output:     out[64] ==> next block
85992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Purpose:    Input directly from prev frame. output 2x2 DCT
86092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Modified:
861cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet    **************************************************************************/
86292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
86392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    Void Block4x4DCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width)
86492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    {
86592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Short *dst;
86692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        register Int k0, k1, k2, k3, k4, k5, k6, k7;
8679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int round;
8689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int k12 = 0x022A02D4;
8699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int k14 = 0x0188053A;
87092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Int mask;
8719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int *curInt, tmp;
8729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int abs_sum;
8739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int ColTh;
8749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        OSCL_UNUSED_ARG(dummy2);
8769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        dst = out + 64 ;
8789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        ColTh = *dst;
8799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        out += 128;
8809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        round = 1 << (FDCT_SHIFT - 1);
8819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        do  /* fdct_nextrow */
883b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet        {
884b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            mask = 0x1FE;
88592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            curInt = (Int*) cur;
8869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            tmp = curInt[0];    /* contains 4 pixels */
8879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = mask & (tmp << 1);
8889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = mask & (tmp >> 7);
8899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k2 = mask & (tmp >> 15);
8909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k3 = mask & (tmp >> 23);
891b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            tmp = curInt[1];    /* another 4 pixels */
892b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k4 =  mask & (tmp << 1);
8939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k5 =  mask & (tmp >> 7);
8949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k6 =  mask & (tmp >> 15);
8952e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang            k7 =  mask & (tmp >> 23);
8962e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang            cur += width;
8972e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang            /* fdct_1 */
898b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k0 = k0 + k7;
8992e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang            k7 = k0 - (k7 << 1);
9002e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang            k1 = k1 + k6;
9019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k6 = k1 - (k6 << 1);
902d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k2 = k2 + k5;
903d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            k5 = k2 - (k5 << 1);
9049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k3 = k3 + k4;
9059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k4 = k3 - (k4 << 1);
9069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = k0 + k3;
9089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k3 = k0 - (k3 << 1);
909462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k1 = k1 + k2;
9101f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao            k2 = k1 - (k2 << 1);
91113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines
91213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k0 = k0 + k1;
9139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /**********/
91413fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            dst[0] = k0;
91513fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            /* fdct_2 */
916d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k4 = k4 + k5;
9175abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k5 = k5 + k6;
918d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines            k6 = k6 + k7;
919462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k2 = k2 + k3;
920462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* MUL2C k2,k5,724,FDCT_SHIFT */
9219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* k0, k1 become scratch */
9229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* assume FAST MULTIPLY */
92313fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k1 = mla724(k12, k5, round);
92413fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            k0 = mla724(k12, k2, round);
925462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
926462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k5 = k1 >> FDCT_SHIFT;
927c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet            k2 = k0 >> FDCT_SHIFT;
928c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet            /*****************/
929462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k2 = k2 + k3;
930462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /********/
931c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet            dst[2] = k2;        /* col. 2 */
932c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet            /* fdct_3 */
933462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
934462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* assume FAST MULTIPLY */
9356b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang            /* k0, k1 are output */
9366b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang            k0 = k4 - k6;
9376b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang
938a41ce1d98094da84643995d40d71c529905123fcZonr Chang            k1 = mla392(k0, k14, round);
9396b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang            k0 = mla554(k4, k12, k1);
9400da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang            k1 = mla1338(k6, k14, k1);
9410da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
9426315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr            k4 = k0 >> FDCT_SHIFT;
9435abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k6 = k1 >> FDCT_SHIFT;
9440da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang            /***********************/
9450da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang            k5 = k5 + k7;
9460da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang            k7 = (k7 << 1) - k5;
947b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k7 = k7 - k4;
9480da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang            k5 = k5 + k6;
9490da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang            /********/
950b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            dst[1] = k5;        /* col. 1 */
951b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            dst[3] = k7;        /* col. 3 */
952462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            dst += 8;
953462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
9543cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang        while (dst < out);
9553cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang
9563cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang        out -= 64;
957641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang        dst = out + 4;
9585abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes
9593cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang        /*  Vertical Block Loop  */
960641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang        do  /* Vertical 8xDCT loop */
961641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang        {
962641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang            k0 = out[0];
963641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang            k1 = out[8];
964641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang            k2 = out[16];
965641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang            k3 = out[24];
966641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang            k4 = out[32];
967a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang            k5 = out[40];
968a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang            k6 = out[48];
969a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang            k7 = out[56];
9709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
971b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
972b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
9739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (abs_sum < ColTh)
9749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            {
9755abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes                out[0] = 0x7fff;
9769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                out++;
9779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                continue;
9789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
979462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* fdct_1 */
980462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k0 = k0 + k7;
981cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k7 = k0 - (k7 << 1);
982b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            k1 = k1 + k6;
9839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k6 = k1 - (k6 << 1);
9849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k2 = k2 + k5;
985462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k5 = k2 - (k5 << 1);
986b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            k3 = k3 + k4;
987474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k4 = k3 - (k4 << 1);
9883eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines
9893eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines            k0 = k0 + k3;
990474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k3 = k0 - (k3 << 1);
9919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = k1 + k2;
992462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k2 = k1 - (k2 << 1);
993b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
994b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            k0 = k0 + k1;
9959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /**********/
9969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            out[0] = k0;   /* row 0 */
9979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* fdct_2 */
9989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k4 = k4 + k5;
9999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k5 = k5 + k6;
1000cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet            k6 = k6 + k7;
1001b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            k2 = k2 + k3;
10025abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            /* MUL2C k2,k5,724,FDCT_SHIFT */
10039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* k0, k1 become scratch */
10049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* assume FAST MULTIPLY */
1005b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            k1 = mla724(k12, k5, round);
1006b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            k0 = mla724(k12, k2, round);
1007b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
1008b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            k5 = k1 >> FDCT_SHIFT;
1009474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k2 = k0 >> FDCT_SHIFT;
1010474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /*****************/
1011474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k2 = k2 + k3;
1012474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /********/
1013b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            out[16] = k2;           /* row 2 */
1014b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            /* fdct_3 */
1015b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
1016474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* assume FAST MULTIPLY */
1017474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* k0, k1 are output */
1018474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k0 = k4 - k6;
1019474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet
10209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = mla392(k0, k14, round);
10219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = mla554(k4, k12, k1);
1022feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k1 = mla1338(k6, k14, k1);
1023feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines
1024feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k4 = k0 >> FDCT_SHIFT;
1025feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k6 = k1 >> FDCT_SHIFT;
1026feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            /***********************/
1027feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k5 = k5 + k7;
1028feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k7 = (k7 << 1) - k5;
1029feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k7 = k7 - k4 ;
1030feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k5 = k5 + k6;
1031feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            /********/
1032b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines            out[24] = k7 ;      /* row 3 */
1033feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            out[8] = k5 ;       /* row 1 */
1034b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines            out++;
1035b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines        }
1036b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines        while ((uintptr_t)out < (uintptr_t)dst) ;
1037b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines
1038b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines        return ;
1039b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines    }
1040b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines
1041feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines    /**************************************************************************/
1042feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines    /*  Function:   Block2x2DCT_AANIntra
1043feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Date:       8/9/01
1044feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Input:      prev
1045feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Output:     out[64] ==> next block
1046feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Purpose:    Input directly from prev frame. output 2x2 DCT
1047feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Modified:
1048feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines    **************************************************************************/
1049feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines
1050feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines    Void Block2x2DCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width)
1051feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines    {
1052feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Short *dst;
1053cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet        register Int k0, k1, k2, k3, k4, k5, k6, k7;
1054feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Int round;
1055feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Int k12 = 0x022A02D4;
1056feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Int k14 = 0x018803B2;
1057feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Int mask;
1058feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        Int *curInt, tmp;
1059cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet        Int abs_sum;
1060cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet        Int ColTh;
1061cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet
1062feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        OSCL_UNUSED_ARG(dummy2);
1063feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines
1064feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        dst = out + 64 ;
1065feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        ColTh = *dst;
1066feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        out += 128;
1067feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        round = 1 << (FDCT_SHIFT - 1);
1068feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines
1069feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        do  /* fdct_nextrow */
1070feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines        {
1071feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            mask = 0x1FE;
1072feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            curInt = (Int*) cur;
1073feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            tmp = curInt[0];    /* contains 4 pixels */
1074feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k0 = mask & (tmp << 1);
1075feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k1 = mask & (tmp >> 7);
1076feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k2 = mask & (tmp >> 15);
1077feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k3 = mask & (tmp >> 23);
1078feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            tmp = curInt[1];    /* another 4 pixels */
1079feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k4 =  mask & (tmp << 1);
1080feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k5 =  mask & (tmp >> 7);
1081feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k6 =  mask & (tmp >> 15);
1082feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines            k7 =  mask & (tmp >> 23);
10839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            cur += width;
1084474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet
1085474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* fdct_1 */
10866e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines            k0 = k0 + k7;
10879ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines            k7 = k0 - (k7 << 1);
10889ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines            k1 = k1 + k6;
10899ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines            k6 = k1 - (k6 << 1);
10909ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines            k2 = k2 + k5;
1091474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k5 = k2 - (k5 << 1);
1092462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k3 = k3 + k4;
1093462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k4 = k3 - (k4 << 1);
1094cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet
10952ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines            k0 = k0 + k3;
10965abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k3 = k0 - (k3 << 1);
10979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = k1 + k2;
1098462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k2 = k1 - (k2 << 1);
10999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = k0 + k1;
1101be27482cdeaf08576bc39b72a15d35d13014a636Logan            /**********/
1102b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet            dst[0] = k0;
1103474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* fdct_2 */
11045abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            k4 = k4 + k5;
1105474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k5 = k5 + k6;
11069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k6 = k6 + k7;
1107474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* MUL2C k2,k5,724,FDCT_SHIFT */
1108474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* k0, k1 become scratch */
1109474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            /* assume FAST MULTIPLY */
1110474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet            k1 = mla724(k12, k5, round);
11119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k5 = k1 >> FDCT_SHIFT;
11139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /*****************/
11149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /********/
1115b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            /* fdct_3 */
11169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
11179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* assume FAST MULTIPLY */
1118d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet            /* k0, k1 are output */
11192ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines            k1 = mla392(k4, k14, round);
11209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = mla946(k6, k14, k1);
1121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k6 = k1 >> FDCT_SHIFT;
1123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /***********************/
11249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k5 = k5 + k7;
1125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k5 = k5 + k6;
1126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /********/
11279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            dst[1] = k5;
11289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            dst += 8;
11299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
11309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        while (dst < out);
11319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        out -= 64;
11322ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines        dst = out + 2;
1133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /*  Vertical Block Loop  */
11349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        do  /* Vertical 8xDCT loop */
11355abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        {
11369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = out[0];
11376b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang            k1 = out[8];
11382b8fb64be3047df940a219872b331eb11de2758dStephen Hines            k2 = out[16];
1139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k3 = out[24];
1140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k4 = out[32];
11419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k5 = out[40];
11422b8fb64be3047df940a219872b331eb11de2758dStephen Hines            k6 = out[48];
11439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k7 = out[56];
114413fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines
114513fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines            abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7);
114613fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines
11472b8fb64be3047df940a219872b331eb11de2758dStephen Hines            if (abs_sum < ColTh)
1148e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines            {
11495abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes                out[0] = 0x7fff;
1150e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines                out++;
1151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                continue;
1152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
11537c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao            /* fdct_1 */
11549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = k0 + k7;
11559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k7 = k0 - (k7 << 1);
11569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = k1 + k6;
11579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k6 = k1 - (k6 << 1);
11589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k2 = k2 + k5;
11599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k5 = k2 - (k5 << 1);
11609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k3 = k3 + k4;
11619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k4 = k3 - (k4 << 1);
11629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k0 = k0 + k3;
11649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k3 = k0 - (k3 << 1);
1165d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray            k1 = k1 + k2;
1166d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray            k2 = k1 - (k2 << 1);
1167d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray
1168d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray            k0 = k0 + k1;
1169d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray            /**********/
1170d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray            out[0] = k0;        /* row 0 */
1171d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray            /* fdct_2 */
1172d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray            k4 = k4 + k5;
1173d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray            k5 = k5 + k6;
1174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            k6 = k6 + k7;
11759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* MUL2C k2,k5,724,FDCT_SHIFT */
1176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* k0, k1 become scratch */
11779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* assume FAST MULTIPLY */
1178e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar            k1 = mla724(k12, k5, round);
1179e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar
1180e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar            k5 = k1 >> FDCT_SHIFT;
1181e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar            /*****************/
11829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /********/
11839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* fdct_3 */
11849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* ROTATE k4,k6,392,946, FDCT_SHIFT */
11859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* assume FAST MULTIPLY */
11869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /* k0, k1 are output */
11879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = mla392(k4, k14, round);
11889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            k1 = mla946(k6, k14, k1);
11899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
119091a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            k6 = k1 >> FDCT_SHIFT;
119191a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            /***********************/
119291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            k5 = k5 + k7;
119391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            k5 = k5 + k6;
11949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            /********/
11959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            out[8] = k5 ;       /* row 1 */
11969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            out++;
11979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
11989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        while ((uintptr_t)out < (uintptr_t)dst) ;
11999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return ;
12019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
12029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /**************************************************************************/
12039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /*  Function:   Block1x1DCTwSub
12049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Date:       8/9/01
12059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Input:      block
12069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Output:     y
12079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Purpose:    Compute DC value only
12089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Modified:
12099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    **************************************************************************/
12109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void Block1x1DCTwSub(Short *out, UChar *cur, UChar *pred, Int width)
12119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    {
1212a5d2c232d56b04292cb51c8fb343aef990f7970fStephen Hines        UChar *end;
1213a5d2c232d56b04292cb51c8fb343aef990f7970fStephen Hines        Int temp = 0;
12149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int offset2;
12159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        offset2 = width - 8;
12179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        end = pred + (16 << 3);
12186e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines        do
1219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        {
12209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            temp += (*cur++ - *pred++);
1221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            temp += (*cur++ - *pred++);
12225abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            temp += (*cur++ - *pred++);
1223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            temp += (*cur++ - *pred++);
1224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            temp += (*cur++ - *pred++);
1225641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang            temp += (*cur++ - *pred++);
1226641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang            temp += (*cur++ - *pred++);
1227641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang            temp += (*cur++ - *pred++);
1228641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang            cur += offset2;
1229641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang            pred += 8;
1230fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines        }
1231fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines        while (pred < end) ;
1232fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines
1233fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines        out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = out[7] = 0;
12345abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        out[0] = temp >> 3;
1235fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines
1236fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines        return ;
1237fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines    }
12389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1239462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /**************************************************************************/
12409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /*  Function:   Block1x1DCTIntra
12419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Date:       8/9/01
12429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Input:      prev
12439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Output:     out
1244b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet        Purpose:    Compute DC value only
12459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Modified:
1246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    **************************************************************************/
12479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void Block1x1DCTIntra(Short *out, UChar *cur, UChar *dummy2, Int width)
124813fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines    {
124913fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines        UChar *end;
12509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Int temp = 0;
12519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        ULong word;
12522ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines
12532ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines        OSCL_UNUSED_ARG(dummy2);
12549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        end = cur + (width << 3);
12565abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        do
12572ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines        {
12585abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes            word = *((ULong*)cur);
12599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            temp += (word >> 24);
1260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            temp += ((word >> 16) & 0xFF);
12619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            temp += ((word >> 8) & 0xFF);
1262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            temp += (word & 0xFF);
1263462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
12647c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao            word = *((ULong*)(cur + 4));
12657c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao            temp += (word >> 24);
12669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            temp += ((word >> 16) & 0xFF);
1267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            temp += ((word >> 8) & 0xFF);
1268462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            temp += (word & 0xFF);
12693cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang
12703cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang            cur += width;
12713cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang        }
1272641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang        while (cur < end) ;
12733cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang
1274641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang        out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = out[7] = 0;
1275641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang        out[0] = temp >> 3;
1276641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang
1277641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang        return ;
1278641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    }
1279641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang
1280641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang#ifdef __cplusplus
1281641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang}
12826315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#endif
12836315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
12846315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr