-v参数

先看一个简单的例子:

gst-launch的pipeline,增加-v参数就可以输出caps的详细信息,包括我们想要的codec_data,那么,这个-v参数是怎么输出这些的,就需要深入跟踪下代码,因为这个输出不受GST_DEBUG的控制,是直接输出到terminal的。

$ gst-launch-1.0 filesrc location=~/h264.mp4 ! qtdemux !  fakesink -v
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
/GstPipeline:pipeline0/GstFakeSink:fakesink0.GstPad:sink: caps = video/x-h264, stream-format=(string)avc, alignment=(string)au, \
level=(string)3.1, profile=(string)high, codec_data=(buffer)0164001fffe100196764001facd9405005ba1000000300100000030320f183196001000568ebecb22c, \
width=(int)1280, height=(int)720, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)1/1
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
Redistribute latency...
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:00.001151180
Setting pipeline to NULL ...
Freeing pipeline ...

在gst-launch的代码中,-v参数的作用是输出状态信息和属性通知,如果有verbose参数,会先增加deep_notify处理函数:

{"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,N_("Output status information and property notifications"), NULL},if (verbose) {deep_notify_id =gst_element_add_property_deep_notify_watch (pipeline, NULL, TRUE);
}

gst_element_property_deep_notify_cb

gst_element_property_deep_notify_cb在这里是deep_notify信号回调函数:

gulong
gst_element_add_property_deep_notify_watch (GstElement * element,const gchar * property_name, gboolean include_value)
{const gchar *sep;gchar *signal_name;gulong id;g_return_val_if_fail (GST_IS_ELEMENT (element), 0);sep = (property_name != NULL) ? "::" : NULL;signal_name = g_strconcat ("deep-notify", sep, property_name, NULL);id = g_signal_connect (element, signal_name,G_CALLBACK (gst_element_property_deep_notify_cb),GINT_TO_POINTER (include_value));g_free (signal_name);return id;
}

跟踪进入gst_element_property_deep_notify_cb函数,gst_message_new_property_notify会先创建新的property消息,然后post message。

gst_message_new_property_notify

gst_message_new_property_notify中构造MESSAGE_PROPERTY_NOTIFY类型的message,message post之后,就会在gst-launch中接收处理。

GstMessage *
gst_message_new_property_notify (GstObject * src, const gchar * property_name,GValue * val)
{GstStructure *structure;GValue name_val = G_VALUE_INIT;g_return_val_if_fail (property_name != NULL, NULL);structure = gst_structure_new_id_empty (GST_QUARK (MESSAGE_PROPERTY_NOTIFY));g_value_init (&name_val, G_TYPE_STRING);/* should already be interned, but let's make sure */g_value_set_static_string (&name_val, g_intern_string (property_name));gst_structure_id_take_value (structure, GST_QUARK (PROPERTY_NAME), &name_val);if (val != NULL)gst_structure_id_take_value (structure, GST_QUARK (PROPERTY_VALUE), val);return gst_message_new_custom (GST_MESSAGE_PROPERTY_NOTIFY, src, structure);
}

gst-lauch之GST_MESSAGE_PROPERTY_NOTIFY

在gst-launch的中,GST_MESSAGE_PROPERTY_NOTIFY的处理分支,会先解析message的val,然后在最后通过gst_print打印出来,这就是为什么通过增加-v参数就能获取codec_data了。

