GStreamerカスタムエレメントの作成方法を調べたのでメモ。
上記ページではSinkエレメントを作成してるが、今回はtransformエレメントを作成する。
とりあえず、参考ページと似たような感じで作成していく。
$ cd ~/work/src/gst/ $ git clone https://github.com/GStreamer/gst-plugins-bad.git $ cd gst-plugins-bad $ git checkout -b w1.16.3 1.16.3 $ sudo apt install autopoint automake $ NOCONFIGURE=1 ./autogen.sh $ sudo cp common/gst-indent /usr/local/bin/ $ sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev indent
$ mkdir myconv $ cd myconv/ $ ~/work/src/gst/gst-plugins-bad/tools/gst-element-maker myconv basetransform
自動生成されたソースコードの以下三か所を改変。
/* pad templates */ static GstStaticPadTemplate gst_myconv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("YUY2")) ); static GstStaticPadTemplate gst_myconv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("YUY2")) );
base_transform_class->transform_caps = GST_DEBUG_FUNCPTR (gst_myconv_transform_caps); //base_transform_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_myconv_fixate_caps); base_transform_class->accept_caps = GST_DEBUG_FUNCPTR (gst_myconv_accept_caps);
static gboolean gst_myconv_query (GstBaseTransform * trans, GstPadDirection direction, GstQuery * query) { gboolean ret = FALSE; GstMyconv *myconv = GST_MYCONV (trans); GST_DEBUG_OBJECT (myconv, "query: GST_QUERY_TYPE (query)=%d", GST_QUERY_TYPE (query)); switch (GST_QUERY_TYPE (query)) { default: { ret = GST_BASE_TRANSFORM_CLASS(gst_myconv_parent_class)->query (trans, direction, query); } break; } GST_DEBUG_OBJECT (myconv, "query"); return ret; }
以下のようなMakefileを作成しビルドする。
TARGET = libgstmyconv.so OBJS = gstmyconv.o CC = gcc PACKAGES = gstreamer-1.0 gstreamer-base-1.0 CFLAGS = -Wall -fPIC $(shell pkg-config --cflags $(PACKAGES)) LDLIBS = $(shell pkg-config --libs $(PACKAGES)) $(TARGET): $(OBJS) $(CC) -shared -o $@ $< $(LDLIBS) clean: rm -f $(TARGET) $(OBJS) install: $(TARGET) mkdir -p ${HOME}/.local/share/gstreamer-1.0/plugins/ cp $(TARGET) ${HOME}/.local/share/gstreamer-1.0/plugins/
以下のようなコマンドを実行すると、再生されていることがわかる。
$ gst-launch-1.0 videotestsrc is-live=1 ! myconv ! fakesink -v