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/*
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong INPUT AND OUTPUT DEFINITIONS
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Inputs:
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [input_variable_name] = [description of the input to module, its type
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                 definition, and length (when applicable)]
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores/Buffers/Pointers Needed:
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_store_name] = [description of the local store, its type
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  definition, and length (when applicable)]
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_buffer_name] = [description of the local buffer, its type
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_ptr_name] = [description of the local pointer, its type
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                definition, and length (when applicable)]
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores/Buffers/Pointers Needed:
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_store_name] = [description of the global store, its type
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_buffer_name] = [description of the global buffer, its type
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                definition, and length (when applicable)]
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_ptr_name] = [description of the global pointer, its type
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                 definition, and length (when applicable)]
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Outputs:
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [return_variable_name] = [description of data/pointer returned
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  by module, its type definition, and length
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  (when applicable)]
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Pointers and Buffers Modified:
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [variable_bfr_ptr] points to the [describe where the
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      variable_bfr_ptr points to, its type definition, and length
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      (when applicable)]
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [variable_bfr] contents are [describe the new contents of
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      variable_bfr]
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores Modified:
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_store_name] = [describe new contents, its type
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  definition, and length (when applicable)]
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores Modified:
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_store_name] = [describe new contents, its type
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FUNCTION DESCRIPTION
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong REQUIREMENTS
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong REFERENCES
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PSEUDO-CODE
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong RESOURCES USED
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong   When the code is written for a specific target processor the
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     the resources used should be documented below.
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong STACK USAGE: [stack count for this module] + [variable to represent
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong          stack usage for each subroutine called]
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     where: [stack usage variable] = stack usage for [subroutine
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong         name] (see [filename].ext)
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong DATA MEMORY USED: x words
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PROGRAM MEMORY USED: x words
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLOCK CYCLES: [cycle count equation for this module] + [variable
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           used to represent cycle count for each subroutine
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           called]
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     where: [cycle count variable] = cycle count for [subroutine
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        name] (see [filename].ext)
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*/
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; INCLUDES
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h"
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "idct.h"
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "motion_comp.h"
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define OSCL_DISABLE_WARNING_CONV_POSSIBLE_LOSS_OF_DATA
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; MACROS
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Define module specific macros here
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; DEFINES
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Include all pre-processor statements here. Include conditional
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; compile variables also.
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; LOCAL FUNCTION DEFINITIONS
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Function Prototype declaration
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* private prototypes */
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic void idctrow(int16 *blk, uint8 *pred, uint8 *dst, int width);
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic void idctrow_intra(int16 *blk, PIXEL *, int width);
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic void idctcol(int16 *blk);
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// mapping from nz_coefs to functions to be used
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// ARM4 does not allow global data when they are not constant hence
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// an array of function pointers cannot be considered as array of constants
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// (actual addresses are only known when the dll is loaded).
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// So instead of arrays of function pointers, we'll store here
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// arrays of rows or columns and then call the idct function
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// corresponding to such the row/column number:
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic void (*const idctcolVCA[10][4])(int16*) =
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {&idctcol1, &idctcol0, &idctcol0, &idctcol0},
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {&idctcol1, &idctcol1, &idctcol0, &idctcol0},
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {&idctcol2, &idctcol1, &idctcol0, &idctcol0},
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {&idctcol3, &idctcol1, &idctcol0, &idctcol0},
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {&idctcol3, &idctcol2, &idctcol0, &idctcol0},
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {&idctcol3, &idctcol2, &idctcol1, &idctcol0},
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {&idctcol3, &idctcol2, &idctcol1, &idctcol1},
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {&idctcol3, &idctcol2, &idctcol2, &idctcol1},
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {&idctcol3, &idctcol3, &idctcol2, &idctcol1},
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {&idctcol4, &idctcol3, &idctcol2, &idctcol1}
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic void (*const idctrowVCA[10])(int16*, uint8*, uint8*, int) =
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow1,
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow2,
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow2,
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow2,
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow2,
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow3,
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow4,
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow4,
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow4,
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow4
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic void (*const idctcolVCA2[16])(int16*) =
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctcol0, &idctcol4, &idctcol3, &idctcol4,
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctcol2, &idctcol4, &idctcol3, &idctcol4,
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctcol1, &idctcol4, &idctcol3, &idctcol4,
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctcol2, &idctcol4, &idctcol3, &idctcol4
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic void (*const idctrowVCA2[8])(int16*, uint8*, uint8*, int) =
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow1, &idctrow4, &idctrow3, &idctrow4,
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow2, &idctrow4, &idctrow3, &idctrow4
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic void (*const idctrowVCA_intra[10])(int16*, PIXEL *, int) =
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow1_intra,
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow2_intra,
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow2_intra,
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow2_intra,
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow2_intra,
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow3_intra,
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow4_intra,
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow4_intra,
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow4_intra,
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow4_intra
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic void (*const idctrowVCA2_intra[8])(int16*, PIXEL *, int) =
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow1_intra, &idctrow4_intra, &idctrow3_intra, &idctrow4_intra,
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    &idctrow2_intra, &idctrow4_intra, &idctrow3_intra, &idctrow4_intra
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; LOCAL STORE/BUFFER/POINTER DEFINITIONS
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Variable declaration - defined here and used outside this module
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; EXTERNAL FUNCTION REFERENCES
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Declare functions defined elsewhere and referenced in this module
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Declare variables used in this module but defined elsewhere
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; FUNCTION CODE
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid MBlockIDCT(VideoDecData *video)
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *currVop = video->currVop;
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MacroBlock *mblock = video->mblock;
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *c_comp;
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *cu_comp;
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *cv_comp;
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int x_pos = video->mbnum_col;
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int y_pos = video->mbnum_row;
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int width, width_uv;
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 offset;
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width = video->width;
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width_uv = width >> 1;
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    offset = (int32)(y_pos << 4) * width + (x_pos << 4);
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    c_comp  = currVop->yChan + offset;
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    cu_comp = currVop->uChan + (offset >> 2) + (x_pos << 2);
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    cv_comp = currVop->vChan + (offset >> 2) + (x_pos << 2);
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BlockIDCT_intra(mblock, c_comp, 0, width);
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BlockIDCT_intra(mblock, c_comp + 8, 1, width);
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BlockIDCT_intra(mblock, c_comp + (width << 3), 2, width);
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BlockIDCT_intra(mblock, c_comp + (width << 3) + 8, 3, width);
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BlockIDCT_intra(mblock, cu_comp, 4, width_uv);
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BlockIDCT_intra(mblock, cv_comp, 5, width_uv);
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid BlockIDCT_intra(
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MacroBlock *mblock, PIXEL *c_comp, int comp, int width)
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Define all local variables
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *coeff_in = mblock->block[comp];
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef INTEGER_IDCT
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT  /* VCA IDCT using nzcoefs and bitmaps*/
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i, bmapr;
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nz_coefs = mblock->no_coeff[comp];
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *bitmapcol = mblock->bitmapcol[comp];
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 bitmaprow = mblock->bitmaprow[comp];
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Function body here
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (nz_coefs <= 10)
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        bmapr = (nz_coefs - 1);
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*(idctcolVCA[bmapr]))(coeff_in);
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*(idctcolVCA[bmapr][1]))(coeff_in + 1);
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*(idctcolVCA[bmapr][2]))(coeff_in + 2);
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*(idctcolVCA[bmapr][3]))(coeff_in + 3);
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*idctrowVCA_intra[nz_coefs-1])(coeff_in, c_comp, width);
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i = 8;
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (i--)
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            bmapr = (int)bitmapcol[i];
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (bmapr)
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((bmapr&0xf) == 0)         /*  07/18/01 */
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    (*(idctcolVCA2[bmapr>>4]))(coeff_in + i);
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    idctcol(coeff_in + i);
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((bitmapcol[4] | bitmapcol[5] | bitmapcol[6] | bitmapcol[7]) == 0)
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            bitmaprow >>= 4;
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            (*(idctrowVCA2_intra[(int)bitmaprow]))(coeff_in, c_comp, width);
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            idctrow_intra(coeff_in, c_comp, width);
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    void idct_intra(int *block, uint8 *comp, int width);
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    idct_intra(coeff_in, c_comp, width);
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    void idctref_intra(int *block, uint8 *comp, int width);
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    idctref_intra(coeff_in, c_comp, width);
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Return nothing or data or data pointer
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  08/04/05, no residue, just copy from pred to output */
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid Copy_Blk_to_Vop(uint8 *dst, uint8 *pred, int width)
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* copy 4 bytes at a time */
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width -= 4;
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)dst) = *((uint32*)pred);
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return ;
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  08/04/05 compute IDCT and add prediction at the end  */
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid BlockIDCT(
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *dst,  /* destination */
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pred, /* prediction block, pitch 16 */
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16   *coeff_in,  /* DCT data, size 64 */
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int width, /* width of dst */
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nz_coefs,
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *bitmapcol,
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 bitmaprow
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong)
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef INTEGER_IDCT
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT  /* VCA IDCT using nzcoefs and bitmaps*/
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i, bmapr;
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Function body here
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (nz_coefs <= 10)
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        bmapr = (nz_coefs - 1);
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*(idctcolVCA[bmapr]))(coeff_in);
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*(idctcolVCA[bmapr][1]))(coeff_in + 1);
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*(idctcolVCA[bmapr][2]))(coeff_in + 2);
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*(idctcolVCA[bmapr][3]))(coeff_in + 3);
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*idctrowVCA[nz_coefs-1])(coeff_in, pred, dst, width);
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return ;
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i = 8;
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (i--)
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            bmapr = (int)bitmapcol[i];
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (bmapr)
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((bmapr&0xf) == 0)         /*  07/18/01 */
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    (*(idctcolVCA2[bmapr>>4]))(coeff_in + i);
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    idctcol(coeff_in + i);
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((bitmapcol[4] | bitmapcol[5] | bitmapcol[6] | bitmapcol[7]) == 0)
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            (*(idctrowVCA2[bitmaprow>>4]))(coeff_in, pred, dst, width);
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            idctrow(coeff_in, pred, dst, width);
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return ;
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else // FAST_IDCT
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    void idct(int *block, uint8 *pred, uint8 *dst, int width);
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    idct(coeff_in, pred, dst, width);
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif // FAST_IDCT
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else // INTEGER_IDCT
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    void idctref(int *block, uint8 *pred, uint8 *dst, int width);
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    idctref(coeff_in, pred, dst, width);
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif // INTEGER_IDCT
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong;  End Function: block_idct
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/****************************************************************************/
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FUNCTION NAME: idctrow
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong INPUT AND OUTPUT DEFINITIONS FOR idctrow
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Inputs:
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [input_variable_name] = [description of the input to module, its type
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                 definition, and length (when applicable)]
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores/Buffers/Pointers Needed:
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_store_name] = [description of the local store, its type
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  definition, and length (when applicable)]
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_buffer_name] = [description of the local buffer, its type
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_ptr_name] = [description of the local pointer, its type
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                definition, and length (when applicable)]
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores/Buffers/Pointers Needed:
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_store_name] = [description of the global store, its type
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_buffer_name] = [description of the global buffer, its type
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                definition, and length (when applicable)]
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_ptr_name] = [description of the global pointer, its type
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                 definition, and length (when applicable)]
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Outputs:
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [return_variable_name] = [description of data/pointer returned
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  by module, its type definition, and length
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  (when applicable)]
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Pointers and Buffers Modified:
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [variable_bfr_ptr] points to the [describe where the
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      variable_bfr_ptr points to, its type definition, and length
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      (when applicable)]
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [variable_bfr] contents are [describe the new contents of
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      variable_bfr]
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores Modified:
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_store_name] = [describe new contents, its type
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  definition, and length (when applicable)]
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores Modified:
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_store_name] = [describe new contents, its type
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FUNCTION DESCRIPTION FOR idctrow
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong REQUIREMENTS FOR idctrow
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong REFERENCES FOR idctrow
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PSEUDO-CODE FOR idctrow
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong RESOURCES USED FOR idctrow
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong   When the code is written for a specific target processor the
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     the resources used should be documented below.
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong STACK USAGE: [stack count for this module] + [variable to represent
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong          stack usage for each subroutine called]
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     where: [stack usage variable] = stack usage for [subroutine
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong         name] (see [filename].ext)
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong DATA MEMORY USED: x words
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PROGRAM MEMORY USED: x words
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLOCK CYCLES: [cycle count equation for this module] + [variable
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           used to represent cycle count for each subroutine
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           called]
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     where: [cycle count variable] = cycle count for [subroutine
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        name] (see [filename].ext)
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*/
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Function Code FOR idctrow
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow(
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *blk, uint8 *pred, uint8 *dst, int width
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong)
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Define all local variables
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8;
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 8;
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 pred_word, dst_word;
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int res, res2;
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Function body here
5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* row (horizontal) IDCT
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    * 7                       pi         1 dst[k] = sum c[l] * src[l] * cos( -- *
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    * ( k + - ) * l ) l=0                      8          2
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    * where: c[0]    = 128 c[1..7] = 128*sqrt(2) */
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* preset the offset, such that we can take advantage pre-offset addressing mode   */
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width -= 4;
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dst -= width;
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pred -= 12;
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk -= 8;
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = (int32)blk[12] << 8;
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[12] = 0;
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = blk[14];
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[14] = 0;
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = blk[10];
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[10] = 0;
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = blk[9];
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[9] = 0;
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = blk[15];
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[15] = 0;
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = blk[13];
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[13] = 0;
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = blk[11];
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[11] = 0;
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 = ((*(blk += 8)) << 8) + 8192;
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[0] = 0;   /* for proper rounding in the fourth stage */
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* first stage */
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = W7 * (x4 + x5) + 4;
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = (x8 + (W1 - W7) * x4) >> 3;
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = (x8 - (W1 + W7) * x5) >> 3;
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = W3 * (x6 + x7) + 4;
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = (x8 - (W3 - W5) * x6) >> 3;
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = (x8 - (W3 + W5) * x7) >> 3;
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* second stage */
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x0 + x1;
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 -= x1;
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = W6 * (x3 + x2) + 4;
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = (x1 - (W2 + W6) * x2) >> 3;
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = (x1 + (W2 - W6) * x3) >> 3;
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = x4 + x6;
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 -= x6;
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = x5 + x7;
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 -= x7;
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* third stage */
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = x8 + x3;
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 -= x3;
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = x0 + x2;
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 -= x2;
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = (181 * (x4 + x5) + 128) >> 8;
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = (181 * (x4 - x5) + 128) >> 8;
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* fourth stage */
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_word = *((uint32*)(pred += 12)); /* read 4 bytes from pred */
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x7 + x1) >> 14;
5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP1(res);
5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res2 = (x3 + x2) >> 14;
5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP2(res2);
5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word = (res2 << 8) | res;
5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x0 + x4) >> 14;
5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP3(res);
5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 16);
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x8 + x6) >> 14;
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP4(res);
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 24);
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(dst += width)) = dst_word; /* save 4 bytes to dst */
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_word = *((uint32*)(pred += 4)); /* read 4 bytes from pred */
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x8 - x6) >> 14;
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP1(res);
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res2 = (x0 - x4) >> 14;
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP2(res2);
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word = (res2 << 8) | res;
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x3 - x2) >> 14;
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP3(res);
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 16);
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        res = (x7 - x1) >> 14;
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ADD_AND_CLIP4(res);
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dst_word |= (res << 24);
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((uint32*)(dst += 4)) = dst_word; /* save 4 bytes to dst */
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Return nothing or data or data pointer
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow_intra(
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *blk, PIXEL *comp, int width
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong)
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Define all local variables
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8, temp;
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 8;
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int offset = width;
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 word;
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Function body here
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* row (horizontal) IDCT
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    * 7                       pi         1 dst[k] = sum c[l] * src[l] * cos( -- *
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    * ( k + - ) * l ) l=0                      8          2
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *
6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    * where: c[0]    = 128 c[1..7] = 128*sqrt(2) */
6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = (int32)blk[4] << 8;
6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[4] = 0;
6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = blk[6];
6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[6] = 0;
6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = blk[2];
6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[2] = 0;
6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = blk[1];
6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[1] = 0;
6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = blk[7];
6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[7] = 0;
6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = blk[5];
6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[5] = 0;
6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = blk[3];
6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[3] = 0;
6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef FAST_IDCT
6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* shortcut */  /* covered by idctrow1  01/9/2001 */
6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!(x1 | x2 | x3 | x4 | x5 | x6 | x7))
6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            blk[0] = blk[1] = blk[2] = blk[3] = blk[4] = blk[5] = blk[6] = blk[7] = (blk[0] + 32) >> 6;
6623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return;
6633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 = ((int32)blk[0] << 8) + 8192;
6663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[0] = 0;  /* for proper rounding in the fourth stage */
6673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* first stage */
6693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = W7 * (x4 + x5) + 4;
6703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = (x8 + (W1 - W7) * x4) >> 3;
6713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 = (x8 - (W1 + W7) * x5) >> 3;
6723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = W3 * (x6 + x7) + 4;
6733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = (x8 - (W3 - W5) * x6) >> 3;
6743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = (x8 - (W3 + W5) * x7) >> 3;
6753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* second stage */
6773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 = x0 + x1;
6783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 -= x1;
6793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = W6 * (x3 + x2) + 4;
6803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = (x1 - (W2 + W6) * x2) >> 3;
6813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = (x1 + (W2 - W6) * x3) >> 3;
6823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x1 = x4 + x6;
6833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 -= x6;
6843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x6 = x5 + x7;
6853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x5 -= x7;
6863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* third stage */
6883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x7 = x8 + x3;
6893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x8 -= x3;
6903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x3 = x0 + x2;
6913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x0 -= x2;
6923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x2 = (181 * (x4 + x5) + 128) >> 8;
6933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        x4 = (181 * (x4 - x5) + 128) >> 8;
6943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* fourth stage */
6963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = ((x7 + x1) >> 14);
6973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(word)
6983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x3 + x2) >> 14);
7003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
7013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 8);
7023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x0 + x4) >> 14);
7043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
7053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 16);
7063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x8 + x6) >> 14);
7083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
7093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 24);
7103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((int32*)(comp)) = word;
7113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = ((x8 - x6) >> 14);
7133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(word)
7143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x0 - x4) >> 14);
7163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
7173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 8);
7183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x3 - x2) >> 14);
7203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
7213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 16);
7223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = ((x7 - x1) >> 14);
7243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CLIP_RESULT(temp)
7253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        word = word | (temp << 24);
7263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *((int32*)(comp + 4)) = word;
7273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        comp += offset;
7283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk += B_SIZE;
7303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
7323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Return nothing or data or data pointer
7333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
7343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
7353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
7363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
7383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; End Function: idctrow
7393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
7403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/****************************************************************************/
7433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*
7453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
7463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FUNCTION NAME: idctcol
7473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
7483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong INPUT AND OUTPUT DEFINITIONS FOR idctcol
7493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Inputs:
7513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [input_variable_name] = [description of the input to module, its type
7523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                 definition, and length (when applicable)]
7533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores/Buffers/Pointers Needed:
7553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_store_name] = [description of the local store, its type
7563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  definition, and length (when applicable)]
7573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_buffer_name] = [description of the local buffer, its type
7583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
7593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_ptr_name] = [description of the local pointer, its type
7603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                definition, and length (when applicable)]
7613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores/Buffers/Pointers Needed:
7633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_store_name] = [description of the global store, its type
7643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
7653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_buffer_name] = [description of the global buffer, its type
7663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                definition, and length (when applicable)]
7673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_ptr_name] = [description of the global pointer, its type
7683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                 definition, and length (when applicable)]
7693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Outputs:
7713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [return_variable_name] = [description of data/pointer returned
7723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  by module, its type definition, and length
7733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  (when applicable)]
7743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Pointers and Buffers Modified:
7763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [variable_bfr_ptr] points to the [describe where the
7773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      variable_bfr_ptr points to, its type definition, and length
7783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      (when applicable)]
7793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [variable_bfr] contents are [describe the new contents of
7803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      variable_bfr]
7813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores Modified:
7833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_store_name] = [describe new contents, its type
7843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  definition, and length (when applicable)]
7853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores Modified:
7873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_store_name] = [describe new contents, its type
7883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
7893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
7913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FUNCTION DESCRIPTION FOR idctcol
7923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
7943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong REQUIREMENTS FOR idctcol
7953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
7973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong REFERENCES FOR idctcol
7983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
8003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PSEUDO-CODE FOR idctcol
8013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
8033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong RESOURCES USED FOR idctcol
8043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong   When the code is written for a specific target processor the
8053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     the resources used should be documented below.
8063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong STACK USAGE: [stack count for this module] + [variable to represent
8083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong          stack usage for each subroutine called]
8093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     where: [stack usage variable] = stack usage for [subroutine
8113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong         name] (see [filename].ext)
8123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong DATA MEMORY USED: x words
8143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PROGRAM MEMORY USED: x words
8163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLOCK CYCLES: [cycle count equation for this module] + [variable
8183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           used to represent cycle count for each subroutine
8193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           called]
8203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     where: [cycle count variable] = cycle count for [subroutine
8223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        name] (see [filename].ext)
8233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
8253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*/
8263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
8283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Function Code FOR idctcol
8293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
8303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol(
8313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *blk
8323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong)
8333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
8353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Define all local variables
8363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
8373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8;
8383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
8403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Function body here
8413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
8423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* column (vertical) IDCT
8433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *
8443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    * 7                         pi         1 dst[8*k] = sum c[l] * src[8*l] *
8453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    * cos( -- * ( k + - ) * l ) l=0                        8          2
8463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *
8473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    * where: c[0]    = 1/1024 c[1..7] = (1/1024)*sqrt(2) */
8483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x1 = (int32)blk[32] << 11;
8493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x2 = blk[48];
8503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x3 = blk[16];
8513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x4 = blk[8];
8523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x5 = blk[56];
8533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x6 = blk[40];
8543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x7 = blk[24];
8553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef FAST_IDCT
8563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* shortcut */        /* covered by idctcolumn1  01/9/2001 */
8573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!(x1 | x2 | x3 | x4 | x5 | x6 | x7))
8583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        blk[0] = blk[8] = blk[16] = blk[24] = blk[32] = blk[40] = blk[48] = blk[56]
8603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                              = blk[0] << 3;
8613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return;
8623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
8643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x0 = ((int32)blk[0] << 11) + 128;
8663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* first stage */
8683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x8 = W7 * (x4 + x5);
8693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x4 = x8 + (W1 - W7) * x4;
8703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x5 = x8 - (W1 + W7) * x5;
8713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x8 = W3 * (x6 + x7);
8723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x6 = x8 - (W3 - W5) * x6;
8733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x7 = x8 - (W3 + W5) * x7;
8743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* second stage */
8763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x8 = x0 + x1;
8773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x0 -= x1;
8783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x1 = W6 * (x3 + x2);
8793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x2 = x1 - (W2 + W6) * x2;
8803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x3 = x1 + (W2 - W6) * x3;
8813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x1 = x4 + x6;
8823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x4 -= x6;
8833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x6 = x5 + x7;
8843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x5 -= x7;
8853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* third stage */
8873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x7 = x8 + x3;
8883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x8 -= x3;
8893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x3 = x0 + x2;
8903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x0 -= x2;
8913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x2 = (181 * (x4 + x5) + 128) >> 8;
8923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    x4 = (181 * (x4 - x5) + 128) >> 8;
8933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* fourth stage */
8953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[0]    = (x7 + x1) >> 8;
8963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[8] = (x3 + x2) >> 8;
8973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[16] = (x0 + x4) >> 8;
8983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[24] = (x8 + x6) >> 8;
8993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[32] = (x8 - x6) >> 8;
9003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[40] = (x0 - x4) >> 8;
9013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[48] = (x3 - x2) >> 8;
9023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    blk[56] = (x7 - x1) >> 8;
9033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
9043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Return nothing or data or data pointer
9053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
9063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
9073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
9083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
9093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong;  End Function: idctcol
9103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
9113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
912