• 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)));
    
    • 1

    直接输出数值

    frameTimeNs是以纳秒为单位,64位整形,需要用’%lld’(long long)格式化:

     GST_DEBUG("PTS %lld" frameTimeNs);
    
    • 1

    自定义category输出日志

    在Gstreamer中日志输出非常强大,可以根据category设置需要显示的部分,还可以设置颜色,突出显示。

    首先,需要定义一个category:

    GST_DEBUG_CATEGORY_STATIC (h264dec_debug);
    #define GST_CAT_DEFAULT h264dec_debug
    
    • 1
    • 2

    然后在初始化这个category,这里是放在构造函数里面的:

    GST_DEBUG_CATEGORY_INIT (h264dec_debug, "i264dec", 0, "video decoder");
    
    • 1

    i264dec是h264dec_debug的name,定义好之后,在代码中通过GST_DEBUG输出log,在命令行用GST_DEBUG=i264dec:5这样的环境变量来打开,就可以看到log输出了。

    比如:

    GST_DEBUG("Hello world.");
    
    • 1

    如果想定义category的颜色,可以像下面这样:

      GST_DEBUG_CATEGORY_INIT (debug_dataflow, "GST_DATAFLOW", \
          GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "dataflow inside pads"); \
    
    • 1
    • 2

    其中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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在前面的例子中加上颜色定义:

    GST_DEBUG_CATEGORY_INIT (h264dec_debug, "i264dec", GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "video decoder");
    
    • 1

    最后输出的log就是这样的效果:

    0:00:00.340767721 ^[[331m14232^[[00m 0xdef6ec00 ^[[37mDEBUG  ^[[00m ^[[00;01;32m            i264dec
    
    • 1

    看着有点难受,这个用less查看就能解析了,用less替换vim看起来非常方便。

    lss -R gst.log
    
    • 1

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    %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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    Python语句和循环
    如何区分一个项目是react还react native
    linux4.1.15内核移植到野火PRO开发板开发板
    【计算机图形学】期末考试课后习题重点复习(第1-2章)
    卖家应该如何应对亚马逊多账号操作呢?
    Scala词频统计
    OTL Select with MySQL LONGTEXT in stream mode注意事项
    【ROS进阶篇】第五讲 ROS中的TF坐标变换
    Android 电量优化概览
    FVP和Juno平台的Memory Layout介绍
  • 原文地址:https://blog.csdn.net/hongszh/article/details/126659370