1 /*
2  * Copyright (C) 2009 The Android Open Source Project
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 express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*------------------------------------------------------------------------------
18 
19     Table of contents
20 
21     1. Include headers
22     2. Module defines
23     3. Data types
24     4. Function prototypes
25 
26 ------------------------------------------------------------------------------*/
27 
28 #ifndef H264SWDEC_UTIL_H
29 #define H264SWDEC_UTIL_H
30 
31 /*------------------------------------------------------------------------------
32     1. Include headers
33 ------------------------------------------------------------------------------*/
34 
35 #ifdef _ASSERT_USED
36 #include <assert.h>
37 #endif
38 
39 #include "H264SwDecApi.h"
40 
41 #if defined(_RANGE_CHECK) || defined(_DEBUG_PRINT) || defined(_ERROR_PRINT)
42 #include <stdio.h>
43 #endif
44 
45 #include <stdint.h>
46 #include "basetype.h"
47 #include "h264bsd_stream.h"
48 #include "h264bsd_image.h"
49 
50 /*------------------------------------------------------------------------------
51     2. Module defines
52 ------------------------------------------------------------------------------*/
53 
54 #define HANTRO_OK   0
55 #define HANTRO_NOK  1
56 
57 #define HANTRO_TRUE     (1)
58 #define HANTRO_FALSE    (0)
59 
60 #ifndef NULL
61 #define NULL 0
62 #endif
63 
64 #define MEMORY_ALLOCATION_ERROR 0xFFFF
65 #define PARAM_SET_ERROR 0xFFF0
66 
67 /* value to be returned by GetBits if stream buffer is empty */
68 #define END_OF_STREAM 0xFFFFFFFFU
69 
70 #define EMPTY_RESIDUAL_INDICATOR 0xFFFFFF
71 
72 /* macro to mark a residual block empty, i.e. contain zero coefficients */
73 #define MARK_RESIDUAL_EMPTY(residual) ((residual)[0] = EMPTY_RESIDUAL_INDICATOR)
74 /* macro to check if residual block is empty */
75 #define IS_RESIDUAL_EMPTY(residual) ((residual)[0] == EMPTY_RESIDUAL_INDICATOR)
76 
77 /* macro for assertion, used only if compiler flag _ASSERT_USED is defined */
78 #ifdef _ASSERT_USED
79 #define ASSERT(expr) assert(expr)
80 #else
81 #define ASSERT(expr)
82 #endif
83 
84 /* macro for range checking an value, used only if compiler flag _RANGE_CHECK
85  * is defined */
86 #ifdef _RANGE_CHECK
87 #define RANGE_CHECK(value, minBound, maxBound) \
88 { \
89     if ((value) < (minBound) || (value) > (maxBound)) \
90         fprintf(stderr, "Warning: Value exceeds given limit(s)!\n"); \
91 }
92 #else
93 #define RANGE_CHECK(value, minBound, maxBound)
94 #endif
95 
96 /* macro for range checking an array, used only if compiler flag _RANGE_CHECK
97  * is defined */
98 #ifdef _RANGE_CHECK
99 #define RANGE_CHECK_ARRAY(array, minBound, maxBound, length) \
100 { \
101     i32 i; \
102     for (i = 0; i < (length); i++) \
103         if ((array)[i] < (minBound) || (array)[i] > (maxBound)) \
104             fprintf(stderr,"Warning: Value [%d] exceeds given limit(s)!\n",i); \
105 }
106 #else
107 #define RANGE_CHECK_ARRAY(array, minBound, maxBound, length)
108 #endif
109 
110 /* macro for debug printing, used only if compiler flag _DEBUG_PRINT is
111  * defined */
112 #ifdef _DEBUG_PRINT
113 #define DEBUG(args) printf args
114 #else
115 #define DEBUG(args)
116 #endif
117 
118 /* macro for error printing, used only if compiler flag _ERROR_PRINT is
119  * defined */
120 #ifdef _ERROR_PRINT
121 #define EPRINT(msg) fprintf(stderr,"ERROR: %s\n",msg)
122 #else
123 #define EPRINT(msg)
124 #endif
125 
126 /* macro to get smaller of two values */
127 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
128 
129 /* macro to get greater of two values */
130 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
131 
132 /* macro to get absolute value */
133 #define ABS(a) (((a) < 0) ? -(a) : (a))
134 
135 /* macro to clip a value z, so that x <= z =< y */
136 #define CLIP3(x,y,z) (((z) < (x)) ? (x) : (((z) > (y)) ? (y) : (z)))
137 
138 /* macro to clip a value z, so that 0 <= z =< 255 */
139 #define CLIP1(z) (((z) < 0) ? 0 : (((z) > 255) ? 255 : (z)))
140 
141 /* macro to allocate memory */
142 #define ALLOCATE(ptr, count, type) \
143 { \
144     (ptr) = H264SwDecMalloc((count) * sizeof(type)); \
145 }
146 
147 /* macro to free allocated memory */
148 #define FREE(ptr) \
149 { \
150     H264SwDecFree((ptr)); (ptr) = NULL; \
151 }
152 
153 #define ALIGN(ptr, bytePos) \
154         (ptr + ( ((bytePos - (uintptr_t)ptr) & (bytePos - 1)) / sizeof(*ptr) ))
155 
156 extern const u32 h264bsdQpC[52];
157 
158 /*------------------------------------------------------------------------------
159     3. Data types
160 ------------------------------------------------------------------------------*/
161 
162 /*------------------------------------------------------------------------------
163     4. Function prototypes
164 ------------------------------------------------------------------------------*/
165 #ifndef H264DEC_NEON
166 u32 h264bsdCountLeadingZeros(u32 value, u32 length);
167 #else
168 u32 h264bsdCountLeadingZeros(u32 value);
169 #endif
170 u32 h264bsdRbspTrailingBits(strmData_t *strmData);
171 
172 u32 h264bsdMoreRbspData(strmData_t *strmData);
173 
174 u32 h264bsdNextMbAddress(u32 *pSliceGroupMap, u32 picSizeInMbs, u32 currMbAddr);
175 
176 void h264bsdSetCurrImageMbPointers(image_t *image, u32 mbNum);
177 
178 #endif /* #ifdef H264SWDEC_UTIL_H */
179 
180