GStreamerカスタムエレメントの作成方法

GStreamerカスタムエレメントの作成方法を調べたのでメモ。

参考↓ 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