stream pushing ok without access permission of /dev/video0
[rtmpclient.git] / app / src / main / jni / utilbase.h
1 /*
2  * UVCCamera
3  * library and sample to access to UVC web camera on non-rooted Android device
4  *
5  * Copyright (c) 2014-2017 saki t_saki@serenegiant.com
6  *
7  * File name: utilbase.h
8  *
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
12  *
13  *     http://www.apache.org/licenses/LICENSE-2.0
14  *
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.
20  *
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.
23 */
24
25 #ifndef UTILBASE_H_
26 #define UTILBASE_H_
27
28 #include <jni.h>
29 #ifdef __ANDROID__
30 #include <android/log.h>
31 #endif
32 #include <unistd.h>
33 #include <libgen.h>
34 #include "localdefines.h"
35
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]))
40
41 #if defined(__GNUC__)
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
46 #else
47 #define         CONDITION(cond)                         ((cond))
48 #define         LIKELY(x)                                       ((x))
49 #define         UNLIKELY(x)                                     ((x))
50 #endif
51
52 // XXX assertはNDEBUGが定義されていたら引数を含めて丸ごと削除されてしまうので
53 // 関数実行を直接assertの引数にするとその関数はNDEBUGの時に実行されなくなるので注意
54 #include <assert.h>
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); }
62
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, ...) \
77                 ( (CONDITION(cond)) \
78                         ? LOGV(__VA_ARGS__) \
79                         : (0) )
80         #define LOGD_IF(cond, ...) \
81                 ( (CONDITION(cond)) \
82                         ? LOGD(__VA_ARGS__) \
83                         : (0) )
84         #define LOGI_IF(cond, ...) \
85                 ( (CONDITION(cond)) \
86                         ? LOGI(__VA_ARGS__) \
87                         : (0) )
88         #define LOGW_IF(cond, ...) \
89                 ( (CONDITION(cond)) \
90                         ? LOGW(__VA_ARGS__) \
91                         : (0) )
92         #define LOGE_IF(cond, ...) \
93                 ( (CONDITION(cond)) \
94                         ? LOGE(__VA_ARGS__) \
95                         : (0) )
96         #define LOGF_IF(cond, ...) \
97                 ( (CONDITION(cond)) \
98                         ? LOGF(__VA_ARGS__) \
99                         : (0) )
100 #else
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__) \
107                         : (0) )
108                 #else
109                 #define LOGV(...)
110                 #define LOGV_IF(cond, ...)
111         #endif
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__) \
118                         : (0) )
119         #else
120                 #define LOGD(...)
121                 #define LOGD_IF(cond, ...)
122         #endif
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__) \
129                         : (0) )
130         #else
131                 #define LOGI(...)
132                 #define LOGI_IF(cond, ...)
133         #endif
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__) \
140                         : (0) )
141         #else
142                 #define LOGW(...)
143                 #define LOGW_IF(cond, ...)
144         #endif
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__) \
151                         : (0) )
152         #else
153                 #define LOGE(...)
154                 #define LOGE_IF(cond, ...)
155         #endif
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__) \
162                         : (0) )
163         #else
164                 #define LOGF(...)
165                 #define LOGF_IF(cond, ...)
166         #endif
167 #endif
168
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__)) \
173                                 : (void)0 )
174 #endif
175
176 #ifndef         LOG_ALWAYS_FATAL
177 #define         LOG_ALWAYS_FATAL(...) \
178                                 ( ((void)__android_log_assert(NULL, LOG_TAG, ## __VA_ARGS__)) )
179 #endif
180
181 #ifndef         LOG_ASSERT
182 #define         LOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ## __VA_ARGS__)
183 #endif
184
185 #ifdef LOG_NDEBUG
186
187 #ifndef         LOG_FATAL_IF
188 #define         LOG_FATAL_IF(cond, ...) ((void)0)
189 #endif
190 #ifndef         LOG_FATAL
191 #define         LOG_FATAL(...) ((void)0)
192 #endif
193
194 #else
195
196 #ifndef         LOG_FATAL_IF
197 #define         LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ## __VA_ARGS__)
198 #endif
199 #ifndef         LOG_FATAL
200 #define         LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
201 #endif
202
203 #endif
204
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")
210
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__)
214 #else
215 #define         MARK(...)
216 #endif
217
218 #define LITERAL_TO_STRING_INTERNAL(x)    #x
219 #define LITERAL_TO_STRING(x) LITERAL_TO_STRING_INTERNAL(x)
220
221 #define TRESPASS() \
222                 LOG_ALWAYS_FATAL(                                       \
223                         __FILE__ ":" LITERAL_TO_STRING(__LINE__)            \
224                         " Should not be here.");
225
226 void setVM(JavaVM *);
227 JavaVM *getVM();
228 JNIEnv *getEnv();
229
230 #endif /* UTILBASE_H_ */