From 1d5310c38c93766b294afdd380e6fb05170aaad5 Mon Sep 17 00:00:00 2001 From: Sean DuBois Date: Fri, 20 Sep 2019 00:31:15 -0700 Subject: Initial commit --- gst/gst.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 gst/gst.c (limited to 'gst/gst.c') diff --git a/gst/gst.c b/gst/gst.c new file mode 100644 index 0000000..e84316e --- /dev/null +++ b/gst/gst.c @@ -0,0 +1,110 @@ +#include "gst.h" + +#include + +typedef struct SampleHandlerUserData { + int pipelineId; +} SampleHandlerUserData; + +GMainLoop *gstreamer_send_main_loop = NULL; +void gstreamer_send_start_mainloop(void) { + gstreamer_send_main_loop = g_main_loop_new(NULL, FALSE); + + g_main_loop_run(gstreamer_send_main_loop); +} + +static gboolean gstreamer_send_bus_call(GstBus *bus, GstMessage *msg, gpointer data) { + GstElement *pipeline = GST_ELEMENT(data); + + switch (GST_MESSAGE_TYPE(msg)) { + case GST_MESSAGE_EOS: + if (!gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT | GST_SEEK_FLAG_SKIP, + GST_SEEK_TYPE_SET, 0, + GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) { + g_print ("EOS restart failed\n"); + exit(1); + } + break; + + case GST_MESSAGE_ERROR: { + gchar *debug; + GError *error; + + gst_message_parse_error(msg, &error, &debug); + g_free(debug); + + g_printerr("GStreamer Error: %s\n", error->message); + g_error_free(error); + exit(1); + } + default: + break; + } + + return TRUE; +} + +GstFlowReturn gstreamer_send_new_sample_handler(GstElement *object, gpointer user_data) { + GstSample *sample = NULL; + GstBuffer *buffer = NULL; + gpointer copy = NULL; + gsize copy_size = 0; + int *isVideo = (int *) user_data; + + g_signal_emit_by_name (object, "pull-sample", &sample); + if (sample) { + buffer = gst_sample_get_buffer(sample); + if (buffer) { + gst_buffer_extract_dup(buffer, 0, gst_buffer_get_size(buffer), ©, ©_size); + goHandlePipelineBuffer(copy, copy_size, GST_BUFFER_DURATION(buffer), *isVideo); + } + gst_sample_unref (sample); + } + + return GST_FLOW_OK; +} + +GstElement *gstreamer_send_create_pipeline(char *pipeline) { + gst_init(NULL, NULL); + GError *error = NULL; + return gst_parse_launch(pipeline, &error); +} + +void gstreamer_send_start_pipeline(GstElement *pipeline) { + GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); + gst_bus_add_watch(bus, gstreamer_send_bus_call, pipeline); + gst_object_unref(bus); + + GstElement *audio = gst_bin_get_by_name(GST_BIN(pipeline), "audio"), + *video = gst_bin_get_by_name(GST_BIN(pipeline), "video"); + + int *isAudio = malloc(sizeof(int)), + *isVideo = malloc(sizeof(int)); + + *isVideo = 1; + *isAudio = 0; + + g_object_set(audio, "emit-signals", TRUE, NULL); + g_signal_connect(audio, "new-sample", G_CALLBACK(gstreamer_send_new_sample_handler), isAudio); + + g_object_set(video, "emit-signals", TRUE, NULL); + g_signal_connect(video, "new-sample", G_CALLBACK(gstreamer_send_new_sample_handler), isVideo); + + gstreamer_send_play_pipeline(pipeline); +} + +void gstreamer_send_play_pipeline(GstElement *pipeline) { + gst_element_set_state(pipeline, GST_STATE_PLAYING); +} + +void gstreamer_send_pause_pipeline(GstElement *pipeline) { + gst_element_set_state(pipeline, GST_STATE_PAUSED); +} + +void gstreamer_send_seek(GstElement *pipeline, int64_t seek_pos) { + if (!gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT | GST_SEEK_FLAG_SKIP, + GST_SEEK_TYPE_SET, seek_pos * GST_SECOND, + GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) { + g_print ("Seek failed!\n"); + } +} -- cgit v1.2.3