[GStreamer] 插件编写 source element

Reference : 

https://gstreamer.freedesktop.org/documentation/plugin-development/advanced/negotiation.html#caps-negotiation-use-casesicon-default.png?t=N7T8https://gstreamer.freedesktop.org/documentation/plugin-development/advanced/negotiation.html#caps-negotiation-use-cases

Different scheduling modesicon-default.png?t=N7T8https://gstreamer.freedesktop.org/documentation/plugin-development/advanced/scheduling.html?gi-language=c

源码(finish me):

obtsrc.h

#pragma once

#include <gst/gst.h>
#include <gst/gstbasesrc.h>

#define VERSION 1.0
#define PACKAGE "obtplugin"

G_BEGIN_DECLS

typedef struct _GstObtSrc GstObtSrc;
typedef struct _GstObtSrcClass GstObtSrcClass;
typedef struct _GstObtSrcPrivate GstObtSrcPrivate;	//every element instance has it's own private data


/***************************************

			instance stuct
			
***************************************/
struct _GstObtSrc
{
	//parent (every element has a parent instance struct instance in it's instance struct)
	GstBaseSrc element;

	//pubic member vars
	gboolean b_working;	//work state

	//private member vars
	GstObtSrcPrivate s_priv;
};



/***************************************

			class struct
			
***************************************/
struct _GstObtSrcClass
{
	//parent class (class struct has a parent class struct instance int it's class struct)
	GstBaseSrcClass parent_class;

	//class meta vars
	gchar* s_desc;

};



/***************************************

			declare GType
			
***************************************/
GType gst_obt_src_get_type(void);



/***************************************

			boilerplate MACROs

	note:every GType has two structs, instance struct and class struct , following macros' input arg are 
		 related struct pointer seperatly, eg. arg of GST_OBT_SRC should be a instance struct pointer,
		 meanwhile, arg of GST_OBT_SRC_CLASS should be a class struct pointer. If pointer type is mismatch,
		 MACROS return null represent error arg.
		 
***************************************/
#define GST_TYPE_OBT_SRC (gst_obt_src_get_type())

//if ptr_obj point to a instance of GST_TYPE_OBT_SRC, cast ptr_obj to GstObtSrc* and return , otherwise return null
#define GST_OBT_SRC(ptr_obj) \
	(G_TYPE_CHECK_INSTANCE_CAST((ptr_obj),GST_TYPE_OBT_SRC,GstObtSrc))		

//if ptr_class point to a instance of GST_TYPE_OBT_SRC, cast ptr_obj to GstObtSrcClass* and return , otherwise return null , ptr_class is a class struct pointer
#define GST_OBT_SRC_CLASS(ptr_class) \
	(G_TYPE_CHECK_CLASS_CAST((ptr_class),GST_TYPE_OBT_SRC,GstObtSrcClass))

//if ptr_obj point to a instance of GST_TYPE_OBT_SRC, return true , otherwise return false , ptr_obj is a instance struct pointer
#define GST_IS_OBT_SRC(ptr_obj) \
	(G_TYPE_CHECK_INSTANCE_TYPE((ptr_obj),GST_TYPE_OBT_SRC))

//if ptr_class point to a instance of GST_TYPE_OBT_SRC, return ture , otherwise return false, ptr_class is a class struct pointer
#define GST_IS_OBT_SRC_CLASS(ptr_obj) \
	(G_TYPE_CHECK_CLASS_TYPE((ptr_obj),GST_TYPE_OBT_SRC))





G_END_DECLS




obtsrc.c

#include "ObtSrc.h"
#include <gst/gst.h>

static gboolean gst_obt_src_event_process(GstPad* recvpad/*pad received event*/, GstObject* parentofpad/*element that own #recvpad */, GstEvent* event);


#define gst_obt_src_parent_class parent_class

struct _GstObtSrcPrivate
{
	gboolean b_reserv;
};


/***************************************** boilerplate Funcs [START] *****************************************/

static gboolean gst_obt_src_event(GstPad* recvpad/*pad received event*/, GstObject* parentofpad/*element that own #recvpad */, GstEvent* event)
{
	gboolean ret = TRUE;
	ret = gst_obt_src_event_process();
	if(ret){
		ret = gst_pad_event_default(pad,parent,event);
	}else{
		return ret;
	}
}

static GstStateChangeReturn gst_obt_src_state_changed(GstElement* element, GstStateChange transition)
{
	GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;

	ret = GST_ELEMENT_CLASS(parent_class)->change_state(element,transition);
	if (ret == GST_STATE_CHANGE_FAILURE)
		return ret;
}

static void gst_obt_src_init(GstObtSrc* ptr_obj)
{

}

static void gst_obt_src_class_init(GstObtSrcClass* ptr_class)
{

}

/***************************************** boilerplate Funcs [END] *****************************************/

static gboolean gst_obt_src_event_process(GstPad* recvpad/*pad received event*/, GstObject* parentofpad/*element that own #recvpad */, GstEvent* event)
{
	GstObtSrc* src = GST_OBT_SRC(parentofpad);

	switch (GST_EVENT_TYPE(event)) {
	case GST_EVENT_CAPS:
		//do something
		break;
	case GST_EVENT_EOS:
		//do something
		break;
	//case ....
	//....
	default:
		//do something
		break;
	}
	
	return true;
}

/***************************************** Local Funcs [START] *****************************************/

gchar* 

/***************************************** Local Funcs [END] *****************************************/







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值