Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates Gstreamer示例接收器_Templates_Gstreamer_Sink - Fatal编程技术网

Templates Gstreamer示例接收器

Templates Gstreamer示例接收器,templates,gstreamer,sink,Templates,Gstreamer,Sink,gstreamer中是否有视频接收器模板,就像插件元素一样 我有一个非常简单的想法:一个init函数、render(display)函数和deinit函数。没别的了 最好的“模板”是可用的源代码。拿一个简单的水槽作为起点。这也是了解GStreamer、了解编写良好的元素的行为方式的一个好方法。您想要的基类可能是gstbasesink,因为有gstbaseaudiosink这样的东西,但还没有gstbasevideosink。我也在基于gstbasesink的基础上寻找了一个sink“模板”,但没

gstreamer中是否有视频接收器模板,就像插件元素一样

我有一个非常简单的想法:一个init函数、render(display)函数和deinit函数。没别的了

最好的“模板”是可用的源代码。拿一个简单的水槽作为起点。这也是了解GStreamer、了解编写良好的元素的行为方式的一个好方法。您想要的基类可能是gstbasesink,因为有gstbaseaudiosink这样的东西,但还没有gstbasevideosink。

我也在基于gstbasesink的基础上寻找了一个sink“模板”,但没有找到。我按照上面的建议从fakesink元素创建了一个名为vpphlsvideosink的元素,尽管它还不是一个专门的视频接收器。它除了向std cout发送用于渲染的“r”字符和用于事件的“e”字符外,什么都不做。以下是文件:

  • gstvphlsvideosink.cpp
  • vpphlsvideosink.h
  • #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.cpp
  • #如果定义有配置#
    #包括
    #恩迪夫
    #包括“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.