|
From: NAKAJIMA T. <nak...@ni...> - 2013-05-02 13:40:47
|
中島です。ご無沙汰しております。
gstreamerサンプル移植について、steppingフォルダにある
framestep1.cに挑戦しているのですが、どうしてもうまくいかないので、
助言いただければ幸いです。
このサンプルはvideotestsrcにappsinkをつないだパイプラインに
指定した数フレームの再生をかけるものですが、まずはpauseする
ことから始まります。
ところが、以下のコードでパイプラインのステートは3秒待っても
2(READY)までで、3(PAUSED)になってくれません。
◆コード
Gst.init
# create a new bin to hold the elements
bin = Gst::Pipeline.new("pipeline")
raise "'pipeline' gstreamer plugin missing" if bin.nil?
# create a fake source
videotestsrc = Gst::ElementFactory.make("videotestsrc", "videotestsrc")
raise "'videotestsrc' gstreamer plugin missing" if videotestsrc.nil?
videotestsrc.num_buffers = 10
# and a fake sink
appsink = Gst::ElementFactory.make("appsink", "appsink")
raise "'appsink' gstreamer plugin missing" if appsink.nil?
appsink.emit_signals = true
appsink.sync = true
appsink.signal_connect("new-preroll") do |appsink|
# signalled when a new preroll buffer is available
# buffer = appsink.signal_emit_by_name("pull-preroll")
buffer = appsink.pull_preroll
puts "have new-preroll buffer #{buffer}, timestamp #{buffer}"
Gst::FlowReturn::OK
end
# add objects to the main pipeline
bin << videotestsrc << appsink
# link the elements
videotestsrc >> appsink
# go to the PAUSED state and wait for preroll
puts "prerolling first frame"
bin.pause
#bin.get_state(Gst::CLOCK_TIME_NONE)
state, pending = bin.get_state(Gst::SECOND * 3)
puts "state: #{state.to_i}, pending: #{pending.to_i}"
exit 1 if state != Gst::State::PAUSED
(全コードは
https://github.com/ted-n/ruby-gnome2/blob/stepping/gstreamer/sample/framestep1.rb
です)
◆実行結果
prerolling first frame
state: 2, pending: 2
オリジナルのCコードでは、get_stateの前にappsinkにnew-preroll
シグナルが入った後に、ステート3が返ってくるのですが、こちらの
Rubyコードではnew-prerollが入らないようで、このためステートが
変わらないのではと考えています。
appsinkの使い方が間違っているのでしょうか?
|