Re: [Vala] clutter-gst and gst
- From: Steve Salazar <eagsalazar hotmail com>
- To: <vala-list gnome org>
- Subject: Re: [Vala] clutter-gst and gst
- Date: Sun, 18 Jul 2010 07:11:36 +0000
Thanks for your help, that vala code is a great reference for me to look at also.
One question, where is vala documentation for ClutterGst and Gst plugins?
Anyway, I finally got a working clutter-gst from a filesrc! Once bug is resolved:
https://bugzilla.gnome.org/show_bug.cgi?id=624648
This is working code (assuming bug fixed):
using Clutter;using Gst;using ClutterGst;
// You provide the filename and the sink and we'll make it just work.public class VideoPlayer { private
string fileName; private Pipeline pipeline; private Element src; private Element sink; private
Element decode; private Element colorspace;
public VideoPlayer(string? _fileName, Element _sink) { fileName = _fileName; sink = _sink;
setup_pipeline(); }
public void play() { if(pipeline.current_state == State.PLAYING)
pipeline.set_state(State.PAUSED); else pipeline.set_state(State.PLAYING); }
public void stop() { pipeline.set_state(State.READY); }
private void setup_pipeline() { pipeline = new Pipeline("pipeline");
// To play a video file you need these elements: // - "filesrc"
to read file or "v4l2src" (src) // - "decodebin" to decode file (filter)
// - "ffmpegcolorspace" to do colorspace conversion (filter) // -
Some sink that we have passed in.
// If we don't have a fileName, then use the video camera, which is fun.
if(fileName == null) { src = ElementFactory.make("v4l2src", null); } else {
src = ElementFactory.make("filesrc", null); // Unlike in GOBject where
we use .set_attribute, here we use .set as this is // built into vala, I guess.
src.set("location", fileName); }
decode = ElementFactory.make("decodebin", null); colorspace =
ElementFactory.make("ffmpegcolorspace", null);
// decodebins output (src) isnt created until after the state != State.READY. So we wait
// for the new-decoded-pad event and hook up those pads at that time. // //
The last argument is because on_new_decoded_pad is static so we need to // provide a reference
to the instance variables it will need. // // We should be able to simply do:
// // decode.new_decoded_pad.connect(on_new_decoded_pad); //
// Where on_new_decoded_pad would be an instance method. However // There is a bug that
requires we do this crap. See on_new_decoded_pad comments. Signal.connect(decode,
"new-decoded-pad", (GLib.Callback) on_new_decoded_pad, colorspace);
// Add all our elements to the pipeline pipeline.add_many(src, decode, colorspace,
sink);
// Hook up the elements that we can hook up. Which pads to hook up is // resolved
automatically by direction and type when not ambiguous. src.link(decode);
colorspace.link(sink); }
// The last argument inherits from GPointer in C which in the context means any reference type. // We
declare this method to be static and use the last arg to get a ref back to the instance, // instead of just
making this an instance method because of bug: (which I don't totally understand) //
https://bugzilla.gnome.org/show_bug.cgi?id=615979 private static void on_new_decoded_pad(Element
decodebin, Pad pad, bool last, Element colorspace) { pad.link(colorspace.get_pad("sink")); }}
// Clutter.Texture is an actor, for drawing images on. We are going// to draw video frames on this texture.
It exposes a public attribute// player which is an instance of VideoPlayer.class VideoTexture :
Clutter.Texture {
public VideoPlayer player; private ClutterGst.VideoSink sink;
// Input args private string videoFile;
public VideoTexture(string? _videoFile) { videoFile = _videoFile;
// ClutterGst.VideoSink is a Gst sink element. We pass in this // actor so that this
sink knows to copy frames to that texture. sink = new ClutterGst.VideoSink(this);
// Create the player player = new VideoPlayer(videoFile, sink); }}
bool on_keypress_event(KeyEvent e) { Clutter.main_quit(); return true;}
void main(string[] args) { var vid1 = null;
// Initialize both Clutter and ClutterGst Clutter.init(ref args); Gst.init (ref args);
ClutterGst.init(ref args);
// Each window by default has a stage associated with it var stage = Stage.get_default();
stage.color = Color.from_string("black"); stage.title = "Awesome"; stage.x = 800; stage.y =
600;
stage.hide.connect(Clutter.main_quit); stage.key_press_event.connect(on_keypress_event);
VideoTexture awesome1 = new VideoTexture(vid1);
// Add the target of the pipeline, the clutter texture (this), // to the stage so we can see it.
stage.add_actor(awesome1); stage.show_all();
// Play must be called after the stage has been shown or else segfault!! // Calling play sets
the gst pipelines state to State.PLAYING awesome1.player.play();
Clutter.main();}
On 18 July 2010 12:05, Steve Salazar <eagsalazar hotmail com> wrote:
Sorry about the last post, here is the correct link:
http://gist.github.com/479975
Also, to answer the last question about trying the pipeline with gst-launch, I've tried this and it works
fine:
gst-launch filesrc location=/home/esalazar/Desktop/Rendezvous.avi ! decodebin ! ffmpegcolorspace !
xvimagesink
Which should be identical to what I'm doing.
Instead of linking decodebin to the next element, you should connect
to its `new-decoded-pad` event and link from there. See these C and
Vala examples:
http://cgit.freedesktop.org/gstreamer/gst-plugins-base/tree/gst/playback/test6.c
http://gitorious.org/spek/spek/blobs/bccc4997868333df89d1dc5594fcb2c88a8e28e8/src/spek-source.vala#line82
Alex
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]