case GST_MESSAGE_PROPERTY_NOTIFY:{const GValue *val;const gchar *name;GstObject *obj;gchar *val_str = NULL;gchar **ex_prop, *obj_name;if (quiet)break;gst_message_parse_property_notify (message, &obj, &name, &val);/* Let's not print anything for excluded properties... */ex_prop = exclude_args;while (ex_prop != NULL && *ex_prop != NULL) {if (strcmp (name, *ex_prop) == 0)break;ex_prop++;}if (ex_prop != NULL && *ex_prop != NULL)break;obj_name = gst_object_get_path_string (GST_OBJECT (obj));if (val != NULL) {if (G_VALUE_HOLDS_STRING (val))val_str = g_value_dup_string (val);else if (G_VALUE_TYPE (val) == GST_TYPE_CAPS)val_str = gst_caps_to_string (g_value_get_boxed (val));else if (G_VALUE_TYPE (val) == GST_TYPE_TAG_LIST)val_str = gst_tag_list_to_string (g_value_get_boxed (val));else if (G_VALUE_TYPE (val) == GST_TYPE_STRUCTURE)val_str = gst_structure_to_string (g_value_get_boxed (val));elseval_str = gst_value_serialize (val);} else {val_str = g_strdup ("(no value)");}gst_print ("%s: %s = %s\n", obj_name, name, val_str);g_free (obj_name);g_free (val_str);break;

同样的,在codec-select的代码中,有deep_notify信号回调函数gst_object_default_deep_notify:

gst-plugins-base/tests/examples/dynamic/codec-select.c

  g_signal_connect (pipeline, "deep_notify",G_CALLBACK (gst_object_default_deep_notify), NULL);

gst_object_default_deep_notify:

void
gst_object_default_deep_notify (GObject * object, GstObject * orig,GParamSpec * pspec, gchar ** excluded_props)
{GValue value = { 0, };        /* the important thing is that value.type = 0 */gchar *str = NULL;gchar *name = NULL;if (pspec->flags & G_PARAM_READABLE) {/* let's not print these out for excluded properties... */while (excluded_props != NULL && *excluded_props != NULL) {if (strcmp (pspec->name, *excluded_props) == 0)return;excluded_props++;}g_value_init (&value, pspec->value_type);g_object_get_property (G_OBJECT (orig), pspec->name, &value);if (G_VALUE_HOLDS_STRING (&value))str = g_value_dup_string (&value);elsestr = gst_value_serialize (&value);name = gst_object_get_path_string (orig);// 打印-v参数g_print ("%s: %s = %s\n", name, pspec->name, str);g_free (name);g_free (str);g_value_unset (&value);} else {name = gst_object_get_path_string (orig);g_warning ("Parameter %s not readable in %s.", pspec->name, name);g_free (name);}
}

gst-launch的-v参数相关推荐

  1. docker run中-v参数的用法解释

    作用:挂载宿主机的一个目录 如: # docker run -it -v /宿主机目录:/容器目录 镜像名 /bin/bash 这里-it是参数作用是: **-i:**以交互模式运行容器,通常与 -t ...

  2. ROS向节点传递参数的方法总结(rosrun,launch) + (参数服务器,main函数参数)

    0. 写在最前面 本文持续更新地址:https://haoqchen.site/2019/03/22/send-param2node/ 如果觉得写得还不错,可以找我其他文章来看看哦---可以的话帮我g ...

  3. 荣耀magic v参数配置

    荣耀magic v采用了AMOLED的屏幕,并且其还是有着90Hz的刷新率,为我们带来舒适的视觉,体验到沉浸式的乐趣哦! 荣耀magic v采用了后置四摄模组5000万像素+1600万像素+1200万 ...

  4. linux中v参数全称,[置顶] linux 命令中的 -v 参数

    也不知从何时起,我比较关注 各种软件的版本号,从ubuntu 9.10 到 14.04 14.10 再到Qt 软件的4,7.0 到5.3.1 ,再到arm-linux-gcc 4.4.1 等等,我觉着 ...

  5. 【Linux】Rsync基于SSH认证的使用(rsync 命令属于1 v 4 的命令、rsync常用参数基本用法)

    一.Rsync基于SSH认证的使用 rsync 默认使用 ssh 协议进行远程登录和数据传输.远程主机需要开启 sshd 服务,rsync 在传输数据之前会先与远程主机进行一次 ssh 登录认证,然后 ...

  6. ROS节点无法读入launch参数问题

    总述 由于没有注意 参数 与 句柄的 全局/局部 关系,从而使得launch文件的参数无法正常进入节点中. 表现 问题代码来自 https://github.com/RuPingCen/publish ...

  7. ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介...

    ROS 提高篇 之 Launch 深入研究 - 01 - 启动文件的编程 - ROS 的 XML语法简介 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubu ...

  8. too many resources required for launch

    背景 当我们在使用一些低端的jetson设备的时候,比如nano, 偶尔会出现报错,报错显示: too many resources required for launch 查资料可以发现,一般遇到这 ...

  9. linux 下orapwd 未找到命令,orapwd命令中entries参数的作用

    orapwd命令中entries参数的作用 作者 blue_stone E-mail: blue_stone@xinhuanet.com Blog: http://bluestone.cublog.c ...

  10. 常用浏览器重要启动参数和配置参数整理

    IE的常用启动参数 1.-nohome 双击此快捷方式则只打开一个空白IE窗口,可以加快IE启动速度,同时如果IE主页被恶意修改了,利用此法就不会自动打开恶意主页. 2.-k -k参数可以让IE工作在 ...

最新文章

  1. workerman源码分析之启动过程
  2. C语言中的位操作(8)--根据指定掩码选择两数之一
  3. Google Guava官方教程
  4. tableau实战系列(三十八)-Tableau Server 端口耗竭的具体表象及如何避免端口耗竭
  5. 【转】5亿个数找中位数
  6. gradle配置及使用教程、groovy入门示例
  7. mysql 5.5免安装配置_mysql的参考文档mysql5.5.21免安装版的配置方法
  8. VB6获取本机所有IP地址公用函数
  9. (42)JS运动之多物体框架--多个div变宽
  10. Android Studio - 安装插件GsonFormat
  11. windbg中ntsd使用用户态调试器链接到内核调试器的常用技巧
  12. App拉起:h5打开app指定页面
  13. IDEA中解决Spring 配置文件未受管束问题,提示:Unmapped Spring configuration files found
  14. python提取部分字符串_python如何提取字符串
  15. 微信小程序自定义状态栏组件,提取自(colorui)
  16. 奋斗的小孩系列 FPGA学习altera系列: 第一篇 软件的安装与破解
  17. Poi 4.0设置自定义背景颜色
  18. poi 启用保护后取消_保护模式禁用怎么解除
  19. NavMesh.AllAreas
  20. Adobe Flash player Activex控件问题解决方法

热门文章

  1. android 获取短信中心号码,无法发短信,短信中心号码设置 解决办法!!!
  2. 用友u8服务器修改ipv4,用友U8-OA11.1 用友U8加密狗更换服务器了-用友U8
  3. sqli-labs 前五关
  4. Python 网络编程
  5. DevIL的学习笔记
  6. windows的映射驱动器
  7. 京东商城选择地址信息
  8. 路由器桥接LAN接LAN口(改DHCP以及详细避坑教程)
  9. python subprocess.Popen 监控控制台输出
  10. Unity 3D 入门小游戏 小球酷跑(上)