1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #define MODULE_TAG "mpp_log"
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include <stdio.h>
9*437bfbebSnyanmisaka #include <string.h>
10*437bfbebSnyanmisaka
11*437bfbebSnyanmisaka #include "mpp_env.h"
12*437bfbebSnyanmisaka #include "mpp_debug.h"
13*437bfbebSnyanmisaka #include "mpp_common.h"
14*437bfbebSnyanmisaka
15*437bfbebSnyanmisaka #include "os_log.h"
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #define MPP_LOG_MAX_LEN 256
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #ifdef __cplusplus
20*437bfbebSnyanmisaka extern "C" {
21*437bfbebSnyanmisaka #endif
22*437bfbebSnyanmisaka
23*437bfbebSnyanmisaka RK_U32 mpp_debug = 0;
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka // TODO: add log timing information and switch flag
26*437bfbebSnyanmisaka static const char *msg_log_warning = "log message is long\n";
27*437bfbebSnyanmisaka static const char *msg_log_nothing = "\n";
28*437bfbebSnyanmisaka static int mpp_log_level = MPP_LOG_INFO;
29*437bfbebSnyanmisaka static MppLogCb mpp_log_ext_cb = NULL;
30*437bfbebSnyanmisaka static void *mpp_log_ext_ctx = NULL;
31*437bfbebSnyanmisaka
32*437bfbebSnyanmisaka static os_log_callback log_func[] = {
33*437bfbebSnyanmisaka NULL, /* MPP_LOG_DEFAULT */
34*437bfbebSnyanmisaka os_log_fatal, /* MPP_LOG_FATAL */
35*437bfbebSnyanmisaka os_log_error, /* MPP_LOG_ERROR */
36*437bfbebSnyanmisaka os_log_warn, /* MPP_LOG_WARN */
37*437bfbebSnyanmisaka os_log_info, /* MPP_LOG_INFO */
38*437bfbebSnyanmisaka os_log_debug, /* MPP_LOG_DEBUG */
39*437bfbebSnyanmisaka os_log_trace, /* MPP_LOG_VERBOSE */
40*437bfbebSnyanmisaka os_log_info, /* MPP_LOG_DEFAULT */
41*437bfbebSnyanmisaka };
42*437bfbebSnyanmisaka
__mpp_log(os_log_callback func,const char * tag,const char * fmt,const char * fname,va_list args)43*437bfbebSnyanmisaka static void __mpp_log(os_log_callback func, const char *tag, const char *fmt,
44*437bfbebSnyanmisaka const char *fname, va_list args)
45*437bfbebSnyanmisaka {
46*437bfbebSnyanmisaka char msg[MPP_LOG_MAX_LEN + 1];
47*437bfbebSnyanmisaka char *tmp = msg;
48*437bfbebSnyanmisaka const char *buf = fmt;
49*437bfbebSnyanmisaka size_t len_fmt = strnlen(fmt, MPP_LOG_MAX_LEN);
50*437bfbebSnyanmisaka size_t len_name = (fname) ? (strnlen(fname, MPP_LOG_MAX_LEN)) : (0);
51*437bfbebSnyanmisaka size_t buf_left = MPP_LOG_MAX_LEN;
52*437bfbebSnyanmisaka size_t len_all = len_fmt + len_name;
53*437bfbebSnyanmisaka
54*437bfbebSnyanmisaka if (NULL == tag)
55*437bfbebSnyanmisaka tag = MODULE_TAG;
56*437bfbebSnyanmisaka
57*437bfbebSnyanmisaka if (len_name) {
58*437bfbebSnyanmisaka buf = msg;
59*437bfbebSnyanmisaka buf_left -= snprintf(msg, buf_left, "%s ", fname);
60*437bfbebSnyanmisaka tmp += len_name + 1;
61*437bfbebSnyanmisaka }
62*437bfbebSnyanmisaka
63*437bfbebSnyanmisaka if (len_all == 0) {
64*437bfbebSnyanmisaka buf = msg_log_nothing;
65*437bfbebSnyanmisaka } else if (len_all >= MPP_LOG_MAX_LEN) {
66*437bfbebSnyanmisaka buf_left -= snprintf(tmp, buf_left, "%s", msg_log_warning);
67*437bfbebSnyanmisaka buf = msg;
68*437bfbebSnyanmisaka } else {
69*437bfbebSnyanmisaka snprintf(tmp, buf_left, "%s", fmt);
70*437bfbebSnyanmisaka if (fmt[len_fmt - 1] != '\n') {
71*437bfbebSnyanmisaka tmp[len_fmt] = '\n';
72*437bfbebSnyanmisaka tmp[len_fmt + 1] = '\0';
73*437bfbebSnyanmisaka }
74*437bfbebSnyanmisaka buf = msg;
75*437bfbebSnyanmisaka }
76*437bfbebSnyanmisaka
77*437bfbebSnyanmisaka func(tag, buf, args);
78*437bfbebSnyanmisaka }
79*437bfbebSnyanmisaka
_mpp_log(const char * tag,const char * fmt,const char * fname,...)80*437bfbebSnyanmisaka void _mpp_log(const char *tag, const char *fmt, const char *fname, ...)
81*437bfbebSnyanmisaka {
82*437bfbebSnyanmisaka va_list args;
83*437bfbebSnyanmisaka
84*437bfbebSnyanmisaka mpp_logw("warning: use new logx function\n");
85*437bfbebSnyanmisaka
86*437bfbebSnyanmisaka va_start(args, fname);
87*437bfbebSnyanmisaka __mpp_log(os_log_info, tag, fmt, fname, args);
88*437bfbebSnyanmisaka va_end(args);
89*437bfbebSnyanmisaka }
90*437bfbebSnyanmisaka
_mpp_err(const char * tag,const char * fmt,const char * fname,...)91*437bfbebSnyanmisaka void _mpp_err(const char *tag, const char *fmt, const char *fname, ...)
92*437bfbebSnyanmisaka {
93*437bfbebSnyanmisaka va_list args;
94*437bfbebSnyanmisaka
95*437bfbebSnyanmisaka mpp_logw("warning: use new logx function\n");
96*437bfbebSnyanmisaka
97*437bfbebSnyanmisaka va_start(args, fname);
98*437bfbebSnyanmisaka __mpp_log(os_log_error, tag, fmt, fname, args);
99*437bfbebSnyanmisaka va_end(args);
100*437bfbebSnyanmisaka }
101*437bfbebSnyanmisaka
_mpp_log_l(int level,const char * tag,const char * fmt,const char * fname,...)102*437bfbebSnyanmisaka void _mpp_log_l(int level, const char *tag, const char *fmt, const char *fname, ...)
103*437bfbebSnyanmisaka {
104*437bfbebSnyanmisaka va_list args;
105*437bfbebSnyanmisaka int log_level;
106*437bfbebSnyanmisaka
107*437bfbebSnyanmisaka if (mpp_log_ext_cb) {
108*437bfbebSnyanmisaka va_start(args, fname);
109*437bfbebSnyanmisaka mpp_log_ext_cb(mpp_log_ext_ctx, level, tag, fmt, fname, args);
110*437bfbebSnyanmisaka va_end(args);
111*437bfbebSnyanmisaka return;
112*437bfbebSnyanmisaka }
113*437bfbebSnyanmisaka
114*437bfbebSnyanmisaka if (level <= MPP_LOG_UNKNOWN || level >= MPP_LOG_SILENT)
115*437bfbebSnyanmisaka return;
116*437bfbebSnyanmisaka
117*437bfbebSnyanmisaka log_level = mpp_log_level;
118*437bfbebSnyanmisaka if (log_level >= MPP_LOG_SILENT)
119*437bfbebSnyanmisaka return;
120*437bfbebSnyanmisaka
121*437bfbebSnyanmisaka if (level > log_level)
122*437bfbebSnyanmisaka return;
123*437bfbebSnyanmisaka
124*437bfbebSnyanmisaka va_start(args, fname);
125*437bfbebSnyanmisaka __mpp_log(log_func[level], tag, fmt, fname, args);
126*437bfbebSnyanmisaka va_end(args);
127*437bfbebSnyanmisaka }
128*437bfbebSnyanmisaka
mpp_llog(int level,const char * tag,const char * fmt,const char * fname,...)129*437bfbebSnyanmisaka void mpp_llog(int level, const char *tag, const char *fmt, const char *fname, ...)
130*437bfbebSnyanmisaka {
131*437bfbebSnyanmisaka va_list args;
132*437bfbebSnyanmisaka char *log_buf = NULL;
133*437bfbebSnyanmisaka int log_size = SZ_1K;
134*437bfbebSnyanmisaka int log_base = 0;
135*437bfbebSnyanmisaka int log_len = 0;
136*437bfbebSnyanmisaka int log_level;
137*437bfbebSnyanmisaka int i;
138*437bfbebSnyanmisaka
139*437bfbebSnyanmisaka if (mpp_log_ext_cb) {
140*437bfbebSnyanmisaka va_start(args, fname);
141*437bfbebSnyanmisaka mpp_log_ext_cb(mpp_log_ext_ctx, level, tag, fmt, fname, args);
142*437bfbebSnyanmisaka va_end(args);
143*437bfbebSnyanmisaka return;
144*437bfbebSnyanmisaka }
145*437bfbebSnyanmisaka
146*437bfbebSnyanmisaka if (level <= MPP_LOG_UNKNOWN || level >= MPP_LOG_SILENT)
147*437bfbebSnyanmisaka return;
148*437bfbebSnyanmisaka
149*437bfbebSnyanmisaka log_level = mpp_log_level;
150*437bfbebSnyanmisaka if (log_level >= MPP_LOG_SILENT)
151*437bfbebSnyanmisaka return;
152*437bfbebSnyanmisaka
153*437bfbebSnyanmisaka if (level > log_level)
154*437bfbebSnyanmisaka return;
155*437bfbebSnyanmisaka
156*437bfbebSnyanmisaka if (NULL == tag)
157*437bfbebSnyanmisaka tag = MODULE_TAG;
158*437bfbebSnyanmisaka
159*437bfbebSnyanmisaka
160*437bfbebSnyanmisaka va_start(args, fname);
161*437bfbebSnyanmisaka
162*437bfbebSnyanmisaka /* get log len and create buffer */
163*437bfbebSnyanmisaka do {
164*437bfbebSnyanmisaka log_buf = (char *)malloc(log_size);
165*437bfbebSnyanmisaka if (!log_buf)
166*437bfbebSnyanmisaka break;
167*437bfbebSnyanmisaka
168*437bfbebSnyanmisaka log_len = vsnprintf(log_buf, log_size - 1, fmt, args);
169*437bfbebSnyanmisaka if (log_len < log_size - 1)
170*437bfbebSnyanmisaka break;
171*437bfbebSnyanmisaka
172*437bfbebSnyanmisaka free(log_buf);
173*437bfbebSnyanmisaka log_size <<= 1;
174*437bfbebSnyanmisaka } while (1);
175*437bfbebSnyanmisaka
176*437bfbebSnyanmisaka va_end(args);
177*437bfbebSnyanmisaka
178*437bfbebSnyanmisaka for (i = 0; i < log_len; i++) {
179*437bfbebSnyanmisaka if (log_buf[i] == '\n') {
180*437bfbebSnyanmisaka /* skip empty line */
181*437bfbebSnyanmisaka if (log_base < i) {
182*437bfbebSnyanmisaka log_buf[i] = '\0';
183*437bfbebSnyanmisaka log_func[level](tag, log_buf + log_base, args);
184*437bfbebSnyanmisaka /* restore \n */
185*437bfbebSnyanmisaka log_buf[i] = '\n';
186*437bfbebSnyanmisaka }
187*437bfbebSnyanmisaka
188*437bfbebSnyanmisaka log_base = i + 1;
189*437bfbebSnyanmisaka }
190*437bfbebSnyanmisaka }
191*437bfbebSnyanmisaka
192*437bfbebSnyanmisaka if (log_buf)
193*437bfbebSnyanmisaka free(log_buf);
194*437bfbebSnyanmisaka }
195*437bfbebSnyanmisaka
mpp_set_log_level(int level)196*437bfbebSnyanmisaka void mpp_set_log_level(int level)
197*437bfbebSnyanmisaka {
198*437bfbebSnyanmisaka if (level <= MPP_LOG_UNKNOWN || level > MPP_LOG_SILENT) {
199*437bfbebSnyanmisaka mpp_logw("log level should in range [%d : %d] invalid intput %d\n",
200*437bfbebSnyanmisaka MPP_LOG_FATAL, MPP_LOG_SILENT, level);
201*437bfbebSnyanmisaka level = MPP_LOG_INFO;
202*437bfbebSnyanmisaka }
203*437bfbebSnyanmisaka
204*437bfbebSnyanmisaka mpp_log_level = level;
205*437bfbebSnyanmisaka }
206*437bfbebSnyanmisaka
mpp_get_log_level(void)207*437bfbebSnyanmisaka int mpp_get_log_level(void)
208*437bfbebSnyanmisaka {
209*437bfbebSnyanmisaka int level;
210*437bfbebSnyanmisaka
211*437bfbebSnyanmisaka mpp_env_get_u32("mpp_log_level", (RK_U32 *)&level, mpp_log_level);
212*437bfbebSnyanmisaka
213*437bfbebSnyanmisaka if (level <= MPP_LOG_UNKNOWN || level > MPP_LOG_SILENT)
214*437bfbebSnyanmisaka level = MPP_LOG_INFO;
215*437bfbebSnyanmisaka
216*437bfbebSnyanmisaka mpp_log_level = level;
217*437bfbebSnyanmisaka
218*437bfbebSnyanmisaka return level;
219*437bfbebSnyanmisaka }
220*437bfbebSnyanmisaka
mpp_set_log_callback(void * ctx,MppLogCb cb)221*437bfbebSnyanmisaka int mpp_set_log_callback(void *ctx, MppLogCb cb)
222*437bfbebSnyanmisaka {
223*437bfbebSnyanmisaka mpp_log_ext_cb = cb;
224*437bfbebSnyanmisaka mpp_log_ext_ctx = ctx;
225*437bfbebSnyanmisaka
226*437bfbebSnyanmisaka return 0;
227*437bfbebSnyanmisaka }
228*437bfbebSnyanmisaka
229*437bfbebSnyanmisaka #ifdef __cplusplus
230*437bfbebSnyanmisaka }
231*437bfbebSnyanmisaka #endif
232