102f5b5447de349216a40086ca6061efefb5a3025James Dong/* ------------------------------------------------------------------
202f5b5447de349216a40086ca6061efefb5a3025James Dong * Copyright (C) 1998-2009 PacketVideo
302f5b5447de349216a40086ca6061efefb5a3025James Dong *
402f5b5447de349216a40086ca6061efefb5a3025James Dong * Licensed under the Apache License, Version 2.0 (the "License");
502f5b5447de349216a40086ca6061efefb5a3025James Dong * you may not use this file except in compliance with the License.
602f5b5447de349216a40086ca6061efefb5a3025James Dong * You may obtain a copy of the License at
702f5b5447de349216a40086ca6061efefb5a3025James Dong *
802f5b5447de349216a40086ca6061efefb5a3025James Dong *      http://www.apache.org/licenses/LICENSE-2.0
902f5b5447de349216a40086ca6061efefb5a3025James Dong *
1002f5b5447de349216a40086ca6061efefb5a3025James Dong * Unless required by applicable law or agreed to in writing, software
1102f5b5447de349216a40086ca6061efefb5a3025James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1202f5b5447de349216a40086ca6061efefb5a3025James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1302f5b5447de349216a40086ca6061efefb5a3025James Dong * express or implied.
1402f5b5447de349216a40086ca6061efefb5a3025James Dong * See the License for the specific language governing permissions
1502f5b5447de349216a40086ca6061efefb5a3025James Dong * and limitations under the License.
1602f5b5447de349216a40086ca6061efefb5a3025James Dong * -------------------------------------------------------------------
1702f5b5447de349216a40086ca6061efefb5a3025James Dong */
1802f5b5447de349216a40086ca6061efefb5a3025James Dong/*
1902f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
2002f5b5447de349216a40086ca6061efefb5a3025James Dong INPUT AND OUTPUT DEFINITIONS
2102f5b5447de349216a40086ca6061efefb5a3025James Dong
2202f5b5447de349216a40086ca6061efefb5a3025James Dong Inputs:
2302f5b5447de349216a40086ca6061efefb5a3025James Dong    [input_variable_name] = [description of the input to module, its type
2402f5b5447de349216a40086ca6061efefb5a3025James Dong                 definition, and length (when applicable)]
2502f5b5447de349216a40086ca6061efefb5a3025James Dong
2602f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores/Buffers/Pointers Needed:
2702f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_store_name] = [description of the local store, its type
2802f5b5447de349216a40086ca6061efefb5a3025James Dong                  definition, and length (when applicable)]
2902f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_buffer_name] = [description of the local buffer, its type
3002f5b5447de349216a40086ca6061efefb5a3025James Dong                   definition, and length (when applicable)]
3102f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_ptr_name] = [description of the local pointer, its type
3202f5b5447de349216a40086ca6061efefb5a3025James Dong                definition, and length (when applicable)]
3302f5b5447de349216a40086ca6061efefb5a3025James Dong
3402f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores/Buffers/Pointers Needed:
3502f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_store_name] = [description of the global store, its type
3602f5b5447de349216a40086ca6061efefb5a3025James Dong                   definition, and length (when applicable)]
3702f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_buffer_name] = [description of the global buffer, its type
3802f5b5447de349216a40086ca6061efefb5a3025James Dong                definition, and length (when applicable)]
3902f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_ptr_name] = [description of the global pointer, its type
4002f5b5447de349216a40086ca6061efefb5a3025James Dong                 definition, and length (when applicable)]
4102f5b5447de349216a40086ca6061efefb5a3025James Dong
4202f5b5447de349216a40086ca6061efefb5a3025James Dong Outputs:
4302f5b5447de349216a40086ca6061efefb5a3025James Dong    [return_variable_name] = [description of data/pointer returned
4402f5b5447de349216a40086ca6061efefb5a3025James Dong                  by module, its type definition, and length
4502f5b5447de349216a40086ca6061efefb5a3025James Dong                  (when applicable)]
4602f5b5447de349216a40086ca6061efefb5a3025James Dong
4702f5b5447de349216a40086ca6061efefb5a3025James Dong Pointers and Buffers Modified:
4802f5b5447de349216a40086ca6061efefb5a3025James Dong    [variable_bfr_ptr] points to the [describe where the
4902f5b5447de349216a40086ca6061efefb5a3025James Dong      variable_bfr_ptr points to, its type definition, and length
5002f5b5447de349216a40086ca6061efefb5a3025James Dong      (when applicable)]
5102f5b5447de349216a40086ca6061efefb5a3025James Dong    [variable_bfr] contents are [describe the new contents of
5202f5b5447de349216a40086ca6061efefb5a3025James Dong      variable_bfr]
5302f5b5447de349216a40086ca6061efefb5a3025James Dong
5402f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores Modified:
5502f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_store_name] = [describe new contents, its type
5602f5b5447de349216a40086ca6061efefb5a3025James Dong                  definition, and length (when applicable)]
5702f5b5447de349216a40086ca6061efefb5a3025James Dong
5802f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores Modified:
5902f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_store_name] = [describe new contents, its type
6002f5b5447de349216a40086ca6061efefb5a3025James Dong                   definition, and length (when applicable)]
6102f5b5447de349216a40086ca6061efefb5a3025James Dong
6202f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
6302f5b5447de349216a40086ca6061efefb5a3025James Dong FUNCTION DESCRIPTION
6402f5b5447de349216a40086ca6061efefb5a3025James Dong
6502f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
6602f5b5447de349216a40086ca6061efefb5a3025James Dong REQUIREMENTS
6702f5b5447de349216a40086ca6061efefb5a3025James Dong
6802f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
6902f5b5447de349216a40086ca6061efefb5a3025James Dong REFERENCES
7002f5b5447de349216a40086ca6061efefb5a3025James Dong
7102f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
7202f5b5447de349216a40086ca6061efefb5a3025James Dong PSEUDO-CODE
7302f5b5447de349216a40086ca6061efefb5a3025James Dong
7402f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
7502f5b5447de349216a40086ca6061efefb5a3025James Dong RESOURCES USED
7602f5b5447de349216a40086ca6061efefb5a3025James Dong   When the code is written for a specific target processor the
7702f5b5447de349216a40086ca6061efefb5a3025James Dong     the resources used should be documented below.
7802f5b5447de349216a40086ca6061efefb5a3025James Dong
7902f5b5447de349216a40086ca6061efefb5a3025James Dong STACK USAGE: [stack count for this module] + [variable to represent
8002f5b5447de349216a40086ca6061efefb5a3025James Dong          stack usage for each subroutine called]
8102f5b5447de349216a40086ca6061efefb5a3025James Dong
8202f5b5447de349216a40086ca6061efefb5a3025James Dong     where: [stack usage variable] = stack usage for [subroutine
8302f5b5447de349216a40086ca6061efefb5a3025James Dong         name] (see [filename].ext)
8402f5b5447de349216a40086ca6061efefb5a3025James Dong
8502f5b5447de349216a40086ca6061efefb5a3025James Dong DATA MEMORY USED: x words
8602f5b5447de349216a40086ca6061efefb5a3025James Dong
8702f5b5447de349216a40086ca6061efefb5a3025James Dong PROGRAM MEMORY USED: x words
8802f5b5447de349216a40086ca6061efefb5a3025James Dong
8902f5b5447de349216a40086ca6061efefb5a3025James Dong CLOCK CYCLES: [cycle count equation for this module] + [variable
9002f5b5447de349216a40086ca6061efefb5a3025James Dong           used to represent cycle count for each subroutine
9102f5b5447de349216a40086ca6061efefb5a3025James Dong           called]
9202f5b5447de349216a40086ca6061efefb5a3025James Dong
9302f5b5447de349216a40086ca6061efefb5a3025James Dong     where: [cycle count variable] = cycle count for [subroutine
9402f5b5447de349216a40086ca6061efefb5a3025James Dong        name] (see [filename].ext)
9502f5b5447de349216a40086ca6061efefb5a3025James Dong
9602f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
9702f5b5447de349216a40086ca6061efefb5a3025James Dong*/
9802f5b5447de349216a40086ca6061efefb5a3025James Dong
9902f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
10002f5b5447de349216a40086ca6061efefb5a3025James Dong; INCLUDES
10102f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
10202f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4dec_lib.h"
10302f5b5447de349216a40086ca6061efefb5a3025James Dong#include "idct.h"
10402f5b5447de349216a40086ca6061efefb5a3025James Dong#include "motion_comp.h"
10502f5b5447de349216a40086ca6061efefb5a3025James Dong
10602f5b5447de349216a40086ca6061efefb5a3025James Dong#define OSCL_DISABLE_WARNING_CONV_POSSIBLE_LOSS_OF_DATA
10702f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
10802f5b5447de349216a40086ca6061efefb5a3025James Dong; MACROS
10902f5b5447de349216a40086ca6061efefb5a3025James Dong; Define module specific macros here
11002f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
11102f5b5447de349216a40086ca6061efefb5a3025James Dong
11202f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
11302f5b5447de349216a40086ca6061efefb5a3025James Dong; DEFINES
11402f5b5447de349216a40086ca6061efefb5a3025James Dong; Include all pre-processor statements here. Include conditional
11502f5b5447de349216a40086ca6061efefb5a3025James Dong; compile variables also.
11602f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
11702f5b5447de349216a40086ca6061efefb5a3025James Dong
11802f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
11902f5b5447de349216a40086ca6061efefb5a3025James Dong; LOCAL FUNCTION DEFINITIONS
12002f5b5447de349216a40086ca6061efefb5a3025James Dong; Function Prototype declaration
12102f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
12202f5b5447de349216a40086ca6061efefb5a3025James Dong/* private prototypes */
12302f5b5447de349216a40086ca6061efefb5a3025James Dongstatic void idctrow(int16 *blk, uint8 *pred, uint8 *dst, int width);
12402f5b5447de349216a40086ca6061efefb5a3025James Dongstatic void idctrow_intra(int16 *blk, PIXEL *, int width);
12502f5b5447de349216a40086ca6061efefb5a3025James Dongstatic void idctcol(int16 *blk);
12602f5b5447de349216a40086ca6061efefb5a3025James Dong
12702f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
12802f5b5447de349216a40086ca6061efefb5a3025James Dong// mapping from nz_coefs to functions to be used
12902f5b5447de349216a40086ca6061efefb5a3025James Dong
13002f5b5447de349216a40086ca6061efefb5a3025James Dong
13102f5b5447de349216a40086ca6061efefb5a3025James Dong// ARM4 does not allow global data when they are not constant hence
13202f5b5447de349216a40086ca6061efefb5a3025James Dong// an array of function pointers cannot be considered as array of constants
13302f5b5447de349216a40086ca6061efefb5a3025James Dong// (actual addresses are only known when the dll is loaded).
13402f5b5447de349216a40086ca6061efefb5a3025James Dong// So instead of arrays of function pointers, we'll store here
13502f5b5447de349216a40086ca6061efefb5a3025James Dong// arrays of rows or columns and then call the idct function
13602f5b5447de349216a40086ca6061efefb5a3025James Dong// corresponding to such the row/column number:
13702f5b5447de349216a40086ca6061efefb5a3025James Dong
13802f5b5447de349216a40086ca6061efefb5a3025James Dong
13902f5b5447de349216a40086ca6061efefb5a3025James Dongstatic void (*const idctcolVCA[10][4])(int16*) =
14002f5b5447de349216a40086ca6061efefb5a3025James Dong{
14102f5b5447de349216a40086ca6061efefb5a3025James Dong    {&idctcol1, &idctcol0, &idctcol0, &idctcol0},
14202f5b5447de349216a40086ca6061efefb5a3025James Dong    {&idctcol1, &idctcol1, &idctcol0, &idctcol0},
14302f5b5447de349216a40086ca6061efefb5a3025James Dong    {&idctcol2, &idctcol1, &idctcol0, &idctcol0},
14402f5b5447de349216a40086ca6061efefb5a3025James Dong    {&idctcol3, &idctcol1, &idctcol0, &idctcol0},
14502f5b5447de349216a40086ca6061efefb5a3025James Dong    {&idctcol3, &idctcol2, &idctcol0, &idctcol0},
14602f5b5447de349216a40086ca6061efefb5a3025James Dong    {&idctcol3, &idctcol2, &idctcol1, &idctcol0},
14702f5b5447de349216a40086ca6061efefb5a3025James Dong    {&idctcol3, &idctcol2, &idctcol1, &idctcol1},
14802f5b5447de349216a40086ca6061efefb5a3025James Dong    {&idctcol3, &idctcol2, &idctcol2, &idctcol1},
14902f5b5447de349216a40086ca6061efefb5a3025James Dong    {&idctcol3, &idctcol3, &idctcol2, &idctcol1},
15002f5b5447de349216a40086ca6061efefb5a3025James Dong    {&idctcol4, &idctcol3, &idctcol2, &idctcol1}
15102f5b5447de349216a40086ca6061efefb5a3025James Dong};
15202f5b5447de349216a40086ca6061efefb5a3025James Dong
15302f5b5447de349216a40086ca6061efefb5a3025James Dong
15402f5b5447de349216a40086ca6061efefb5a3025James Dongstatic void (*const idctrowVCA[10])(int16*, uint8*, uint8*, int) =
15502f5b5447de349216a40086ca6061efefb5a3025James Dong{
15602f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow1,
15702f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow2,
15802f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow2,
15902f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow2,
16002f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow2,
16102f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow3,
16202f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow4,
16302f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow4,
16402f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow4,
16502f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow4
16602f5b5447de349216a40086ca6061efefb5a3025James Dong};
16702f5b5447de349216a40086ca6061efefb5a3025James Dong
16802f5b5447de349216a40086ca6061efefb5a3025James Dong
16902f5b5447de349216a40086ca6061efefb5a3025James Dongstatic void (*const idctcolVCA2[16])(int16*) =
17002f5b5447de349216a40086ca6061efefb5a3025James Dong{
17102f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctcol0, &idctcol4, &idctcol3, &idctcol4,
17202f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctcol2, &idctcol4, &idctcol3, &idctcol4,
17302f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctcol1, &idctcol4, &idctcol3, &idctcol4,
17402f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctcol2, &idctcol4, &idctcol3, &idctcol4
17502f5b5447de349216a40086ca6061efefb5a3025James Dong};
17602f5b5447de349216a40086ca6061efefb5a3025James Dong
17702f5b5447de349216a40086ca6061efefb5a3025James Dongstatic void (*const idctrowVCA2[8])(int16*, uint8*, uint8*, int) =
17802f5b5447de349216a40086ca6061efefb5a3025James Dong{
17902f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow1, &idctrow4, &idctrow3, &idctrow4,
18002f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow2, &idctrow4, &idctrow3, &idctrow4
18102f5b5447de349216a40086ca6061efefb5a3025James Dong};
18202f5b5447de349216a40086ca6061efefb5a3025James Dong
18302f5b5447de349216a40086ca6061efefb5a3025James Dongstatic void (*const idctrowVCA_intra[10])(int16*, PIXEL *, int) =
18402f5b5447de349216a40086ca6061efefb5a3025James Dong{
18502f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow1_intra,
18602f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow2_intra,
18702f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow2_intra,
18802f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow2_intra,
18902f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow2_intra,
19002f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow3_intra,
19102f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow4_intra,
19202f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow4_intra,
19302f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow4_intra,
19402f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow4_intra
19502f5b5447de349216a40086ca6061efefb5a3025James Dong};
19602f5b5447de349216a40086ca6061efefb5a3025James Dong
19702f5b5447de349216a40086ca6061efefb5a3025James Dongstatic void (*const idctrowVCA2_intra[8])(int16*, PIXEL *, int) =
19802f5b5447de349216a40086ca6061efefb5a3025James Dong{
19902f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow1_intra, &idctrow4_intra, &idctrow3_intra, &idctrow4_intra,
20002f5b5447de349216a40086ca6061efefb5a3025James Dong    &idctrow2_intra, &idctrow4_intra, &idctrow3_intra, &idctrow4_intra
20102f5b5447de349216a40086ca6061efefb5a3025James Dong};
20202f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
20302f5b5447de349216a40086ca6061efefb5a3025James Dong
20402f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
20502f5b5447de349216a40086ca6061efefb5a3025James Dong; LOCAL STORE/BUFFER/POINTER DEFINITIONS
20602f5b5447de349216a40086ca6061efefb5a3025James Dong; Variable declaration - defined here and used outside this module
20702f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
20802f5b5447de349216a40086ca6061efefb5a3025James Dong
20902f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
21002f5b5447de349216a40086ca6061efefb5a3025James Dong; EXTERNAL FUNCTION REFERENCES
21102f5b5447de349216a40086ca6061efefb5a3025James Dong; Declare functions defined elsewhere and referenced in this module
21202f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
21302f5b5447de349216a40086ca6061efefb5a3025James Dong
21402f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
21502f5b5447de349216a40086ca6061efefb5a3025James Dong; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
21602f5b5447de349216a40086ca6061efefb5a3025James Dong; Declare variables used in this module but defined elsewhere
21702f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
21802f5b5447de349216a40086ca6061efefb5a3025James Dong
21902f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
22002f5b5447de349216a40086ca6061efefb5a3025James Dong; FUNCTION CODE
22102f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
22202f5b5447de349216a40086ca6061efefb5a3025James Dongvoid MBlockIDCT(VideoDecData *video)
22302f5b5447de349216a40086ca6061efefb5a3025James Dong{
22402f5b5447de349216a40086ca6061efefb5a3025James Dong    Vop *currVop = video->currVop;
22502f5b5447de349216a40086ca6061efefb5a3025James Dong    MacroBlock *mblock = video->mblock;
22602f5b5447de349216a40086ca6061efefb5a3025James Dong    PIXEL *c_comp;
22702f5b5447de349216a40086ca6061efefb5a3025James Dong    PIXEL *cu_comp;
22802f5b5447de349216a40086ca6061efefb5a3025James Dong    PIXEL *cv_comp;
22902f5b5447de349216a40086ca6061efefb5a3025James Dong    int x_pos = video->mbnum_col;
23002f5b5447de349216a40086ca6061efefb5a3025James Dong    int y_pos = video->mbnum_row;
23102f5b5447de349216a40086ca6061efefb5a3025James Dong    int width, width_uv;
23202f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 offset;
23302f5b5447de349216a40086ca6061efefb5a3025James Dong    width = video->width;
23402f5b5447de349216a40086ca6061efefb5a3025James Dong    width_uv = width >> 1;
23502f5b5447de349216a40086ca6061efefb5a3025James Dong    offset = (int32)(y_pos << 4) * width + (x_pos << 4);
23602f5b5447de349216a40086ca6061efefb5a3025James Dong
23702f5b5447de349216a40086ca6061efefb5a3025James Dong    c_comp  = currVop->yChan + offset;
23802f5b5447de349216a40086ca6061efefb5a3025James Dong    cu_comp = currVop->uChan + (offset >> 2) + (x_pos << 2);
23902f5b5447de349216a40086ca6061efefb5a3025James Dong    cv_comp = currVop->vChan + (offset >> 2) + (x_pos << 2);
24002f5b5447de349216a40086ca6061efefb5a3025James Dong
24102f5b5447de349216a40086ca6061efefb5a3025James Dong    BlockIDCT_intra(mblock, c_comp, 0, width);
24202f5b5447de349216a40086ca6061efefb5a3025James Dong    BlockIDCT_intra(mblock, c_comp + 8, 1, width);
24302f5b5447de349216a40086ca6061efefb5a3025James Dong    BlockIDCT_intra(mblock, c_comp + (width << 3), 2, width);
24402f5b5447de349216a40086ca6061efefb5a3025James Dong    BlockIDCT_intra(mblock, c_comp + (width << 3) + 8, 3, width);
24502f5b5447de349216a40086ca6061efefb5a3025James Dong    BlockIDCT_intra(mblock, cu_comp, 4, width_uv);
24602f5b5447de349216a40086ca6061efefb5a3025James Dong    BlockIDCT_intra(mblock, cv_comp, 5, width_uv);
24702f5b5447de349216a40086ca6061efefb5a3025James Dong}
24802f5b5447de349216a40086ca6061efefb5a3025James Dong
24902f5b5447de349216a40086ca6061efefb5a3025James Dong
25002f5b5447de349216a40086ca6061efefb5a3025James Dongvoid BlockIDCT_intra(
25102f5b5447de349216a40086ca6061efefb5a3025James Dong    MacroBlock *mblock, PIXEL *c_comp, int comp, int width)
25202f5b5447de349216a40086ca6061efefb5a3025James Dong{
25302f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
25402f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Define all local variables
25502f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
25602f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *coeff_in = mblock->block[comp];
25702f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef INTEGER_IDCT
25802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT  /* VCA IDCT using nzcoefs and bitmaps*/
25902f5b5447de349216a40086ca6061efefb5a3025James Dong    int i, bmapr;
26002f5b5447de349216a40086ca6061efefb5a3025James Dong    int nz_coefs = mblock->no_coeff[comp];
26102f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *bitmapcol = mblock->bitmapcol[comp];
26202f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 bitmaprow = mblock->bitmaprow[comp];
26302f5b5447de349216a40086ca6061efefb5a3025James Dong
26402f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
26502f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Function body here
26602f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
26702f5b5447de349216a40086ca6061efefb5a3025James Dong    if (nz_coefs <= 10)
26802f5b5447de349216a40086ca6061efefb5a3025James Dong    {
26902f5b5447de349216a40086ca6061efefb5a3025James Dong        bmapr = (nz_coefs - 1);
27002f5b5447de349216a40086ca6061efefb5a3025James Dong
27102f5b5447de349216a40086ca6061efefb5a3025James Dong        (*(idctcolVCA[bmapr]))(coeff_in);
27202f5b5447de349216a40086ca6061efefb5a3025James Dong        (*(idctcolVCA[bmapr][1]))(coeff_in + 1);
27302f5b5447de349216a40086ca6061efefb5a3025James Dong        (*(idctcolVCA[bmapr][2]))(coeff_in + 2);
27402f5b5447de349216a40086ca6061efefb5a3025James Dong        (*(idctcolVCA[bmapr][3]))(coeff_in + 3);
27502f5b5447de349216a40086ca6061efefb5a3025James Dong
27602f5b5447de349216a40086ca6061efefb5a3025James Dong        (*idctrowVCA_intra[nz_coefs-1])(coeff_in, c_comp, width);
27702f5b5447de349216a40086ca6061efefb5a3025James Dong    }
27802f5b5447de349216a40086ca6061efefb5a3025James Dong    else
27902f5b5447de349216a40086ca6061efefb5a3025James Dong    {
28002f5b5447de349216a40086ca6061efefb5a3025James Dong        i = 8;
28102f5b5447de349216a40086ca6061efefb5a3025James Dong        while (i--)
28202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
28302f5b5447de349216a40086ca6061efefb5a3025James Dong            bmapr = (int)bitmapcol[i];
28402f5b5447de349216a40086ca6061efefb5a3025James Dong            if (bmapr)
28502f5b5447de349216a40086ca6061efefb5a3025James Dong            {
28602f5b5447de349216a40086ca6061efefb5a3025James Dong                if ((bmapr&0xf) == 0)         /*  07/18/01 */
28702f5b5447de349216a40086ca6061efefb5a3025James Dong                {
28802f5b5447de349216a40086ca6061efefb5a3025James Dong                    (*(idctcolVCA2[bmapr>>4]))(coeff_in + i);
28902f5b5447de349216a40086ca6061efefb5a3025James Dong                }
29002f5b5447de349216a40086ca6061efefb5a3025James Dong                else
29102f5b5447de349216a40086ca6061efefb5a3025James Dong                {
29202f5b5447de349216a40086ca6061efefb5a3025James Dong                    idctcol(coeff_in + i);
29302f5b5447de349216a40086ca6061efefb5a3025James Dong                }
29402f5b5447de349216a40086ca6061efefb5a3025James Dong            }
29502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
29602f5b5447de349216a40086ca6061efefb5a3025James Dong        if ((bitmapcol[4] | bitmapcol[5] | bitmapcol[6] | bitmapcol[7]) == 0)
29702f5b5447de349216a40086ca6061efefb5a3025James Dong        {
29802f5b5447de349216a40086ca6061efefb5a3025James Dong            bitmaprow >>= 4;
29902f5b5447de349216a40086ca6061efefb5a3025James Dong            (*(idctrowVCA2_intra[(int)bitmaprow]))(coeff_in, c_comp, width);
30002f5b5447de349216a40086ca6061efefb5a3025James Dong        }
30102f5b5447de349216a40086ca6061efefb5a3025James Dong        else
30202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
30302f5b5447de349216a40086ca6061efefb5a3025James Dong            idctrow_intra(coeff_in, c_comp, width);
30402f5b5447de349216a40086ca6061efefb5a3025James Dong        }
30502f5b5447de349216a40086ca6061efefb5a3025James Dong    }
30602f5b5447de349216a40086ca6061efefb5a3025James Dong#else
30702f5b5447de349216a40086ca6061efefb5a3025James Dong    void idct_intra(int *block, uint8 *comp, int width);
30802f5b5447de349216a40086ca6061efefb5a3025James Dong    idct_intra(coeff_in, c_comp, width);
30902f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
31002f5b5447de349216a40086ca6061efefb5a3025James Dong#else
31102f5b5447de349216a40086ca6061efefb5a3025James Dong    void idctref_intra(int *block, uint8 *comp, int width);
31202f5b5447de349216a40086ca6061efefb5a3025James Dong    idctref_intra(coeff_in, c_comp, width);
31302f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
31402f5b5447de349216a40086ca6061efefb5a3025James Dong
31502f5b5447de349216a40086ca6061efefb5a3025James Dong
31602f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
31702f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Return nothing or data or data pointer
31802f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
31902f5b5447de349216a40086ca6061efefb5a3025James Dong    return;
32002f5b5447de349216a40086ca6061efefb5a3025James Dong}
32102f5b5447de349216a40086ca6061efefb5a3025James Dong
32202f5b5447de349216a40086ca6061efefb5a3025James Dong/*  08/04/05, no residue, just copy from pred to output */
32302f5b5447de349216a40086ca6061efefb5a3025James Dongvoid Copy_Blk_to_Vop(uint8 *dst, uint8 *pred, int width)
32402f5b5447de349216a40086ca6061efefb5a3025James Dong{
32502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* copy 4 bytes at a time */
32602f5b5447de349216a40086ca6061efefb5a3025James Dong    width -= 4;
32702f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)dst) = *((uint32*)pred);
32802f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
32902f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
33002f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
33102f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
33202f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
33302f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
33402f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
33502f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
33602f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
33702f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
33802f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
33902f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
34002f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
34102f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += width)) = *((uint32*)(pred += 12));
34202f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)(dst += 4)) = *((uint32*)(pred += 4));
34302f5b5447de349216a40086ca6061efefb5a3025James Dong
34402f5b5447de349216a40086ca6061efefb5a3025James Dong    return ;
34502f5b5447de349216a40086ca6061efefb5a3025James Dong}
34602f5b5447de349216a40086ca6061efefb5a3025James Dong
34702f5b5447de349216a40086ca6061efefb5a3025James Dong/*  08/04/05 compute IDCT and add prediction at the end  */
34802f5b5447de349216a40086ca6061efefb5a3025James Dongvoid BlockIDCT(
34902f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *dst,  /* destination */
35002f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *pred, /* prediction block, pitch 16 */
35102f5b5447de349216a40086ca6061efefb5a3025James Dong    int16   *coeff_in,  /* DCT data, size 64 */
35202f5b5447de349216a40086ca6061efefb5a3025James Dong    int width, /* width of dst */
35302f5b5447de349216a40086ca6061efefb5a3025James Dong    int nz_coefs,
35402f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *bitmapcol,
35502f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 bitmaprow
35602f5b5447de349216a40086ca6061efefb5a3025James Dong)
35702f5b5447de349216a40086ca6061efefb5a3025James Dong{
35802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef INTEGER_IDCT
35902f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT  /* VCA IDCT using nzcoefs and bitmaps*/
36002f5b5447de349216a40086ca6061efefb5a3025James Dong    int i, bmapr;
36102f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
36202f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Function body here
36302f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
36402f5b5447de349216a40086ca6061efefb5a3025James Dong    if (nz_coefs <= 10)
36502f5b5447de349216a40086ca6061efefb5a3025James Dong    {
36602f5b5447de349216a40086ca6061efefb5a3025James Dong        bmapr = (nz_coefs - 1);
36702f5b5447de349216a40086ca6061efefb5a3025James Dong        (*(idctcolVCA[bmapr]))(coeff_in);
36802f5b5447de349216a40086ca6061efefb5a3025James Dong        (*(idctcolVCA[bmapr][1]))(coeff_in + 1);
36902f5b5447de349216a40086ca6061efefb5a3025James Dong        (*(idctcolVCA[bmapr][2]))(coeff_in + 2);
37002f5b5447de349216a40086ca6061efefb5a3025James Dong        (*(idctcolVCA[bmapr][3]))(coeff_in + 3);
37102f5b5447de349216a40086ca6061efefb5a3025James Dong
37202f5b5447de349216a40086ca6061efefb5a3025James Dong        (*idctrowVCA[nz_coefs-1])(coeff_in, pred, dst, width);
37302f5b5447de349216a40086ca6061efefb5a3025James Dong        return ;
37402f5b5447de349216a40086ca6061efefb5a3025James Dong    }
37502f5b5447de349216a40086ca6061efefb5a3025James Dong    else
37602f5b5447de349216a40086ca6061efefb5a3025James Dong    {
37702f5b5447de349216a40086ca6061efefb5a3025James Dong        i = 8;
37802f5b5447de349216a40086ca6061efefb5a3025James Dong
37902f5b5447de349216a40086ca6061efefb5a3025James Dong        while (i--)
38002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
38102f5b5447de349216a40086ca6061efefb5a3025James Dong            bmapr = (int)bitmapcol[i];
38202f5b5447de349216a40086ca6061efefb5a3025James Dong            if (bmapr)
38302f5b5447de349216a40086ca6061efefb5a3025James Dong            {
38402f5b5447de349216a40086ca6061efefb5a3025James Dong                if ((bmapr&0xf) == 0)         /*  07/18/01 */
38502f5b5447de349216a40086ca6061efefb5a3025James Dong                {
38602f5b5447de349216a40086ca6061efefb5a3025James Dong                    (*(idctcolVCA2[bmapr>>4]))(coeff_in + i);
38702f5b5447de349216a40086ca6061efefb5a3025James Dong                }
38802f5b5447de349216a40086ca6061efefb5a3025James Dong                else
38902f5b5447de349216a40086ca6061efefb5a3025James Dong                {
39002f5b5447de349216a40086ca6061efefb5a3025James Dong                    idctcol(coeff_in + i);
39102f5b5447de349216a40086ca6061efefb5a3025James Dong                }
39202f5b5447de349216a40086ca6061efefb5a3025James Dong            }
39302f5b5447de349216a40086ca6061efefb5a3025James Dong        }
39402f5b5447de349216a40086ca6061efefb5a3025James Dong        if ((bitmapcol[4] | bitmapcol[5] | bitmapcol[6] | bitmapcol[7]) == 0)
39502f5b5447de349216a40086ca6061efefb5a3025James Dong        {
39602f5b5447de349216a40086ca6061efefb5a3025James Dong            (*(idctrowVCA2[bitmaprow>>4]))(coeff_in, pred, dst, width);
39702f5b5447de349216a40086ca6061efefb5a3025James Dong        }
39802f5b5447de349216a40086ca6061efefb5a3025James Dong        else
39902f5b5447de349216a40086ca6061efefb5a3025James Dong        {
40002f5b5447de349216a40086ca6061efefb5a3025James Dong            idctrow(coeff_in, pred, dst, width);
40102f5b5447de349216a40086ca6061efefb5a3025James Dong        }
40202f5b5447de349216a40086ca6061efefb5a3025James Dong        return ;
40302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
40402f5b5447de349216a40086ca6061efefb5a3025James Dong#else // FAST_IDCT
40502f5b5447de349216a40086ca6061efefb5a3025James Dong    void idct(int *block, uint8 *pred, uint8 *dst, int width);
40602f5b5447de349216a40086ca6061efefb5a3025James Dong    idct(coeff_in, pred, dst, width);
40702f5b5447de349216a40086ca6061efefb5a3025James Dong    return;
40802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif // FAST_IDCT
40902f5b5447de349216a40086ca6061efefb5a3025James Dong#else // INTEGER_IDCT
41002f5b5447de349216a40086ca6061efefb5a3025James Dong    void idctref(int *block, uint8 *pred, uint8 *dst, int width);
41102f5b5447de349216a40086ca6061efefb5a3025James Dong    idctref(coeff_in, pred, dst, width);
41202f5b5447de349216a40086ca6061efefb5a3025James Dong    return;
41302f5b5447de349216a40086ca6061efefb5a3025James Dong#endif // INTEGER_IDCT
41402f5b5447de349216a40086ca6061efefb5a3025James Dong
41502f5b5447de349216a40086ca6061efefb5a3025James Dong}
41602f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
41702f5b5447de349216a40086ca6061efefb5a3025James Dong;  End Function: block_idct
41802f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
41902f5b5447de349216a40086ca6061efefb5a3025James Dong
42002f5b5447de349216a40086ca6061efefb5a3025James Dong
42102f5b5447de349216a40086ca6061efefb5a3025James Dong/****************************************************************************/
42202f5b5447de349216a40086ca6061efefb5a3025James Dong
42302f5b5447de349216a40086ca6061efefb5a3025James Dong/*
42402f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
42502f5b5447de349216a40086ca6061efefb5a3025James Dong FUNCTION NAME: idctrow
42602f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
42702f5b5447de349216a40086ca6061efefb5a3025James Dong INPUT AND OUTPUT DEFINITIONS FOR idctrow
42802f5b5447de349216a40086ca6061efefb5a3025James Dong
42902f5b5447de349216a40086ca6061efefb5a3025James Dong Inputs:
43002f5b5447de349216a40086ca6061efefb5a3025James Dong    [input_variable_name] = [description of the input to module, its type
43102f5b5447de349216a40086ca6061efefb5a3025James Dong                 definition, and length (when applicable)]
43202f5b5447de349216a40086ca6061efefb5a3025James Dong
43302f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores/Buffers/Pointers Needed:
43402f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_store_name] = [description of the local store, its type
43502f5b5447de349216a40086ca6061efefb5a3025James Dong                  definition, and length (when applicable)]
43602f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_buffer_name] = [description of the local buffer, its type
43702f5b5447de349216a40086ca6061efefb5a3025James Dong                   definition, and length (when applicable)]
43802f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_ptr_name] = [description of the local pointer, its type
43902f5b5447de349216a40086ca6061efefb5a3025James Dong                definition, and length (when applicable)]
44002f5b5447de349216a40086ca6061efefb5a3025James Dong
44102f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores/Buffers/Pointers Needed:
44202f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_store_name] = [description of the global store, its type
44302f5b5447de349216a40086ca6061efefb5a3025James Dong                   definition, and length (when applicable)]
44402f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_buffer_name] = [description of the global buffer, its type
44502f5b5447de349216a40086ca6061efefb5a3025James Dong                definition, and length (when applicable)]
44602f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_ptr_name] = [description of the global pointer, its type
44702f5b5447de349216a40086ca6061efefb5a3025James Dong                 definition, and length (when applicable)]
44802f5b5447de349216a40086ca6061efefb5a3025James Dong
44902f5b5447de349216a40086ca6061efefb5a3025James Dong Outputs:
45002f5b5447de349216a40086ca6061efefb5a3025James Dong    [return_variable_name] = [description of data/pointer returned
45102f5b5447de349216a40086ca6061efefb5a3025James Dong                  by module, its type definition, and length
45202f5b5447de349216a40086ca6061efefb5a3025James Dong                  (when applicable)]
45302f5b5447de349216a40086ca6061efefb5a3025James Dong
45402f5b5447de349216a40086ca6061efefb5a3025James Dong Pointers and Buffers Modified:
45502f5b5447de349216a40086ca6061efefb5a3025James Dong    [variable_bfr_ptr] points to the [describe where the
45602f5b5447de349216a40086ca6061efefb5a3025James Dong      variable_bfr_ptr points to, its type definition, and length
45702f5b5447de349216a40086ca6061efefb5a3025James Dong      (when applicable)]
45802f5b5447de349216a40086ca6061efefb5a3025James Dong    [variable_bfr] contents are [describe the new contents of
45902f5b5447de349216a40086ca6061efefb5a3025James Dong      variable_bfr]
46002f5b5447de349216a40086ca6061efefb5a3025James Dong
46102f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores Modified:
46202f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_store_name] = [describe new contents, its type
46302f5b5447de349216a40086ca6061efefb5a3025James Dong                  definition, and length (when applicable)]
46402f5b5447de349216a40086ca6061efefb5a3025James Dong
46502f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores Modified:
46602f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_store_name] = [describe new contents, its type
46702f5b5447de349216a40086ca6061efefb5a3025James Dong                   definition, and length (when applicable)]
46802f5b5447de349216a40086ca6061efefb5a3025James Dong
46902f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
47002f5b5447de349216a40086ca6061efefb5a3025James Dong FUNCTION DESCRIPTION FOR idctrow
47102f5b5447de349216a40086ca6061efefb5a3025James Dong
47202f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
47302f5b5447de349216a40086ca6061efefb5a3025James Dong REQUIREMENTS FOR idctrow
47402f5b5447de349216a40086ca6061efefb5a3025James Dong
47502f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
47602f5b5447de349216a40086ca6061efefb5a3025James Dong REFERENCES FOR idctrow
47702f5b5447de349216a40086ca6061efefb5a3025James Dong
47802f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
47902f5b5447de349216a40086ca6061efefb5a3025James Dong PSEUDO-CODE FOR idctrow
48002f5b5447de349216a40086ca6061efefb5a3025James Dong
48102f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
48202f5b5447de349216a40086ca6061efefb5a3025James Dong RESOURCES USED FOR idctrow
48302f5b5447de349216a40086ca6061efefb5a3025James Dong   When the code is written for a specific target processor the
48402f5b5447de349216a40086ca6061efefb5a3025James Dong     the resources used should be documented below.
48502f5b5447de349216a40086ca6061efefb5a3025James Dong
48602f5b5447de349216a40086ca6061efefb5a3025James Dong STACK USAGE: [stack count for this module] + [variable to represent
48702f5b5447de349216a40086ca6061efefb5a3025James Dong          stack usage for each subroutine called]
48802f5b5447de349216a40086ca6061efefb5a3025James Dong
48902f5b5447de349216a40086ca6061efefb5a3025James Dong     where: [stack usage variable] = stack usage for [subroutine
49002f5b5447de349216a40086ca6061efefb5a3025James Dong         name] (see [filename].ext)
49102f5b5447de349216a40086ca6061efefb5a3025James Dong
49202f5b5447de349216a40086ca6061efefb5a3025James Dong DATA MEMORY USED: x words
49302f5b5447de349216a40086ca6061efefb5a3025James Dong
49402f5b5447de349216a40086ca6061efefb5a3025James Dong PROGRAM MEMORY USED: x words
49502f5b5447de349216a40086ca6061efefb5a3025James Dong
49602f5b5447de349216a40086ca6061efefb5a3025James Dong CLOCK CYCLES: [cycle count equation for this module] + [variable
49702f5b5447de349216a40086ca6061efefb5a3025James Dong           used to represent cycle count for each subroutine
49802f5b5447de349216a40086ca6061efefb5a3025James Dong           called]
49902f5b5447de349216a40086ca6061efefb5a3025James Dong
50002f5b5447de349216a40086ca6061efefb5a3025James Dong     where: [cycle count variable] = cycle count for [subroutine
50102f5b5447de349216a40086ca6061efefb5a3025James Dong        name] (see [filename].ext)
50202f5b5447de349216a40086ca6061efefb5a3025James Dong
50302f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
50402f5b5447de349216a40086ca6061efefb5a3025James Dong*/
50502f5b5447de349216a40086ca6061efefb5a3025James Dong
50602f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
50702f5b5447de349216a40086ca6061efefb5a3025James Dong; Function Code FOR idctrow
50802f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
50902f5b5447de349216a40086ca6061efefb5a3025James Dongvoid idctrow(
51002f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *blk, uint8 *pred, uint8 *dst, int width
51102f5b5447de349216a40086ca6061efefb5a3025James Dong)
51202f5b5447de349216a40086ca6061efefb5a3025James Dong{
51302f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
51402f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Define all local variables
51502f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
51602f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8;
51702f5b5447de349216a40086ca6061efefb5a3025James Dong    int i = 8;
51802f5b5447de349216a40086ca6061efefb5a3025James Dong    uint32 pred_word, dst_word;
51902f5b5447de349216a40086ca6061efefb5a3025James Dong    int res, res2;
52002f5b5447de349216a40086ca6061efefb5a3025James Dong
52102f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
52202f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Function body here
52302f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
52402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* row (horizontal) IDCT
52502f5b5447de349216a40086ca6061efefb5a3025James Dong    *
52602f5b5447de349216a40086ca6061efefb5a3025James Dong    * 7                       pi         1 dst[k] = sum c[l] * src[l] * cos( -- *
52702f5b5447de349216a40086ca6061efefb5a3025James Dong    * ( k + - ) * l ) l=0                      8          2
52802f5b5447de349216a40086ca6061efefb5a3025James Dong    *
52902f5b5447de349216a40086ca6061efefb5a3025James Dong    * where: c[0]    = 128 c[1..7] = 128*sqrt(2) */
53002f5b5447de349216a40086ca6061efefb5a3025James Dong
53102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* preset the offset, such that we can take advantage pre-offset addressing mode   */
53202f5b5447de349216a40086ca6061efefb5a3025James Dong    width -= 4;
53302f5b5447de349216a40086ca6061efefb5a3025James Dong    dst -= width;
53402f5b5447de349216a40086ca6061efefb5a3025James Dong    pred -= 12;
53502f5b5447de349216a40086ca6061efefb5a3025James Dong    blk -= 8;
53602f5b5447de349216a40086ca6061efefb5a3025James Dong
53702f5b5447de349216a40086ca6061efefb5a3025James Dong    while (i--)
53802f5b5447de349216a40086ca6061efefb5a3025James Dong    {
53902f5b5447de349216a40086ca6061efefb5a3025James Dong        x1 = (int32)blk[12] << 8;
54002f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[12] = 0;
54102f5b5447de349216a40086ca6061efefb5a3025James Dong        x2 = blk[14];
54202f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[14] = 0;
54302f5b5447de349216a40086ca6061efefb5a3025James Dong        x3 = blk[10];
54402f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[10] = 0;
54502f5b5447de349216a40086ca6061efefb5a3025James Dong        x4 = blk[9];
54602f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[9] = 0;
54702f5b5447de349216a40086ca6061efefb5a3025James Dong        x5 = blk[15];
54802f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[15] = 0;
54902f5b5447de349216a40086ca6061efefb5a3025James Dong        x6 = blk[13];
55002f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[13] = 0;
55102f5b5447de349216a40086ca6061efefb5a3025James Dong        x7 = blk[11];
55202f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[11] = 0;
55302f5b5447de349216a40086ca6061efefb5a3025James Dong        x0 = ((*(blk += 8)) << 8) + 8192;
55402f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[0] = 0;   /* for proper rounding in the fourth stage */
55502f5b5447de349216a40086ca6061efefb5a3025James Dong
55602f5b5447de349216a40086ca6061efefb5a3025James Dong        /* first stage */
55702f5b5447de349216a40086ca6061efefb5a3025James Dong        x8 = W7 * (x4 + x5) + 4;
55802f5b5447de349216a40086ca6061efefb5a3025James Dong        x4 = (x8 + (W1 - W7) * x4) >> 3;
55902f5b5447de349216a40086ca6061efefb5a3025James Dong        x5 = (x8 - (W1 + W7) * x5) >> 3;
56002f5b5447de349216a40086ca6061efefb5a3025James Dong        x8 = W3 * (x6 + x7) + 4;
56102f5b5447de349216a40086ca6061efefb5a3025James Dong        x6 = (x8 - (W3 - W5) * x6) >> 3;
56202f5b5447de349216a40086ca6061efefb5a3025James Dong        x7 = (x8 - (W3 + W5) * x7) >> 3;
56302f5b5447de349216a40086ca6061efefb5a3025James Dong
56402f5b5447de349216a40086ca6061efefb5a3025James Dong        /* second stage */
56502f5b5447de349216a40086ca6061efefb5a3025James Dong        x8 = x0 + x1;
56602f5b5447de349216a40086ca6061efefb5a3025James Dong        x0 -= x1;
56702f5b5447de349216a40086ca6061efefb5a3025James Dong        x1 = W6 * (x3 + x2) + 4;
56802f5b5447de349216a40086ca6061efefb5a3025James Dong        x2 = (x1 - (W2 + W6) * x2) >> 3;
56902f5b5447de349216a40086ca6061efefb5a3025James Dong        x3 = (x1 + (W2 - W6) * x3) >> 3;
57002f5b5447de349216a40086ca6061efefb5a3025James Dong        x1 = x4 + x6;
57102f5b5447de349216a40086ca6061efefb5a3025James Dong        x4 -= x6;
57202f5b5447de349216a40086ca6061efefb5a3025James Dong        x6 = x5 + x7;
57302f5b5447de349216a40086ca6061efefb5a3025James Dong        x5 -= x7;
57402f5b5447de349216a40086ca6061efefb5a3025James Dong
57502f5b5447de349216a40086ca6061efefb5a3025James Dong        /* third stage */
57602f5b5447de349216a40086ca6061efefb5a3025James Dong        x7 = x8 + x3;
57702f5b5447de349216a40086ca6061efefb5a3025James Dong        x8 -= x3;
57802f5b5447de349216a40086ca6061efefb5a3025James Dong        x3 = x0 + x2;
57902f5b5447de349216a40086ca6061efefb5a3025James Dong        x0 -= x2;
58002f5b5447de349216a40086ca6061efefb5a3025James Dong        x2 = (181 * (x4 + x5) + 128) >> 8;
58102f5b5447de349216a40086ca6061efefb5a3025James Dong        x4 = (181 * (x4 - x5) + 128) >> 8;
58202f5b5447de349216a40086ca6061efefb5a3025James Dong
58302f5b5447de349216a40086ca6061efefb5a3025James Dong        /* fourth stage */
58402f5b5447de349216a40086ca6061efefb5a3025James Dong        pred_word = *((uint32*)(pred += 12)); /* read 4 bytes from pred */
58502f5b5447de349216a40086ca6061efefb5a3025James Dong
58602f5b5447de349216a40086ca6061efefb5a3025James Dong        res = (x7 + x1) >> 14;
58702f5b5447de349216a40086ca6061efefb5a3025James Dong        ADD_AND_CLIP1(res);
58802f5b5447de349216a40086ca6061efefb5a3025James Dong        res2 = (x3 + x2) >> 14;
58902f5b5447de349216a40086ca6061efefb5a3025James Dong        ADD_AND_CLIP2(res2);
59002f5b5447de349216a40086ca6061efefb5a3025James Dong        dst_word = (res2 << 8) | res;
59102f5b5447de349216a40086ca6061efefb5a3025James Dong        res = (x0 + x4) >> 14;
59202f5b5447de349216a40086ca6061efefb5a3025James Dong        ADD_AND_CLIP3(res);
59302f5b5447de349216a40086ca6061efefb5a3025James Dong        dst_word |= (res << 16);
59402f5b5447de349216a40086ca6061efefb5a3025James Dong        res = (x8 + x6) >> 14;
59502f5b5447de349216a40086ca6061efefb5a3025James Dong        ADD_AND_CLIP4(res);
59602f5b5447de349216a40086ca6061efefb5a3025James Dong        dst_word |= (res << 24);
59702f5b5447de349216a40086ca6061efefb5a3025James Dong        *((uint32*)(dst += width)) = dst_word; /* save 4 bytes to dst */
59802f5b5447de349216a40086ca6061efefb5a3025James Dong
59902f5b5447de349216a40086ca6061efefb5a3025James Dong        pred_word = *((uint32*)(pred += 4)); /* read 4 bytes from pred */
60002f5b5447de349216a40086ca6061efefb5a3025James Dong
60102f5b5447de349216a40086ca6061efefb5a3025James Dong        res = (x8 - x6) >> 14;
60202f5b5447de349216a40086ca6061efefb5a3025James Dong        ADD_AND_CLIP1(res);
60302f5b5447de349216a40086ca6061efefb5a3025James Dong        res2 = (x0 - x4) >> 14;
60402f5b5447de349216a40086ca6061efefb5a3025James Dong        ADD_AND_CLIP2(res2);
60502f5b5447de349216a40086ca6061efefb5a3025James Dong        dst_word = (res2 << 8) | res;
60602f5b5447de349216a40086ca6061efefb5a3025James Dong        res = (x3 - x2) >> 14;
60702f5b5447de349216a40086ca6061efefb5a3025James Dong        ADD_AND_CLIP3(res);
60802f5b5447de349216a40086ca6061efefb5a3025James Dong        dst_word |= (res << 16);
60902f5b5447de349216a40086ca6061efefb5a3025James Dong        res = (x7 - x1) >> 14;
61002f5b5447de349216a40086ca6061efefb5a3025James Dong        ADD_AND_CLIP4(res);
61102f5b5447de349216a40086ca6061efefb5a3025James Dong        dst_word |= (res << 24);
61202f5b5447de349216a40086ca6061efefb5a3025James Dong        *((uint32*)(dst += 4)) = dst_word; /* save 4 bytes to dst */
61302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
61402f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
61502f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Return nothing or data or data pointer
61602f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
61702f5b5447de349216a40086ca6061efefb5a3025James Dong    return;
61802f5b5447de349216a40086ca6061efefb5a3025James Dong}
61902f5b5447de349216a40086ca6061efefb5a3025James Dong
62002f5b5447de349216a40086ca6061efefb5a3025James Dongvoid idctrow_intra(
62102f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *blk, PIXEL *comp, int width
62202f5b5447de349216a40086ca6061efefb5a3025James Dong)
62302f5b5447de349216a40086ca6061efefb5a3025James Dong{
62402f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
62502f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Define all local variables
62602f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
62702f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8, temp;
62802f5b5447de349216a40086ca6061efefb5a3025James Dong    int i = 8;
62902f5b5447de349216a40086ca6061efefb5a3025James Dong    int offset = width;
63002f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 word;
63102f5b5447de349216a40086ca6061efefb5a3025James Dong
63202f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
63302f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Function body here
63402f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
63502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* row (horizontal) IDCT
63602f5b5447de349216a40086ca6061efefb5a3025James Dong    *
63702f5b5447de349216a40086ca6061efefb5a3025James Dong    * 7                       pi         1 dst[k] = sum c[l] * src[l] * cos( -- *
63802f5b5447de349216a40086ca6061efefb5a3025James Dong    * ( k + - ) * l ) l=0                      8          2
63902f5b5447de349216a40086ca6061efefb5a3025James Dong    *
64002f5b5447de349216a40086ca6061efefb5a3025James Dong    * where: c[0]    = 128 c[1..7] = 128*sqrt(2) */
64102f5b5447de349216a40086ca6061efefb5a3025James Dong    while (i--)
64202f5b5447de349216a40086ca6061efefb5a3025James Dong    {
64302f5b5447de349216a40086ca6061efefb5a3025James Dong        x1 = (int32)blk[4] << 8;
64402f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[4] = 0;
64502f5b5447de349216a40086ca6061efefb5a3025James Dong        x2 = blk[6];
64602f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[6] = 0;
64702f5b5447de349216a40086ca6061efefb5a3025James Dong        x3 = blk[2];
64802f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[2] = 0;
64902f5b5447de349216a40086ca6061efefb5a3025James Dong        x4 = blk[1];
65002f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[1] = 0;
65102f5b5447de349216a40086ca6061efefb5a3025James Dong        x5 = blk[7];
65202f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[7] = 0;
65302f5b5447de349216a40086ca6061efefb5a3025James Dong        x6 = blk[5];
65402f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[5] = 0;
65502f5b5447de349216a40086ca6061efefb5a3025James Dong        x7 = blk[3];
65602f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[3] = 0;
65702f5b5447de349216a40086ca6061efefb5a3025James Dong#ifndef FAST_IDCT
65802f5b5447de349216a40086ca6061efefb5a3025James Dong        /* shortcut */  /* covered by idctrow1  01/9/2001 */
65902f5b5447de349216a40086ca6061efefb5a3025James Dong        if (!(x1 | x2 | x3 | x4 | x5 | x6 | x7))
66002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
66102f5b5447de349216a40086ca6061efefb5a3025James Dong            blk[0] = blk[1] = blk[2] = blk[3] = blk[4] = blk[5] = blk[6] = blk[7] = (blk[0] + 32) >> 6;
66202f5b5447de349216a40086ca6061efefb5a3025James Dong            return;
66302f5b5447de349216a40086ca6061efefb5a3025James Dong        }
66402f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
66502f5b5447de349216a40086ca6061efefb5a3025James Dong        x0 = ((int32)blk[0] << 8) + 8192;
66602f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[0] = 0;  /* for proper rounding in the fourth stage */
66702f5b5447de349216a40086ca6061efefb5a3025James Dong
66802f5b5447de349216a40086ca6061efefb5a3025James Dong        /* first stage */
66902f5b5447de349216a40086ca6061efefb5a3025James Dong        x8 = W7 * (x4 + x5) + 4;
67002f5b5447de349216a40086ca6061efefb5a3025James Dong        x4 = (x8 + (W1 - W7) * x4) >> 3;
67102f5b5447de349216a40086ca6061efefb5a3025James Dong        x5 = (x8 - (W1 + W7) * x5) >> 3;
67202f5b5447de349216a40086ca6061efefb5a3025James Dong        x8 = W3 * (x6 + x7) + 4;
67302f5b5447de349216a40086ca6061efefb5a3025James Dong        x6 = (x8 - (W3 - W5) * x6) >> 3;
67402f5b5447de349216a40086ca6061efefb5a3025James Dong        x7 = (x8 - (W3 + W5) * x7) >> 3;
67502f5b5447de349216a40086ca6061efefb5a3025James Dong
67602f5b5447de349216a40086ca6061efefb5a3025James Dong        /* second stage */
67702f5b5447de349216a40086ca6061efefb5a3025James Dong        x8 = x0 + x1;
67802f5b5447de349216a40086ca6061efefb5a3025James Dong        x0 -= x1;
67902f5b5447de349216a40086ca6061efefb5a3025James Dong        x1 = W6 * (x3 + x2) + 4;
68002f5b5447de349216a40086ca6061efefb5a3025James Dong        x2 = (x1 - (W2 + W6) * x2) >> 3;
68102f5b5447de349216a40086ca6061efefb5a3025James Dong        x3 = (x1 + (W2 - W6) * x3) >> 3;
68202f5b5447de349216a40086ca6061efefb5a3025James Dong        x1 = x4 + x6;
68302f5b5447de349216a40086ca6061efefb5a3025James Dong        x4 -= x6;
68402f5b5447de349216a40086ca6061efefb5a3025James Dong        x6 = x5 + x7;
68502f5b5447de349216a40086ca6061efefb5a3025James Dong        x5 -= x7;
68602f5b5447de349216a40086ca6061efefb5a3025James Dong
68702f5b5447de349216a40086ca6061efefb5a3025James Dong        /* third stage */
68802f5b5447de349216a40086ca6061efefb5a3025James Dong        x7 = x8 + x3;
68902f5b5447de349216a40086ca6061efefb5a3025James Dong        x8 -= x3;
69002f5b5447de349216a40086ca6061efefb5a3025James Dong        x3 = x0 + x2;
69102f5b5447de349216a40086ca6061efefb5a3025James Dong        x0 -= x2;
69202f5b5447de349216a40086ca6061efefb5a3025James Dong        x2 = (181 * (x4 + x5) + 128) >> 8;
69302f5b5447de349216a40086ca6061efefb5a3025James Dong        x4 = (181 * (x4 - x5) + 128) >> 8;
69402f5b5447de349216a40086ca6061efefb5a3025James Dong
69502f5b5447de349216a40086ca6061efefb5a3025James Dong        /* fourth stage */
69602f5b5447de349216a40086ca6061efefb5a3025James Dong        word = ((x7 + x1) >> 14);
69702f5b5447de349216a40086ca6061efefb5a3025James Dong        CLIP_RESULT(word)
69802f5b5447de349216a40086ca6061efefb5a3025James Dong
69902f5b5447de349216a40086ca6061efefb5a3025James Dong        temp = ((x3 + x2) >> 14);
70002f5b5447de349216a40086ca6061efefb5a3025James Dong        CLIP_RESULT(temp)
70102f5b5447de349216a40086ca6061efefb5a3025James Dong        word = word | (temp << 8);
70202f5b5447de349216a40086ca6061efefb5a3025James Dong
70302f5b5447de349216a40086ca6061efefb5a3025James Dong        temp = ((x0 + x4) >> 14);
70402f5b5447de349216a40086ca6061efefb5a3025James Dong        CLIP_RESULT(temp)
70502f5b5447de349216a40086ca6061efefb5a3025James Dong        word = word | (temp << 16);
70602f5b5447de349216a40086ca6061efefb5a3025James Dong
70702f5b5447de349216a40086ca6061efefb5a3025James Dong        temp = ((x8 + x6) >> 14);
70802f5b5447de349216a40086ca6061efefb5a3025James Dong        CLIP_RESULT(temp)
70902f5b5447de349216a40086ca6061efefb5a3025James Dong        word = word | (temp << 24);
71002f5b5447de349216a40086ca6061efefb5a3025James Dong        *((int32*)(comp)) = word;
71102f5b5447de349216a40086ca6061efefb5a3025James Dong
71202f5b5447de349216a40086ca6061efefb5a3025James Dong        word = ((x8 - x6) >> 14);
71302f5b5447de349216a40086ca6061efefb5a3025James Dong        CLIP_RESULT(word)
71402f5b5447de349216a40086ca6061efefb5a3025James Dong
71502f5b5447de349216a40086ca6061efefb5a3025James Dong        temp = ((x0 - x4) >> 14);
71602f5b5447de349216a40086ca6061efefb5a3025James Dong        CLIP_RESULT(temp)
71702f5b5447de349216a40086ca6061efefb5a3025James Dong        word = word | (temp << 8);
71802f5b5447de349216a40086ca6061efefb5a3025James Dong
71902f5b5447de349216a40086ca6061efefb5a3025James Dong        temp = ((x3 - x2) >> 14);
72002f5b5447de349216a40086ca6061efefb5a3025James Dong        CLIP_RESULT(temp)
72102f5b5447de349216a40086ca6061efefb5a3025James Dong        word = word | (temp << 16);
72202f5b5447de349216a40086ca6061efefb5a3025James Dong
72302f5b5447de349216a40086ca6061efefb5a3025James Dong        temp = ((x7 - x1) >> 14);
72402f5b5447de349216a40086ca6061efefb5a3025James Dong        CLIP_RESULT(temp)
72502f5b5447de349216a40086ca6061efefb5a3025James Dong        word = word | (temp << 24);
72602f5b5447de349216a40086ca6061efefb5a3025James Dong        *((int32*)(comp + 4)) = word;
72702f5b5447de349216a40086ca6061efefb5a3025James Dong        comp += offset;
72802f5b5447de349216a40086ca6061efefb5a3025James Dong
72902f5b5447de349216a40086ca6061efefb5a3025James Dong        blk += B_SIZE;
73002f5b5447de349216a40086ca6061efefb5a3025James Dong    }
73102f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
73202f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Return nothing or data or data pointer
73302f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
73402f5b5447de349216a40086ca6061efefb5a3025James Dong    return;
73502f5b5447de349216a40086ca6061efefb5a3025James Dong}
73602f5b5447de349216a40086ca6061efefb5a3025James Dong
73702f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
73802f5b5447de349216a40086ca6061efefb5a3025James Dong; End Function: idctrow
73902f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
74002f5b5447de349216a40086ca6061efefb5a3025James Dong
74102f5b5447de349216a40086ca6061efefb5a3025James Dong
74202f5b5447de349216a40086ca6061efefb5a3025James Dong/****************************************************************************/
74302f5b5447de349216a40086ca6061efefb5a3025James Dong
74402f5b5447de349216a40086ca6061efefb5a3025James Dong/*
74502f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
74602f5b5447de349216a40086ca6061efefb5a3025James Dong FUNCTION NAME: idctcol
74702f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
74802f5b5447de349216a40086ca6061efefb5a3025James Dong INPUT AND OUTPUT DEFINITIONS FOR idctcol
74902f5b5447de349216a40086ca6061efefb5a3025James Dong
75002f5b5447de349216a40086ca6061efefb5a3025James Dong Inputs:
75102f5b5447de349216a40086ca6061efefb5a3025James Dong    [input_variable_name] = [description of the input to module, its type
75202f5b5447de349216a40086ca6061efefb5a3025James Dong                 definition, and length (when applicable)]
75302f5b5447de349216a40086ca6061efefb5a3025James Dong
75402f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores/Buffers/Pointers Needed:
75502f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_store_name] = [description of the local store, its type
75602f5b5447de349216a40086ca6061efefb5a3025James Dong                  definition, and length (when applicable)]
75702f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_buffer_name] = [description of the local buffer, its type
75802f5b5447de349216a40086ca6061efefb5a3025James Dong                   definition, and length (when applicable)]
75902f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_ptr_name] = [description of the local pointer, its type
76002f5b5447de349216a40086ca6061efefb5a3025James Dong                definition, and length (when applicable)]
76102f5b5447de349216a40086ca6061efefb5a3025James Dong
76202f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores/Buffers/Pointers Needed:
76302f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_store_name] = [description of the global store, its type
76402f5b5447de349216a40086ca6061efefb5a3025James Dong                   definition, and length (when applicable)]
76502f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_buffer_name] = [description of the global buffer, its type
76602f5b5447de349216a40086ca6061efefb5a3025James Dong                definition, and length (when applicable)]
76702f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_ptr_name] = [description of the global pointer, its type
76802f5b5447de349216a40086ca6061efefb5a3025James Dong                 definition, and length (when applicable)]
76902f5b5447de349216a40086ca6061efefb5a3025James Dong
77002f5b5447de349216a40086ca6061efefb5a3025James Dong Outputs:
77102f5b5447de349216a40086ca6061efefb5a3025James Dong    [return_variable_name] = [description of data/pointer returned
77202f5b5447de349216a40086ca6061efefb5a3025James Dong                  by module, its type definition, and length
77302f5b5447de349216a40086ca6061efefb5a3025James Dong                  (when applicable)]
77402f5b5447de349216a40086ca6061efefb5a3025James Dong
77502f5b5447de349216a40086ca6061efefb5a3025James Dong Pointers and Buffers Modified:
77602f5b5447de349216a40086ca6061efefb5a3025James Dong    [variable_bfr_ptr] points to the [describe where the
77702f5b5447de349216a40086ca6061efefb5a3025James Dong      variable_bfr_ptr points to, its type definition, and length
77802f5b5447de349216a40086ca6061efefb5a3025James Dong      (when applicable)]
77902f5b5447de349216a40086ca6061efefb5a3025James Dong    [variable_bfr] contents are [describe the new contents of
78002f5b5447de349216a40086ca6061efefb5a3025James Dong      variable_bfr]
78102f5b5447de349216a40086ca6061efefb5a3025James Dong
78202f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores Modified:
78302f5b5447de349216a40086ca6061efefb5a3025James Dong    [local_store_name] = [describe new contents, its type
78402f5b5447de349216a40086ca6061efefb5a3025James Dong                  definition, and length (when applicable)]
78502f5b5447de349216a40086ca6061efefb5a3025James Dong
78602f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores Modified:
78702f5b5447de349216a40086ca6061efefb5a3025James Dong    [global_store_name] = [describe new contents, its type
78802f5b5447de349216a40086ca6061efefb5a3025James Dong                   definition, and length (when applicable)]
78902f5b5447de349216a40086ca6061efefb5a3025James Dong
79002f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
79102f5b5447de349216a40086ca6061efefb5a3025James Dong FUNCTION DESCRIPTION FOR idctcol
79202f5b5447de349216a40086ca6061efefb5a3025James Dong
79302f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
79402f5b5447de349216a40086ca6061efefb5a3025James Dong REQUIREMENTS FOR idctcol
79502f5b5447de349216a40086ca6061efefb5a3025James Dong
79602f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
79702f5b5447de349216a40086ca6061efefb5a3025James Dong REFERENCES FOR idctcol
79802f5b5447de349216a40086ca6061efefb5a3025James Dong
79902f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
80002f5b5447de349216a40086ca6061efefb5a3025James Dong PSEUDO-CODE FOR idctcol
80102f5b5447de349216a40086ca6061efefb5a3025James Dong
80202f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
80302f5b5447de349216a40086ca6061efefb5a3025James Dong RESOURCES USED FOR idctcol
80402f5b5447de349216a40086ca6061efefb5a3025James Dong   When the code is written for a specific target processor the
80502f5b5447de349216a40086ca6061efefb5a3025James Dong     the resources used should be documented below.
80602f5b5447de349216a40086ca6061efefb5a3025James Dong
80702f5b5447de349216a40086ca6061efefb5a3025James Dong STACK USAGE: [stack count for this module] + [variable to represent
80802f5b5447de349216a40086ca6061efefb5a3025James Dong          stack usage for each subroutine called]
80902f5b5447de349216a40086ca6061efefb5a3025James Dong
81002f5b5447de349216a40086ca6061efefb5a3025James Dong     where: [stack usage variable] = stack usage for [subroutine
81102f5b5447de349216a40086ca6061efefb5a3025James Dong         name] (see [filename].ext)
81202f5b5447de349216a40086ca6061efefb5a3025James Dong
81302f5b5447de349216a40086ca6061efefb5a3025James Dong DATA MEMORY USED: x words
81402f5b5447de349216a40086ca6061efefb5a3025James Dong
81502f5b5447de349216a40086ca6061efefb5a3025James Dong PROGRAM MEMORY USED: x words
81602f5b5447de349216a40086ca6061efefb5a3025James Dong
81702f5b5447de349216a40086ca6061efefb5a3025James Dong CLOCK CYCLES: [cycle count equation for this module] + [variable
81802f5b5447de349216a40086ca6061efefb5a3025James Dong           used to represent cycle count for each subroutine
81902f5b5447de349216a40086ca6061efefb5a3025James Dong           called]
82002f5b5447de349216a40086ca6061efefb5a3025James Dong
82102f5b5447de349216a40086ca6061efefb5a3025James Dong     where: [cycle count variable] = cycle count for [subroutine
82202f5b5447de349216a40086ca6061efefb5a3025James Dong        name] (see [filename].ext)
82302f5b5447de349216a40086ca6061efefb5a3025James Dong
82402f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
82502f5b5447de349216a40086ca6061efefb5a3025James Dong*/
82602f5b5447de349216a40086ca6061efefb5a3025James Dong
82702f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
82802f5b5447de349216a40086ca6061efefb5a3025James Dong; Function Code FOR idctcol
82902f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
83002f5b5447de349216a40086ca6061efefb5a3025James Dongvoid idctcol(
83102f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *blk
83202f5b5447de349216a40086ca6061efefb5a3025James Dong)
83302f5b5447de349216a40086ca6061efefb5a3025James Dong{
83402f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
83502f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Define all local variables
83602f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
83702f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 x0, x1, x2, x3, x4, x5, x6, x7, x8;
83802f5b5447de349216a40086ca6061efefb5a3025James Dong
83902f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
84002f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Function body here
84102f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
84202f5b5447de349216a40086ca6061efefb5a3025James Dong    /* column (vertical) IDCT
84302f5b5447de349216a40086ca6061efefb5a3025James Dong    *
84402f5b5447de349216a40086ca6061efefb5a3025James Dong    * 7                         pi         1 dst[8*k] = sum c[l] * src[8*l] *
84502f5b5447de349216a40086ca6061efefb5a3025James Dong    * cos( -- * ( k + - ) * l ) l=0                        8          2
84602f5b5447de349216a40086ca6061efefb5a3025James Dong    *
84702f5b5447de349216a40086ca6061efefb5a3025James Dong    * where: c[0]    = 1/1024 c[1..7] = (1/1024)*sqrt(2) */
84802f5b5447de349216a40086ca6061efefb5a3025James Dong    x1 = (int32)blk[32] << 11;
84902f5b5447de349216a40086ca6061efefb5a3025James Dong    x2 = blk[48];
85002f5b5447de349216a40086ca6061efefb5a3025James Dong    x3 = blk[16];
85102f5b5447de349216a40086ca6061efefb5a3025James Dong    x4 = blk[8];
85202f5b5447de349216a40086ca6061efefb5a3025James Dong    x5 = blk[56];
85302f5b5447de349216a40086ca6061efefb5a3025James Dong    x6 = blk[40];
85402f5b5447de349216a40086ca6061efefb5a3025James Dong    x7 = blk[24];
85502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifndef FAST_IDCT
85602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* shortcut */        /* covered by idctcolumn1  01/9/2001 */
85702f5b5447de349216a40086ca6061efefb5a3025James Dong    if (!(x1 | x2 | x3 | x4 | x5 | x6 | x7))
85802f5b5447de349216a40086ca6061efefb5a3025James Dong    {
85902f5b5447de349216a40086ca6061efefb5a3025James Dong        blk[0] = blk[8] = blk[16] = blk[24] = blk[32] = blk[40] = blk[48] = blk[56]
86002f5b5447de349216a40086ca6061efefb5a3025James Dong                                              = blk[0] << 3;
86102f5b5447de349216a40086ca6061efefb5a3025James Dong        return;
86202f5b5447de349216a40086ca6061efefb5a3025James Dong    }
86302f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
86402f5b5447de349216a40086ca6061efefb5a3025James Dong
86502f5b5447de349216a40086ca6061efefb5a3025James Dong    x0 = ((int32)blk[0] << 11) + 128;
86602f5b5447de349216a40086ca6061efefb5a3025James Dong
86702f5b5447de349216a40086ca6061efefb5a3025James Dong    /* first stage */
86802f5b5447de349216a40086ca6061efefb5a3025James Dong    x8 = W7 * (x4 + x5);
86902f5b5447de349216a40086ca6061efefb5a3025James Dong    x4 = x8 + (W1 - W7) * x4;
87002f5b5447de349216a40086ca6061efefb5a3025James Dong    x5 = x8 - (W1 + W7) * x5;
87102f5b5447de349216a40086ca6061efefb5a3025James Dong    x8 = W3 * (x6 + x7);
87202f5b5447de349216a40086ca6061efefb5a3025James Dong    x6 = x8 - (W3 - W5) * x6;
87302f5b5447de349216a40086ca6061efefb5a3025James Dong    x7 = x8 - (W3 + W5) * x7;
87402f5b5447de349216a40086ca6061efefb5a3025James Dong
87502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* second stage */
87602f5b5447de349216a40086ca6061efefb5a3025James Dong    x8 = x0 + x1;
87702f5b5447de349216a40086ca6061efefb5a3025James Dong    x0 -= x1;
87802f5b5447de349216a40086ca6061efefb5a3025James Dong    x1 = W6 * (x3 + x2);
87902f5b5447de349216a40086ca6061efefb5a3025James Dong    x2 = x1 - (W2 + W6) * x2;
88002f5b5447de349216a40086ca6061efefb5a3025James Dong    x3 = x1 + (W2 - W6) * x3;
88102f5b5447de349216a40086ca6061efefb5a3025James Dong    x1 = x4 + x6;
88202f5b5447de349216a40086ca6061efefb5a3025James Dong    x4 -= x6;
88302f5b5447de349216a40086ca6061efefb5a3025James Dong    x6 = x5 + x7;
88402f5b5447de349216a40086ca6061efefb5a3025James Dong    x5 -= x7;
88502f5b5447de349216a40086ca6061efefb5a3025James Dong
88602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* third stage */
88702f5b5447de349216a40086ca6061efefb5a3025James Dong    x7 = x8 + x3;
88802f5b5447de349216a40086ca6061efefb5a3025James Dong    x8 -= x3;
88902f5b5447de349216a40086ca6061efefb5a3025James Dong    x3 = x0 + x2;
89002f5b5447de349216a40086ca6061efefb5a3025James Dong    x0 -= x2;
89102f5b5447de349216a40086ca6061efefb5a3025James Dong    x2 = (181 * (x4 + x5) + 128) >> 8;
89202f5b5447de349216a40086ca6061efefb5a3025James Dong    x4 = (181 * (x4 - x5) + 128) >> 8;
89302f5b5447de349216a40086ca6061efefb5a3025James Dong
89402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* fourth stage */
89502f5b5447de349216a40086ca6061efefb5a3025James Dong    blk[0]    = (x7 + x1) >> 8;
89602f5b5447de349216a40086ca6061efefb5a3025James Dong    blk[8] = (x3 + x2) >> 8;
89702f5b5447de349216a40086ca6061efefb5a3025James Dong    blk[16] = (x0 + x4) >> 8;
89802f5b5447de349216a40086ca6061efefb5a3025James Dong    blk[24] = (x8 + x6) >> 8;
89902f5b5447de349216a40086ca6061efefb5a3025James Dong    blk[32] = (x8 - x6) >> 8;
90002f5b5447de349216a40086ca6061efefb5a3025James Dong    blk[40] = (x0 - x4) >> 8;
90102f5b5447de349216a40086ca6061efefb5a3025James Dong    blk[48] = (x3 - x2) >> 8;
90202f5b5447de349216a40086ca6061efefb5a3025James Dong    blk[56] = (x7 - x1) >> 8;
90302f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
90402f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Return nothing or data or data pointer
90502f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
90602f5b5447de349216a40086ca6061efefb5a3025James Dong    return;
90702f5b5447de349216a40086ca6061efefb5a3025James Dong}
90802f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
90902f5b5447de349216a40086ca6061efefb5a3025James Dong;  End Function: idctcol
91002f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
91102f5b5447de349216a40086ca6061efefb5a3025James Dong
912