Re: Are there Perl bindings for gstreamer-1.0?

Hmm, well picking up off of:

my $bus = $play->get_bus;

# It appears the next steps would be:

# Create Gtk3 windows, widgets, drawable, etc..

$bus->signal_connect("sync-message", \&sync_message,$drawable);

sub sync_message
    my ($bus,$message,$drawable) = @_;
    my $structure = $message->get_structure;
    if(!defined($structure)) { return; }
    my $name = $structure->get_name;
    if($name ne 'prepare-window-handle') { return; }
    my $src = "">    print "Source: $src\n";

    # Do stuff...   

It looks like it hands off a: Source: Glib::Object::_Unregistered::GstPlaySink=HASH(0x8af8a40) as the $src. You'll then need to set that to the window id of the drawable, somehow. Let me know if you have any luck. Otherwise, I can look into this a little further tonight or tomorrow.

Also, you'll get this warning: *** GPerl asked to invoke callback from a foreign thread; handing it over to the main loop
I googled it. As long as nothing crashes, I'd say it's doing it job (of handing the signal from the other thread over to the main thread).

Terence J. Ferraro

On Mon, Apr 28, 2014 at 1:06 PM, Steve Cookson <it sca-uk com> wrote:
Hi Terrence,

Do you have any idea how to do a video-overlay using this mechanism?

I suspect that I have to wrap a different package, but I have no idea which one.

I guess this is why Torsten wrapped the original packages.  It doesn't seem that you can have 2 lots of

    Glib::Object::Introspection->invoke ($_GST_BASENAME, undef, 'init', undef);

in one module, so that'2 why we have and and so on.

And at that point you might as well put them on CPAN.

So I'm a bit lost with the videooverlay, because I don't know what package to wrap.

What do you think?



On 27/04/14 07:42, Terence Ferraro wrote:
I did a little more playing around with this...

Here's my working example:

#!/usr/bin/perl -w

use strict;

use Glib;
use Gtk3 -init;


my $play = Gst::ElementFactory->new("playbin","play");
my $fn = "";
my $bus = $play->get_bus;
my $int = $bus->add_watch(\&my_callback);


sub my_callback
    my ($bus, $message) = @_;

    if ($message->type =~ /error/)
        warn "error\n";
    elsif ($message->type =~ /eos/)
        warn "end\n";
    return 1;

Accomplished by placing the following in my file (in their respective portions of the file, left to the reader):

my $_GST_BASENAME = 'Gst';
my $_GST_VERSION = '1.0';
my $_GST_PACKAGE = 'Gst';

  Glib::Object::Introspection->setup (
    basename => $_GST_BASENAME,
    version => $_GST_VERSION,
    package => $_GST_PACKAGE);

sub Gst::init {
    Glib::Object::Introspection->invoke ($_GST_BASENAME, undef, 'init', undef);

sub Gst::ElementFactory::new
    my ($self,$factory_name,$name) = @_;
    my $e = Gst::ElementFactory::make($factory_name,$name);
    my $package = 'Gst::Element';
    return bless $e, $package;
sub Gst::Element::set_uri
    my ($self,$uri) = @_;
    Glib::Object::set($self,'uri' => $uri);
sub Gst::Bus::add_watch
    my ($self,$callback,$data) = @_;
    my $int = Glib::Object::Introspection->invoke ('Gst', 'Bus', 'add_watch',$self,0,$callback,$data);

Not sure if that's of use to anyone, but, hey, it works :)

Terence J. Ferraro

On Sat, Apr 26, 2014 at 9:05 PM, Terence Ferraro <terencejferraro gmail com> wrote:
I knew nothing about GStreamer a couple hours ago, but, since I have had a lot of dealings with perl/introspection of late, I went ahead and did some digging. Compiled with gstreamer-1.2.4.

So, first off, instead of: my $play = GStreamer::ElementFactory -> make("playbin", "play");
It should be: my $play = GStreamer::ElementFactory::make("playbin", "play");

Due to the class-static stuff.

I was, however, running into the same issue. I first verified that this works:

my $fake_factory = Glib::Object::Introspection->invoke ('Gst', 'ElementFactory', 'find', 'fakesrc');
my $fake_element = GStreamer::ElementFactory::create($fake_factory,"source");

After attempting a find on playbin, it would seem that the plugin simply isn't installed as the fakesrc is working. Looking at: plugins/elements/, I only see a handful of source files; playbin not being one of them.

That's when I remembered seeing a number of plugin subdirectories in

It looks like gst-plugins-base provides playbin. After installing, now the aforementioned playbin call returns correctly.

Terence J. Ferraro

On Sat, Apr 26, 2014 at 6:13 PM, Steve Cookson <it sca-uk com> wrote:
Hi Guys,

On 26/04/14 09:30, Steve Cookson wrote:
> > I'd suggest basing them on Glib::Object::Introspection.

Well actually, it's amazing.  I've just been trying it.

It's not so easy to install you have to install libgirepository1.0-dev first (apt-get install libgirepository1.0-dev).

This code:

#!/usr/bin/perl -w
    use strict;

    use Glib::Object::Introspection;
    Glib::Object::Introspection->setup (basename => 'Gst', version => '1.0', package => 'GStreamer');
    my @version=();
    @version = GStreamer::version();
    print "This program is linked against GStreamer @version\n";
    my $i = GStreamer::init ([$0, @ARGV]);

Gave me "This program is linked against GStreamer 1 2 3 0".

However, when I tried:

    my $play = GStreamer::ElementFactory -> make("playbin", "play");

I get:

*** GStreamer::ElementFactory::make: passed too many parameters (expected 2, got 3); ignoring excess at ~/test_code/ line 129.

When I drop the final parameter, I get an empty string passed in $play.

Any ideas?



gtk-perl-list mailing list
gtk-perl-list gnome org

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]