/* * Copyright 2015 Rockchip Electronics Co. LTD * * 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. */ #define MODULE_TAG "mpp_log" #include #include #include #include "mpp_env.h" #include "mpp_debug.h" #include "mpp_common.h" #include "os_log.h" #define MPP_LOG_MAX_LEN 256 #ifdef __cplusplus extern "C" { #endif RK_U32 mpp_debug = 0; // TODO: add log timing information and switch flag static const char *msg_log_warning = "log message is long\n"; static const char *msg_log_nothing = "\n"; static int mpp_log_level = MPP_LOG_INFO; static void __mpp_log(os_log_callback func, const char *tag, const char *fmt, const char *fname, va_list args) { char msg[MPP_LOG_MAX_LEN + 1]; char *tmp = msg; const char *buf = fmt; size_t len_fmt = strnlen(fmt, MPP_LOG_MAX_LEN); size_t len_name = (fname) ? (strnlen(fname, MPP_LOG_MAX_LEN)) : (0); size_t buf_left = MPP_LOG_MAX_LEN; size_t len_all = len_fmt + len_name; if (NULL == tag) tag = MODULE_TAG; if (len_name) { buf = msg; buf_left -= snprintf(msg, buf_left, "%s ", fname); tmp += len_name + 1; } if (len_all == 0) { buf = msg_log_nothing; } else if (len_all >= MPP_LOG_MAX_LEN) { buf_left -= snprintf(tmp, buf_left, "%s", msg_log_warning); buf = msg; } else { snprintf(tmp, buf_left, "%s", fmt); if (fmt[len_fmt - 1] != '\n') { tmp[len_fmt] = '\n'; tmp[len_fmt + 1] = '\0'; } buf = msg; } func(tag, buf, args); } void _mpp_log(const char *tag, const char *fmt, const char *fname, ...) { va_list args; mpp_logw("warning: use new logx function\n"); va_start(args, fname); __mpp_log(os_log_info, tag, fmt, fname, args); va_end(args); } void _mpp_err(const char *tag, const char *fmt, const char *fname, ...) { va_list args; mpp_logw("warning: use new logx function\n"); va_start(args, fname); __mpp_log(os_log_error, tag, fmt, fname, args); va_end(args); } void _mpp_log_l(int level, const char *tag, const char *fmt, const char *fname, ...) { static os_log_callback log_func[] = { NULL, /* MPP_LOG_DEFAULT */ os_log_fatal, /* MPP_LOG_FATAL */ os_log_error, /* MPP_LOG_ERROR */ os_log_warn, /* MPP_LOG_WARN */ os_log_info, /* MPP_LOG_INFO */ os_log_debug, /* MPP_LOG_DEBUG */ os_log_trace, /* MPP_LOG_VERBOSE */ os_log_info, /* MPP_LOG_DEFAULT */ }; va_list args; int log_level; if (level <= MPP_LOG_UNKNOWN || level >= MPP_LOG_SILENT) return; log_level = mpp_log_level; if (log_level >= MPP_LOG_SILENT) return; if (level > log_level) return; va_start(args, fname); __mpp_log(log_func[level], tag, fmt, fname, args); va_end(args); } void mpp_set_log_level(int level) { if (level <= MPP_LOG_UNKNOWN || level > MPP_LOG_SILENT) { mpp_logw("log level should in range [%d : %d] invalid intput %d\n", MPP_LOG_FATAL, MPP_LOG_SILENT, level); level = MPP_LOG_INFO; } mpp_log_level = level; } int mpp_get_log_level(void) { int level; mpp_env_get_u32("mpp_log_level", (RK_U32 *)&level, mpp_log_level); if (level <= MPP_LOG_UNKNOWN || level > MPP_LOG_SILENT) level = MPP_LOG_INFO; mpp_log_level = level; return level; } #ifdef __cplusplus } #endif