diff options
author | Christian Pointner <equinox@helsinki.at> | 2011-04-20 13:40:15 (GMT) |
---|---|---|
committer | Christian Pointner <equinox@helsinki.at> | 2011-04-20 13:40:15 (GMT) |
commit | 336cc3d0101ebc6d7a0e2cd509d351951f804368 (patch) | |
tree | 722d8ce63d5dd3fa75884db808114c1c583aafdb /src/writer.c | |
parent | 9bb444e208beac4e25e0cdcbff5904f818b8e8fd (diff) |
switched to multifdsink
no pthread at log (usign GThread instead)
file_list ist now thread safe
Diffstat (limited to 'src/writer.c')
-rw-r--r-- | src/writer.c | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/src/writer.c b/src/writer.c index 0f96eb9..4d8d664 100644 --- a/src/writer.c +++ b/src/writer.c @@ -68,17 +68,40 @@ static int init_time_boundaries(writer_t* writer) return 0; } +static void added_cb(GstElement* sink, gint fd, gpointer data) +{ + log_printf(INFO, "fdsink: successfully added client %d", fd); +} + +static void removed_cb(GstElement* sink, gint fd, gpointer data) +{ + log_printf(INFO, "fdsink: successfully removed client %d", fd); +} + +static void fdremoved_cb(GstElement* sink, gint fd, gpointer data) +{ + writer_t *writer = (writer_t*)data; + log_printf(INFO, "fdsink: successfully removed fd %d", fd); + + // call post processing script + file_list_remove(&(writer->files_), fd); +} + int writer_init(writer_t* writer, GMainLoop *loop, const char* name_format, mode_t mode, const char* output_dir, int interval, int offset) { if(!writer) return -1; writer->loop_ = loop; - writer->sink_ = gst_element_factory_make("fdsink", "writer"); + writer->sink_ = gst_element_factory_make("multifdsink", "writer"); if(!writer->sink_) { log_printf(ERROR, "the writer object could not be created. Exiting."); return -1; } + g_signal_connect(G_OBJECT(writer->sink_), "client-added", G_CALLBACK(added_cb), writer); + g_signal_connect(G_OBJECT(writer->sink_), "client-removed", G_CALLBACK(removed_cb), writer); + g_signal_connect(G_OBJECT(writer->sink_), "client-fd-removed", G_CALLBACK(fdremoved_cb), writer); + writer->clock_ = gst_system_clock_obtain(); if(!writer->clock_) { log_printf(ERROR, "unable to obtain the system clock"); @@ -97,6 +120,21 @@ int writer_init(writer_t* writer, GMainLoop *loop, const char* name_format, mode return init_time_boundaries(writer); } +static void add_fd(writer_t* writer, int fd) +{ + log_printf(INFO, "adding fd %d to fdsink", fd); +// g_object_set(G_OBJECT(writer->sink_), "fd", fd, NULL); + + g_signal_emit_by_name(G_OBJECT(writer->sink_), "add", fd, NULL); +} + +static void remove_fd(writer_t* writer, int fd) +{ + log_printf(INFO, "removing fd %d from fdsink", fd); + // nothing yet + g_signal_emit_by_name(G_OBJECT(writer->sink_), "remove-flush", fd, NULL); +} + static int check_boundaries(writer_t* writer) { struct timespec now; @@ -113,7 +151,8 @@ static int check_boundaries(writer_t* writer) int ret = open_file(writer->next_); if(ret) return ret; // TODO: stop writer on open_file error ??? - g_object_set(G_OBJECT(writer->sink_), "fd", writer->next_->fd_, NULL); + add_fd(writer, writer->next_->fd_); + remove_fd(writer, writer->current_->fd_); int old_fd = writer->current_->fd_; writer->current_ = writer->next_; @@ -124,8 +163,6 @@ static int check_boundaries(writer_t* writer) writer->next_ = file_list_add(&(writer->files_), &bd_time, "next", writer->name_format_, writer->output_dir_, writer->mode_); if(writer->next_ == NULL) return -2; - - file_list_remove(&(writer->files_), old_fd); } return 0; @@ -164,7 +201,7 @@ int writer_start(writer_t* writer) if(ret) return ret; - g_object_set(G_OBJECT(writer->sink_), "fd", writer->current_->fd_, NULL); + add_fd(writer, writer->current_->fd_); writer->clock_id_ = gst_clock_new_periodic_id(writer->clock_, 0, writer->interval_); if(!writer->clock_id_) { |