今日からから使える GStreamer の環境変数


このネタが GStreamer アドベントカレンダー最終日の記事としてふさわしいかどうかは別として、

アドベントカレンダー内で **環境変数** の話をしていないことに
気づいてしまったのでこれを書くことにしました！

### 情報源

英語を積極的に読む方は、Running GStreamer Applications を参照してください。
これから説明する内容はすべてここに書かれています。

- Running GStreamer Applications
  - http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gst-running.html

### この記事で知れること

- GStreamer アプリケーションをデバッグする上で有効な環境変数
- GStreamer plugins の Search path を変更する方法
- GStreamer のパイプラインを可視化する (図にする)
- など

### GStreamer 環境変数まとめ

- GST_PLUGIN_SYSTEM_PATH
- GST_PLUGIN_SYSTEM_PATH_1_0
- GST_PLUGIN_PATH
- GST_PLUGIN_PATH_1_0 
- GST_DEBUG
- GST_DEBUG_COLOR_MODE
- GST_DEBUG_NO_COLOR
- GST_DEBUG_OPTIONS
- GST_DEBUG_DUMP_DOT_DIR
- GST_REGISTRY
- GST_REGISTRY_1_0 
- GST_REGISTRY_FORK
- GST_REGISTRY_UPDATE
- GST_TRACE
- GST_DEBUG_FILE
- ORC_CODE
- G_DEBUG
- G_SLICE
- GST_TAG_ENCODING
- GST_TAG_ID3_ENCODING
- GST_TAG_ID3V1_ENCODING
- GST_GL_WINDOW
- GST_GL_PLATFORM
- GST_GL_API

### 無印 と _1_0 の違いは?

`GST_PLUGIN_PATH`, `GST_PLUGIN_PATH_1_0` など、`_1_0` が付く変数と、
付かない変数がありますが、なにが違うのでしょう?

先ほど紹介した [公式ドキュメント](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gst-running.html) によれば

> The GST_PLUGIN_PATH_1_0 variant is useful if both the old GStreamer 0.10 version and the new GStreamer 1.0 version need to be pointed to new plugin paths. 

`_1_0` を付けるのは、GStreamer 0.10 (古いバージョン) と GStreamer 1.0 (現行バージョン) の
どちらもが新しい PLUGIN_PATH を指す必要がある場合に使う。とのことです。

つまり、GStreamer 1.0 だけ使う場合や、どちらも同じ PATH を示す場合などには
`GST_PLUGIN_PATH` **のみで足りる**ということになります。


### 指定すべきは GST_PLUGIN_SYSTEM_PATH? GST_PLUGIN_PATH?

これは、あなたの目的によります。

ビルドしたプラグインを動かしたい場合などは `GST_PLUGIN_PATH` です。
GStreamer をビルドし、開発バージョンの GStreamer を試したい場合は `GST_PLUGIN_SYSTEAM_PATH` です。

なので、アプリケーション、プラグイン開発者の多くは `GST_PLUGIN_PATH` を指定することになります。

`GST_PLUGIN_SYSTEM_PATH` は `gst-launch` などの GStreamer アプリケーションが
プラグインを探すための Search path です。
なので、試しに `GST_PLUGIN_SYSTEM_PATH` をカレントディレクトリに指定すると、ほとんど見つからなくなります。

```shell-session
$ GST_PLUGIN_SYSTEM_PATH=`pwd` gst-inspect-1.0
staticelements:  bin: Generic bin
staticelements:  pipeline: Pipeline object

Total count: 1 plugin, 2 features
```

また、プラグインが探される順は `GST_PLUGIN_PATH` => `GST_PLUGIN_SYSTEM_PATH` となることを覚えておいてください。

### GST_DEBUG でデバッグ情報を出す

GST_DEBUG によりデバッグレベルを上げることで、ユーザーはより多くの情報を得ることができます。
例えば`queue`からは「現在のどのくらい溜まっているか」などの情報が得られます。

GST_DEBUG はランタイムで発生する問題の解析に非常に有効です。

デバッグレベルは8段階あり深刻度から順に ERROR, WARNING, FIXME, INFO, DEBUG, LOG, TRACE, MEMDUMP となっています。

`gst-launch` で使う場合は以下のように使用します。

```shell-session
$ GST_DEBUG=FIXME gst-launch-1.0 faskesrc ! fakesink
```

また、特定のエレメントだけデバッグレベルを上げたいこともできます。
このようにすることで、fakesink は LOG, それ以外は FIXME というような指定ができます。

```shell-session
$ GST_DEBUG=FIXME,fakesink:LOG gst-launch-1.0 faskesrc ! fakesink
```

さらに、より便利な使い方として `*` があります。
以下のように指定すると `fakesrc`, `fakesink` のデバッグレベルが LOG になり、`queue` には設定されません。

```shell-session
$ GST_DEBUG=fake*:LOG gst-launch-1.0 faskesrc ! queue ! fakesink
```

基本的にはカラーリングされて表示される GStreamer のログですが、
時には色を付けないでほしいシチュエーションが生まれます。

そのときは以下のようにすることで色を付けをやめることができます。

```shell-session
$ GST_DEBUG_NO_COLOR=1 GST_DEBUG=fake*:LOG gst-launch-1.0 faskesrc ! queue ! fakesink
```

### GStreamer パイプラインの画像を生成する

画像を生成するには `graphviz` などの、dot ファイルから画像を出力できるアプリケーションをインストール必要があります。

パイプラインの dot ファイルは `GST_DEBUG_DUMP_DOT_DIR` を指定して取得します。

```shell-session
$ GST_DEBUG_DUMP_DOT_DIR=. gst-launch-1.0 playbin uri=file:///home/shotam/WIN_20151210_01_54_09_Pro.mp4
```

パイプラインを実行すると、パイプラインのSTATEごとに dot ファイルが生成されます。

```shell-session
$ ls
0.00.00.024948963-gst-launch.NULL_READY.dot
0.00.00.297588838-gst-launch.READY_PAUSED.dot
0.00.00.307373873-gst-launch.PAUSED_PLAYING.dot
0.00.04.267717672-gst-launch.PLAYING_PAUSED.dot
0.00.04.279790822-gst-launch.PAUSED_READY.dot
```

PAUSED -> PLAYING が再生しているときの dot ファイルなので、これを画像化します。

```shell-session
$  dot 0.00.00.307373873-gst-launch.PAUSED_PLAYING.dot -Tpng -o foo.png
```

出来上がった画像は↓こちら↓になります。

![foo.png](https://qiita-image-store.s3.amazonaws.com/0/97187/df45114f-03da-9a4b-8118-b4192a4a1fae.png)

`playbin` のなかで何が使われたかが一目瞭然ですね！
bin って中で何使ってるんだろう? と思った時にはこれで確認するのが便利です。

### おわり

今回は、特に役立ちそうな環境変数についてのみ解説しましたので、
必要に応じで公式ドキュメントを参照していただければと思います。

最後に、、、

完全に日付をまたいでの投稿となってしまいましたが、
これで、2015 GStreamer アドベントカレンダー完走です！

期間中見てくださった皆さま本当にありがとうございました！！