|
From: Takashi N. <nak...@ni...> - 2013-03-02 11:38:53
|
中島です。 giを使ったGStreamerのサンプルを移植中ですが、今度はadapter フォルダのadapter_test.cについて、以下3点ご教示お願いします。 (今現在困っているのは3つめだけですが) 1. GstBaseのバインディング このadapter_test.cは、GstBase-1.0.girに定義されている GstAdapterを使っています。こちらGstBaseのバインディングの 作成予定はありますでしょうか? なお、試しにgst.rbのモジュール名とLoaderのパラメータを "GstBase"に変えたものをrequireしてみたところ、 GstBase::Adapter.newは通ったようです。 2. Gst::Bufferの生成方法 AdapterにGst::Bufferを与えるのですが、これを生成する関数として、 オリジナル使用の gst_buffer_new_and_alloc() の v.1.0版と思われる、 gst_buffer_new_allocate() を使いたいと考えています。 しかしgiの Gst::Bufferには new_allocate というコンストラクタが定義 されておらず、 buf = Gst::Buffer.new buf.initialize_new_allocate(nil, size) という形になっているようです。 これで生成と初期化はできているようですが、気分としては buf = Gst::Buffer.new_allocate(nil, size) などで一発生成できるとうれしいです。 3. Gst::Bufferがwritableにならない 上記生成したGst::Bufferに、 buf.memset(0, 0, size) で0クリアしようとしたところ、コンソールに大量のメッセージ (adapter_test.rb:8776): GStreamer-CRITICAL **: gst_buffer_memset: assertion `gst_buffer_is_writable (buffer)' failed が出力され、書き込みに失敗しました。 GStreamerのリファレンスによると、Bufferのrefcountが1でなければ ならないらしいですが、上記 2. のコードだとカウントが上がってしまうので しょうか? なお、refcountを確認したいのですが、Buffer内でカウントを持っているらしい GstMiniObjectを以下のように参照すると puts buf.mini_object.refcount 以下のエラーになります。 /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:150:in `get_field_value': failed to get field value (ArgumentError) from /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:150:in `block (2 levels) in load_fields' なお、現在のコードは以下です。 https://github.com/ted-n/ruby-gnome2/blob/adapter/gstreamer-gi/sample/adapter_test.rb https://github.com/ted-n/ruby-gnome2/blob/adapter/gstreamer-gi/sample/gst-base.rb |
|
From: Kouhei S. <ko...@co...> - 2013-03-02 13:28:43
|
須藤です。 In <513...@ni...> "[ruby-gnome2-devel-ja] gi使用時のGst::Bufferがwritableにならない" on Sat, 02 Mar 2013 20:21:25 +0900, Takashi Nakajima <nak...@ni...> wrote: > giを使ったGStreamerのサンプルを移植中ですが、今度はadapter > フォルダのadapter_test.cについて、以下3点ご教示お願いします。 ありがとうございます! > 1. GstBaseのバインディング > このadapter_test.cは、GstBase-1.0.girに定義されている > GstAdapterを使っています。こちらGstBaseのバインディングの > 作成予定はありますでしょうか? ぜんぜん気付いていませんでした! みてみたら、GstBaseもGStreamerと同じリポジトリに入っているの で、gstreamer-giの中に作るのが適切ですね。 ということで、ぶちこんでおきました。 > なお、試しにgst.rbのモジュール名とLoaderのパラメータを > "GstBase"に変えたものをrequireしてみたところ、 > GstBase::Adapter.newは通ったようです。 require "gst"するだけで、Gst::Adapter.newできるようにしてお きました。GstBase-1.0.girをのぞいたら c:identifier-prefixes="Gst"となっていたので、GstBase::XXXで はなく、Gst::XXXにしておきました。 > 2. Gst::Bufferの生成方法 > AdapterにGst::Bufferを与えるのですが、これを生成する関数として、 > オリジナル使用の gst_buffer_new_and_alloc() の v.1.0版と思われる、 > gst_buffer_new_allocate() を使いたいと考えています。 > しかしgiの Gst::Bufferには new_allocate というコンストラクタが定義 > されておらず、 > buf = Gst::Buffer.new > buf.initialize_new_allocate(nil, size) > という形になっているようです。 > これで生成と初期化はできているようですが、気分としては > buf = Gst::Buffer.new_allocate(nil, size) > などで一発生成できるとうれしいです。 あ、これはですね。 buf = Gst::Buffer.new(nil, size, nil) でいけます。コンストラクターが複数あるときは、initialize_XXX を作って、initializeでディスパッチするようにしています。なの で、new()の引数を変えるだけで適切なinitialize_XXXが呼ばれま す。(gst_buffer_new_allocate()は引数が3つなので3つ渡さない といけない。2つだとgst_buffer_new_wrapped()にディスパッチさ れてしまう。) initialize_XXXの方は間違って使わないようにprivateにしておき ました。 > 3. Gst::Bufferがwritableにならない > 上記生成したGst::Bufferに、 > buf.memset(0, 0, size) > で0クリアしようとしたところ、コンソールに大量のメッセージ > > (adapter_test.rb:8776): GStreamer-CRITICAL **: gst_buffer_memset: > assertion `gst_buffer_is_writable (buffer)' failed > > が出力され、書き込みに失敗しました。 > GStreamerのリファレンスによると、Bufferのrefcountが1でなければ > ならないらしいですが、上記 2. のコードだとカウントが上がってしまうので > しょうか? > なお、refcountを確認したいのですが、Buffer内でカウントを持っているらしい > GstMiniObjectを以下のように参照すると > > puts buf.mini_object.refcount > > 以下のエラーになります。 > > /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:150:in > `get_field_value': failed to get field value (ArgumentError) > from > /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:150:in > `block (2 levels) in load_fields' これは、だいぶ切ないですねぇ。 そもそも、Gst::BufferがGst::MiniObjectのサブクラスになってい ないのがアレですねぇ。ここもがんばらないといけないのか。。。 今週は来週のぐんまRuby会議01の準備をしないといけなくて、次の 週は一週間岩手に行っていたりするので、再来週以降にがんばりま す。。。 Ruby/GObjectIntrospectionのLoaderでGst::Buffer用のstructのク ラスを定義するときにGst::MiniObjectを使うようにすればいける ような気がするんですけどねぇ。。。それだけじゃ足りない気もし ますが。。。 |
|
From: Takashi N. <nak...@ni...> - 2013-03-02 16:08:41
|
中島です。 (2013年03月02日 22:08), Kouhei Sutou wrote: >> 1. GstBaseのバインディング >> このadapter_test.cは、GstBase-1.0.girに定義されている >> GstAdapterを使っています。こちらGstBaseのバインディングの >> 作成予定はありますでしょうか? > ぜんぜん気付いていませんでした! > みてみたら、GstBaseもGStreamerと同じリポジトリに入っているの > で、gstreamer-giの中に作るのが適切ですね。 > > ということで、ぶちこんでおきました。 ありがとうございます。さっそくいただきました。 >> 2. Gst::Bufferの生成方法 (snip) > あ、これはですね。 > > buf = Gst::Buffer.new(nil, size, nil) > > でいけます。コンストラクターが複数あるときは、initialize_XXX > を作って、initializeでディスパッチするようにしています。なの > で、new()の引数を変えるだけで適切なinitialize_XXXが呼ばれま > す。(gst_buffer_new_allocate()は引数が3つなので3つ渡さない > といけない。2つだとgst_buffer_new_wrapped()にディスパッチさ > れてしまう。) > > initialize_XXXの方は間違って使わないようにprivateにしておき > ました。 なるほど、それでnewしか見当たらなかったんですね。納得です。 ただ、残念ながら下記3.は変わりませんでした... >> 3. Gst::Bufferがwritableにならない (snip) > これは、だいぶ切ないですねぇ。 そもそも、Gst::BufferがGst::MiniObject > のサブクラスになってい ないのがアレですねぇ。ここもがんばらないといけ > ないのか。。。 今週は来週のぐんまRuby会議01の準備をしないといけなく > て、次の 週は一週間岩手に行っていたりするので、再来週以降にがんばりま > す。。。 Ruby/GObjectIntrospectionのLoaderでGst::Buffer用のstructのク > ラスを定義するときにGst::MiniObjectを使うようにすればいける ような気が > するんですけどねぇ。。。それだけじゃ足りない気もし ますが。。。 了解しました。それではまた後日ということで。 |
|
From: Takashi N. <nak...@ni...> - 2013-04-03 12:43:28
|
中島です。 3月末はバタバタしてましたがまた戻ってきました。 (2013年03月21日 23:47), Kouhei Sutou wrote: > とりあえず、Gst::Bufferはwritableになるようにしました。 > が、そのあとのadapterにpushしたバッファーをtakeしていくやつ > を使うとクラッシュします。これは、adapterがtakeすると、デー > タの所有者をバッファーからadapterに変えないといけない(バッ > ファーは所有権を手放さないといけない)のですが、今はそこらへ > んに対応できていなくて、バッファーもadapterもデータを開放し > ようとしてクラッシュします。 > > 所有権周りをごにょごにょすればいいんですが、それをいい感じに > するにはもう少し作業が必要そうなので途中報告でした。。。 対応ありがとうございます! 今pull --rebaseして試してみましたが、 git masterへの反映はまだですよね? 同じようだったので。 ところで、私の環境では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) といったエラーになってしまいます。 私のところだけなんでしょうか? |
|
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まわりは難易度高めなので、これは飛ばして他 のやつに着手したほうがいいかもです。。。 |
|
From: Takashi N. <nak...@ni...> - 2013-04-03 13:55:23
|
中島です。 (2013年04月03日 22:35), Kouhei Sutou wrote: > あ、もう入っています。 > gstreamer-gi/じゃなくてglib2/の方での対応だったんですよ。 これは失礼しました。glib2もビルドしたら、writable failedメッセージは 消えました。 > ちょっと、adapterまわりは難易度高めなので、これは飛ばして他 > のやつに着手したほうがいいかもです。。。 そうします(^^;)。 |
|
From: Kouhei S. <ko...@co...> - 2013-03-21 14:48:04
|
須藤です。 まだできていないんですが、途中報告。。。 In <513...@ni...> "Re: [ruby-gnome2-devel-ja] gi使用時のGst::Bufferがwritableにならない" on Sun, 03 Mar 2013 00:58:20 +0900, Takashi Nakajima <nak...@ni...> wrote: >>> 3. Gst::Bufferがwritableにならない > (snip) >> これは、だいぶ切ないですねぇ。 そもそも、Gst::BufferがGst::MiniObject >> のサブクラスになってい ないのがアレですねぇ。ここもがんばらないといけ >> ないのか。。。 今週は来週のぐんまRuby会議01の準備をしないといけなく >> て、次の 週は一週間岩手に行っていたりするので、再来週以降にがんばりま >> す。。。 Ruby/GObjectIntrospectionのLoaderでGst::Buffer用のstructのク >> ラスを定義するときにGst::MiniObjectを使うようにすればいける ような気が >> するんですけどねぇ。。。それだけじゃ足りない気もし ますが。。。 > > 了解しました。それではまた後日ということで。 とりあえず、Gst::Bufferはwritableになるようにしました。 が、そのあとのadapterにpushしたバッファーをtakeしていくやつ を使うとクラッシュします。これは、adapterがtakeすると、デー タの所有者をバッファーからadapterに変えないといけない(バッ ファーは所有権を手放さないといけない)のですが、今はそこらへ んに対応できていなくて、バッファーもadapterもデータを開放し ようとしてクラッシュします。 所有権周りをごにょごにょすればいいんですが、それをいい感じに するにはもう少し作業が必要そうなので途中報告でした。。。 |