GStreamer pwg ch. 3
1. Constructing the Boilerplate
boilerplate: 표준문안
1.1. Getting the GStreamer plugin templates
gst-template git module
git clone git://anongit.freedesktop.org/gstreamer/gst-template.git
gst-template/gst-plugin
설치된 libgstreamer1.0이 1.19 보다 낮은 경우 1.18 branch에서 build 해야함
name, version
이런 detail을 boilerplate라고 함
boilerplate 정의 방법
n ./gst-plugin/tools
s make_element tool
s 이거로 boilerplate code 생성 가능
~$ cd gst-template/gst-plugin/src ~$ ../tools/make_element MyFilter |
위와 같이 src 경로에서 실행해야 함
gstmyfilter.c/h를 생성
meson.build를 수정하고 실행
meson build
이후 ninja -C build를 통해 project가 build 되고 install 될 수 있음
meson은 기본으로 /usr/local을 default location으로 선택
/usr/local/lib/gstreamer-1.0을 GST_PLUGIN_PATH에 넣어야 new plugin이 gstreamer에 나타남
element 생성을 위해서 gst-plugins-bad에 있는 gst-element-maker를 사용하기를 권장함
#include <gst/gst.h> /* Definition of structure storing data for this element. */ typedef struct _GstMyFilter { GstElement element; GstPad *sinkpad, *srcpad; gboolean silent; } GstMyFilter; /* Standard definition defining a class for this element. */ typedef struct _GstMyFilterClass { GstElementClass parent_class; } GstMyFilterClass; /* Standard macros for defining types for this element. */ #define GST_TYPE_MY_FILTER (gst_my_filter_get_type()) #define GST_MY_FILTER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MY_FILTER,GstMyFilter)) #define GST_MY_FILTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MY_FILTER,GstMyFilterClass)) #define GST_IS_MY_FILTER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MY_FILTER)) #define GST_IS_MY_FILTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MY_FILTER)) /* Standard function returning type information. */ GType gst_my_filter_get_type (void); GST_ELEMENT_REGISTER_DECLARE(my_filter) |
아래 macro가 있어야 file이 제대로 호출 될 수 있음
G_DEFINE_TYPE (GstMyFilter, gst_my_filter, GST_TYPE_ELEMENT); GST_ELEMENT_REGISTER_DEFINE (my_filter, "my_filter", GST_RANK_NONE, GST_TYPE_MYFILTER); |
GST_ELEMENT_REGISTER_DEFINE과 GST_ELEMENT_REGISTER_DECLARE를 통해 element가 등록 될 수 있음
plugin에
혹은 다른 plugin/application에 의해서 호출 될 수 있음
GST_ELEMENT_REGISTER(my_filter)를 호출하여
1.4. element metadata
element의 기타 정보를 제공
gst_element_class_set_[static_]metadata를 통해서 설정됨
gst_element_class_set_static_metadata (klass,
"An example plugin",
"Example/FirstExample",
"Shows the basic structure of a plugin",
"your name <your.name@your.isp>");
이 정보는 _class_init 함수 내에서 등록됨
static void
gst_my_filter_class_init (GstMyFilterClass * klass) {
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
[..]
gst_element_class_set_static_metadata (element_klass,
"An example plugin",
"Example/FirstExample",
"Shows the basic structure of a plugin",
"your name <your.name@your.isp>");
}
그러나 최근 ver.에서는 다음과 같이 수정되었음
gst_element_class_set_details_simple (gstelement_class, "MyFilter", "FIXME:Generic", "FIXME:Generic Template Element", " <<user@hostname.org>>"); |
1.5. GstStaticPadTemplate
pad의 설명
/* the capabilities of the inputs and outputs. * * describe the real formats here. */ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("ANY") // ANY는 모든 input을 받아들인다는 의미 ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("ANY") ); |
pad도 _class_init 도중에 등록됨
static void gst_my_filter_class_init (GstMyFilterClass * klass) { ... gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&src_factory)); gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&sink_factory)); } |
supported type은 실제로 다음과 같이 설정 될 수 있음
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ( "sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ( "audio/x-raw, " "format = (string) " GST_AUDIO_NE (S16) ", " "channels = (int) { 1, 2 }, " "rate = (int) [ 8000, 96000 ]" ) ); |
{1, 2}는 list임
[8000, 96000]은 range임
여러 type의 설정이 가능하며 ;로 구분하여 기술 할 수 있음
1.6. Constructor Functions
_class_init()
n 1회 초기화를 위해 호출됨
_init()
n 이 type에 대한 특정 instance를 초기화 할 때 사용됨
1.7. The plugin_init function
plugin_init()
- n plugin이 load 된 직후 호출됨
- n 여기서 return 된 정보는 central registry에 caching 됨
- s runtime 조건에 의해 availablity가 변경되어선 안 됨
If an element can only work in certain conditions (for example, if the soundcard is not being used by some other process) this must be reflected by the element being unable to enter the READY state if unavailable, rather than the plugin attempting to deny existence of the plugin.
static gboolean
plugin_init (GstPlugin *plugin) {
return GST_ELEMENT_REGISTER (my_filter, plugin);
}
GST_PLUGIN_DEFINE (
GST_VERSION_MAJOR,
GST_VERSION_MINOR,
my_filter,
"My filter plugin",
plugin_init,
VERSION,
"LGPL",
"GStreamer",
"http://gstreamer.net/"
)
'Multimedia > GStreamer' 카테고리의 다른 글
GStreamer application development guide (0) | 2021.12.22 |
---|---|
GStreamer plugin writer's guide: part 1 (0) | 2021.12.22 |
GStreamer pwg ch 4~6 (0) | 2021.12.22 |
GStreamer pwg ch 7 ~ 9 (0) | 2021.12.22 |
GStreamer pwg ch 11 (0) | 2021.12.22 |
댓글