MPEG CDVA Experimentation Model (CXM)  1.0
Compact Descriptors for Visual Analisys
math.h
Go to the documentation of this file.
1 
2 /*
3 //
4 // Copyright (c) 2002-2015 Joe Bertolami. All Right Reserved.
5 //
6 // math.h
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions are met:
10 //
11 // * Redistributions of source code must retain the above copyright notice, this
12 // list of conditions and the following disclaimer.
13 //
14 // * Redistributions in binary form must reproduce the above copyright notice,
15 // this list of conditions and the following disclaimer in the documentation
16 // and/or other materials provided with the distribution.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 //
29 // Additional Information:
30 //
31 // For more information, visit http://www.bertolami.com.
32 //
33 */
34 
35 #ifndef __EV_MATH_H__
36 #define __EV_MATH_H__
37 
38 #include "base.h"
39 
40 #define EVX_KB ((uint32) 1024)
41 #define EVX_MB (EVX_KB * EVX_KB)
42 #define EVX_GB (EVX_MB * EVX_KB)
43 
44 #define EVX_MAX_INT64 (0x7FFFFFFFFFFFFFFF)
45 #define EVX_MAX_INT32 (0x7FFFFFFF)
46 #define EVX_MAX_INT16 (0x7FFF)
47 #define EVX_MAX_INT8 (0x7F)
48 
49 #define EVX_MAX_UINT64 (0xFFFFFFFFFFFFFFFF)
50 #define EVX_MAX_UINT32 (0xFFFFFFFF)
51 #define EVX_MAX_UINT16 (0xFFFF)
52 #define EVX_MAX_UINT8 (0xFF)
53 
54 #define EVX_MIN_INT64 (-EVX_MAX_INT64 - 1)
55 #define EVX_MIN_INT32 (-EVX_MAX_INT32 - 1)
56 #define EVX_MIN_INT16 (-EVX_MAX_INT16 - 1)
57 #define EVX_MIN_INT8 (-EVX_MAX_INT8 - 1)
58 
59 #define evx_min2( a, b ) ((a) < (b) ? (a) : (b))
60 #define evx_max2( a, b ) ((a) > (b) ? (a) : (b))
61 #define evx_min3( a, b, c ) ((c) < (a) ? ((c) < (b) ? (c) : (b)) : (a) < (b) ? (a) : (b))
62 #define evx_max3( a, b, c ) ((c) > (a) ? ((c) > (b) ? (c) : (b)) : (a) > (b) ? (a) : (b))
63 
64 namespace evx {
65 
66 const uint8 log2_byte_lut[] = {
67  0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
68  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
69  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
70  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
71  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
72  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
73  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
74  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
75  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
76  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
77  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
78  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
79  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
80  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
81  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
82  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
83 };
84 
85 inline uint8 log2(uint8 value)
86 {
87  return log2_byte_lut[value];
88 }
89 
90 inline uint8 log2(uint16 value)
91 {
92  if (value <= 0xFF)
93  {
94  return log2((uint8) value);
95  }
96 
97  return 8 + log2((uint8) (value >> 8));
98 }
99 
100 inline uint8 log2(uint32 value)
101 {
102  if (value <= 0xFFFF)
103  {
104  return log2((uint16) value);
105  }
106 
107  return 16 + log2((uint16) (value >> 16));
108 }
109 
110 inline int8 abs(int8 value)
111 {
112  if (0x80 == value)
113  {
114  return 0x7F;
115  }
116 
117  return (value < 0 ? -value : value);
118 }
119 
120 inline int16 abs(int16 value)
121 {
122  if (0x1000 == value)
123  {
124  return 0x7FFF;
125  }
126 
127  return (value < 0 ? -value : value);
128 }
129 
130 inline int32 abs(int32 value)
131 {
132  if (0x10000000 == value)
133  {
134  return 0x7FFFFFFF;
135  }
136 
137  return (value < 0 ? -value : value);
138 }
139 
140 inline int16 clip_range(int16 value, int16 min, int16 max)
141 {
142  return (value < min ? min : (value > max ? max : value));
143 }
144 
145 inline uint32 greater_multiple(uint32 value, uint32 multiple)
146 {
147  uint32 mod = value % multiple;
148 
149  if (0 != mod)
150  {
151  value += multiple - mod;
152  }
153 
154  return value;
155 }
156 
157 inline uint32 align(uint32 value, uint32 alignment)
158 {
159  return greater_multiple(value, alignment);
160 }
161 
162 } // namespace evx
163 
164 #endif // __EV_MATH_H__
u_int8_t uint8
Definition: base.h:137
int8 abs(int8 value)
Definition: math.h:110
int32_t int32
Definition: base.h:130
Definition: base.h:116
u_int16_t uint16
Definition: base.h:136
uint32 greater_multiple(uint32 value, uint32 multiple)
Definition: math.h:145
int16_t int16
Definition: base.h:131
u_int32_t uint32
Definition: base.h:135
int16 clip_range(int16 value, int16 min, int16 max)
Definition: math.h:140
uint8 log2(uint8 value)
Definition: math.h:85
const uint8 log2_byte_lut[]
Definition: math.h:66
uint32 align(uint32 value, uint32 alignment)
Definition: math.h:157
int8_t int8
Definition: base.h:132