Reference :
源码(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] *****************************************/