Multimedia/GStreamer

GStreamer pwg ch. 3

Roien 2021. 12. 22.
반응형

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 해야함

 

 

1.2.     using the project stamp

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를 사용하기를 권장함

 

 

1.3.     Examining the basic code

 

#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

댓글