Armadilloフォーラム

GStreamerのavdec_bmpによるBMPファイル表示

ce_fono

2015年9月22日 14時04分

本田です。

GStreamerのavdec_bmpエレメントを使ったBMPファイルの表示が出来ません。
コマンドの間違いがありましたら、ご指摘願います。
試した表示コマンドは以下のものです。

gst-launch-1.0 --gst-debug-no-color --gst-debug-level=5 \
-e filesrc location=/mnt/sdcard/smpte_800x480.bmp \
! image/bmp ! avdec_bmp \
! videoconvert ! fbdevsink device=/dev/fb1 2> /home/ftp/pub/error.txt

上記コマンドで採取したログおよびコンソール出力と表示に使用したBMPファイルを添付します。
表示に使用したBMPファイルは、avenc_bmpエレメントを使った以下のコマンドで作成しています。

gst-launch-1.0 videotestsrc num-buffers=1 \
! video/x-raw,width=800,height=480,framerate=1/1 \
! videoconvert ! video/x-raw,format=BGR \
! avenc_bmp ! queue ! filesink location=/mnt/sdcard/smpte_800x480.bmp

試した環境の情報です。
カーネル: linux-a840-v1.11.bin.gz
ユーザーランド: romfs-a840-v1.09.img.gz

採取したログを見ると12925行目に最初のエラーlibav :0:: not enough data (4096 < 1152054)があります。
また13261行目以降にlibav :0:: bad magic numberのエラーが何回も現れています。
BMPファイルヘッダの解析に失敗しているように見えます。

GStreamer(というかgst-launch)でBMPファイルを表示する事例をネットで探しましたが見つかりませんでした。
たまたまavenc_bmpによるファイル保存が成功したのでavdec_bmpで表示できるかと思い、はまっています。

よろしくお願い致します。

ファイル ファイルの説明
console_txt.zip コンソール出力
gst_log_txt.zip gst-launch-1.0のログ
smpte_800x480_bmp.zip 表示に使用したBMPファイル
コメント

> BMPファイルヘッダの解析に失敗しているように見えます。

失敗するファイル、ありますね。ちゃんと表示されるものとされないものがあるみたいです。
詳しく調査していませんが、 imagemagick の convert で変換すると、正しく表示されました。

imagemagick の identify で変換前後の差分をとってみたのですが、v3 と gammaくらいしか
差がないです。v3 はダメなのかな?とおもったら、v3でも表示されるものがありました。

identify では、差がでないなにかなんですね。

--- /tmp/bad    2015-09-22 16:31:59.041005601 +0900
+++ /tmp/good    2015-09-22 16:31:54.609001883 +0900
@@ -1,5 +1,5 @@
-Image: /tmp/bad.bmp
-  Format: BMP3 (Microsoft Windows bitmap image (V3))
+Image: /tmp/good.bmp
+  Format: BMP (Microsoft Windows bitmap image)
   Class: PseudoClass
   Geometry: 81x70+0+0
   Resolution: 28.34x28.34
@@ -321,7 +321,6 @@
        254: (254,254,254) #FEFEFE gray(254)
        255: (255,255,255) #FFFFFF gray(255)
   Rendering intent: Perceptual
-  Gamma: 0.454545
   Chromaticity:
     red primary: (0.64,0.33)
     green primary: (0.3,0.6)
@@ -340,14 +339,14 @@
   Compression: Undefined
   Orientation: Undefined
   Properties:
-    date:create: 2015-09-22T16:31:42+09:00
-    date:modify: 2015-09-22T16:31:42+09:00
+    date:create: 2015-09-22T16:31:37+09:00
+    date:modify: 2015-09-22T16:31:37+09:00
     signature: 4d91b95947b0a10f8a80f568e748f9d5d4a45688e66a89a0c015d7111af18be5
   Artifacts:
-    filename: /tmp/bad.bmp
+    filename: /tmp/good.bmp
     verbose: true
   Tainted: False
-  Filesize: 6.96KB
+  Filesize: 5.32KB
   Number pixels: 5.67K
   Pixels per second: 5.67EB
   User time: 0.000u

画像表示には、imagefreeze が便利かもしれません。 sink 部分は適当に差し替えてください

... videoconvert ! imagefreeze ! autovideosink

提案ありがとうございます。
imagefreezeを試しましたが改善されませんでした。libavでエラーが発生しているから当たり前?

gst-launch-1.0 -e filesrc location=/mnt/sdcard/smpte_800x480.bmp \
! image/bmp ! avdec_bmp \
! videoconvert ! imagefreeze ! fbdevsink device=/dev/fb1

GStreamerによるBMPファイルの表示は断念します。

> GStreamerによるBMPファイルの表示は断念します。

GStreamer で、BMPを表示したい理由を聞いても良いでしょうか?

GStreamer を使ったビデオアプリで cheese[1] というのがあります。
このアプリでもキャプチャーは GStreamer の camerabin[2] を使っていますが、
画像/thumbnailの表示[3]は、gdk_pixbuf[4] をつかっています。

これは参考になりますか?

[1]: https://wiki.gnome.org/Apps/Cheese
[2]: https://git.gnome.org/browse/cheese/tree/libcheese/cheese-camera.c#n1581
[3]: https://git.gnome.org/browse/cheese/tree/src/thumbview/cheese-thumbnail…
[4]: https://developer.gnome.org/gdk-pixbuf/stable/

ps. cheese は、ATDEの中にもはいっているので、開発環境に webカメラを繋げば
動作すると思います。

単に 24bitRGB 非圧縮という要件だけで良いのあれば、
昔ながらのppmだと簡単に表示できました。

作成:

gst-launch-1.0 videotestsrc num-buffers=1 ! \
video/x-raw,width=800,height=480,framerate=1/1 ! \ 
avenc_ppm ! filesink location=some_image.ppm

表示:

fbsplash -s some_image.ppm -d /dev/fb0