summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2014-09-22 05:17:42 +0200
committerChristian Pointner <equinox@spreadspace.org>2014-09-22 05:17:42 +0200
commit00902a0ef808048f6d839723090e477b15a2d9e9 (patch)
tree997a6f049d67cda6dc52b5fbe81bfc5c206d8872 /src
parentfixed wrong type for textoverlay parameters (diff)
recording with different codecs works now
Signed-off-by: Christian Pointner <equinox@spreadspace.org>
Diffstat (limited to 'src')
-rw-r--r--src/options.c22
-rw-r--r--src/options.h3
-rw-r--r--src/sydra.c48
3 files changed, 55 insertions, 18 deletions
diff --git a/src/options.c b/src/options.c
index 7789456..ac3909c 100644
--- a/src/options.c
+++ b/src/options.c
@@ -214,8 +214,10 @@ int options_parse(options_t* opt, int argc, char* argv[])
PARSE_STRING_PARAM("-o","--rtp-host", opt->rtp_host_)
PARSE_INT_PARAM("-O","--rtp-port-base", opt->rtp_port_base_, 10)
PARSE_STRING_PARAM("-V","--videosink", opt->preview_videosink_)
- PARSE_STRING_PARAM("-m","--rec-mux", opt->rec_mux_)
- PARSE_STRING_PARAM("-r","--rec-name-format", opt->rec_name_format_)
+ PARSE_STRING_PARAM("-rv","--rec-video-encoder", opt->video_enc_rec_)
+ PARSE_STRING_PARAM("-ra","--rec-audio-encoder", opt->audio_enc_rec_)
+ PARSE_STRING_PARAM("-rm","--rec-mux", opt->rec_mux_)
+ PARSE_STRING_PARAM("-R","--rec-name-format", opt->rec_name_format_)
else
return i;
}
@@ -271,6 +273,8 @@ void options_default(options_t* opt)
opt->preview_videosink_ = NULL;
+ opt->video_enc_rec_ = NULL;
+ opt->audio_enc_rec_ = strdup("audioconvert ! vorbisenc bitrate=96000");
opt->rec_mux_ = strdup("matroskamux");
opt->rec_name_format_ = strdup("./recordings/%Y-%m-%d_%H-%M-%S.mkv");
}
@@ -309,6 +313,10 @@ void options_clear(options_t* opt)
free(opt->rtp_host_);
if(opt->preview_videosink_)
free(opt->preview_videosink_);
+ if(opt->video_enc_rec_)
+ free(opt->video_enc_rec_);
+ if(opt->audio_enc_rec_)
+ free(opt->audio_enc_rec_);
if(opt->rec_mux_)
free(opt->rec_mux_);
if(opt->rec_name_format_)
@@ -330,15 +338,17 @@ void options_print_usage()
printf(" [-U|--debug] don't daemonize and log to stdout with maximum log level\n");
printf(" [-n|--appname] <name> set the application name (will be used by xvimagesink for window title)\n");
printf(" [-vs|--video-source pipeline for raw video (i.e. videotestsrc)\n");
- printf(" [-ve|--video-encoder pipeline for video encoder (stream and recording)\n");
+ printf(" [-ve|--video-encoder pipeline for video encoder (stream)\n");
printf(" [-vp|--video-payloader video payloader element (i.e. rtpvp8pay)\n");
printf(" [-as|--audio-source pipeline for raw audio (audiotestsrc)\n");
- printf(" [-ae|--audio-encoder pipeline for audio encoder (stream only)\n");
+ printf(" [-ae|--audio-encoder pipeline for audio encoder (stream)\n");
printf(" [-ap|--audio-payloader audio payloader element (i.e. rptopuspay)\n");
printf(" [-o|--rtp-host remote host for RTP packets\n");
printf(" [-O|--rtp-port-base base number for remote ports\n");
printf(" [-V|--videosink video sink element for local preview (i.e. xvimagesink) - leave empty to disable preview\n");
- printf(" [-m|--rec-mux muxer elemenent (i.e. matroskamux)\n");
+ printf(" [-rv|--rec-video-encoder pipeline for video encoder (recording - leave empty for same as stream)\n");
+ printf(" [-ra|--rec-audio-encoder pipeline for audio encoder (recording - leave empty for same as stream)\n");
+ printf(" [-rm|--rec-mux muxer elemenent (i.e. matroskamux)\n");
printf(" [-r|--rec-name-format] <format> the recording file name format, see manpage of strftime for the syntax\n");
}
@@ -372,6 +382,8 @@ void options_print(options_t* opt)
printf(" rtp_host: >>%s<<\n", opt->rtp_host_);
printf(" rtp_port_base: %d\n", opt->rtp_port_base_);
printf(" preview_video_sink: >>%s<<\n", opt->preview_videosink_);
+ printf(" video_enc_rec: >>%s<<\n", opt->video_enc_rec_);
+ printf(" audio_enc_rec: >>%s<<\n", opt->audio_enc_rec_);
printf(" rec_mux: >>%s<<\n", opt->rec_mux_);
printf(" rec_name_format: '%s'\n", opt->rec_name_format_);
}
diff --git a/src/options.h b/src/options.h
index 7231347..c0794ea 100644
--- a/src/options.h
+++ b/src/options.h
@@ -64,6 +64,9 @@ struct options_struct {
int rtp_port_base_;
char* preview_videosink_;
+
+ char* video_enc_rec_;
+ char* audio_enc_rec_;
char* rec_mux_;
char* rec_name_format_;
};
diff --git a/src/sydra.c b/src/sydra.c
index 5dc7ba4..8d637f2 100644
--- a/src/sydra.c
+++ b/src/sydra.c
@@ -227,7 +227,7 @@ static gboolean sydra_link_static_compatible(GstElement* src, const char* src_pa
if(!src_pad) return FALSE;
GstPad *sink_pad = gst_element_get_compatible_pad(sink, src_pad, NULL);
- if(!src_pad) return FALSE;
+ if(!sink_pad) return FALSE;
gchar* sink_pad_name = gst_pad_get_name(sink_pad);
gboolean res = sydra_link_pads(src, src_pad, src_pad_name, sink, sink_pad, sink_pad_name);
@@ -353,17 +353,30 @@ static gboolean create_preview_elements(const char* preview_bin_desc, GstElement
return TRUE;
}
-static gboolean create_recorder_elements(const char* mux_str, const char* name_format, GstElement* pipeline, GstElement* tv, GstElement* ta)
+static gboolean create_recorder_elements(options_t* opt, GstElement* pipeline, struct media_elements *mv, struct media_elements *ma)
{
GstElement *qv = sydra_create_element("queue", NULL);
GstElement *qa = sydra_create_element("queue", NULL);
- GstElement *mux = sydra_create_element(mux_str, NULL);
+ GstElement *mux = sydra_create_element(opt->rec_mux_, NULL);
GstElement *sink = sydra_create_element("filesink", NULL);
if(!qv || !qa || !mux || !sink) {
return FALSE;
}
+ GstElement *ev = NULL, *tv = mv->tee_enc_;
+ if(opt->video_enc_rec_) {
+ ev = sydra_create_bin_from_desc("record video encoder", opt->video_enc_rec_);
+ if(!ev) return FALSE;
+ tv = mv->tee_raw_;
+ }
+ GstElement *ea = NULL, *ta = ma->tee_enc_;
+ if(opt->audio_enc_rec_) {
+ ea = sydra_create_bin_from_desc("record audio encoder", opt->audio_enc_rec_);
+ if(!ea) return FALSE;
+ ta = ma->tee_raw_;
+ }
+
log_printf(DEBUG, "recorder path created successfully!");
struct timespec now;
@@ -371,20 +384,29 @@ static gboolean create_recorder_elements(const char* mux_str, const char* name_f
struct tm bd_time;
localtime_r(&(now.tv_sec), &bd_time);
char recfile[1024]; //TODO: fix this hardcoded length
- strftime(recfile, sizeof(recfile), name_format, &bd_time);
+ recfile[0] = 0;
+ strftime(recfile, sizeof(recfile), opt->rec_name_format_, &bd_time);
g_object_set(G_OBJECT(sink), "location", recfile, NULL);
- gst_bin_add_many (GST_BIN(pipeline), qv, qa, mux, sink, NULL);
+ gst_bin_add_many(GST_BIN(pipeline), qv, qa, mux, sink, NULL);
gst_element_link(mux, sink);
+ GstElement* sv = qv;
+ if(ev) {
+ gst_bin_add(GST_BIN(pipeline), ev);
+ gst_element_link(qv, ev);
+ sv = ev;
+ }
+ GstElement* sa = qa;
+ if(ev) {
+ gst_bin_add(GST_BIN(pipeline), ea);
+ gst_element_link(qa, ea);
+ sa = ea;
+ }
- /* if(!sydra_link_request_static(tv, "src_%u", qv, "sink") || */
- /* !sydra_link_static_compatible(qv, "src", mux) || */
- /* !sydra_link_request_static(ta, "src_%u", qa, "sink") || */
- /* !sydra_link_static_compatible(qa, "src", mux)) { */
- /* return FALSE; */
- /* } */
if(!sydra_link_request_static(tv, "src_%u", qv, "sink") ||
- !sydra_link_static_compatible(qv, "src", mux)) {
+ !sydra_link_static_compatible(sv, "src", mux) ||
+ !sydra_link_request_static(ta, "src_%u", qa, "sink") ||
+ !sydra_link_static_compatible(sa, "src", mux)) {
return FALSE;
}
@@ -423,7 +445,7 @@ static GstElement* create_pipeline(options_t* opt)
}
if(opt->rec_mux_) {
- if(!create_recorder_elements(opt->rec_mux_, opt->rec_name_format_, pipeline, video.tee_enc_, audio.tee_enc_))
+ if(!create_recorder_elements(opt, pipeline, &video, &audio))
return NULL;
}