gstreamer打印时间
输出为可读字符串
-
GST_TIME_ARGS:参数后面跟的时间单位是纳秒
-
GST_TIME_FORMAT:“%"GST_TIME_FORMAT是时间格式化字符串,就相当于”%lld“
搭配起来,要打印一个比较Human Readable String
用这个特别方便,下面这个例子:
GST_DEBUG("PTS %" GST_TIME_FORMAT, GST_TIME_ARGS(GST_TIME_ARGS(frameTimeNs)));
直接输出数值
frameTimeNs是以纳秒为单位,64位整形,需要用’%lld’(long long)格式化:
GST_DEBUG("PTS %lld" frameTimeNs);
自定义category输出日志
在Gstreamer中日志输出非常强大,可以根据category设置需要显示的部分,还可以设置颜色,突出显示。
首先,需要定义一个category:
GST_DEBUG_CATEGORY_STATIC (h264dec_debug);
#define GST_CAT_DEFAULT h264dec_debug
然后在初始化这个category,这里是放在构造函数里面的:
GST_DEBUG_CATEGORY_INIT (h264dec_debug, "i264dec", 0, "video decoder");
i264dec
是h264dec_debug的name,定义好之后,在代码中通过GST_DEBUG输出log,在命令行用GST_DEBUG=i264dec:5
这样的环境变量来打开,就可以看到log输出了。
比如:
GST_DEBUG("Hello world.");
如果想定义category的颜色,可以像下面这样:
GST_DEBUG_CATEGORY_INIT (debug_dataflow, "GST_DATAFLOW", \
GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "dataflow inside pads"); \
其中GST_DEBUG_BOLD是color flag,定义在gstreamer/gst/gstinfo.h
文件中,可以设置前景色,背景色,粗体和下划线。
typedef enum { /*< flags >*/
/* colors */
GST_DEBUG_FG_BLACK = 0x0000,
GST_DEBUG_FG_RED = 0x0001,
GST_DEBUG_FG_GREEN = 0x0002,
GST_DEBUG_FG_YELLOW = 0x0003,
GST_DEBUG_FG_BLUE = 0x0004,
GST_DEBUG_FG_MAGENTA = 0x0005,
GST_DEBUG_FG_CYAN = 0x0006,
GST_DEBUG_FG_WHITE = 0x0007,
/* background colors */
GST_DEBUG_BG_BLACK = 0x0000,
GST_DEBUG_BG_RED = 0x0010,
GST_DEBUG_BG_GREEN = 0x0020,
GST_DEBUG_BG_YELLOW = 0x0030,
GST_DEBUG_BG_BLUE = 0x0040,
GST_DEBUG_BG_MAGENTA = 0x0050,
GST_DEBUG_BG_CYAN = 0x0060,
GST_DEBUG_BG_WHITE = 0x0070,
/* other formats */
GST_DEBUG_BOLD = 0x0100,
GST_DEBUG_UNDERLINE = 0x0200
} GstDebugColorFlags;
在前面的例子中加上颜色定义:
GST_DEBUG_CATEGORY_INIT (h264dec_debug, "i264dec", GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "video decoder");
最后输出的log就是这样的效果:
0:00:00.340767721 ^[[331m14232^[[00m 0xdef6ec00 ^[[37mDEBUG ^[[00m ^[[00;01;32m i264dec
看着有点难受,这个用less查看就能解析了,用less替换vim看起来非常方便。
lss -R gst.log
gst_debug_log_default函数
gstreamer/gst/gstinfo.c
#define PRINT_FMT " %s"PID_FMT"%s "PTR_FMT" %s%s%s %s"CAT_FMT"%s %s\n"
FPRINTF_DEBUG (log_file, "%" GST_TIME_FORMAT PRINT_FMT,
GST_TIME_ARGS (elapsed), pidcolor, pid, clear, g_thread_self (),
levelcolor, gst_debug_level_get_name (level), clear, color,
gst_debug_category_get_name (category), file, line, function, obj,
clear, message_str);
default函数中print format:
#define PTR_FMT "%14p"
#else
#define PTR_FMT "%10p"
#endif
#define PID_FMT "%5d"
#define CAT_FMT "%20s %s:%d:%s:%s"
#define PRINT_FMT " %s"PID_FMT"%s \
"PTR_FMT" %s%s%s %s"CAT_FMT"%s %s\n"
%20s
的说明:
- 不带点:
%20s
当字串长度小于20,左边补空格,大于或等于20,则全部输出 - 不带点:
%-20s
右边补空格 - 带点:
%.20s
输出字串前20个字符,不足20则全部输出 - 带点:
%5.4s
输出前4个字符,不足5个字符,左边补空格 - 带点:
%-5.4s
输出前4个字符,不足5个字符,右边补空格 - 带点:
%5.6s
输出前6个字符,超出5个字符,不补空格 - 带点:
%-5.6s
输出前6个字符,超出5个字符,不补空格
所以如果需要需要修改default log函数,借鉴default函数的写法,那么输出的log函数还是非常的熟悉,方便阅读。
比如,通过cout输出类似的格式化日志:
char time[64] = {0};
GstClockTime elapsed = GST_CLOCK_DIFF (start_time, gst_util_get_timestamp ());
sprintf(time, "%u:%02u:%02u.%09u", GST_TIME_ARGS (elapsed));
cout >> time
>> " " >> gst_debug_level_get_name(level)
>> " " >> gst_debug_category_get_name(category)
>> " " >> GST_GET_SHORT_FILENAME(file)
>> ": " >> __LINE__ >> ": " >> __FUNCTION__
>> ": " >> gst_debug_message_get (message) >> std::endl;