*

GStreamer Tips #1 / Still Image

   

GStreamer Tips : GStreamerに関わる忘備録
第一回目の今回は、静止画像(Still Image)表示について動作確認してみます。

静止画像といっても、その種類はかなりあるようです。とても全てについて触れることはできません。
そこでここでは、BMP/GIF/TIFF/PPM/JPEG/PNG の6種のメジャーな形式を取り上げたいと思います。
GStreamerのpipelineについては汎用タイプ(playbin,uridecodebin)、個別タイプ(filesrc)共に確認したいと思います。

使用実機(PC) : x86_64 Ubuntu 16.04.3 LTS
GStreamer Version : 1.12.3(2017/10時点のstable)
使用画像 : lena256.xxx(ご存知 画像処理界のアイドル レナ嬢です。)

【BMPファイル】
BMPファイルは32bit(アルファ付き)、24bit(アルファなし)があるようですが、ここではアルファなしを使用しています。

export BMPF=/xxxx/lena256.bmp

gst-launch-1.0 -e uridecodebin uri=file://$BMPF ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e uridecodebin uri=file://$BMPF ! videoconvert ! imagefreeze ! ximagesink

gst-launch-1.0 -e playbin uri=file://$BMPF video-sink=”imagefreeze ! ximagesink” flags=0x00000001

gst-launch-1.0 -e filesrc location=$BMPF ! gdkpixbufdec ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e filesrc location=$BMPF ! gdkpixbufdec ! videoconvert ! imagefreeze ! ximagesink

汎用タイプ(uridecodebinとplaybin)の場合、使用するdecoderをオートプラッグしてくれます。
playbinタイプでは、video用のsinkプロパティ(video-sink)は無指定で動作してくれれば何も言うことはなかったのですがそうはいきません。
video-sink には videoconvertの指定は不要のようで、playbin内でconvert後に続くelementにデータを渡しているようですね。
playbinのflagsプロパティには0x00000001 としてvideoのみとしないとwarninngが発生します。(バグっぽいです。)

個別タイプ(filesrc)の場合、必要なelementを全てpipelineに指定しなければなりません。
bmp用のdecoder(avdec_bmp)がgst-libavパッケージにありこれを指定しましたが動作しなかったです。
静止画表示は無理なのかもしれません、multifilesrcでの複数画像のレンダリングは可能なのですが….
複数画像のレンダリングは後日改めて確認したいと思います。(尚、gst-libavは local snapshot な状態です。)

しかたなくgdkpixbufを使用することで回避しました。(decodebinでもよいです。)

汎用/個別どちらも imgefreeze が必要です。これで1frameしかない静止画像を表示状態でキープすることができます。
これがないと一瞬チラッと表示し、終了してしまいます。

【GIFファイル】

export GIFF=/xxxx/lena256.gif

gst-launch-1.0 -e uridecodebin uri=file://$GIFF ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e uridecodebin uri=file://$GIFF ! videoconvert ! imagefreeze ! ximagesink

gst-launch-1.0 -e playbin uri=file://$GIFF video-sink=”imagefreeze ! ximagesink” flags=0x00000001

gst-launch-1.0 -e filesrc location=$GIFF ! gdkpixbufdec ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e filesrc location=$GIFF ! gdkpixbufdec ! videoconvert ! imagefreeze ! ximagesink

bmpファイルとまったく同じです。
gst-libavには該当のdecoderはありません。

【TIFFファイル】

export TIFF=/xxxx/lena256.tif

gst-launch-1.0 -e uridecodebin uri=file://$TIFF ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e uridecodebin uri=file://$TIFF ! videoconvert ! imagefreeze ! ximagesink

gst-launch-1.0 -e playbin uri=file://$TIFF video-sink=”imagefreeze ! ximagesink” flags=0x00000001

gst-launch-1.0 -e filesrc location=$TIFF ! gdkpixbufdec ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e filesrc location=$TIFF ! gdkpixbufdec ! videoconvert ! imagefreeze ! ximagesink

bmpファイルとまったく同じです。
gst-libavには該当のdecoder(avdec_tiff)がありましたがやはり動作しません。

【PPMファイル】

export PPMF=/xxxx/lena256.ppm

gst-launch-1.0 -e uridecodebin uri=file://$PPMF ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e uridecodebin uri=file://$PPMF ! videoconvert ! imagefreeze ! ximagesink

gst-launch-1.0 -e playbin uri=file://$PPMF video-sink=”imagefreeze ! ximagesink”

gst-launch-1.0 -e filesrc location=$PPMF ! gdkpixbufdec ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e filesrc location=$PPMF ! gdkpixbufdec ! videoconvert ! imagefreeze ! ximagesink

gst-launch-1.0 -e filesrc location=$PPMF ! pnmdec ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e filesrc location=$PPMF ! pnmdec ! videoconvert ! imagefreeze ! ximagesink

bmpファイルとの違いは、gst-pluguins-badにpnmdecという専用decoderがあります。
gst-libavには該当のdecoder(avdec_ppm)がありましたがやはり動作しません。
playbinタイプの場合にflagsプロパティの指定が不要なところです。ここら辺りの微妙な違いは….です。

【JPGファイル】

export JPGF=/xxxx/lena256.jpg

