find_min_max.cpp revision 3306cfee3bf38ab207a0504e49c2d492bb73ffbf
1/* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18/* 19------------------------------------------------------------------------------ 20 INPUT AND OUTPUT DEFINITIONS 21 22 Inputs: 23 input_ptr = pointer to the buffer containing values of type UChar 24 in a 2D block of data. 25 min_ptr = pointer to the minimum value of type Int to be found in a 26 square block of size BLKSIZE contained in 2D block of data. 27 max_ptr = pointer to the maximum value of type Int to be found in a 28 square block of size BLKSIZE contained in 2D block of data. 29 incr = value of type Int representing the width of 2D block of data. 30 31 Local Stores/Buffers/Pointers Needed: 32 None 33 34 Global Stores/Buffers/Pointers Needed: 35 None 36 37 Outputs: 38 None 39 40 Pointers and Buffers Modified: 41 min_ptr points to the found minimum value in the square block of 42 size BLKSIZE contained in 2D block of data. 43 44 max_ptr points to the found maximum value in the square block of 45 size BLKSIZE contained in 2D block of data. 46 47 Local Stores Modified: 48 None 49 50 Global Stores Modified: 51 None 52 53------------------------------------------------------------------------------ 54 FUNCTION DESCRIPTION 55 56 This function finds the maximum and the minimum values in a square block of 57 data of size BLKSIZE * BLKSIZE. The data is contained in the buffer which 58 represents a 2D block of data that is larger than BLKSIZE * BLKSIZE. 59 This is illustrated below. 60 61 mem loc x + 00h -> o o o o o o o o o o o o o o o o 62 mem loc x + 10h -> o o o o o X X X X X X X X o o o 63 mem loc x + 20h -> o o o o o X X X X X X X X o o o 64 mem loc x + 30h -> o o o o o X X X X X X X X o o o 65 mem loc x + 40h -> o o o o o X X X X X X X X o o o 66 mem loc x + 50h -> o o o o o X X X X X X X X o o o 67 mem loc x + 60h -> o o o o o X X X X X X X X o o o 68 mem loc x + 70h -> o o o o o X X X X X X X X o o o 69 mem loc x + 80h -> o o o o o X X X X X X X X o o o 70 mem loc x + 90h -> o o o o o o o o o o o o o o o o 71 mem loc x + A0h -> o o o o o o o o o o o o o o o o 72 mem loc x + B0h -> o o o o o o o o o o o o o o o o 73 74For illustration purposes, the diagram assumes that BLKSIZE is equal to 8 75but this is not a requirement. In this diagram, the buffer starts at 76location x but the input pointer, input_ptr, passed into this function 77would be the first row of data to be searched which is at x + 15h. The 78value of incr passed onto this function represents the amount the input_ptr 79needs to be incremented to point to the next row of data. 80 81This function compares each value in a row to the current maximum and 82minimum. After each row, input_ptr is incremented to point to the next row. 83This is repeated until all rows have been processed. When the search is 84complete the location pointed to by min_ptr contains the minimum value 85found and the location pointed to by max_ptr contains the maximum value found. 86 87------------------------------------------------------------------------------ 88*/ 89 90 91/*---------------------------------------------------------------------------- 92; INCLUDES 93----------------------------------------------------------------------------*/ 94#include "mp4dec_lib.h" 95#include "post_proc.h" 96 97/*---------------------------------------------------------------------------- 98; MACROS 99; Define module specific macros here 100----------------------------------------------------------------------------*/ 101 102/*---------------------------------------------------------------------------- 103; DEFINES 104; Include all pre-processor statements here. Include conditional 105; compile variables also. 106----------------------------------------------------------------------------*/ 107 108/*---------------------------------------------------------------------------- 109; LOCAL FUNCTION DEFINITIONS 110; Function Prototype declaration 111----------------------------------------------------------------------------*/ 112 113/*---------------------------------------------------------------------------- 114; LOCAL STORE/BUFFER/POINTER DEFINITIONS 115; Variable declaration - defined here and used outside this module 116----------------------------------------------------------------------------*/ 117 118/*---------------------------------------------------------------------------- 119; EXTERNAL FUNCTION REFERENCES 120; Declare functions defined elsewhere and referenced in this module 121----------------------------------------------------------------------------*/ 122 123/*---------------------------------------------------------------------------- 124; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 125; Declare variables used in this module but defined elsewhere 126----------------------------------------------------------------------------*/ 127 128#ifdef PV_POSTPROC_ON 129/*---------------------------------------------------------------------------- 130; FUNCTION CODE 131----------------------------------------------------------------------------*/ 132void FindMaxMin( 133 uint8 *input_ptr, 134 int *min_ptr, 135 int *max_ptr, 136 int incr) 137{ 138 /*---------------------------------------------------------------------------- 139 ; Define all local variables 140 ----------------------------------------------------------------------------*/ 141 register uint i, j; 142 register int min, max; 143 144 /*---------------------------------------------------------------------------- 145 ; Function body here 146 ----------------------------------------------------------------------------*/ 147 max = min = *input_ptr; 148 /* incr = incr - BLKSIZE; */ /* 09/06/2001, already passed in as width - BLKSIZE */ 149 150 for (i = BLKSIZE; i > 0; i--) 151 { 152 for (j = BLKSIZE; j > 0; j--) 153 { 154 if (*input_ptr > max) 155 { 156 max = *input_ptr; 157 } 158 else if (*input_ptr < min) 159 { 160 min = *input_ptr; 161 } 162 input_ptr += 1; 163 } 164 165 /* set pointer to the beginning of the next row*/ 166 input_ptr += incr; 167 } 168 169 *max_ptr = max; 170 *min_ptr = min; 171 /*---------------------------------------------------------------------------- 172 ; Return nothing or data or data pointer 173 ----------------------------------------------------------------------------*/ 174 return; 175} 176#endif 177