From 72aad834774598a50cbaf4bedc22e8101b02cef5 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Thu, 4 Sep 2014 02:20:34 +0200 Subject: added send stream pipeline with options --- src/sydra.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 6 deletions(-) (limited to 'src/sydra.c') diff --git a/src/sydra.c b/src/sydra.c index ec87af8..b4b8d9b 100644 --- a/src/sydra.c +++ b/src/sydra.c @@ -27,11 +27,13 @@ * along with sydra. If not, see . */ +#define _GNU_SOURCE #include #include #include #include #include +#include #include @@ -75,17 +77,19 @@ static gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data) break; } default: + log_printf(WARNING, "unkonwn message %d", GST_MESSAGE_TYPE(msg)); break; } return TRUE; } + int main_loop(options_t* opt) { log_printf(INFO, "entering main loop"); GMainLoop *loop; - GstElement *pipeline, *source; + GstElement *pipeline, *sender; GstBus *bus; loop = g_main_loop_new(NULL, FALSE); @@ -95,17 +99,62 @@ int main_loop(options_t* opt) return -1; } + struct timespec now; + clock_gettime(CLOCK_REALTIME, &now); + struct tm bd_time; + localtime_r(&(now.tv_sec), &bd_time); + char recfile[1024]; //TODO: fix this hardcoded length + strftime(recfile, sizeof(recfile), opt->rec_name_format_, &bd_time); + + int rtp_port_v = opt->rtp_port_base_; + int rtcp_port_v = opt->rtp_port_base_ + 100; + int rtp_port_a = opt->rtp_port_base_ + 200; + int rtcp_port_a = opt->rtp_port_base_ + 300; + + char* sender_str; + int slen = asprintf(&sender_str, "rtpbin name=rtpbin \ + %s ! tee name=vt \ + vt. ! queue silent=true ! %s ! tee name=cvt \ + cvt. ! %s ! rtpbin.send_rtp_sink_0 \ + rtpbin.send_rtp_src_0 ! udpsink port=%d host=%s \ + rtpbin.send_rtcp_src_0 ! udpsink port=%d host=%s sync=false async=false \ + %s ! tee name=at \ + at. ! queue silent=true ! %s ! %s ! rtpbin.send_rtp_sink_1 \ + rtpbin.send_rtp_src_1 ! udpsink port=%d host=%s \ + rtpbin.send_rtcp_src_1 ! udpsink port=%d host=%s sync=false async=false \ + %s name=recmux ! filesink location=\"%s\" \ + cvt. ! queue silent=true ! recmux. \ + at. ! queue silent=true ! %s ! recmux. \ + vt. ! queue silent=true ! textoverlay text=\" local \" shaded-background=true halignment=center valignment=baseline font-desc=\"Sans 18\" ! %s", + opt->video_src_, opt->video_enc_, opt->video_payloader_, rtp_port_v, opt->rtp_host_, rtcp_port_v, opt->rtp_host_, + opt->audio_src_, opt->audio_enc_stream_, opt->audio_payloader_, rtp_port_a, opt->rtp_host_, rtcp_port_a, opt->rtp_host_, + opt->rec_mux_, recfile, opt->audio_enc_rec_, opt->videosink_); + + if(slen < 0) { + log_printf(ERROR, "memory error while constructing sender pipeline"); + gst_object_unref(GST_OBJECT(pipeline)); + gst_object_unref(GST_OBJECT(loop)); + return -1; + } + + printf("\n\n\n"); + printf("%s", sender_str); + printf("\n\n\n"); + + GError *error = NULL; - source = gst_parse_bin_from_description("videotestsrc ! xvimagesink", TRUE, &error); - if(!source || error) { - log_printf(ERROR, "Source Bin Description Parser Error: %s", error ? error->message : "unknown"); + sender = gst_parse_bin_from_description(sender_str, TRUE, &error); + if(!sender || error) { + log_printf(ERROR, "Sending Bin Description Parser Error: %s", error ? error->message : "unknown"); g_error_free(error); + free(sender_str); gst_object_unref(GST_OBJECT(pipeline)); gst_object_unref(GST_OBJECT(loop)); return -1; } + free(sender_str); - gst_bin_add_many(GST_BIN(pipeline), source, NULL); + gst_bin_add_many(GST_BIN(pipeline), sender, NULL); bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); gst_bus_add_watch(bus, bus_call, loop); gst_object_unref(bus); @@ -140,7 +189,7 @@ int main(int argc, char* argv[]) if(ret == -3) options_print_version(); if(ret == -4) - fprintf(stderr, "the interval must be bigger than 0\n"); + fprintf(stderr, "the port number is invalid\n"); if(ret != -2 && ret != -3 && ret != -4) options_print_usage(); -- cgit v1.2.3