|
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を使うようにすればいける ような気がするんですけどねぇ。。。それだけじゃ足りない気もし ますが。。。 |