15
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GStreamerAdvent Calendar 2015

Day 2

CoreElements について

Last updated at Posted at 2015-12-02

CoreElements とは

名前の通り、基本的な Element群のことです。
Linux 使いならcat, echo, grep, sed... などイメージしてもらうと近いかも...?

CoreElement 一覧

Linux, Windows で fdsrc といった OS に依存する部分以外はまったく同じであることがわかります。

@Debian (testing: gstreamer 1.6.1)

$ gst-inspect-1.0|grep core|sort
coreelements:  capsfilter: CapsFilter
coreelements:  concat: Concat
coreelements:  downloadbuffer: DownloadBuffer
coreelements:  fakesink: Fake Sink
coreelements:  fakesrc: Fake Source
coreelements:  fdsink: Filedescriptor Sink
coreelements:  fdsrc: Filedescriptor Source
coreelements:  filesink: File Sink
coreelements:  filesrc: File Source
coreelements:  funnel: Funnel pipe fitting
coreelements:  identity: Identity
coreelements:  input-selector: Input selector
coreelements:  multiqueue: MultiQueue
coreelements:  output-selector: Output selector
coreelements:  queue2: Queue 2
coreelements:  queue: Queue
coreelements:  streamiddemux: Streamid Demux
coreelements:  tee: Tee pipe fitting
coreelements:  typefind: TypeFind
coreelements:  valve: Valve element

@Windows (msys: gstreamer 1.6.1)

$  gst-inspect-1.0|grep core|sort    
coreelements:  capsfilter: CapsFilter
coreelements:  concat: Concat
coreelements:  downloadbuffer: DownloadBuffer
coreelements:  fakesink: Fake Sink
coreelements:  fakesrc: Fake Source
coreelements:  filesink: File Sink
coreelements:  filesrc: File Source
coreelements:  funnel: Funnel pipe fitting
coreelements:  identity: Identity
coreelements:  input-selector: Input selector
coreelements:  multiqueue: MultiQueue
coreelements:  output-selector: Output selector
coreelements:  queue: Queue
coreelements:  queue2: Queue 2
coreelements:  streamiddemux: Streamid Demux
coreelements:  tee: Tee pipe fitting
coreelements:  typefind: TypeFind
coreelements:  valve: Valve element

CoreElements をいくつか使ってみる

GStreamer のパイプラインアーキテクチャの基本となる Element 群ですから、一度触っておいても損はありません。
以下は Linux で触ってみる場合を紹介しています。また、windows の場合は ximagesinkd3dvideosink または autovideosink に置き換えると動きます。

queue

#!/bin/sh

gst-launch-1.0 videotestsrc ! queue ! ximagesink

いわゆる、スタックとキューの「キュー」です。
videotestsrc ! ximagesink と見た目は変わりませんが、gdb などで thread を見てみると queue の有無で thread 数が違うので、確認してみてくださいね。

また、thread 数の違いの理由については 1日目 のスライドに書いていたはず...

tee

linux のコマンドの tee と同じです。

パイプラインを1 to Nにします。
忘れがちなのですが、tee を使った時には、以下のように queue を使う必要があります。

なんで動かないかについても、 1日目のスライドに書いてたような、書いてなかったような...

#!/bin/sh

gst-launch-1.0 -q \
videotestsrc ! tee name=t \
t. ! queue ! ximagesink \
t. ! queue ! ximagesink \
t. ! queue ! ximagesink \
t. ! queue ! ximagesink

concat

これも Linux のコマンドの concat と同じです。

num-buffers という videotestsrc から 何枚バッファを取り出すか のオプションを設定しないと、どんなエレメントなのか実感できないので注意です。

#!/bin/sh

gst-launch-1.0 \
concat name=c ! videoconvert ! ximagesink \
videotestsrc num-buffers=100 pattern=ball ! c. \
videotestsrc num-buffers=100              ! c.

valve`

ご存じ、バルブです。

drop=true に設定すれば、下流にバッファが流れなくなり、
drop=false にすれば、下流にバッファが流れるようになります。

#!/bin/sh

gst-launch-1.0 videotestsrc ! valve drop=true ! ximagesink

gst-launch を使う範囲ではたぶんお世話になることがなさそう...

複数の src element から入力を受けて、まとめて1枚の画面にしたりする時で、「いまはここの入力だけ表示したい!」なんてことをするためには使えそうですね。

identity

とっても便利な filter element です。

以下のように指定すると、50% ほどフレームドロップします。
実行しみると「カクカク」するはずです。

#!/bin/sh

gst-launch-1.0 videotestsrc pattern=ball ! identity drop-probability=0.5 ! ximagesink

また、identity にはとっても便利な handoff という Element Signal があります。

これは、identity が下流にバッファを渡す直前に発生するシグナルで、このシグナルに対するコールバックを書くことで、どんなバッファを下流に渡そうとしているか?などをチェックすることができます。

typefind

どんなデータかを調べてくれます(-vオプションつければユーザーに教えてくれます)

具体的には、以下のような jpegファイルを typefind に食わせると

#!/bin/sh

gst-launch-1.0 -v filesrc location=hello.jpg ! typefind ! fakesink

このような結果が得られます。

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
/GstPipeline:pipeline0/GstTypeFindElement:typefindelement0.GstPad:src: caps = "image/jpeg\,\ width\=\(int\)400\,\ height\=\(int\)400\,\ sof-marker\=\(int\)0"
/GstPipeline:pipeline0/GstFakeSink:fakesink0.GstPad:sink: caps = "image/jpeg\,\ width\=\(int\)400\,\ height\=\(int\)400\,\ sof-marker\=\(int\)0"
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:00.000508308
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

大事なのは...

"image/jpeg\,\ width\=\(int\)400\,\ height\=\(int\)400\,\ sof-marker\=\(int\)0"

image/jpegwidth, height = 400 のファイルであるということがわかりました!

さて、なにに使うでしょう?

どんなファイルなのかをチェックする機構があれば、動的に使用するElementを変えることができます。

つまり deocodebin のようなことを自前で書けるようになり、書けるアプリの幅が広がります :)

まとめ

いくか CoreElements を見てみました。

よく使われている omxh264dec の中がどうなっているか? autovidoesink の中がどうなっているのか? が垣間見えたかもしれませんね。

基本的な要素を知っておけば、応用がききますし、車輪の再発明をしなくて済みます。

今日はそんな内容でした。

明日は msys2 を使って windows 上で GStreamer と戯れる方法をご紹介しますー

15
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?