[gst-devel] Xoverlay artifacts
Paulo Schreiner
paulo.schreiner at gmail.com
Wed Nov 18 17:06:55 CET 2009
Solved it already :-) Sorry to bother...
changed the sink to xvimagesink and configured Xv and it worked...
Thanks,
Paulo Schreiner
On Wed, 2009-11-18 at 12:27 -0200, Paulo Schreiner wrote:
> Hello,
>
> I'm developing a video player, to be embedded on a low cost PC. It
> should play a sequence of short video clips, repeating when getting to
> the end, but it should also be possible to include a video to be played
> one time, at an arbitrary moment. But, one very important feature is
> that the player looks "professional", that is, to the viewer it should
> look like normal TV.
>
> To that effect I leveraged the Gstreamer framework and developed a
> sample application. It works ok, but i notice an artifact while playing
> full-screen or any kind of scaled video. For a short time, a fraction of
> a second, when the program starts playing a new clip, it appears on
> screen with its original resolution, shortly thereafter it fills the
> window allocated to it.
>
> I'm using Xoverlay as described in the documentation, is it possible
> that the xvvideosink is creating it's own window, and only a
> split-second later doing the overlay? If I resize the window DURING
> play, it works seamlessly.
>
> The relevant code is:
>
> pipeline = gst_pipeline_new ("gst-player");
>
> bin = gst_element_factory_make ("playbin", "bin");
> videosink = gst_element_factory_make ("xvvideosink", "videosink");
>
> g_object_set (G_OBJECT (bin), "video-sink", videosink, NULL);
>
> gst_bin_add (GST_BIN (pipeline), bin);
>
> {
> GstBus *bus;
> bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
> gst_bus_add_watch (bus, bus_cb, NULL);
> gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window,
> pipeline);
> gst_object_unref (bus);
> }
>
> g_object_set (G_OBJECT (bin), "uri", uri, NULL);
> g_print("URI2: %s\n", uri);
>
>
> gst_element_set_state (pipeline, GST_STATE_PLAYING);
> ---------------------------------------------------------------------
>
> This is executed when playing the first video.
>
> -----------------------------------------------------------------------
> static GstBusSyncReply
> create_window (GstBus * bus, GstMessage * message, GstPipeline *
> pipeline)
> {
> // ignore anything but 'prepare-xwindow-id' element messages
> if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
> return GST_BUS_PASS;
>
> if (!gst_structure_has_name (message->structure, "prepare-xwindow-id"))
> return GST_BUS_PASS;
>
> gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (GST_MESSAGE_SRC
> (message)),
> window); // window is a global
>
> gst_message_unref (message);
>
> return GST_BUS_DROP;
> }
> -------------------------------------------------------------------------
> To play the next clip, i do as follows:
> -------------------------------------------------------------------------
> gst_element_set_state (pipeline, GST_STATE_READY);
> g_object_set (G_OBJECT (bin), "uri",
> current_play_list->uri_to_play, NULL);
> gst_element_set_state (pipeline, GST_STATE_PLAYING);
> -------------------------------------------------------------------------
>
>
>
> Full source with a makefile is available too:
> http://www.jorjao81.com/player.tar.bz2
>
> Could anyone help me? I really want to use gstreamer for this project,
> and I'm probably doing something stupid... But i have to get rid of the
> artifacts...
>
> Sorry for this lengthy message, and thanks in advance.
>
> Yours,
> Paulo Schreiner
>
>
More information about the gstreamer-devel
mailing list