From: NAKAJIMA T. <nak...@ni...> - 2013-02-03 15:45:15
|
中島です。 GObject Introspectionを使ったGStreamerサンプルの移植に挑戦しています。 Gst.initは無事通ったのですが、以下報告させてください。 ほとんどTutorialにあるHello Worldと変わらないコードですが、 playbin = Gst::ElementFactory.make("playbin") bus = playbin.bus bus.add_watch do |bus, message| (イベント捕捉) end だと、add_watchのところで以下のエラーが起きます。 /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in `invoke': no implicit conversion from nil to integer (TypeError) from /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in `block in load_method_info' from helloworld.rb:32:in `<main>' intパラメータを要求しているようなので、priorityかなと思い bus.add_watch(GLib::PRIORITY_DEFAULT) do |bus, message| にしたところ、次のエラーに変わりました。 /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in `invoke': TODO: GSourceFunc callback is only supported. (NotImplementedError) from /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in `block in load_method_info' from helloworld.rb:32:in `<main>' GSourceFuncのcallbackでない(?)と怒られているようですが、ブロックで 渡しているところが違うのでしょうか。 なおGst-1.0.girによると、add_watchは <parameters> <parameter name="func" transfer-ownership="none" closure="1"> <doc xml:whitespace="preserve">A function to call when a message is received.</doc> <type name="BusFunc" c:type="GstBusFunc"/> </parameter> <parameter name="user_data" transfer-ownership="none"> <doc xml:whitespace="preserve">user data passed to @func.</doc> <type name="gpointer" c:type="gpointer"/> </parameter> </parameters> なので、priorityを渡したのも違っているのかもしれませんけど。(?) |
From: Kouhei S. <ko...@co...> - 2013-02-04 14:18:36
|
須藤です。 In <510...@ni...> "[ruby-gnome2-devel-ja] gi使用時Gst::Bus.add_watchの引数" on Mon, 04 Feb 2013 00:45:04 +0900, NAKAJIMA Takashi <nak...@ni...> wrote: > playbin = Gst::ElementFactory.make("playbin") > bus = playbin.bus > bus.add_watch do |bus, message| > (イベント捕捉) > end > > だと、add_watchのところで以下のエラーが起きます。 おぉ。。。 > /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in > `invoke': no implicit conversion from nil to integer (TypeError) > from > /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in > `block in load_method_info' > from helloworld.rb:32:in `<main>' > > intパラメータを要求しているようなので、priorityかなと思い > > bus.add_watch(GLib::PRIORITY_DEFAULT) do |bus, message| > > にしたところ、次のエラーに変わりました。 はい、priorityであっています。 たしかに、 > なおGst-1.0.girによると、add_watchは > <parameters> > <parameter name="func" transfer-ownership="none" closure="1"> > <doc xml:whitespace="preserve">A function to call when a message is > received.</doc> > <type name="BusFunc" c:type="GstBusFunc"/> > </parameter> > <parameter name="user_data" transfer-ownership="none"> > <doc xml:whitespace="preserve">user data passed to @func.</doc> > <type name="gpointer" c:type="gpointer"/> > </parameter> > </parameters> > なので、priorityを渡したのも違っているのかもしれませんけど。(?) となっているのですが、 <method name="add_watch" c:identifier="gst_bus_add_watch" shadowed-by="add_watch_full" introspectable="0"> となっている通り、add_watchの実体はadd_watch_fullとして提供 されていて、add_watch_fullは <method name="add_watch_full" c:identifier="gst_bus_add_watch_full" shadows="add_watch"> <parameters> <parameter name="priority" transfer-ownership="none"> <doc xml:whitespace="preserve">The priority of the watch.</doc> <type name="gint" c:type="gint"/> </parameter> なので、最初の引数はpriorityであっています! > /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in > `invoke': TODO: GSourceFunc callback is only supported. > (NotImplementedError) > from > /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in > `block in load_method_info' > from helloworld.rb:32:in `<main>' > > GSourceFuncのcallbackでない(?)と怒られているようですが、ブロックで > 渡しているところが違うのでしょうか。 いえ、あっているのですが、Ruby/GObjectIntrospectionが対応し ていないのです。エラーメッセージにもある通り、GSourceFuncに は対応しているのですが、これは、GObject Introspectionが依存 しているGLibが提供しているものなので対応しています。 が、GstBusFuncはGObjectIntrospectionが依存していない GStreamerが提供していないものなので、 Ruby/GObjectIntrospectionが対応するのは変ですね。。。 なので、Ruby/GStreamerの方で対応する必要があるので、対応する ためのコードを追加しておきます!追加したらまた報告します! なかなか、スムーズにいかずにすみません。。。 |
From: NAKAJIMA T. <nak...@ni...> - 2013-02-04 15:14:22
|
中島です。 (2013年02月04日 23:18), Kouhei Sutou wrote: > <method name="add_watch" > c:identifier="gst_bus_add_watch" > shadowed-by="add_watch_full" > introspectable="0"> > > となっている通り、add_watchの実体はadd_watch_fullとして提供 > されていて、add_watch_fullは > > <method name="add_watch_full" > c:identifier="gst_bus_add_watch_full" > shadows="add_watch"> > <parameters> > <parameter name="priority" transfer-ownership="none"> > <doc xml:whitespace="preserve">The priority of the watch.</doc> > <type name="gint" c:type="gint"/> > </parameter> > > なので、最初の引数はpriorityであっています! なるほど、そういうしくみなんですね。勉強になります。 > いえ、あっているのですが、Ruby/GObjectIntrospectionが対応し > ていないのです。エラーメッセージにもある通り、GSourceFuncに > は対応しているのですが、これは、GObject Introspectionが依存 > しているGLibが提供しているものなので対応しています。 > > が、GstBusFuncはGObjectIntrospectionが依存していない > GStreamerが提供していないものなので、 > Ruby/GObjectIntrospectionが対応するのは変ですね。。。 > > なので、Ruby/GStreamerの方で対応する必要があるので、対応する > ためのコードを追加しておきます!追加したらまた報告します! > > なかなか、スムーズにいかずにすみません。。。 > 了解しました。こちらも楽しんでやってますので、お気になさらずに。 |
From: Kouhei S. <ko...@co...> - 2013-02-06 13:33:07
|
須藤です。 In <510...@ni...> "Re: [ruby-gnome2-devel-ja] gi使用時Gst::Bus.add_watchの引数" on Tue, 05 Feb 2013 00:14:07 +0900, NAKAJIMA Takashi <nak...@ni...> wrote: >> いえ、あっているのですが、Ruby/GObjectIntrospectionが対応し >> ていないのです。エラーメッセージにもある通り、GSourceFuncに >> は対応しているのですが、これは、GObject Introspectionが依存 >> しているGLibが提供しているものなので対応しています。 >> >> が、GstBusFuncはGObjectIntrospectionが依存していない >> GStreamerが提供していないものなので、 >> Ruby/GObjectIntrospectionが対応するのは変ですね。。。 >> >> なので、Ruby/GStreamerの方で対応する必要があるので、対応する >> ためのコードを追加しておきます!追加したらまた報告します! >> >> なかなか、スムーズにいかずにすみません。。。 >> > > 了解しました。こちらも楽しんでやってますので、お気になさらずに。 ありがとうございます。。。 gstreamer/以下ではうまくやっていけそうにないので、今回用に gstreamer-gi/というのを作りました。そこで、↑に対応させまし た。手元ではadd_watchできることを確認しました。以下で試せる はずです。 ruby-gnome2% git pull --rebase ruby-gnome2% cd gobject-introspection gobject-introspection% make gobject-introspection% cd ../gstreamer-gi gstreamer-gi% ruby extconf.rb gstreamer-gi% make gstreamer-gi% ruby \ -I lib \ -I ext/gstreamer \ -I ../glib2/lib \ -I ../glib2/ext/glib2 \ -I ../gobject-introspection/lib \ -I ../gobject-introspection/ext/gobject-introspection \ #{gstreamer-giを使う.rbファイル} また、 require "gst-gi" ではなく require "gst" に変えてください。 新しくディレクトリを作ってそっちに-giをつけたので.rbの方から は-giを抜きました。 |
From: NAKAJIMA T. <nak...@ni...> - 2013-02-07 15:31:53
|
中島です。 giを使ったGstreamerサンプルのhelloworldが動きました! もう少し整理したら、pull requestを送れそうです。 ありがとうございました。 |
From: NAKAJIMA T. <nak...@ni...> - 2013-02-09 17:14:15
|
中島です。 giを使ったGStreamerサンプルの移植中です。 確認させてほしいのですが、gstreamer-giを使ったサンプルは gstreamer-gi/の下にsampleディレクトリを作って置いた方が よろしいでしょうか。それとも、元のgstreamer/sampleで よかったでしょうか。 あと、元のCコードにならって、再生ループ中に飛んでくる Gst::Messageを以下のようなコードで捕捉しようとしているのですが、 MessageType::ERRORを起こさせる方法がわからず、parse_error部分の テストができなくて困っています。 どなたかご存知でしたら、教えていただければ助かります。 bus.add_watch(GLib::PRIORITY_DEFAULT) do |bus, message| case message.type when Gst::MessageType::EOS puts "End-of-stream" loop.quit when Gst::MessageType::ERROR err = nil debug = nil message.parse_error(err, debug) puts "Debugging info: #{(debug) ? debug : 'none'}" puts "Error: #{err.message}" loop.quit end true end |
From: NAKAJIMA T. <nak...@ni...> - 2013-02-10 12:04:25
|
中島です。 (2013年02月10日 12:23), Kouhei Sutou wrote: > 確認させてほしいのですが、gstreamer-giを使ったサンプルは > gstreamer-gi/の下にsampleディレクトリを作って置いた方が > よろしいでしょうか。それとも、元のgstreamer/sampleで > よかったでしょうか。 > gstreamer-gi/の方でおねがいします! > GI関連は全部そっちでやりましょう! 了解しました。ではgstreamer-gi/sampleということで。 >> あと、元のCコードにならって、再生ループ中に飛んでくる >> Gst::Messageを以下のようなコードで捕捉しようとしているのですが、 >> MessageType::ERRORを起こさせる方法がわからず、parse_error部分の >> テストができなくて困っています。 >> どなたかご存知でしたら、教えていただければ助かります。 > 音楽や動画のファイルではなくテキストファイルを渡すと発生する > ようです! やってみたのですが、例外GLib::Errorが発生しているため、Busにattachした ハンドラでメッセージを捕捉する前に、下記のメインループ部loop.runを 飛び出して、例外ハンドラに行ってしまうようです。 # start play back and listed to events playbin.state = Gst::State::PLAYING begin loop.run rescue Interrupt puts "Interrupt" rescue => error puts "Error: #{error.message}" ensure playbin.state = Gst::State::NULL end 実行結果: Error: これはテキストファイルのようです 扱いとしては再生停止なのでこれでもOKとは思いますが、元のGst::Messageが 取れないため、parse_errorからデバッグ情報が取れないのが惜しい気がします。 たとえばGLib::ErrorをGst::Messageに入れたままraiseしないようなオプション とか、 またはGLib::Errorなど他からGst::Messageを取得する方法はないでしょうか? >> when Gst::MessageType::ERROR >> err = nil >> debug = nil >> message.parse_error(err, debug) >> puts "Debugging info: #{(debug) ? debug : 'none'}" >> puts "Error: #{err.message}" > たぶん、こう書くことになるんじゃないかなぁと思います! > > error, debug = message.parse_error > puts "Debugging info: #{debug || 'none'}" > puts "Error: #{error.message}" おお、ご指導ありがとうございます! このへんのしくみを理解できて いないのですが、GIの定義でdirection="out"なパラメータがあったら 複数の場合も含めて、すべて戻り値で返す、と考えておけばいいでしょうか。 (どこかに書いてあったらすみません) |
From: NAKAJIMA T. <nak...@ni...> - 2013-02-10 13:31:26
|
中島です。 (2013年02月10日 21:33), Kouhei Sutou wrote: >> やってみたのですが、例外GLib::Errorが発生しているため、Busにattachした >> ハンドラでメッセージを捕捉する前に、下記のメインループ部loop.runを >> 飛び出して、例外ハンドラに行ってしまうようです。 > おぉ。。。 > 手元で試したらadd_watchの中のGst::MessageType::ERRORまでいっ > たんですけど。。。GStreamerのバージョンが違うからかしら。。。 > > 今の状態でpull requestしてもらえますか?一旦、マージして同じ > コードをみましょう! 了解しました! たった今、pull requestを出させていただきました。 (ユーザ名ted_nです。変なところがあればご指摘ください) > あと、昨日、英語のメーリングリストの方でも試してくれた人がい > て、そこでもらった問題を今のmasterで修正しています。git pull > --rebaseしてもう一度試してもらうともっとよくなっているか > も。。。 pull request直前にrebaseさせていただき、gstreamer-giだけ再ビルド しました。そこでGst::uri_is_validをGst::valid_uri?に修正しましたが、 上記エラーハンドリングは変わらなかったです。 > http://sourceforge.net/mailarchive/message.php?msg_id=30466384 > > あと、↑の人と一緒に作業していく意味でも現時点のコードを共有 > できるようになっていた方がいいかなぁと思いました。 仲間が増えましたか! 私も英語版MLを見るようにしたいと思います。 > はい、基本的にはそうしています。 > ただ、outが1つでそれがGErrorのときだけは戻り値ではなく例外を > あげるようになっています。 > >> (どこかに書いてあったらすみません) > いえ、コードにしか書いていないので聞いてください! 了解しました。毎度すみませんが、よろしくお願いいたします。 |
From: NAKAJIMA T. <nak...@ni...> - 2013-02-10 15:56:22
|
中島です。 (2013年02月10日 23:14), Kouhei Sutou wrote: > ありがとうございます!マージしました! > 気になったところは直接コミットしておきました! > > 変更点はこんな感じです。 > https://github.com/ruby-gnome2/ruby-gnome2/commits/master マージありがとうございます! 修正についてはお手数おかけしました。 > 手元でも試してみたらたしかに再現しました。 > で、自分の手元で試していたやつとの違いを確認してみたら > > GLib::MainLoop.new(nil, false) > と > GLib::MainLoop.new > が違いました。 > > 私は(めんどくさかったので)後者を使っていたのですが、後者だ > と > GLib::MainLoop.new(nil, true) > という意味になります。 > > で、第二引数がtrueだとどういう意味かというと、このメインルー > プはもう動いているよーという意味だったりします。 > http://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-main-loop-new > > この動きから考えると、メインループが動いている状態でエラーが > 起きるとadd_watchに処理がいって、そうじゃなければloop.runし > たときにエラーが通知されるんだろうと思います。 私もrebaseして試してみたのですが、なぜか挙動が変わりませんでした。(?) まあ私の環境だけみたいなので、ゆっくり調べることにして、次のサンプルに 取りかかろうと思います。 |
From: Kouhei S. <ko...@co...> - 2013-02-11 09:45:21
|
須藤です。 In <511...@ni...> "Re: [ruby-gnome2-devel-ja] gi使用時Gst::Bus.add_watchの引数" on Mon, 11 Feb 2013 00:56:01 +0900, NAKAJIMA Takashi <nak...@ni...> wrote: >> ありがとうございます!マージしました! >> 気になったところは直接コミットしておきました! >> >> 変更点はこんな感じです。 >> https://github.com/ruby-gnome2/ruby-gnome2/commits/master > > マージありがとうございます! 修正についてはお手数おかけしました。 いえいえ!こちらこそありがとうございました! > 私もrebaseして試してみたのですが、なぜか挙動が変わりませんでした。(?) > まあ私の環境だけみたいなので、ゆっくり調べることにして、次のサンプルに > 取りかかろうと思います。 そうですね! それでいいと思います! |
From: Kouhei S. <ko...@co...> - 2013-02-10 14:15:03
|
須藤です。 In <511...@ni...> "Re: [ruby-gnome2-devel-ja] gi使用時Gst::Bus.add_watchの引数" on Sun, 10 Feb 2013 22:31:08 +0900, NAKAJIMA Takashi <nak...@ni...> wrote: >> 今の状態でpull requestしてもらえますか?一旦、マージして同じ >> コードをみましょう! > > 了解しました! たった今、pull requestを出させていただきました。 > (ユーザ名ted_nです。変なところがあればご指摘ください) ありがとうございます!マージしました! 気になったところは直接コミットしておきました! 変更点はこんな感じです。 https://github.com/ruby-gnome2/ruby-gnome2/commits/master もし、変更点がメールで通知されるとうれしいなぁという場合はこ ちらをどうぞ。(私はこっちを使っています。) https://lists.sourceforge.net/lists/listinfo/ruby-gnome2-cvs > pull request直前にrebaseさせていただき、gstreamer-giだけ再ビルド > しました。そこでGst::uri_is_validをGst::valid_uri?に修正しましたが、 > 上記エラーハンドリングは変わらなかったです。 手元でも試してみたらたしかに再現しました。 で、自分の手元で試していたやつとの違いを確認してみたら GLib::MainLoop.new(nil, false) と GLib::MainLoop.new が違いました。 私は(めんどくさかったので)後者を使っていたのですが、後者だ と GLib::MainLoop.new(nil, true) という意味になります。 で、第二引数がtrueだとどういう意味かというと、このメインルー プはもう動いているよーという意味だったりします。 http://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-main-loop-new この動きから考えると、メインループが動いている状態でエラーが 起きるとadd_watchに処理がいって、そうじゃなければloop.runし たときにエラーが通知されるんだろうと思います。 あ、GitHub上のやつは後者にして手元ではmp4が再生できました! ありがとうございます! あ、あ、エラーの起こし方ですが、テキストファイルを指定する以 外にも、未サポートのメディアファイルを指定するとよさそうです。 例えば、libavのプラグインをアンインストールした状態でmp4を指 定するとか。 >> http://sourceforge.net/mailarchive/message.php?msg_id=30466384 >> >> あと、↑の人と一緒に作業していく意味でも現時点のコードを共有 >> できるようになっていた方がいいかなぁと思いました。 > > 仲間が増えましたか! 私も英語版MLを見るようにしたいと思います。 ありがとうございます! |
From: Kouhei S. <ko...@co...> - 2013-02-10 12:33:18
|
須藤です。 In <511...@ni...> "Re: [ruby-gnome2-devel-ja] gi使用時Gst::Bus.add_watchの引数" on Sun, 10 Feb 2013 21:03:52 +0900, NAKAJIMA Takashi <nak...@ni...> wrote: >> gstreamer-gi/の方でおねがいします! >> GI関連は全部そっちでやりましょう! > > 了解しました。ではgstreamer-gi/sampleということで。 はい! >>> あと、元のCコードにならって、再生ループ中に飛んでくる >>> Gst::Messageを以下のようなコードで捕捉しようとしているのですが、 >>> MessageType::ERRORを起こさせる方法がわからず、parse_error部分の >>> テストができなくて困っています。 >>> どなたかご存知でしたら、教えていただければ助かります。 >> 音楽や動画のファイルではなくテキストファイルを渡すと発生する >> ようです! > > やってみたのですが、例外GLib::Errorが発生しているため、Busにattachした > ハンドラでメッセージを捕捉する前に、下記のメインループ部loop.runを > 飛び出して、例外ハンドラに行ってしまうようです。 おぉ。。。 手元で試したらadd_watchの中のGst::MessageType::ERRORまでいっ たんですけど。。。GStreamerのバージョンが違うからかしら。。。 今の状態でpull requestしてもらえますか?一旦、マージして同じ コードをみましょう! あと、昨日、英語のメーリングリストの方でも試してくれた人がい て、そこでもらった問題を今のmasterで修正しています。git pull --rebaseしてもう一度試してもらうともっとよくなっているか も。。。 http://sourceforge.net/mailarchive/message.php?msg_id=30466384 あと、↑の人と一緒に作業していく意味でも現時点のコードを共有 できるようになっていた方がいいかなぁと思いました。 > おお、ご指導ありがとうございます! このへんのしくみを理解できて > いないのですが、GIの定義でdirection="out"なパラメータがあったら > 複数の場合も含めて、すべて戻り値で返す、と考えておけばいいでしょうか。 はい、基本的にはそうしています。 ただ、outが1つでそれがGErrorのときだけは戻り値ではなく例外を あげるようになっています。 > (どこかに書いてあったらすみません) いえ、コードにしか書いていないので聞いてください! |
From: Kouhei S. <ko...@co...> - 2013-02-10 03:23:34
|
須藤です。 In <511...@ni...> "Re: [ruby-gnome2-devel-ja] gi使用時Gst::Bus.add_watchの引数" on Sun, 10 Feb 2013 02:13:47 +0900, NAKAJIMA Takashi <nak...@ni...> wrote: > 確認させてほしいのですが、gstreamer-giを使ったサンプルは > gstreamer-gi/の下にsampleディレクトリを作って置いた方が > よろしいでしょうか。それとも、元のgstreamer/sampleで > よかったでしょうか。 gstreamer-gi/の方でおねがいします! GI関連は全部そっちでやりましょう! > あと、元のCコードにならって、再生ループ中に飛んでくる > Gst::Messageを以下のようなコードで捕捉しようとしているのですが、 > MessageType::ERRORを起こさせる方法がわからず、parse_error部分の > テストができなくて困っています。 > どなたかご存知でしたら、教えていただければ助かります。 音楽や動画のファイルではなくテキストファイルを渡すと発生する ようです! > when Gst::MessageType::ERROR > err = nil > debug = nil > message.parse_error(err, debug) > puts "Debugging info: #{(debug) ? debug : 'none'}" > puts "Error: #{err.message}" たぶん、こう書くことになるんじゃないかなぁと思います! error, debug = message.parse_error puts "Debugging info: #{debug || 'none'}" puts "Error: #{error.message}" |
From: Kouhei S. <ko...@co...> - 2013-02-08 14:31:19
|
須藤です。 In <511...@ni...> "Re: [ruby-gnome2-devel-ja] gi使用時Gst::Bus.add_watchの引数" on Fri, 08 Feb 2013 00:31:43 +0900, NAKAJIMA Takashi <nak...@ni...> wrote: > giを使ったGstreamerサンプルのhelloworldが動きました! > もう少し整理したら、pull requestを送れそうです。 わぁ!よかったです! ありがとうございます! |
From: NAKAJIMA T. <nak...@ni...> - 2013-02-07 14:55:51
|
中島です。 (2013年02月06日 22:32), Kouhei Sutou wrote: > gstreamer/以下ではうまくやっていけそうにないので、今回用に > gstreamer-gi/というのを作りました。そこで、↑に対応させまし > た。手元ではadd_watchできることを確認しました。以下で試せる > はずです。 > > ruby-gnome2% git pull --rebase > ruby-gnome2% cd gobject-introspection > gobject-introspection% make > gobject-introspection% cd ../gstreamer-gi > gstreamer-gi% ruby extconf.rb > gstreamer-gi% make > gstreamer-gi% ruby \ > -I lib \ > -I ext/gstreamer \ > -I ../glib2/lib \ > -I ../glib2/ext/glib2 \ > -I ../gobject-introspection/lib \ > -I ../gobject-introspection/ext/gobject-introspection \ > #{gstreamer-giを使う.rbファイル} > > また、 > > require "gst-gi" > > ではなく > > require "gst" > > に変えてください。 ありがとうございます! こちらの環境でもadd_watchできたようです。 また、前回使えなかったenumのGst::State::PLAYINGも使えるようになっていま した。 |