mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-29 11:40:38 +00:00
20d64607d4
Original commit message from CVS: * examples/app/.cvsignore: * examples/app/Makefile.am: * examples/app/appsrc-stream.c: (read_data), (start_feed), (stop_feed), (found_source), (bus_message), (main): Added an example on how to use appsrc in playbin in streaming mode from an mmapped file. * examples/app/appsrc_ex.c: (main): Set pipeline to NULL to free queued buffers. * gst-libs/gst/app/gstapp-marshal.list: * gst-libs/gst/app/gstappsrc.c: (stream_type_get_type), (_do_init), (gst_app_src_class_init), (gst_app_src_init), (gst_app_src_flush_queued), (gst_app_src_dispose), (gst_app_src_set_property), (gst_app_src_get_property), (gst_app_src_unlock), (gst_app_src_unlock_stop), (gst_app_src_start), (gst_app_src_stop), (gst_app_src_is_seekable), (gst_app_src_check_get_range), (gst_app_src_do_seek), (gst_app_src_create), (gst_app_src_set_stream_type), (gst_app_src_get_stream_type), (gst_app_src_set_max_bytes), (gst_app_src_get_max_bytes), (gst_app_src_push_buffer), (gst_app_src_end_of_stream), (gst_app_src_uri_get_type), (gst_app_src_uri_get_protocols), (gst_app_src_uri_get_uri), (gst_app_src_uri_set_uri), (gst_app_src_uri_handler_init): * gst-libs/gst/app/gstappsrc.h: Measure max queue size in bytes instead. Add support for 3 modes of operation, streaming, seekable and random-access, making basesrc handle the scheduling modes for each. Add appsrc:// uri handler so that automatic plugging can be done from playbin2 or uridecodebin, for example. Added support for custom segment formats. Add support for push and pull based operations from the application. Expand the methods so that errors can be detected. Flush the queued buffers on seeks and when shutting down. Add signals to inform the app that a seek must happen.
89 lines
1.8 KiB
C
89 lines
1.8 KiB
C
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <gst/gst.h>
|
|
#include <gst/app/gstappsrc.h>
|
|
#include <gst/app/gstappbuffer.h>
|
|
#include <gst/app/gstappsink.h>
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
typedef struct _App App;
|
|
struct _App
|
|
{
|
|
GstElement *pipe;
|
|
GstElement *src;
|
|
GstElement *id;
|
|
GstElement *sink;
|
|
};
|
|
|
|
App s_app;
|
|
|
|
static void dont_eat_my_chicken_wings (void *priv);
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
App *app = &s_app;
|
|
int i;
|
|
|
|
gst_init (&argc, &argv);
|
|
|
|
app->pipe = gst_pipeline_new (NULL);
|
|
g_assert (app->pipe);
|
|
|
|
app->src = gst_element_factory_make ("appsrc", NULL);
|
|
g_assert (app->src);
|
|
gst_bin_add (GST_BIN (app->pipe), app->src);
|
|
|
|
app->id = gst_element_factory_make ("identity", NULL);
|
|
g_assert (app->id);
|
|
gst_bin_add (GST_BIN (app->pipe), app->id);
|
|
|
|
app->sink = gst_element_factory_make ("appsink", NULL);
|
|
g_assert (app->sink);
|
|
gst_bin_add (GST_BIN (app->pipe), app->sink);
|
|
|
|
gst_element_link (app->src, app->id);
|
|
gst_element_link (app->id, app->sink);
|
|
|
|
gst_element_set_state (app->pipe, GST_STATE_PLAYING);
|
|
|
|
for (i = 0; i < 10; i++) {
|
|
GstBuffer *buf;
|
|
void *data;
|
|
|
|
data = malloc (100);
|
|
memset (data, i, 100);
|
|
|
|
buf = gst_app_buffer_new (data, 100, dont_eat_my_chicken_wings, data);
|
|
printf ("%d: creating buffer for pointer %p, %p\n", i, data, buf);
|
|
gst_app_src_push_buffer (GST_APP_SRC (app->src), buf);
|
|
}
|
|
|
|
gst_app_src_end_of_stream (GST_APP_SRC (app->src));
|
|
|
|
while (!gst_app_sink_is_eos (GST_APP_SINK (app->sink))) {
|
|
GstBuffer *buf;
|
|
|
|
buf = gst_app_sink_pull_buffer (GST_APP_SINK (app->sink));
|
|
printf ("retrieved buffer %p\n", buf);
|
|
gst_buffer_unref (buf);
|
|
}
|
|
gst_element_set_state (app->pipe, GST_STATE_NULL);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void
|
|
dont_eat_my_chicken_wings (void *priv)
|
|
{
|
|
printf ("freeing buffer for pointer %p\n", priv);
|
|
free (priv);
|
|
}
|