GStreamer で element
blog
2020-8-31 18:38 JST

引き続き gstreamer をつかってみますよ。今度は簡単に element を作ってみます。

Element を作る

gstreamer を"使う"という資料は日本語の資料が多いのですがなぜか gstreamer で element を作るという資料は非常に少ない。一番参考になったのがここここの通りにやればできちゃうはず、、、、

がうまくいきませんでした。悪戦苦闘した結果 gsttext というキーワード(?)がだめみたい。たぶんバージョン変わったか何かして動かなくなったんでしょうね。ブログにソースは張り付いているので拝借しました。

チュートリアルを github 上に作った

誰でもうまく行くを目指して github にチュートリアルをつくってみました。取り敢えず手元ではうまく動きました。step0 から step3 まで実行すればできるはず。

公式チュートリアルを使う

これがどういうわけか動かない(blob: 68102a52)。なんででしょうね?というか決定的に欠けてます。

公式チュートリアル通りに公式レポジトリから clone して gst-plugin/src に移動して ../tool/make_element FilterZero として、meson buildしてもエラーになりますよ。

gst-plugin/meson.build

meson は Python 風の構文をつかってます(Python ではない)。meson.build 内で gst_version と api_version が定義されてません。meson をよくわかっていないけど、project がいるんじゃないの?gst_dep も plugins_install_dir もない

ふときがつくと上の階層に meson.build があります。まじか~。上の階層で build すればよいようです。修正しちゃったよ。悔しいから diff つける。

diff --git a/gst-plugin/meson.build b/gst-plugin/meson.build
index 9a26d8b..fb659ab 100644
--- a/gst-plugin/meson.build
+++ b/gst-plugin/meson.build
@@ -1,14 +1,19 @@
+project('gst-template-plugins', 'c', version : '0.0')
+
 plugin_c_args = ['-DHAVE_CONFIG_H']

 cdata = configuration_data()
-cdata.set_quoted('PACKAGE_VERSION', gst_version)
+cdata.set_quoted('PACKAGE_VERSION', '1.0')
 cdata.set_quoted('PACKAGE', 'gst-template-plugin')
 cdata.set_quoted('GST_LICENSE', 'LGPL')
-cdata.set_quoted('GST_API_VERSION', api_version)
+cdata.set_quoted('GST_API_VERSION', '1.0')
 cdata.set_quoted('GST_PACKAGE_NAME', 'GStreamer template Plug-ins')
 cdata.set_quoted('GST_PACKAGE_ORIGIN', 'https://gstreamer.freedesktop.org')
 configure_file(output : 'config.h', configuration : cdata)

+gst_dep = dependency('gstreamer-1.0', version : '>1.0')
+plugins_install_dir = '/opt'
+
 gstaudio_dep = dependency('gstreamer-audio-1.0',

gst-plugin/src で make_element

気を取り直して、再度 ../tool/make_element FilterZeroとして、meson.build に付け加えて meson buildしてもコンパイルエラー(GST_FILTERZERO が undefined)。

undefined reference to `GST_FILTERZERO'

ソースをよく見ると置換に失敗しているようです。make_element で header を出力するところ。ちゃんと置換されるように make_element を書き直します。ついでに meson.build も追加。これちゃんと書かないとうまく動く so 作ってくれない。

参考までに付け加えると library の第一引数 gstfilterzeroexample じゃだめだった。たぶん GST_PLGIN_DEFINE のマクロと関連している。こういう暗黙の掟があるのがこの手のビルドシステムのいやらしいところ。C という言語の外だからね。おまじない。おまじないは論理的に追うのが難しい。

gst-template> git diff
diff --git a/gst-plugin/meson.build b/gst-plugin/meson.build
index 9a26d8b..7408446 100644
--- a/gst-plugin/meson.build
+++ b/gst-plugin/meson.build
@@ -37,3 +37,16 @@ gstaudiofilterexample = library('gstaudiofilterexample',
   install : true,
   install_dir : plugins_install_dir,
 )
+
+# Plugin 3 (filter zero example)
+filterzero_sources = [
+  'src/gstfilterzero.c',
+  ]
+
+gstfilterzeroexample = library('gstfilterzero',
+  filterzero_sources,
+  c_args: plugin_c_args,
+  dependencies : [gst_dep, gstaudio_dep],
+  install : true,
+  install_dir : plugins_install_dir,
+)
diff --git a/gst-plugin/tools/make_element b/gst-plugin/tools/make_element
index 3ae7d18..7a33c53 100755
--- a/gst-plugin/tools/make_element
+++ b/gst-plugin/tools/make_element
@@ -65,7 +65,7 @@ if [ -e $srcfile_h ]; then
        -e "s/GstPluginTemplate/Gst$Template/g" 
        -e "s/gst_plugin_template/gst_$template_/g" 
        -e "s/gst_type_plugin_template/gst_$template_/g" 
-       -e "s/GST_PLUGIN_TEMPLATE/GST_$TEMPLATE/g" 
+       -e "s/PLUGIN_TEMPLATE/$TEMPLATE/g" 
        -e "s/GST_TYPE_PLUGIN_TEMPLATE/GST_TYPE_$TEMPLATE/g" 
        -e "s/GST_IS_PLUGIN_TEMPLATE/GST_IS_$TEMPLATE/g" 
        -e 's/$I[d]: ([^$]*)$/1/g' 

リンク集