gst-launch-1.0 -e uridecodebin uri=file://$JPGF ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e uridecodebin uri=file://$JPGF ! videoconvert ! imagefreeze ! ximagesink

gst-launch-1.0 -e playbin uri=file://$JPGF video-sink=”imagefreeze ! ximagesink”

gst-launch-1.0 -e filesrc location=$JPGF ! gdkpixbufdec ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e filesrc location=$JPGF ! gdkpixbufdec ! videoconvert ! imagefreeze ! ximagesink

gst-launch-1.0 -e filesrc location=$JPGF ! jpegdec ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e filesrc location=$JPGF ! jpegdec ! videoconvert ! imagefreeze ! ximagesink

ppmファイルとほぼ同じです。
こちらもgst-pluguins-goodにjpegdecという専用decoderがあります。
gst-libavには該当のdecoderはありません。(avdec_jpeg2000、avdec_jpeglsはありますが該当ではないです。)

【PNGファイル】

export PNGF=/xxxx/lena256.png

gst-launch-1.0 -e uridecodebin uri=file://$PNGF ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e uridecodebin uri=file://$PNGF ! videoconvert ! imagefreeze ! ximagesink

gst-launch-1.0 -e playbin uri=file://$PNGF video-sink=”imagefreeze ! ximagesink”

gst-launch-1.0 -e filesrc location=$PNGF ! gdkpixbufdec ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e filesrc location=$PNGF ! gdkpixbufdec ! videoconvert ! imagefreeze ! ximagesink

gst-launch-1.0 -e filesrc location=$PNGF ! pngdec ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e filesrc location=$PNGF ! pngdec ! videoconvert ! imagefreeze ! ximagesink

JPGファイルとまったく同じです。
こちらもgst-pluguins-goodにpngdecという専用decoderがあります。
gst-libavには該当のdecoder(avdec_png)がありましたがやはり動作しません。

このようにみていくと、すくなくとも上記6種類の静止画表示は、ファイルタイプを意識せずに
以下のpipelineで対応できそうです。

  
gst-launch-1.0 -e uridecodebin uri=file://<file name> ! imagefreeze ! videoconvert ! ximagesink
gst-launch-1.0 -e playbin uri=file://<file name> video-sink=”imagefreeze ! ximagesink” flags=0x00000001
gst-launch-1.0 -e filesrc location=<file name> ! gdkpixbufdec ! imagefreeze ! videoconvert ! ximagesink

ちなみにgdkpixbufdecの詳細をgst-inspect-1.0でみてみると

Factory Details:
  Rank                     secondary (128)
  Long-name                GdkPixbuf image decoder
  Klass                    Codec/Decoder/Image
  Description              Decodes images in a video stream using GdkPixbuf
  Author                   David A. Schleef <ds@schleef.org>, Renato Filho <renato.filho@indt.org.br>

Plugin Details:
  Name                     gdkpixbuf
  Description              GdkPixbuf-based image decoder, overlay and sink
  Filename                 /home/lineo/gst/1.12/gst-plugins-good/ext/gdk_pixbuf/.libs/libgstgdkpixbuf.so
  Version                  1.12.3
  License                  LGPL
  Source module            gst-plugins-good
  Source release date      2017-09-18
  Binary package           GStreamer Good Plug-ins source release
  Origin URL               Unknown package origin

GObject
 +----GInitiallyUnowned
       +----GstObject
             +----GstElement
                   +----GstGdkPixbufDec

Pad Templates:
  SRC template: 'src'
    Availability: Always
    Capabilities:
      video/x-raw
                 format: RGB
                  width: [ 1, 2147483647 ]
                 height: [ 1, 2147483647 ]
              framerate: [ 0/1, 2147483647/1 ]
      video/x-raw
                 format: RGBA
                  width: [ 1, 2147483647 ]
                 height: [ 1, 2147483647 ]
              framerate: [ 0/1, 2147483647/1 ]

  SINK template: 'sink'
    Availability: Always
    Capabilities:
      image/png
      image/gif
      image/x-icon
      application/x-navi-animation
      image/x-cmu-raster
      image/x-sun-raster
      image/x-pixmap
      image/tiff
      image/x-portable-anymap
      image/x-portable-bitmap
      image/x-portable-graymap
      image/x-portable-pixmap
      image/bmp
      image/x-bmp
      image/x-MS-bmp
      image/vnd.wap.wbmp
      image/x-bitmap
      image/x-tga
      image/x-pcx
      image/svg
      image/svg+xml


Element Flags:
  no flags set

Element Implementation:
  Has change_state() function: gst_gdk_pixbuf_dec_change_state

Element has no clocking capabilities.
Element has no URI handling capabilities.

Pads:
  SINK: 'sink'
    Pad Template: 'sink'
  SRC: 'src'
    Pad Template: 'src'

Element Properties:
  name                : The name of the object
                        flags: 読み込み可能, 書き込み可能
                        String. Default: "gdkpixbufdec0"
  parent              : The parent of the object
                        flags: 読み込み可能, 書き込み可能
                        Object of type "GstObject"
 

となっており、SINK template の Capabilities に対応可能なファイルタイプが分かります。

今回はここまでです。

 - 未分類