mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
examples/sdlshare: Move from a fakesink to an appsink
This commit is contained in:
parent
6f14785c3e
commit
b0bd448d37
1 changed files with 28 additions and 14 deletions
|
@ -159,25 +159,37 @@ update_sdl_scene (gpointer data)
|
||||||
/* push buffer so it can be unref later */
|
/* push buffer so it can be unref later */
|
||||||
g_async_queue_push (queue_output_buf, buf);
|
g_async_queue_push (queue_output_buf, buf);
|
||||||
|
|
||||||
return FALSE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fakesink handoff callback */
|
/* appsink new-sample callback */
|
||||||
static void
|
static GstFlowReturn
|
||||||
on_gst_buffer (GstElement * fakesink, GstBuffer * buf, GstPad * pad,
|
on_new_sample (GstElement * appsink, gpointer data)
|
||||||
gpointer data)
|
|
||||||
{
|
{
|
||||||
|
GstSample *sample = NULL;
|
||||||
|
GstBuffer *buf;
|
||||||
|
|
||||||
|
g_signal_emit_by_name (appsink, "pull-sample", &sample, NULL);
|
||||||
|
if (!sample)
|
||||||
|
return GST_FLOW_FLUSHING;
|
||||||
|
|
||||||
|
buf = gst_sample_get_buffer (sample);
|
||||||
/* ref then push buffer to use it in sdl */
|
/* ref then push buffer to use it in sdl */
|
||||||
gst_buffer_ref (buf);
|
gst_buffer_ref (buf);
|
||||||
|
|
||||||
|
gst_sample_unref (sample);
|
||||||
|
|
||||||
g_async_queue_push (queue_input_buf, buf);
|
g_async_queue_push (queue_input_buf, buf);
|
||||||
if (g_async_queue_length (queue_input_buf) > 3)
|
if (g_async_queue_length (queue_input_buf) > 3)
|
||||||
g_idle_add (update_sdl_scene, (gpointer) fakesink);
|
g_idle_add (update_sdl_scene, (gpointer) appsink);
|
||||||
|
|
||||||
/* pop then unref buffer we have finished to use in sdl */
|
/* pop then unref buffer we have finished to use in sdl */
|
||||||
if (g_async_queue_length (queue_output_buf) > 3) {
|
if (g_async_queue_length (queue_output_buf) > 3) {
|
||||||
GstBuffer *buf_old = (GstBuffer *) g_async_queue_pop (queue_output_buf);
|
GstBuffer *buf_old = (GstBuffer *) g_async_queue_pop (queue_output_buf);
|
||||||
gst_buffer_unref (buf_old);
|
gst_buffer_unref (buf_old);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* gst bus signal watch callback */
|
/* gst bus signal watch callback */
|
||||||
|
@ -265,7 +277,7 @@ main (int argc, char **argv)
|
||||||
|
|
||||||
GstPipeline *pipeline = NULL;
|
GstPipeline *pipeline = NULL;
|
||||||
GstBus *bus = NULL;
|
GstBus *bus = NULL;
|
||||||
GstElement *fakesink = NULL;
|
GstElement *appsink = NULL;
|
||||||
GstState state;
|
GstState state;
|
||||||
const gchar *platform;
|
const gchar *platform;
|
||||||
|
|
||||||
|
@ -320,8 +332,10 @@ main (int argc, char **argv)
|
||||||
|
|
||||||
pipeline =
|
pipeline =
|
||||||
GST_PIPELINE (gst_parse_launch
|
GST_PIPELINE (gst_parse_launch
|
||||||
("videotestsrc ! video/x-raw, width=320, height=240, framerate=(fraction)30/1 ! "
|
("videotestsrc ! glupload ! gleffects effect=5 ! "
|
||||||
"glupload ! gleffects effect=5 ! fakesink sync=1", NULL));
|
"appsink name=sink sync=true "
|
||||||
|
"caps=video/x-raw(memory:GLMemory),format=RGBA,width=320,height=240,framerate=(fraction)30/1,texture-target=2D",
|
||||||
|
NULL));
|
||||||
|
|
||||||
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
|
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
|
||||||
gst_bus_add_signal_watch (bus);
|
gst_bus_add_signal_watch (bus);
|
||||||
|
@ -347,15 +361,15 @@ main (int argc, char **argv)
|
||||||
#else
|
#else
|
||||||
glXMakeCurrent (sdl_display, sdl_win, sdl_gl_context);
|
glXMakeCurrent (sdl_display, sdl_win, sdl_gl_context);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
queue_input_buf = g_async_queue_new ();
|
queue_input_buf = g_async_queue_new ();
|
||||||
queue_output_buf = g_async_queue_new ();
|
queue_output_buf = g_async_queue_new ();
|
||||||
|
|
||||||
/* append a gst-gl texture to this queue when you do not need it no more */
|
/* append a gst-gl texture to this queue when you do not need it no more */
|
||||||
fakesink = gst_bin_get_by_name (GST_BIN (pipeline), "fakesink0");
|
appsink = gst_bin_get_by_name (GST_BIN (pipeline), "sink");
|
||||||
g_object_set (G_OBJECT (fakesink), "signal-handoffs", TRUE, NULL);
|
g_object_set (appsink, "emit-signals", TRUE, NULL);
|
||||||
g_signal_connect (fakesink, "handoff", G_CALLBACK (on_gst_buffer), NULL);
|
g_signal_connect (appsink, "new-sample", G_CALLBACK (on_new_sample), NULL);
|
||||||
gst_object_unref (fakesink);
|
gst_object_unref (appsink);
|
||||||
|
|
||||||
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
|
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue