/* * rharchive * * rharchive is a simple tcp connection proxy which combines the * features of rinetd and 6tunnel. rharchive supports IPv4 and * IPv6 and also supports connections from IPv6 to IPv4 * endpoints and vice versa. * * * Copyright (C) 2010-2011 Christian Pointner * * This file is part of rharchive. * * rharchive 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. * * rharchive 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 rharchive. If not, see . */ #include #include #include #include #include "writer.h" #include "datatypes.h" #include "log.h" int writer_init(writer_t* writer, const char* name_format, const char* output_dir, int length, int offset) { if(!writer) return -1; writer->sink_ = gst_element_factory_make("fakesink", "writer"); if(!writer->sink_) { log_printf(ERROR, "the writer object could not be created. Exiting."); return -1; } writer->clock_ = gst_system_clock_obtain(); if(!writer->clock_) { log_printf(ERROR, "unable to obtain the system clock"); return -1; } writer->name_format_ = name_format; writer->output_dir_ = output_dir; writer->length_ = length; writer->offset_ = offset; return 0; } static gpointer writer_thread_func(gpointer data) { writer_t *writer = (writer_t*)data; log_printf(NOTICE, "writer thread started"); GstBuffer* buf = NULL; for(;;) { GstClockReturn ret = gst_clock_id_wait(writer->clock_id_, NULL); if(GST_CLOCK_UNSCHEDULED == ret) break; if(GST_CLOCK_EARLY == ret) continue; log_printf(NOTICE, "just woke up"); } log_printf(NOTICE, "writer thread stopped"); return NULL; } int writer_start(writer_t* writer) { if(!writer) return; writer->clock_id_ = gst_clock_new_periodic_id(writer->clock_, 0, writer->length_*GST_SECOND); writer->thread_ = g_thread_create(writer_thread_func, writer, TRUE, NULL); if(!writer->thread_) { log_printf(ERROR, "writer thread could not be started"); return -1; } } void writer_stop(writer_t* writer) { if(!writer) return; gst_clock_id_unschedule(writer->clock_id_); if(writer->thread_) { log_printf(NOTICE, "waiting for writer thread to stop"); g_thread_join(writer->thread_); } gst_object_unref(GST_OBJECT(writer->clock_)); }