Templates Gstreamer示例接收器
gstreamer中是否有视频接收器模板,就像插件元素一样 我有一个非常简单的想法:一个init函数、render(display)函数和deinit函数。没别的了 最好的“模板”是可用的源代码。拿一个简单的水槽作为起点。这也是了解GStreamer、了解编写良好的元素的行为方式的一个好方法。您想要的基类可能是gstbasesink,因为有gstbaseaudiosink这样的东西,但还没有gstbasevideosink。我也在基于gstbasesink的基础上寻找了一个sink“模板”,但没有找到。我按照上面的建议从fakesink元素创建了一个名为vpphlsvideosink的元素,尽管它还不是一个专门的视频接收器。它除了向std cout发送用于渲染的“r”字符和用于事件的“e”字符外,什么都不做。以下是文件:Templates Gstreamer示例接收器,templates,gstreamer,sink,Templates,Gstreamer,Sink,gstreamer中是否有视频接收器模板,就像插件元素一样 我有一个非常简单的想法:一个init函数、render(display)函数和deinit函数。没别的了 最好的“模板”是可用的源代码。拿一个简单的水槽作为起点。这也是了解GStreamer、了解编写良好的元素的行为方式的一个好方法。您想要的基类可能是gstbasesink,因为有gstbaseaudiosink这样的东西,但还没有gstbasevideosink。我也在基于gstbasesink的基础上寻找了一个sink“模板”,但没
#pragma一次
#包括
#包括
G_BEGIN_DECLS
//存储此元素数据的结构的定义。
typedef结构\u GSTVPHLSVideosink
{
GstBaseSink元件;
一言不发;
}gstvphlsvideosink;
//定义此元素的类的标准定义。
typedef结构\u GSTVPHLSVideosinkClass
{
GSTBaseskingClass父类\u类;
}GSTVPHLSVideoskingClass;
//用于定义此元素类型的标准宏。
#定义GST_TYPE_VPPHLSVIDEOSINK(GST_VPPHLSVIDEOSINK_get_TYPE())
#定义GST_VPPHLSVIDEOSINK(obj)(G_类型_检查_实例_转换((obj),GST_类型_VPPHLSVIDEOSINK,GSTVPHLSVideosSink))
#定义GST_-VPPHLSVIDEOSINK_类(klass)(G_类型_-CHECK_类_-CAST((klass),GST_类型_-VPPHLSVIDEOSINK,GSTVpphlsVideoSink类))
#定义GST_为VPPHLSVIDEOSINK(obj)(G_类型_检查_实例_类型((obj),GST_类型_VPPHLSVIDEOSINK))
#定义GST_为_VPPHLSVIDEOSINK_类(klass)(G_类型_检查_类_类型((klass),GST_类型_VPPHLSVIDEOSINK))
GType gst\vpphlsvideosink\U get\U类型(无效);
G_END_DECLS
#如果定义有配置#
#包括
#恩迪夫
#包括“vpphlsvideosink.h”
#包括
使用名称空间std;
GST_调试_类别_静态(GST_vpphlsvideosink_调试);
#定义GST\u目录\u默认GST\u vpphlsvideosink\u调试
#定义默认值\u SYNC true
#定义默认值为false
//过滤信号和参数
枚举
{
/*填满我*/
最后信号
};
枚举
{
第0号提案,
道具沉默
};
//输入和输出的能力。
静态GstStaticPadTemplate sinkpadtemplate=GST_静态_PAD_模板(“水槽”,GST_PAD_水槽,GST_PAD_始终,GST_静态_封盖(“任何”);
#定义gst\u vpphlsvideosink\u父类\u父类
G_定义_类型(GSTVPHLSVideosink、gst_VPPHLSideosink、gst_类型_BASE_SINK);
静态无效gst_vpphlsvideosink_set_属性(GObject*object,guint prop\u id,const GValue*value,GParamSpec*pspec);
静态无效gst_vpphlsvideosink_get_属性(GObject*object,guint prop\u id,GValue*value,GParamSpec*pspec);
静态无效gst_vpphlsvideosink_finalize(GObject*obj);
静态GstStateChangeReturn gst_vpphlsvideosink_change_状态(GstElement*元素,GstStateChange转换);
静态GstFlowReturn gst_vpphlsvideosink_呈现(GstBaseSink*父级,GstBuffer*缓冲区);
静态GstFlowReturn gst_vpphlsvideosink_预滚(GstBaseSink*父级,GstBuffer*缓冲区);
静态gboolean gst_vpphlsvideosink_事件(GstBaseSink*父事件,GstEvent*事件);
静态gboolean gst\u vpphlsvideosink\u查询(GstBaseSink*父项,GstQuery*查询);
//当至少定义了一个信号枚举时使用此选项
//静态guint gst_vpphlsvideosink_信号[最后一个信号]={0};
//------GObject虚拟方法------------------------------------------------------------------------------
//初始化vpphlsvideosink类
静态无效gst\u vpphlsvideosink\u类初始化(GSTVPHLSVideosinkClass*klass)
{
gobject类*gobject_类=G_对象_类(klass);
GstElementClass*gstelement_类=GST_元素_类(klass);
GstBaseSinkClass*gstbasesink_class=GST_基本_接收器_class(klass);
gobject\u class->set\u property=gst\vpphlsvideosink\u set\u property;
gobject\u class->get\u property=gst\vpphlsvideosink\u get\u property;
gobject\u class->finalize=gst\vpphlsvideosink\u finalize;
g_对象_类_安装_属性(gobject类,PROP_SILENT,
g_param_spec_boolean(“静默”、“静默”、“生成详细输出?”,
默认情况下,您保持沉默,
(GParamFlags)(G|u参数|读写| GST|u参数|可变|播放| G|u参数|静态|字符串));
gst\u元素\u类\u集合\u静态\u元数据(gstelement\u类,
“VPP HLS视频接收器”,
“接收器/VPPHLSVIDEOSINK”,
“将视频缓冲区写入外部定义的队列”,
“基思·L·弗格森”);
//一个水槽板模板
gst元素类添加静态焊盘模板(gst元素类和焊盘模板);
//设置覆盖方法
gstbasesink_class->render=GST_DEBUG_FUNCPTR(GST_vpphlsvideosink_render);
gstbasesink_class->preroll=GST_DEBUG_FUNCPTR(GST_vpphlsvideosink_preroll);
gstbasesink_class->event=GST_DEBUG_FUNCPTR(GST_vpphlsvideosink_event);
gstbasesink_class->query=GST_DEBUG_FUNCPTR(GST_vpphlsvideosink_query);
}//结束gst\vpphlsvideosink\u类\u初始化。
//初始化新元素。
静态无效gst_vpphlsvideosink_init(Gstvpphlsvideosink*vsink)
{
//在这堂课上
vsink->silent=默认值\u silent;
//关于基类
gst\基本\接收器\设置\同步(gst\基本\接收器(vsink),默认\同步);
}//结束gst\vpphlsvideosink\u初始化。
静态无效gst\vpphlsvideosink\U最终确定(GObject*obj)
{
G_对象_类(父类)->最终确定(obj);
}//结束gst_vpphlsvideosink_最终确定。
静态无效gst_vpphlsvideosink_set_属性(GObject*对象、guint属性id、常量GValue*值、GParamSpec*pspec)
{
gstvphlsvideosink*vsink=GST\VPPHLSVIDEOSINK(对象);
开关(道具id)
{
无提示的情况:
vsink->silent=g\u value\u get\u bo
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "vpphlsvideosink.h"
static gboolean plugin_init (GstPlugin * plugin)
{
return gst_element_register(plugin, "vpphlsvideosink", GST_RANK_NONE, GST_TYPE_VPPHLSVIDEOSINK);
}//end plugin_init.
// GST_PLUGIN_DEFINE needs PACKAGE to be defined.
#ifndef PACKAGE
#define PACKAGE "vpphlsvideosink"
#endif
#ifndef VERSION
#define VERSION "1.0.0.0"
#endif
#ifndef GST_PACKAGE_NAME
#define GST_PACKAGE_NAME "GStreamer"
#endif
#ifndef GST_PACKAGE_ORIGIN
#define GST_PACKAGE_ORIGIN "http://somewhere.net/"
#endif
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
vpphlsvideosink,
"HLS Video Sink Plugin",
plugin_init,
VERSION,
"LGPL",
GST_PACKAGE_NAME,
GST_PACKAGE_ORIGIN);
#pragma once
#include <gst/gst.h>
#include <gst/base/gstbasesink.h>
G_BEGIN_DECLS
// Definition of structure storing data for this element.
typedef struct _Gstvpphlsvideosink
{
GstBaseSink element;
gboolean silent;
} Gstvpphlsvideosink;
// Standard definition defining a class for this element.
typedef struct _GstvpphlsvideosinkClass
{
GstBaseSinkClass parent_class;
} GstvpphlsvideosinkClass;
// Standard macros for defining types for this element.
#define GST_TYPE_VPPHLSVIDEOSINK (gst_vpphlsvideosink_get_type())
#define GST_VPPHLSVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VPPHLSVIDEOSINK,Gstvpphlsvideosink))
#define GST_VPPHLSVIDEOSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VPPHLSVIDEOSINK,GstvpphlsvideosinkClass))
#define GST_IS_VPPHLSVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VPPHLSVIDEOSINK))
#define GST_IS_VPPHLSVIDEOSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VPPHLSVIDEOSINK))
GType gst_vpphlsvideosink_get_type(void);
G_END_DECLS
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "vpphlsvideosink.h"
#include <iostream>
using namespace std;
GST_DEBUG_CATEGORY_STATIC (gst_vpphlsvideosink_debug);
#define GST_CAT_DEFAULT gst_vpphlsvideosink_debug
#define DEFAULT_SYNC true
#define DEFAULT_SILENT false
// Filter signals and args
enum
{
/* FILL ME */
LAST_SIGNAL
};
enum
{
PROP_0,
PROP_SILENT
};
// The capabilities of the inputs and outputs.
static GstStaticPadTemplate sinkpadtemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("ANY"));
#define gst_vpphlsvideosink_parent_class parent_class
G_DEFINE_TYPE(Gstvpphlsvideosink, gst_vpphlsvideosink, GST_TYPE_BASE_SINK);
static void gst_vpphlsvideosink_set_property (GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec);
static void gst_vpphlsvideosink_get_property (GObject* object, guint prop_id, GValue* value, GParamSpec* pspec);
static void gst_vpphlsvideosink_finalize(GObject* obj);
static GstStateChangeReturn gst_vpphlsvideosink_change_state(GstElement* element, GstStateChange transition);
static GstFlowReturn gst_vpphlsvideosink_render(GstBaseSink* parent, GstBuffer* buffer);
static GstFlowReturn gst_vpphlsvideosink_preroll(GstBaseSink* parent, GstBuffer* buffer);
static gboolean gst_vpphlsvideosink_event(GstBaseSink* parent, GstEvent* event);
static gboolean gst_vpphlsvideosink_query(GstBaseSink* parent, GstQuery* query);
// Use this when there is at least one signal enum defined
//static guint gst_vpphlsvideosink_signals[LAST_SIGNAL] = { 0 };
// ------------- GObject virtual methods ------------------------------------------------------------------------------
// Initialize the vpphlsvideosink class
static void gst_vpphlsvideosink_class_init(GstvpphlsvideosinkClass* klass)
{
GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
GstElementClass* gstelement_class = GST_ELEMENT_CLASS(klass);
GstBaseSinkClass* gstbasesink_class = GST_BASE_SINK_CLASS(klass);
gobject_class->set_property = gst_vpphlsvideosink_set_property;
gobject_class->get_property = gst_vpphlsvideosink_get_property;
gobject_class->finalize = gst_vpphlsvideosink_finalize;
g_object_class_install_property (gobject_class, PROP_SILENT,
g_param_spec_boolean ("silent", "Silent", "Produce verbose output?",
DEFAULT_SILENT,
(GParamFlags)(G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS)));
gst_element_class_set_static_metadata(gstelement_class,
"A VPP HLS Video Sink",
"Sink/VPPHLSVIDEOSINK",
"Writes video buffers to an externally defined queue",
"Keith L Ferguson <<user@hostname.org>>");
// The one sink pad template
gst_element_class_add_static_pad_template(gstelement_class, &sinkpadtemplate);
// Set override methods
gstbasesink_class->render = GST_DEBUG_FUNCPTR(gst_vpphlsvideosink_render);
gstbasesink_class->preroll = GST_DEBUG_FUNCPTR(gst_vpphlsvideosink_preroll);
gstbasesink_class->event = GST_DEBUG_FUNCPTR(gst_vpphlsvideosink_event);
gstbasesink_class->query = GST_DEBUG_FUNCPTR(gst_vpphlsvideosink_query);
}//end gst_vpphlsvideosink_class_init.
// Initialise the new element.
static void gst_vpphlsvideosink_init (Gstvpphlsvideosink* vsink)
{
// On this sink class
vsink->silent = DEFAULT_SILENT;
// On the base class
gst_base_sink_set_sync(GST_BASE_SINK(vsink), DEFAULT_SYNC);
}//end gst_vpphlsvideosink_init.
static void gst_vpphlsvideosink_finalize(GObject* obj)
{
G_OBJECT_CLASS(parent_class)->finalize(obj);
}//end gst_vpphlsvideosink_finalize.
static void gst_vpphlsvideosink_set_property (GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec)
{
Gstvpphlsvideosink* vsink = GST_VPPHLSVIDEOSINK (object);
switch (prop_id)
{
case PROP_SILENT:
vsink->silent = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}//end switch prop_id...
}//end gst_vpphlsvideosink_set_property.
static void gst_vpphlsvideosink_get_property (GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
{
Gstvpphlsvideosink* vsink = GST_VPPHLSVIDEOSINK (object);
switch (prop_id)
{
case PROP_SILENT:
g_value_set_boolean (value, vsink->silent);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}//end switch prop_id...
}//end gst_vpphlsvideosink_get_property.
// -------------- GstBaseSink virtual methods ---------------------------------------------------------------
static GstFlowReturn gst_vpphlsvideosink_render(GstBaseSink* parent, GstBuffer* buffer)
{
Gstvpphlsvideosink* vsink = GST_VPPHLSVIDEOSINK(parent);
if (!vsink->silent)
cout << "r";
return GST_FLOW_OK;
}//end gst_vpphlsvideosink_render.
static GstFlowReturn gst_vpphlsvideosink_preroll(GstBaseSink* parent, GstBuffer* buffer)
{
Gstvpphlsvideosink* vsink = GST_VPPHLSVIDEOSINK(parent);
if (!vsink->silent)
cout << "p";
return GST_FLOW_OK;
}//end gst_vpphlsvideosink_preroll.
static gboolean gst_vpphlsvideosink_event(GstBaseSink* parent, GstEvent* event)
{
Gstvpphlsvideosink* vsink = GST_VPPHLSVIDEOSINK(parent);
if (!vsink->silent)
cout << "e";
return GST_BASE_SINK_CLASS(parent_class)->event(parent, event);
}//end gst_vpphlsvideosink_event.
static gboolean gst_vpphlsvideosink_query(GstBaseSink* parent, GstQuery* query)
{
gboolean ret;
switch (GST_QUERY_TYPE(query))
{
case GST_QUERY_SEEKING:
{
// Seeking is not supported
GstFormat fmt;
gst_query_parse_seeking(query, &fmt, NULL, NULL, NULL);
gst_query_set_seeking(query, fmt, FALSE, 0, -1);
ret = TRUE;
break;
}
default:
ret = GST_BASE_SINK_CLASS(parent_class)->query(parent, query);
break;
}//end switch query...
return ret;
}//end gst_vpphlsvideosink_query.
static GstStateChangeReturn gst_vpphlsvideosink_change_state(GstElement* element, GstStateChange transition)
{
GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
Gstvpphlsvideosink* vsink = GST_VPPHLSVIDEOSINK(element);
ret = GST_ELEMENT_CLASS(parent_class)->change_state(element, transition);
}//end gst_vpphlsvideosink_change_state.