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