X-Git-Url: http://47.100.26.94:8080/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjni%2Futilbase.h;fp=app%2Fsrc%2Fmain%2Fjni%2Futilbase.h;h=50ff22a442e2747ae92c688ed10cd8a5b84fe5e8;hb=831cc09829bc6e18d8d0d8bb78063e89ea565ce9;hp=0000000000000000000000000000000000000000;hpb=061580c83656bf358b01a6b78fd22ae9bd497728;p=rtmpclient.git diff --git a/app/src/main/jni/utilbase.h b/app/src/main/jni/utilbase.h new file mode 100644 index 0000000..50ff22a --- /dev/null +++ b/app/src/main/jni/utilbase.h @@ -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 +#ifdef __ANDROID__ +#include +#endif +#include +#include +#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 +#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_ */