当前位置:网站首页>-v parameter of GST launch
-v parameter of GST launch
2022-07-05 19:40:00 【Hui's technical notes】
-v Parameters
Let's start with a simple example :
gst-launch Of pipeline, increase -v Parameters can be output caps Details of , Including what we want codec_data, that , This -v How parameters are output , You need to trace the code in depth , Because this output is not affected GST_DEBUG The control of , Yes direct output to terminal Of .
$ 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 ...
stay gst-launch In the code of ,-v The function of parameters is to output status information and Attribute Notification , If there is verbose Parameters , Will increase first deep_notify Processing function :
{
"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
Here it is. deep_notify
Signal callback function :
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;
}
Tracking into gst_element_property_deep_notify_cb function ,gst_message_new_property_notify Will first create a new property news , then post message.
gst_message_new_property_notify
gst_message_new_property_notify Middle structure MESSAGE_PROPERTY_NOTIFY
Type of message,message post after , Will be in gst-launch Medium receiving and processing .
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 And GST_MESSAGE_PROPERTY_NOTIFY
stay gst-launch In the middle ,GST_MESSAGE_PROPERTY_NOTIFY Processing branch of , Will first parse message Of val, And then pass at the end gst_print Print out , This is why by increasing -v Parameters can be obtained 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;
alike , stay codec-select In the code of , Yes deep_notify
Signal callback function 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);
// Print -v Parameters
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);
}
}
边栏推荐
- What are general items
- Fundamentals of shell programming (Part 8: branch statements -case in)
- Mariadb root用户及普通用户的密码 重置
- Common interview questions in Android, 2022 golden nine silver ten Android factory interview questions hit
- 函数的概念及语法
- C#应用程序界面开发基础——窗体控制(6)——菜单栏、工具栏和状态栏控件
- [OBS] qstring's UTF-8 Chinese conversion to blog printing UTF-8 char*
- Fundamentals of shell programming (Chapter 9: loop)
- PHP uses ueditor to upload pictures and add watermarks
- Fundamentals of machine learning (III) -- KNN / naive Bayes / cross validation / grid search
猜你喜欢
【硬核干货】数据分析哪家强?选Pandas还是选SQL
JMeter 常用的几种断言方法,你会了吗?
Android interview, Android audio and video development
PHP uses ueditor to upload pictures and add watermarks
Hiengine: comparable to the local cloud native memory database engine
IBM has laid off 40 + year-old employees in a large area. Mastering these ten search skills will improve your work efficiency ten times
No matter how busy you are, you can't forget safety
Force buckle 1200 Minimum absolute difference
Fuzor 2020軟件安裝包下載及安裝教程
Android面试,android音视频开发
随机推荐
Debezium系列之:记录mariadb数据库删除多张临时表debezium解析到的消息以及解决方法
微波雷达感应模块技术,实时智能检测人体存在,静止微小动静感知
Android interview, Android audio and video development
C#应用程序界面开发基础——窗体控制(5)——分组类控件
Concept and syntax of function
Zhongang Mining: analysis of the current market supply situation of the global fluorite industry in 2022
Worthy of being a boss, byte Daniel spent eight months on another masterpiece
Is it safe for China Galaxy Securities to open an account? Securities account opening
Information / data
PHP uses ueditor to upload pictures and add watermarks
Get wechat avatar and nickname with uniapp
面试官:Redis中集合数据类型的内部实现方式是什么?
IBM has laid off 40 + year-old employees in a large area. Mastering these ten search skills will improve your work efficiency ten times
How about testing outsourcing companies?
爬虫练习题(二)
HAC集群修改管理员用户密码
openh264解码数据流向分析
再忙不能忘安全
C application interface development foundation - form control (6) - menu bar, toolbar and status bar controls
Android面试,android音视频开发