summaryrefslogtreecommitdiff
path: root/src/writer.c
diff options
context:
space:
mode:
authorChristian Pointner <equinox@helsinki.at>2011-04-20 13:40:15 (GMT)
committerChristian Pointner <equinox@helsinki.at>2011-04-20 13:40:15 (GMT)
commit336cc3d0101ebc6d7a0e2cd509d351951f804368 (patch)
tree722d8ce63d5dd3fa75884db808114c1c583aafdb /src/writer.c
parent9bb444e208beac4e25e0cdcbff5904f818b8e8fd (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.c47
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_) {