|
From: Kouhei S. <ko...@co...> - 2013-04-03 13:35:18
|
須藤です。 In <515...@ni...> "Re: [ruby-gnome2-devel-ja] gi使用時のGst::Bufferがwritableにならない" on Wed, 03 Apr 2013 21:39:49 +0900, Takashi Nakajima <nak...@ni...> wrote: > 3月末はバタバタしてましたがまた戻ってきました。 おかえりなさい! > (2013年03月21日 23:47), Kouhei Sutou wrote: >> とりあえず、Gst::Bufferはwritableになるようにしました。 >> が、そのあとのadapterにpushしたバッファーをtakeしていくやつ >> を使うとクラッシュします。これは、adapterがtakeすると、デー >> タの所有者をバッファーからadapterに変えないといけない(バッ >> ファーは所有権を手放さないといけない)のですが、今はそこらへ >> んに対応できていなくて、バッファーもadapterもデータを開放し >> ようとしてクラッシュします。 >> >> 所有権周りをごにょごにょすればいいんですが、それをいい感じに >> するにはもう少し作業が必要そうなので途中報告でした。。。 > > 対応ありがとうございます! 今pull --rebaseして試してみましたが、 > git masterへの反映はまだですよね? 同じようだったので。 あ、もう入っています。 gstreamer-gi/じゃなくてglib2/の方での対応だったんですよ。 > ところで、私の環境ではadapter_test.rbのtakeメソッドに別の問題が出ています。 > Cの方ではGstAdapterのtake関数は > > gpointer gst_adapter_take (GstAdapter *adapter, gsize nbytes); > > と定義してあって、明らかにnbytesはinputだと思うのですが、 > 私の環境(Fedora 18)ではGstBase-1.0.girのAdapterクラス、 > takeメソッドの定義に > > <parameters> > <parameter name="nbytes" > direction="out" > caller-allocates="0" > transfer-ownership="full"> > <doc xml:whitespace="preserve">the number of bytes to take</doc> > <type name="gsize" c:type="gsize"/> > </parameter> > </parameters> > > なんて書いてあります。ここでdirectionが"out"なためだと思うのですが、 > Rubyでgi経由で > > data = @adapter.take(params.read_size) > > のようにtakeを呼ぶと > > /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:221:in > `validate_arguments': Gst::Adapter#take: wrong number of arguments (1 > for 0) (ArgumentError) > > といったエラーになってしまいます。 > > 私のところだけなんでしょうか? あぁ、こちらでもそうですねぇ。 なんか、前に調べたような。。。 GStreamerのlibs/gst/base/gstadapter.cのgst_adapter_take()の コメントで * Returns: (transfer full) (array length=nbytes) (element-type guint8): * oven-fresh hot data, or #NULL if @nbytes bytes are not available とあるんですが、このうちの (array length=nbytes) のせいでoutになるんですよねぇ。 たしかにinなんですが、ドキュメントを読むと戻り値のデータの長 さもnbytesになるので、戻り値をRubyのオブジェクトに変換すると きにはnbytesの情報が欲しくなるんですよ。まぁ、イレギュラーで すねぇ。バインディング用の関数を提供してもらうのがよい気がし ますねぇ。 gst_adapter_take_XXX(adapter, nbytes, out_nbytes) みたいなので、out_nbytesのところにnybtesと同じ値をいれてくれ る的なやつがあるとよさそうな。。。 ちょっと、adapterまわりは難易度高めなので、これは飛ばして他 のやつに着手したほうがいいかもです。。。 |