diff options
author | Christian Pointner <equinox@spreadspace.org> | 2011-06-08 21:09:03 +0000 |
---|---|---|
committer | Christian Pointner <equinox@spreadspace.org> | 2011-06-08 21:09:03 +0000 |
commit | bf2937ef7a51692fde384a38c24d3d0eed601fda (patch) | |
tree | a82699aba443228ec0ffd4a81986f9f41d7c3923 /src/streamer.c | |
parent | only needed params (diff) |
added basic streamer code
Diffstat (limited to 'src/streamer.c')
-rw-r--r-- | src/streamer.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/streamer.c b/src/streamer.c new file mode 100644 index 0000000..fd1223d --- /dev/null +++ b/src/streamer.c @@ -0,0 +1,137 @@ +/* + * gstdvbbackend + * + * gstdvbbackend is a small programm which captures a given set of dvb + * channels from one dvb device and provides the streams via minimal http. + * + * + * Copyright (C) 2011 Christian Pointner <equinox@spreadspace.org> + * + * This file is part of gstdvbbackend. + * + * gstdvbbackend is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * gstdvbbackend is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gstdvbbackend. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <gst/gst.h> + +#include <sys/types.h> + +#include <errno.h> +#include <string.h> + +#include "streamer.h" + +#include "datatypes.h" +#include "log.h" + +static void added_cb(GstElement* sink, gint fd, gpointer data) +{ + gint num_fds; + g_object_get(G_OBJECT(sink), "num_fds", &num_fds, NULL); + log_printf(INFO, "fdsink: successfully added client %d (sink has now %d fds)", fd, num_fds); +} + +static void removed_cb(GstElement* sink, gint fd, gpointer data) +{ + gint num_fds; + g_object_get(G_OBJECT(sink), "num_fds", &num_fds, NULL); + log_printf(INFO, "fdsink: successfully removed client %d (sink has now %d fds)", fd, num_fds); +} + +static void fdremoved_cb(GstElement* sink, gint fd, gpointer data) +{ + gint num_fds; + g_object_get(G_OBJECT(sink), "num_fds", &num_fds, NULL); + log_printf(INFO, "fdsink: successfully removed fd %d (sink has now %d fds)", fd, num_fds); +} + +int streamer_init(streamer_t* streamer, GMainLoop *loop, const char* host, const char* port) +{ + if(!streamer) + return -1; + + // TODO: init server socket here + + streamer->loop_ = loop; + streamer->sink_ = gst_element_factory_make("multifdsink", "streamer"); + if(!streamer->sink_) { + log_printf(ERROR, "the streamer object could not be created. Exiting."); + return -1; + } + + // TODO: how the heck should we get the right value? 3 means keyframe... + g_object_set(G_OBJECT(streamer->sink_), "recover-policy", 3, NULL); + g_signal_connect(G_OBJECT(streamer->sink_), "client-added", G_CALLBACK(added_cb), streamer); + g_signal_connect(G_OBJECT(streamer->sink_), "client-removed", G_CALLBACK(removed_cb), streamer); + g_signal_connect(G_OBJECT(streamer->sink_), "client-fd-removed", G_CALLBACK(fdremoved_cb), streamer); + + streamer->thread_ = NULL; + return 0; +} + +static void add_fd(streamer_t* streamer, int fd) +{ + log_printf(INFO, "adding fd %d to fdsink", fd); + g_signal_emit_by_name(G_OBJECT(streamer->sink_), "add", fd, NULL); +} + +static void remove_fd(streamer_t* streamer, int fd) +{ + log_printf(INFO, "removing fd %d from fdsink", fd); + g_signal_emit_by_name(G_OBJECT(streamer->sink_), "remove-flush", fd, NULL); +} + +static gpointer streamer_thread_func(gpointer data) +{ + streamer_t *streamer = (streamer_t*)data; + log_printf(NOTICE, "streamer thread started"); + + GstBuffer* buf = NULL; + for(;;) { + // TODO: call accept here + sleep(100); + break; + } + + log_printf(NOTICE, "streamer thread stopped"); + g_main_loop_quit(streamer->loop_); + return NULL; +} + +int streamer_start(streamer_t* streamer) +{ + if(!streamer) + return -1; + + streamer->thread_ = g_thread_create(streamer_thread_func, streamer, TRUE, NULL); + if(!streamer->thread_) { + log_printf(ERROR, "streamer thread could not be started"); + return -1; + } + + return 0; +} + +void streamer_stop(streamer_t* streamer) +{ + if(!streamer) + return; + + // TODO: close server socket here + + if(streamer->thread_) { + log_printf(NOTICE, "waiting for streamer thread to stop"); + g_thread_join(streamer->thread_); + } +} |