[gst-devel] Xoverlay artifacts
Paulo Schreiner
paulo.schreiner at gmail.com
Wed Nov 18 15:27:44 CET 2009
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