stream pushing ok without access permission of /dev/video0
[rtmpclient.git] / app / src / main / jni / utilbase.h
diff --git a/app/src/main/jni/utilbase.h b/app/src/main/jni/utilbase.h
new file mode 100644 (file)
index 0000000..50ff22a
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * UVCCamera
+ * library and sample to access to UVC web camera on non-rooted Android device
+ *
+ * Copyright (c) 2014-2017 saki t_saki@serenegiant.com
+ *
+ * File name: utilbase.h
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ * All files in the folder are under this Apache License, Version 2.0.
+ * Files in the jni/libjpeg, jni/libusb, jin/libuvc, jni/rapidjson folder may have a different license, see the respective files.
+*/
+
+#ifndef UTILBASE_H_
+#define UTILBASE_H_
+
+#include <jni.h>
+#ifdef __ANDROID__
+#include <android/log.h>
+#endif
+#include <unistd.h>
+#include <libgen.h>
+#include "localdefines.h"
+
+#define                SAFE_FREE(p)                            { if (p) { free((p)); (p) = NULL; } }
+#define                SAFE_DELETE(p)                          { if (p) { delete (p); (p) = NULL; } }
+#define                SAFE_DELETE_ARRAY(p)            { if (p) { delete [](p); (p) = NULL; } }
+#define                NUM_ARRAY_ELEMENTS(p)           ((int) sizeof(p) / sizeof(p[0]))
+
+#if defined(__GNUC__)
+// the macro for branch prediction optimaization for gcc(-O2/-O3 required)
+#define                CONDITION(cond)                         ((__builtin_expect((cond)!=0, 0)))
+#define                LIKELY(x)                                       ((__builtin_expect(!!(x), 1)))  // x is likely true
+#define                UNLIKELY(x)                                     ((__builtin_expect(!!(x), 0)))  // x is likely false
+#else
+#define                CONDITION(cond)                         ((cond))
+#define                LIKELY(x)                                       ((x))
+#define                UNLIKELY(x)                                     ((x))
+#endif
+
+// XXX assertはNDEBUGが定義されていたら引数を含めて丸ごと削除されてしまうので
+// 関数実行を直接assertの引数にするとその関数はNDEBUGの時に実行されなくなるので注意
+#include <assert.h>
+#define CHECK(CONDITION) { bool RES = (CONDITION); assert(RES); }
+#define CHECK_EQ(X, Y) { bool RES = (X == Y); assert(RES); }
+#define CHECK_NE(X, Y) { bool RES = (X != Y); assert(RES); }
+#define CHECK_GE(X, Y) { bool RES = (X >= Y); assert(RES); }
+#define CHECK_GT(X, Y) { bool RES = (X > Y); assert(RES); }
+#define CHECK_LE(X, Y) { bool RES = (X <= Y); assert(RES); }
+#define CHECK_LT(X, Y) { bool RES = (X < Y); assert(RES); }
+
+#if defined(USE_LOGALL) && defined(__ANDROID__) && !defined(LOG_NDEBUG)
+       #define LOGV(FMT, ...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "[%d*%s:%d:%s]:" FMT,  \
+                                                       gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+       #define LOGD(FMT, ...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "[%d*%s:%d:%s]:" FMT,    \
+                                                       gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+       #define LOGI(FMT, ...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d*%s:%d:%s]:" FMT,     \
+                                                       gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+       #define LOGW(FMT, ...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, "[%d*%s:%d:%s]:" FMT,     \
+                                                       gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+       #define LOGE(FMT, ...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "[%d*%s:%d:%s]:" FMT,    \
+                                                       gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+       #define LOGF(FMT, ...) __android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "[%d*%s:%d:%s]:" FMT,    \
+                                                       gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+       #define LOGV_IF(cond, ...) \
+               ( (CONDITION(cond)) \
+                       ? LOGV(__VA_ARGS__) \
+                       : (0) )
+       #define LOGD_IF(cond, ...) \
+               ( (CONDITION(cond)) \
+                       ? LOGD(__VA_ARGS__) \
+                       : (0) )
+       #define LOGI_IF(cond, ...) \
+               ( (CONDITION(cond)) \
+                       ? LOGI(__VA_ARGS__) \
+                       : (0) )
+       #define LOGW_IF(cond, ...) \
+               ( (CONDITION(cond)) \
+                       ? LOGW(__VA_ARGS__) \
+                       : (0) )
+       #define LOGE_IF(cond, ...) \
+               ( (CONDITION(cond)) \
+                       ? LOGE(__VA_ARGS__) \
+                       : (0) )
+       #define LOGF_IF(cond, ...) \
+               ( (CONDITION(cond)) \
+                       ? LOGF(__VA_ARGS__) \
+                       : (0) )
+#else
+       #if defined(USE_LOGV) && defined(__ANDROID__) && !defined(LOG_NDEBUG)
+               #define LOGV(FMT, ...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "[%d*%s:%d:%s]:" FMT,  \
+                                                        gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+               #define LOGV_IF(cond, ...) \
+                       ( (CONDITION(cond)) \
+                       ? LOGV(__VA_ARGS__) \
+                       : (0) )
+               #else
+               #define LOGV(...)
+               #define LOGV_IF(cond, ...)
+       #endif
+       #if defined(USE_LOGD) && defined(__ANDROID__) && !defined(LOG_NDEBUG)
+               #define LOGD(FMT, ...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "[%d*%s:%d:%s]:" FMT,    \
+                                                        gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+               #define LOGD_IF(cond, ...) \
+                       ( (CONDITION(cond)) \
+                       ? LOGD(__VA_ARGS__) \
+                       : (0) )
+       #else
+               #define LOGD(...)
+               #define LOGD_IF(cond, ...)
+       #endif
+       #if defined(USE_LOGI) && defined(__ANDROID__)
+               #define LOGI(FMT, ...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d*%s:%d:%s]:" FMT,     \
+                                                        gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+               #define LOGI_IF(cond, ...) \
+                       ( (CONDITION(cond)) \
+                       ? LOGI(__VA_ARGS__) \
+                       : (0) )
+       #else
+               #define LOGI(...)
+               #define LOGI_IF(cond, ...)
+       #endif
+       #if defined(USE_LOGW) && defined(__ANDROID__)
+               #define LOGW(FMT, ...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, "[%d*%s:%d:%s]:" FMT,     \
+                                                        gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+               #define LOGW_IF(cond, ...) \
+                       ( (CONDITION(cond)) \
+                       ? LOGW(__VA_ARGS__) \
+                       : (0) )
+       #else
+               #define LOGW(...)
+               #define LOGW_IF(cond, ...)
+       #endif
+       #if defined(USE_LOGE) && defined(__ANDROID__)
+               #define LOGE(FMT, ...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "[%d*%s:%d:%s]:" FMT,    \
+                                                        gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+               #define LOGE_IF(cond, ...) \
+                       ( (CONDITION(cond)) \
+                       ? LOGE(__VA_ARGS__) \
+                       : (0) )
+       #else
+               #define LOGE(...)
+               #define LOGE_IF(cond, ...)
+       #endif
+       #if defined(USE_LOGF) && defined(__ANDROID__)
+               #define LOGF(FMT, ...) __android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "[%d*%s:%d:%s]:" FMT,    \
+                                                        gettid(), basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+               #define LOGF_IF(cond, ...) \
+                       ( (CONDITION(cond)) \
+                       ? LOGF(__VA_ARGS__) \
+                       : (0) )
+       #else
+               #define LOGF(...)
+               #define LOGF_IF(cond, ...)
+       #endif
+#endif
+
+#ifndef                LOG_ALWAYS_FATAL_IF
+#define                LOG_ALWAYS_FATAL_IF(cond, ...) \
+                               ( (CONDITION(cond)) \
+                               ? ((void)__android_log_assert(#cond, LOG_TAG, ## __VA_ARGS__)) \
+                               : (void)0 )
+#endif
+
+#ifndef                LOG_ALWAYS_FATAL
+#define                LOG_ALWAYS_FATAL(...) \
+                               ( ((void)__android_log_assert(NULL, LOG_TAG, ## __VA_ARGS__)) )
+#endif
+
+#ifndef                LOG_ASSERT
+#define                LOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ## __VA_ARGS__)
+#endif
+
+#ifdef LOG_NDEBUG
+
+#ifndef                LOG_FATAL_IF
+#define                LOG_FATAL_IF(cond, ...) ((void)0)
+#endif
+#ifndef                LOG_FATAL
+#define                LOG_FATAL(...) ((void)0)
+#endif
+
+#else
+
+#ifndef                LOG_FATAL_IF
+#define                LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ## __VA_ARGS__)
+#endif
+#ifndef                LOG_FATAL
+#define                LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
+#endif
+
+#endif
+
+#define                ENTER()                         LOGD("begin")
+#define                RETURN(code,type)       {type RESULT = code; LOGD("end (%d)", (int)RESULT); return RESULT;}
+#define                RET(code)                       {LOGD("end"); return code;}
+#define                EXIT()                          {LOGD("end"); return;}
+#define                PRE_EXIT()                      LOGD("end")
+
+#if defined(__ANDROID__) && (defined(USE_LOGALL) || defined(USE_LOGI)) && !defined(LOG_NDEBUG)
+#define MARK(FMT, ...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%s:%d:%s]:" FMT,       \
+                                               basename(__FILE__), __LINE__, __FUNCTION__, ## __VA_ARGS__)
+#else
+#define                MARK(...)
+#endif
+
+#define LITERAL_TO_STRING_INTERNAL(x)    #x
+#define LITERAL_TO_STRING(x) LITERAL_TO_STRING_INTERNAL(x)
+
+#define TRESPASS() \
+               LOG_ALWAYS_FATAL(                                       \
+                       __FILE__ ":" LITERAL_TO_STRING(__LINE__)            \
+                       " Should not be here.");
+
+void setVM(JavaVM *);
+JavaVM *getVM();
+JNIEnv *getEnv();
+
+#endif /* UTILBASE_H_ */