当前位置:网站首页>gst-launch的-v参数
gst-launch的-v参数
2022-07-05 19:33:00 【HUI的技術筆記】
-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));
else
val_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);
else
str = 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);
}
}
边栏推荐
- HiEngine:可媲美本地的云原生内存数据库引擎
- Go语言 | 03 数组、指针、切片用法
- Ultrasonic ranging based on FPGA
- Zhongang Mining: analysis of the current market supply situation of the global fluorite industry in 2022
- Summer Challenge database Xueba notes, quick review of exams / interviews~
- Vagrant2.2.6 supports virtualbox6.1
- Oracle fault handling: ora-10873:file * needs to be either taken out of backup or media recovered
- Mariadb root用户及普通用户的密码 重置
- IBM has laid off 40 + year-old employees in a large area. Mastering these ten search skills will improve your work efficiency ten times
- 软件测试工程师是做什么的?待遇前景怎么样?
猜你喜欢

全网最全的低代码/无代码平台盘点:简道云、伙伴云、明道云、轻流、速融云、集简云、Treelab、钉钉·宜搭、腾讯云·微搭、智能云·爱速搭、百数云
The problem of returning the longtext field in MySQL and its solution

【FAQ】华为帐号服务报错 907135701的常见原因总结和解决方法

webuploader文件上传 拖拽上传 进度监听 类型控制 上传结果监听控件

#夏日挑战赛#数据库学霸笔记,考试/面试快速复习~

Hiengine: comparable to the local cloud native memory database engine

The relationship between temperature measurement and imaging accuracy of ifd-x micro infrared imager (module)

How to convert word into PDF? Word to PDF simple way to share!

集合

Ultrasonic ranging based on FPGA
随机推荐
Tutoriel de téléchargement et d'installation du progiciel fuzor 2020
Hiengine: comparable to the local cloud native memory database engine
软件测试工程师是做什么的?待遇前景怎么样?
Millimeter wave radar human body sensor, intelligent perception of static presence, human presence detection application
The city chain technology Digital Innovation Strategy Summit was successfully held
Common interview questions in Android, 2022 golden nine silver ten Android factory interview questions hit
MMO project learning 1: preheating
Oracle fault handling: ora-10873:file * needs to be either taken out of backup or media recovered
Shell编程基础(第8篇:分支语句-case in)
JAD的安装、配置及集成IDEA
How MySQL queries and modifies JSON data
JS solution force deduction daily question (12) - 556 Next larger element III (2022-7-3)
The relationship between temperature measurement and imaging accuracy of ifd-x micro infrared imager (module)
Is it safe for China Galaxy Securities to open an account? Securities account opening
国海证券在网上开户安全吗?
#夏日挑战赛#数据库学霸笔记,考试/面试快速复习~
C application interface development foundation - form control (5) - grouping control
IBM has laid off 40 + year-old employees in a large area. Mastering these ten search skills will improve your work efficiency ten times
C#应用程序界面开发基础——窗体控制(5)——分组类控件
Bitcoinwin (BCW)受邀参加Hanoi Traders Fair 2022