| #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); |
| |
| 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; |
| } |