gstreamer/subprojects/gst-plugins-good/gst/multifile/test-splitmuxpartreader.c
Jan Schmidt 64fd2b265f splitmuxsrc: Add num-lookahead property
Add a `num-lookahead` property that will 'prepare' a number of
fragments in advance of the playhead if they have been deactivated
or closed by a limited number of `num-open-fragments`. It can help
to avoid any play stalls reading the indexes or headers of the next
file from high-latency media or on resource limited machines.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7053>
2024-08-02 15:30:12 +10:00

104 lines
2.5 KiB
C

#include <gst/gst.h>
#include "gstsplitmuxpartreader.h"
#include "gstsplitmuxsrc.h"
GST_DEBUG_CATEGORY_EXTERN (splitmux_debug);
static const gchar *const path = "out001.mp4";
typedef struct _CustomData
{
GstSplitMuxPartReader *reader;
GMainLoop *main_loop;
GstBus *bus;
} CustomData;
static void
part_prepared (GstSplitMuxPartReader * reader)
{
g_print ("Part prepared\n");
}
static gboolean
handle_message (GstBus * bus, GstMessage * msg, CustomData * data)
{
GError *err;
gchar *debug_info;
switch (GST_MESSAGE_TYPE (msg)) {
case GST_MESSAGE_ERROR:
gst_message_parse_error (msg, &err, &debug_info);
g_print ("Error received from element %s: %s\n",
GST_OBJECT_NAME (msg->src), err->message);
g_print ("Debugging information: %s\n", debug_info ? debug_info : "none");
g_clear_error (&err);
g_free (debug_info);
g_main_loop_quit (data->main_loop);
break;
case GST_MESSAGE_EOS:
g_print ("End-Of-Stream reached.\n");
g_main_loop_quit (data->main_loop);
break;
default:
break;
}
return TRUE;
}
static gboolean
start_reader (CustomData * data)
{
g_print ("Preparing part reader for %s\n", path);
gst_splitmux_part_reader_prepare (data->reader);
return FALSE;
}
static GstPad *
handle_get_pad (GstSplitMuxPartReader * reader, GstPad * src_pad,
CustomData * data)
{
/* Create a dummy target pad for the reader */
GstPad *new_pad = g_object_new (SPLITMUX_TYPE_SRC_PAD,
"name", GST_PAD_NAME (src_pad), "direction", GST_PAD_SRC, NULL);
g_print ("Creating new dummy pad %s\n", GST_PAD_NAME (src_pad));
return new_pad;
}
int
main (int argc, char **argv)
{
CustomData data;
gst_init (&argc, &argv);
data.main_loop = g_main_loop_new (NULL, FALSE);
data.reader = g_object_new (GST_TYPE_SPLITMUX_PART_READER, NULL);
data.bus = gst_element_get_bus (GST_ELEMENT_CAST (data.reader));
/* Listen for bus messages */
gst_bus_add_watch (data.bus, (GstBusFunc) handle_message, &data);
gst_splitmux_part_reader_set_location (data.reader, path);
/* Connect to prepare signal */
g_signal_connect (data.reader, "prepared", (GCallback) part_prepared, &data);
gst_splitmux_part_reader_set_callbacks (data.reader, &data,
(GstSplitMuxPartReaderPadCb) handle_get_pad, NULL, NULL);
g_idle_add ((GSourceFunc) start_reader, &data);
/* Run mainloop */
g_main_loop_run (data.main_loop);
gst_splitmux_part_reader_unprepare (data.reader);
g_main_loop_unref (data.main_loop);
gst_object_unref (data.bus);
g_object_unref (data.reader);
return 0;
}