#!/usr/bin/perl # This is a Perl port written by g.schlmm at googlemail dot com of the # cairo_overlay.c example found at # . use strict; use warnings; use Glib qw(TRUE FALSE); use GStreamer '-init'; use Cairo::GObject; my $loop = Glib::MainLoop->new; # create the pipeline my $pipeline = GStreamer::Pipeline->new ('cairo-overlay-example'); my ($source, $a1, $a2, $sink) = GStreamer::ElementFactory->make ( videotestsrc => 'source', ffmpegcolorspace => 'a1', ffmpegcolorspace => 'a2', autovideosink => 'sink' ); my $cairo_overlay = GStreamer::ElementFactory->make ('cairooverlay', 'overlay'); my ($width, $height, $valid); $cairo_overlay->signal_connect (draw => sub { my ($overlay, $context, $timestamp, $duration) = @_; return if (!$valid); my $scale = 2 * ((($timestamp / int(1e7)) % 70) + 30) / 100.0; $context->translate ($width / 2, ($height / 2) - 30); $context->scale ($scale, $scale); $context->move_to (0, 0); $context->curve_to (0, -30, -50, -30, -50, 0); $context->curve_to (-50, 30, 0, 35, 0, 60); $context->curve_to (0, 35, 50, 30, 50, 0); $context->curve_to (50, -30, 0, -30, 0, 0); $context->set_source_rgba (0.9, 0.0, 0.1, 0.7); $context->fill; }); $cairo_overlay->signal_connect (caps_changed => sub { my ($overlay, $caps) = @_; $width = 0; $height = 0; for (@{$caps->get_structure(0)->{fields}}) { $width = $_->[2] if ($_->[0] eq 'width'); $height = $_->[2] if ($_->[0] eq 'height'); last if ($height > 0 && $width > 0); } $valid = 1 if ($height > 0 && $width > 0); }); $pipeline->add ($source, $a1, $cairo_overlay, $a2, $sink); $source->link ($a1); $a1->link ($cairo_overlay); $cairo_overlay->link ($a2); $a2->link ($sink); my $bus = $pipeline->get_bus; $bus->add_signal_watch; $bus->signal_connect(message => sub { my ($bus, $message) = @_; if ($message->type eq 'eos') { $loop->quit(); } return TRUE; }); $pipeline->set_state ('playing'); $loop->run; $pipeline->set_state ('null');