13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------
23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo
33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License.
63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at
73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software
113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied.
143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions
153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License.
163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * -------------------------------------------------------------------
173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */
183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4def.h"
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "idct.h"
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "motion_comp.h"
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/****************************************************************
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       vca_idct.c : created 6/1/99 for several options
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                     of hard-coded reduced idct function (using nz_coefs)
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong******************************************************************/
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*****************************************************/
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//pretested version
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow0(int16 *, uint8 *, uint8 *, int)
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol0(int16 *)
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow1(int16 *blk, uint8 *pred, uint8 *dst, int width)
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* shortcut */
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int tmp;
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 8;
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 pred_word, dst_word;
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int res, res2;
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* preset the offset, such that we can take advantage pre-offset addressing mode   */
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width -= 4;
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dst -= width;
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pred -= 12;
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk -= 8;
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmp = (*(blk += 8) + 32) >> 6;
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *blk = 0;
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_word = *((uint32*)(pred += 12)); /* read 4 bytes from pred */
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = tmp + (pred_word & 0xFF);
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(res);
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res2 = tmp + ((pred_word >> 8) & 0xFF);
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(res2);
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word = (res2 << 8) | res;
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = tmp + ((pred_word >> 16) & 0xFF);
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(res);
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 16);
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = tmp + ((pred_word >> 24) & 0xFF);
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(res);
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 24);
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(dst += width)) = dst_word; /* save 4 bytes to dst */
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_word = *((uint32*)(pred += 4)); /* read 4 bytes from pred */
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = tmp + (pred_word & 0xFF);
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(res);
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res2 = tmp + ((pred_word >> 8) & 0xFF);
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(res2);
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word = (res2 << 8) | res;
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = tmp + ((pred_word >> 16) & 0xFF);
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(res);
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 16);
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = tmp + ((pred_word >> 24) & 0xFF);
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(res);
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 24);
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(dst += 4)) = dst_word; /* save 4 bytes to dst */
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol1(int16 *blk)
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ /* shortcut */
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[0] = blk[8] = blk[16] = blk[24] = blk[32] = blk[40] = blk[48] = blk[56] =
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                              blk[0] << 3;
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow2(int16 *blk, uint8 *pred, uint8 *dst, int width)
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x4, x5;
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 8;
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 pred_word, dst_word;
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int res, res2;
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* preset the offset, such that we can take advantage pre-offset addressing mode   */
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width -= 4;
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dst -= width;
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pred -= 12;
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk -= 8;
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* shortcut */
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = blk[9];
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[9] = 0;
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 = ((*(blk += 8)) << 8) + 8192;
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *blk = 0;  /* for proper rounding in the fourth stage */
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* first stage */
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = (W7 * x4 + 4) >> 3;
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = (W1 * x4 + 4) >> 3;
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* third stage */
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = (181 * (x4 + x5) + 128) >> 8;
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = (181 * (x4 - x5) + 128) >> 8;
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* fourth stage */
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_word = *((uint32*)(pred += 12)); /* read 4 bytes from pred */
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 + x4) >> 14;
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP1(res);
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res2 = (x0 + x2) >> 14;
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP2(res2);
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word = (res2 << 8) | res;
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 + x1) >> 14;
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP3(res);
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 16);
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 + x5) >> 14;
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP4(res);
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 24);
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(dst += width)) = dst_word; /* save 4 bytes to dst */
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_word = *((uint32*)(pred += 4)); /* read 4 bytes from pred */
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 - x5) >> 14;
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP1(res);
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res2 = (x0 - x1) >> 14;
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP2(res2);
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word = (res2 << 8) | res;
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 - x2) >> 14;
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP3(res);
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 16);
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 - x4) >> 14;
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP4(res);
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 24);
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(dst += 4)) = dst_word; /* save 4 bytes to dst */
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol2(int16 *blk)
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x3, x5, x7;//, x8;
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x1 = blk[8];
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x0 = ((int32)blk[0] << 11) + 128;
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* both upper and lower*/
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x7 = W7 * x1;
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x1 = W1 * x1;
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x3 = x7;
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x5 = (181 * (x1 - x7) + 128) >> 8;
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x7 = (181 * (x1 + x7) + 128) >> 8;
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[0] = (x0 + x1) >> 8;
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[8] = (x0 + x7) >> 8;
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[16] = (x0 + x5) >> 8;
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[24] = (x0 + x3) >> 8;
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[56] = (x0 - x1) >> 8;
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[48] = (x0 - x7) >> 8;
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[40] = (x0 - x5) >> 8;
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[32] = (x0 - x3) >> 8;
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow3(int16 *blk, uint8 *pred, uint8 *dst, int width)
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8;
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 8;
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 pred_word, dst_word;
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int res, res2;
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* preset the offset, such that we can take advantage pre-offset addressing mode   */
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width -= 4;
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dst -= width;
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pred -= 12;
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk -= 8;
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = blk[10];
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[10] = 0;
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = blk[9];
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[9] = 0;
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 = ((*(blk += 8)) << 8) + 8192;
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *blk = 0;   /* for proper rounding in the fourth stage */
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* both upper and lower*/
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* both x2orx6 and x0orx4 */
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = x0;
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = (W6 * x2 + 4) >> 3;
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = (W2 * x2 + 4) >> 3;
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x0 - x2;
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 += x2;
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = x8;
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x4 - x6;
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 += x6;
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = x8;
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = (W7 * x1 + 4) >> 3;
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = (W1 * x1 + 4) >> 3;
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = x7;
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = (181 * (x1 - x7) + 128) >> 8;
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = (181 * (x1 + x7) + 128) >> 8;
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_word = *((uint32*)(pred += 12)); /* read 4 bytes from pred */
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 + x1) >> 14;
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP1(res);
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res2 = (x4 + x7) >> 14;
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP2(res2);
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word = (res2 << 8) | res;
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x6 + x5) >> 14;
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP3(res);
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 16);
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x2 + x3) >> 14;
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP4(res);
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 24);
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(dst += width)) = dst_word; /* save 4 bytes to dst */
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_word = *((uint32*)(pred += 4)); /* read 4 bytes from pred */
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x2 - x3) >> 14;
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP1(res);
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res2 = (x6 - x5) >> 14;
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP2(res2);
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word = (res2 << 8) | res;
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x4 - x7) >> 14;
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP3(res);
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 16);
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 - x1) >> 14;
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP4(res);
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 24);
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(dst += 4)) = dst_word; /* save 4 bytes to dst */
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol3(int16 *blk)
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8;
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x2 = blk[16];
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x1 = blk[8];
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x0 = ((int32)blk[0] << 11) + 128;
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x4 = x0;
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x6 = W6 * x2;
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x2 = W2 * x2;
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x8 = x0 - x2;
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x0 += x2;
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x2 = x8;
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x8 = x4 - x6;
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x4 += x6;
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x6 = x8;
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x7 = W7 * x1;
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x1 = W1 * x1;
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x3 = x7;
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x5 = (181 * (x1 - x7) + 128) >> 8;
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x7 = (181 * (x1 + x7) + 128) >> 8;
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[0] = (x0 + x1) >> 8;
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[8] = (x4 + x7) >> 8;
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[16] = (x6 + x5) >> 8;
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[24] = (x2 + x3) >> 8;
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[56] = (x0 - x1) >> 8;
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[48] = (x4 - x7) >> 8;
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[40] = (x6 - x5) >> 8;
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[32] = (x2 - x3) >> 8;
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow4(int16 *blk, uint8 *pred, uint8 *dst, int width)
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8;
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 8;
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 pred_word, dst_word;
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int res, res2;
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* preset the offset, such that we can take advantage pre-offset addressing mode   */
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width -= 4;
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dst -= width;
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pred -= 12;
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk -= 8;
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = blk[10];
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[10] = 0;
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = blk[9];
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[9] = 0;
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = blk[11];
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[11] = 0;
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 = ((*(blk += 8)) << 8) + 8192;
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *blk = 0;    /* for proper rounding in the fourth stage */
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = x0;
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = (W6 * x2 + 4) >> 3;
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = (W2 * x2 + 4) >> 3;
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x0 - x2;
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 += x2;
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = x8;
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x4 - x6;
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 += x6;
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = x8;
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = (W7 * x1 + 4) >> 3;
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = (W1 * x1 + 4) >> 3;
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = (W3 * x3 + 4) >> 3;
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = (- W5 * x3 + 4) >> 3;
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x1 - x5;
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 += x5;
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = x8;
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x7 - x3;
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 += x7;
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = (181 * (x5 + x8) + 128) >> 8;
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = (181 * (x5 - x8) + 128) >> 8;
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_word = *((uint32*)(pred += 12)); /* read 4 bytes from pred */
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 + x1) >> 14;
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP1(res);
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res2 = (x4 + x7) >> 14;
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP2(res2);
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word = (res2 << 8) | res;
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x6 + x5) >> 14;
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP3(res);
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 16);
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x2 + x3) >> 14;
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP4(res);
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 24);
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(dst += width)) = dst_word; /* save 4 bytes to dst */
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_word = *((uint32*)(pred += 4)); /* read 4 bytes from pred */
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x2 - x3) >> 14;
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP1(res);
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res2 = (x6 - x5) >> 14;
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP2(res2);
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word = (res2 << 8) | res;
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x4 - x7) >> 14;
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP3(res);
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 16);
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 - x1) >> 14;
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP4(res);
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 24);
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(dst += 4)) = dst_word; /* save 4 bytes to dst */
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol4(int16 *blk)
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8;
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x2 = blk[16];
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x1 = blk[8];
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x3 = blk[24];
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x0 = ((int32)blk[0] << 11) + 128;
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x4 = x0;
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x6 = W6 * x2;
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x2 = W2 * x2;
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x8 = x0 - x2;
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x0 += x2;
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x2 = x8;
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x8 = x4 - x6;
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x4 += x6;
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x6 = x8;
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x7 = W7 * x1;
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x1 = W1 * x1;
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x5 = W3 * x3;
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x3 = -W5 * x3;
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x8 = x1 - x5;
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x1 += x5;
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x5 = x8;
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x8 = x7 - x3;
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x3 += x7;
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x7 = (181 * (x5 + x8) + 128) >> 8;
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x5 = (181 * (x5 - x8) + 128) >> 8;
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[0] = (x0 + x1) >> 8;
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[8] = (x4 + x7) >> 8;
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[16] = (x6 + x5) >> 8;
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[24] = (x2 + x3) >> 8;
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[56] = (x0 - x1) >> 8;
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[48] = (x4 - x7) >> 8;
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[40] = (x6 - x5) >> 8;
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[32] = (x2 - x3) >> 8;
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow0_intra(int16 *, PIXEL *, int)
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow1_intra(int16 *blk, PIXEL *comp, int width)
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* shortcut */
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 tmp;
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 8;
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int offset = width;
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 word;
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    comp -= offset;
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmp = ((blk[0] + 32) >> 6);
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[0] = 0;
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(tmp)
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = (tmp << 8) | tmp;
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = (word << 16) | word;
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(comp += offset)) = word;
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(comp + 4)) = word;
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk += B_SIZE;
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow2_intra(int16 *blk, PIXEL *comp, int width)
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x4, x5, temp;
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 8;
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int offset = width;
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 word;
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    comp -= offset;
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* shortcut */
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = blk[1];
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[1] = 0;
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 = ((int32)blk[0] << 8) + 8192;
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[0] = 0;   /* for proper rounding in the fourth stage */
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* first stage */
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = (W7 * x4 + 4) >> 3;
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = (W1 * x4 + 4) >> 3;
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* third stage */
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = (181 * (x4 + x5) + 128) >> 8;
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = (181 * (x4 - x5) + 128) >> 8;
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* fourth stage */
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = ((x0 + x4) >> 14);
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(word)
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x0 + x2) >> 14);
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 8);
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x0 + x1) >> 14);
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 16);
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x0 + x5) >> 14);
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 24);
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((int32*)(comp += offset)) = word;
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = ((x0 - x5) >> 14);
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(word)
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x0 - x1) >> 14);
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 8);
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x0 - x2) >> 14);
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 16);
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x0 - x4) >> 14);
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 24);
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((int32*)(comp + 4)) = word;
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk += B_SIZE;
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow3_intra(int16 *blk, PIXEL *comp, int width)
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8, temp;
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 8;
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int offset = width;
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 word;
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    comp -= offset;
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = blk[2];
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[2] = 0;
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = blk[1];
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[1] = 0;
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 = ((int32)blk[0] << 8) + 8192;
5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[0] = 0;/* for proper rounding in the fourth stage */
5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* both upper and lower*/
5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* both x2orx6 and x0orx4 */
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = x0;
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = (W6 * x2 + 4) >> 3;
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = (W2 * x2 + 4) >> 3;
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x0 - x2;
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 += x2;
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = x8;
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x4 - x6;
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 += x6;
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = x8;
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = (W7 * x1 + 4) >> 3;
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = (W1 * x1 + 4) >> 3;
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = x7;
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = (181 * (x1 - x7) + 128) >> 8;
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = (181 * (x1 + x7) + 128) >> 8;
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = ((x0 + x1) >> 14);
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(word)
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x4 + x7) >> 14);
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 8);
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x6 + x5) >> 14);
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 16);
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x2 + x3) >> 14);
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 24);
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((int32*)(comp += offset)) = word;
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = ((x2 - x3) >> 14);
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(word)
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x6 - x5) >> 14);
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 8);
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x4 - x7) >> 14);
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 16);
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x0 - x1) >> 14);
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 24);
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((int32*)(comp + 4)) = word;
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk += B_SIZE;
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow4_intra(int16 *blk, PIXEL *comp, int width)
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8, temp;
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 8;
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int offset = width;
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 word;
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    comp -= offset;
5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = blk[2];
5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[2] = 0;
5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = blk[1];
5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[1] = 0;
5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = blk[3];
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[3] = 0;
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 = ((int32)blk[0] << 8) + 8192;
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[0] = 0;/* for proper rounding in the fourth stage */
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = x0;
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = (W6 * x2 + 4) >> 3;
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = (W2 * x2 + 4) >> 3;
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x0 - x2;
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 += x2;
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = x8;
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x4 - x6;
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 += x6;
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = x8;
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = (W7 * x1 + 4) >> 3;
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = (W1 * x1 + 4) >> 3;
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = (W3 * x3 + 4) >> 3;
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = (- W5 * x3 + 4) >> 3;
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x1 - x5;
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 += x5;
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = x8;
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x7 - x3;
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 += x7;
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = (181 * (x5 + x8) + 128) >> 8;
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = (181 * (x5 - x8) + 128) >> 8;
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = ((x0 + x1) >> 14);
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(word)
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x4 + x7) >> 14);
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 8);
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x6 + x5) >> 14);
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 16);
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x2 + x3) >> 14);
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 24);
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((int32*)(comp += offset)) = word;
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = ((x2 - x3) >> 14);
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(word)
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x6 - x5) >> 14);
6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 8);
6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x4 - x7) >> 14);
6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 16);
6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x0 - x1) >> 14);
6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 24);
6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((int32*)(comp + 4)) = word;
6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk += B_SIZE;
6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
661