gsteamer日志输出实例

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;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值