Proper way to set delay per sink audiomixer/compositor
Sean DuBois
sean at siobud.com
Thu Jun 29 07:08:39 UTC 2017
Currently I use gst_pad_set_offset on the sink pad to delay either
audio/video and it works great. However I can't adjust the delay after
the pipeline has been linked.
Below is a minimal example
```
#include <gst/gst.h>
static GstElement *compositor, *audiomixer;
gboolean timeout_cb(gpointer user_data) {
g_print("Updating delay \n");
gst_pad_set_offset((GstPad *)user_data, 0);
return FALSE;
}
void pad_added(GstElement *object, GstPad *in_pad, gpointer user_data) {
GstCaps *decodebin_caps = gst_pad_get_current_caps(in_pad);
g_autofree gchar *pad_name = gst_caps_to_string(decodebin_caps);
GstPad *out_pad = NULL;
if (g_str_has_prefix(pad_name, "video")) {
out_pad = gst_element_get_request_pad(compositor, "sink_%u");
} else {
out_pad = gst_element_get_request_pad(audiomixer, "sink_%u");
gst_pad_set_offset(out_pad, 3000000000);
g_timeout_add_seconds(5, &timeout_cb, out_pad);
}
gst_pad_link(in_pad, out_pad);
}
int main(int argc, char *argv[]) {
gst_init(&argc, &argv);
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
GstElement *pipeline = gst_pipeline_new(NULL);
compositor = gst_element_factory_make("compositor", NULL);
audiomixer = gst_element_factory_make("audiomixer", NULL);
GstElement *filesrc = gst_element_factory_make("filesrc", NULL),
*decodebin = gst_element_factory_make("decodebin", NULL),
*a_convert = gst_element_factory_make("audioconvert", NULL),
*v_convert = gst_element_factory_make("videoconvert", NULL),
*a_sink = gst_element_factory_make("autoaudiosink", NULL),
*v_sink = gst_element_factory_make("autovideosink", NULL);
gst_bin_add_many(GST_BIN(pipeline), filesrc, decodebin, a_convert,
v_convert, a_sink, v_sink, audiomixer, compositor,
NULL);
g_object_set(filesrc, "location",
"/home/sean/Documents/testVideos/doom.mkv", NULL);
gst_element_link(filesrc, decodebin);
gst_element_link_many(compositor, v_convert, v_sink, NULL);
gst_element_link_many(audiomixer, a_convert, a_sink, NULL);
g_signal_connect(decodebin, "pad-added", G_CALLBACK(&pad_added), NULL);
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);
}
```
More information about the gstreamer-devel
mailing list