use glsinkbin for screensaver playback (fixes occasionally missing video)

This commit is contained in:
Andreas Frisch 2016-06-06 13:51:44 +02:00
parent e3a9be7c52
commit bf6c5abbc1
4 changed files with 33 additions and 2 deletions

View file

@ -42,6 +42,7 @@ facebook_put_timeout = 15
No camera connected! = Keine Kamera verbunden!
Touch screen to take a photo! = Bildschirm berühren zum Fotografieren!
Taking photo in %d seconds... = Aufnahme in %d Sekunden...
Taking photo failed! = Fotografieren fehlgeschlagen!
SAY CHEESE! = BITTE LÄCHELN :)
Focussing... = stelle scharf...
Taking photo... = fotografiere...

View file

@ -6,7 +6,7 @@ overlay_image = overlay_print_rainbows.png
save_path_template = /home/fraxinas/Desktop/photobooth_%04d.jpg
#screensaver_timeout -1 = disable
screensaver_timeout = 30
screensaver_timeout = 5
#screensaver_file can be image, video, audio (or freezes preview if omitted)
screensaver_file = /home/fraxinas/Desktop/Troye Sivan - Youth (1080p AAC).mkv
@ -42,6 +42,7 @@ facebook_put_timeout = 15
No camera connected! = Keine Kamera verbunden!
Touch screen to take a photo! = Bildschirm berühren zum Fotografieren!
Taking photo in %d seconds... = Aufnahme in %d Sekunden...
Taking photo failed! = Fotografieren fehlgeschlagen!
SAY CHEESE! = BITTE LÄCHELN :)
Focussing... = stelle scharf...
Taking photo... = fotografiere...

View file

@ -1115,6 +1115,10 @@ static gboolean photo_booth_preview (PhotoBooth *pb)
gst_pad_remove_probe (pad, priv->sink_block_id);
gst_object_unref (pad);
gst_element_set_state (pb->video_sink, GST_STATE_PLAYING);
GtkWidget *gtkgstwidget;
g_object_get (pb->video_sink, "widget", &gtkgstwidget, NULL);
photo_booth_window_add_gtkgstwidget (priv->win, gtkgstwidget);
g_object_unref (gtkgstwidget);
}
int ret = gst_element_link (pb->video_bin, pb->video_sink);
GST_LOG_OBJECT (pb, "linked video-bin ! video-sink ret=%i", ret);
@ -1153,6 +1157,8 @@ static gboolean photo_booth_preview_ready (PhotoBooth *pb)
static gboolean photo_booth_screensaver (PhotoBooth *pb)
{
GtkWidget *gtkgstwidget;
GstElement *gtkglsink, *video_sink;
PhotoBoothPrivate *priv = photo_booth_get_instance_private (pb);
photo_booth_change_state (pb, PB_STATE_SCREENSAVER);
@ -1190,9 +1196,24 @@ static gboolean photo_booth_screensaver (PhotoBooth *pb)
SEND_COMMAND (pb, CONTROL_PAUSE);
priv->screensaver_playbin = gst_element_factory_make ("playbin", "screensaver-playbin");
video_sink = gst_element_factory_make ("glsinkbin", "video-sink");
gtkglsink = gst_element_factory_make ("gtkglsink", "gtkglsink");
if (!(video_sink && gtkglsink))
{
GST_ERROR_OBJECT (pb, "Failed to create video sink element(s)");
return FALSE;
}
g_object_set (video_sink, "sink", gtkglsink, NULL);
g_object_get (gtkglsink, "widget", &gtkgstwidget, NULL);
photo_booth_window_add_gtkgstwidget (priv->win, gtkgstwidget);
g_object_unref (gtkgstwidget);
gst_object_ref (pb->video_sink);
gst_bin_remove (GST_BIN (pb->pipeline), pb->video_sink);
g_object_set (priv->screensaver_playbin, "video-sink", pb->video_sink, NULL);
g_object_set (priv->screensaver_playbin, "video-sink", video_sink, NULL);
if (priv->screensaver_uri)
g_object_set (priv->screensaver_playbin, "uri", priv->screensaver_uri, NULL);
@ -1222,6 +1243,10 @@ static gboolean photo_booth_screensaver_stop (PhotoBooth *pb)
gst_element_set_state (priv->screensaver_playbin, GST_STATE_NULL);
gst_element_set_state (pb->pipeline, GST_STATE_READY);
GstElement *video_sink;
g_object_get (priv->screensaver_playbin, "video-sink", &video_sink, NULL);
g_object_unref (video_sink);
gst_bin_add (GST_BIN (pb->pipeline), pb->video_sink);
gst_object_unref (pb->video_sink);

View file

@ -100,6 +100,10 @@ void photo_booth_window_add_gtkgstwidget (PhotoBoothWindow *win, GtkWidget *gtkg
{
PhotoBoothWindowPrivate *priv;
priv = photo_booth_window_get_instance_private (win);
if (win->gtkgstwidget)
{
gtk_container_remove (GTK_CONTAINER (priv->overlay), win->gtkgstwidget);
}
gtk_container_add (GTK_CONTAINER (priv->overlay), gtkgstwidget);
gtk_widget_add_events (gtkgstwidget, GDK_BUTTON_PRESS_MASK);
gtk_widget_realize (gtkgstwidget);