3 * library and sample to access to UVC web camera on non-rooted Android device
5 * Copyright (c) 2014-2017 saki t_saki@serenegiant.com
7 * File name: utilbase.h
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
21 * All files in the folder are under this Apache License, Version 2.0.
22 * Files in the jni/libjpeg, jni/libusb, jin/libuvc, jni/rapidjson folder may have a different license, see the respective files.
30 #include <android/log.h>
34 #include "localdefines.h"
36 #define SAFE_FREE(p) { if (p) { free((p)); (p) = NULL; } }
37 #define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } }
38 #define SAFE_DELETE_ARRAY(p) { if (p) { delete [](p); (p) = NULL; } }
39 #define NUM_ARRAY_ELEMENTS(p) ((int) sizeof(p) / sizeof(p[0]))
42 // the macro for branch prediction optimaization for gcc(-O2/-O3 required)
43 #define CONDITION(cond) ((__builtin_expect((cond)!=0, 0)))
44 #define LIKELY(x) ((__builtin_expect(!!(x), 1))) // x is likely true
45 #define UNLIKELY(x) ((__builtin_expect(!!(x), 0))) // x is likely false
47 #define CONDITION(cond) ((cond))
48 #define LIKELY(x) ((x))
49 #define UNLIKELY(x) ((x))
52 // XXX assertはNDEBUGが定義されていたら引数を含めて丸ごと削除されてしまうので
53 // 関数実行を直接assertの引数にするとその関数はNDEBUGの時に実行されなくなるので注意
55 #define CHECK(CONDITION) { bool RES = (CONDITION); assert(RES); }
56 #define CHECK_EQ(X, Y) { bool RES = (X == Y); assert(RES); }
57 #define CHECK_NE(X, Y) { bool RES = (X != Y); assert(RES); }
58 #define CHECK_GE(X, Y) { bool RES = (X >= Y); assert(RES); }
59 #define CHECK_GT(X, Y) { bool RES = (X > Y); assert(RES); }
60 #define CHECK_LE(X, Y) { bool RES = (X <= Y); assert(RES); }
61 #define CHECK_LT(X, Y) { bool RES = (X < Y); assert(RES); }
63 #if defined(USE_LOGALL) && defined(__ANDROID__) && !defined(LOG_NDEBUG)
64 #define LOGV(FMT, ...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
65 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
66 #define LOGD(FMT, ...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
67 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
68 #define LOGI(FMT, ...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
69 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
70 #define LOGW(FMT, ...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
71 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
72 #define LOGE(FMT, ...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
73 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
74 #define LOGF(FMT, ...) __android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
75 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
76 #define LOGV_IF(cond, ...) \
80 #define LOGD_IF(cond, ...) \
84 #define LOGI_IF(cond, ...) \
88 #define LOGW_IF(cond, ...) \
92 #define LOGE_IF(cond, ...) \
96 #define LOGF_IF(cond, ...) \
101 #if defined(USE_LOGV) && defined(__ANDROID__) && !defined(LOG_NDEBUG)
102 #define LOGV(FMT, ...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
103 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
104 #define LOGV_IF(cond, ...) \
105 ( (CONDITION(cond)) \
106 ? LOGV(__VA_ARGS__) \
110 #define LOGV_IF(cond, ...)
112 #if defined(USE_LOGD) && defined(__ANDROID__) && !defined(LOG_NDEBUG)
113 #define LOGD(FMT, ...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
114 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
115 #define LOGD_IF(cond, ...) \
116 ( (CONDITION(cond)) \
117 ? LOGD(__VA_ARGS__) \
121 #define LOGD_IF(cond, ...)
123 #if defined(USE_LOGI) && defined(__ANDROID__)
124 #define LOGI(FMT, ...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
125 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
126 #define LOGI_IF(cond, ...) \
127 ( (CONDITION(cond)) \
128 ? LOGI(__VA_ARGS__) \
132 #define LOGI_IF(cond, ...)
134 #if defined(USE_LOGW) && defined(__ANDROID__)
135 #define LOGW(FMT, ...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
136 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
137 #define LOGW_IF(cond, ...) \
138 ( (CONDITION(cond)) \
139 ? LOGW(__VA_ARGS__) \
143 #define LOGW_IF(cond, ...)
145 #if defined(USE_LOGE) && defined(__ANDROID__)
146 #define LOGE(FMT, ...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
147 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
148 #define LOGE_IF(cond, ...) \
149 ( (CONDITION(cond)) \
150 ? LOGE(__VA_ARGS__) \
154 #define LOGE_IF(cond, ...)
156 #if defined(USE_LOGF) && defined(__ANDROID__)
157 #define LOGF(FMT, ...) __android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "[%d*%s:%d:%s]:" FMT, \
158 gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
159 #define LOGF_IF(cond, ...) \
160 ( (CONDITION(cond)) \
161 ? LOGF(__VA_ARGS__) \
165 #define LOGF_IF(cond, ...)
169 #ifndef LOG_ALWAYS_FATAL_IF
170 #define LOG_ALWAYS_FATAL_IF(cond, ...) \
171 ( (CONDITION(cond)) \
172 ? ((void)__android_log_assert(#cond, LOG_TAG, ## __VA_ARGS__)) \
176 #ifndef LOG_ALWAYS_FATAL
177 #define LOG_ALWAYS_FATAL(...) \
178 ( ((void)__android_log_assert(NULL, LOG_TAG, ## __VA_ARGS__)) )
182 #define LOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ## __VA_ARGS__)
188 #define LOG_FATAL_IF(cond, ...) ((void)0)
191 #define LOG_FATAL(...) ((void)0)
197 #define LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ## __VA_ARGS__)
200 #define LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
205 #define ENTER() LOGD("begin")
206 #define RETURN(code,type) {type RESULT = code; LOGD("end (%d)", (int)RESULT); return RESULT;}
207 #define RET(code) {LOGD("end"); return code;}
208 #define EXIT() {LOGD("end"); return;}
209 #define PRE_EXIT() LOGD("end")
211 #if defined(__ANDROID__) && (defined(USE_LOGALL) || defined(USE_LOGI)) && !defined(LOG_NDEBUG)
212 #define MARK(FMT, ...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%s:%d:%s]:" FMT, \
213 basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
218 #define LITERAL_TO_STRING_INTERNAL(x) #x
219 #define LITERAL_TO_STRING(x) LITERAL_TO_STRING_INTERNAL(x)
223 __FILE__ ":" LITERAL_TO_STRING(__LINE__) \
224 " Should not be here.");
226 void setVM(JavaVM *);
230 #endif /* UTILBASE_H_ */