MAlib Programming FAQ

MAlibの導入およびプログラミングに関する質問と回答を紹介します。


[質問]

Gtk-WARING とか Gtk-CRITICAL とかボロボロ出てきてわけ分かんないんだけど(下記参照)。 リンダ困っちゃう。

Gtk-WARNING **: invalid cast from `GtkVBox' to `(unknown)'
Gtk-WARNING **: invalid cast from `GtkVBox' to `(unknown)'
Gtk-WARNING **: invalid class type `GtkDrawingArea' in cast to `(unknown)'
Gtk-CRITICAL **: file gtksignal.c: line 725 (gtk_signal_connect):
assertion `GTK_IS_OBJECT (object)' failed.
Gtk-WARNING **: invalid class type `GtkDrawingArea' in cast to `(unknown)'
Gtk-CRITICAL **: file gtksignal.c: line 725 (gtk_signal_connect):
assertion `GTK_IS_OBJECT (object)' failed.
GLib-CRITICAL **: file ghash.c: line 138 (g_hash_table_lookup):
assertion `hash_table != NULL' failed.
Gtk-WARNING **: gtk_type_create(): unknown parent type `21'.
Gtk-CRITICAL **: file gtkwidget.c: line 3822 (gtk_widget_set_events):
assertion `GTK_IS_WIDGET (widget)' failed.
GLib-CRITICAL **: file ghash.c: line 138 (g_hash_table_lookup):
assertion `hash_table != NULL' failed.
Gtk-WARNING **: gtk_type_create(): unknown parent type `21'.
Gtk-CRITICAL **: file gtkwidget.c: line 1555 (gtk_widget_show_all):
assertion `GTK_IS_WIDGET (widget)' failed.

[回答]

malib_init() を忘れているようです。最初に必ず実行して下さい。

[質問]

最新のMAlibパッケージをダウンロードしてきたのに、 コンパイルできないことがあるんだけど、どうしたらいいの?

./configure --with-mng として make したらこんなエラーがでたよ。

In file included from ../../malib/malib.h:27,
                 from mng_reader.h:29,
                 from mng_reader.c:20:
../../malib/dc1394/dc1394.h:28: libraw1394/raw1394.h: No such file or directory
../../malib/dc1394/dc1394.h:29: libdc1394/dc1394_control.h: No such file or directory

[回答]

このようなエラーが出る場合には、 我々がパッケージを作る際にいくつかのファイルの更新を忘れています。 autoconf や automake がインストールされているなら、 試しに aclocal -I config; autoheader; automake; autoconf と入力してから再度 configure を実行してみるとうまくいくかもしれません。 それでもうまくいかない場合には、 エラーレポートを送ってパッケージが更新されるのを待ちましょう。

[質問]

(1) FreeBSD で使いたいんだけど、./configure も実行できないよ。 どうしたらいいの?

(2) GLIB_CONFIG と GTK_CONFIG を設定したら ./configure はできたけど、 make すると何もコンパイルされずにこんなエラーがでたよ。

malib/Makefile, line XXX: Need an operator
make: fatal errors encountered -- cannot continue

(3) configure.inとMakefile.am などがあるので、試しに aclocal -I config; autoheader; automake; autoconf を実行したら、WARNINGはでるし、できた configure は実行できないよ。 どうしたらいいの?

[回答]

(1) MAlibをはじめとする glibやgtk を使うアプリケーションをコンパイルするためには、glibやgtk のヘッダファイルやライブラリのあるディレクトリなどの設定するために、 glib-config,gtk-config というコマンドを使います。 ところが、FreeBSDではglibやgtkのバージョンを区別をするために それぞれ glib12-config, gtk12-config という名前になっています。 そこで、以下のように環境変数を設定してから configure を実行します。

GLIB_CONFIG=/usr/local/bin/glib12-config \
GTK_CONFIG=/usr/X11R6/bin/gtk12-config \
./configure

(2) FreeBSDやNetBSDでは通常のmakeコマンドは GNU make ではないため、 configure で生成されたMakefile をうまく扱えません。そこで、 make の代わりに gmake というコマンド使います。

(3) 自分で configure を作るには、automake, autoconf, libtool が必要なんだけど、 今のところ automake と autoconf の最新版(それぞれ1.5 と 2.53) には対応していないんだ。 そういうわけで automake は 1.4、 autoconf は 2.13 といったバージョンを使う必要があるんだ。 例えば、FreeBSDの場合には automake14, autoconf213 というコマンドが用意されているので、それらを実行してみて。

[質問]

カメラを接続したいんだけど、何がお薦めなの?

[回答]

コストを無視すれば、 画質(画面サイズ、フレームレート)を重視するなら IEEE1394カメラを使うのがお薦め。 Linuxでは動かせるようになるまでがちょっと面倒なんだ。 接続方法はCマガジンの2002年11月号に簡単に書いたよ。
一番お手軽なのは、USB接続のカメラを使う方法だね。 Logicool製QV-3000Proというカメラがおすすめ。 今は4000っていうのもあるみたいだけど、動作が確認できてないので、 もし使えたら教えてくれるとうれしいな。 ちなみに Creative のWebCam 5 は動かないものもあるんで、要注意だね。
キャプチャカードもまあまあ画質がいいよ。 ただ、MPEGハードエンコーダ搭載のボードは使えないから気をつけて。 買う時は、チップを使っているかどうか確認して。 BT8x8シリーズなら大丈夫だとまず思うよ。

[質問]

格納されているイメージデータのデータ型は何ですか ? MalibFrame の data メンバは void* 型のようですが、実際のところは何 ?

[回答]

RGB、GRAY の場合は int* で、BW の場合は unsigned char* です。 また、BW の値は 1 (MALIB_FRAME_BW_WHITE) または 0 (MALIB_FRAME_BW_BLACK) のいずれかをとります。

[質問]

MalibBwDotRemove ってどんなフィルタ ?

[回答]

白黒画像の細かいノイズを消すためのフィルタです。 白黒画像の周囲8ピクセルのうち、6ピクセル以上が他の値の場合は中心の値をその値にします。

[質問]

MalibGtkDisplay で表示される Window のタイトルを設定したいのだけど、どうすればいい ?

[回答]

malib_gtkdisplay_get_window () を使うと、GtkWindow 型のオブジェクトへのポインタを取得できます。あとは、GTK+ の関数 gtk_window_set_title () など自由にご利用下さい。

コーディング例:

MalibGtkDisplay* disp = malib_gtkdisplay_new ();
GtkWindow* window = malib_gtkdisplay_get_window (disp);
gtk_window_set_title (disp, "title as you like");

[質問]

フィルタをたくさん作ると、クラスの数が爆発してしまうのだけど…

[回答]

MalibGenericFilter を使って下さい。
malib_genericfilter_new_with_config () の引数は順に、 入力バッファ(buf)、入力として許容できるデータタイプ(acceptable)、 フレーム形式が変更される場合のサンプルフレーム情報(frame_info)、 新規データ作成用関数ポインタ(func)、を指定します。

[質問]

二つ以上のソースを合成するにはどうするの?
例えば二つのビデオを重ねながら切替えてつなげる、とか、 別のビデオにスーパーインポーズ、とか。

[回答]

MalibMerger を継承し、複数の入力を持つフィルタを作成します。 具体例は MalibOverlap です。

[質問]

gtkdisplay でディスプレイを2枚開けません。

[回答]

malib_gtkdisplay_auto_play2 () を使って下さい。 引数には、MalibGtkDisplay オブジェクトへのポインタの配列を与えます。 配列の最後尾には NULL ((MalibGtkDisplay*)0) を入れておきます。

[質問]

新しく作った XXXfilter.c の malib_XXXfilter_delete () の最後で、 なぜ free(filter) を行なわなくてもよいの ? いったいどこでMalibDeleyedFilter の構造体の領域解放が行なわれるの ?

[回答]

上位クラスの malib_filter_delete () で解放しています。 free するときは先頭アドレスを与えれば構造体のサイズに関わり無く、 領域の解放が行なわれます。でも、filter 内で自分で malloc した分は、 malib_filter_delete () を呼ぶ前にちゃんと free してね。
(参照) effectv/quark.c や filters/patdither.c など。