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