2012-05-07 16:06:31 +00:00
|
|
|
#include <gst/gst.h>
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2022-12-13 17:42:11 +00:00
|
|
|
#ifdef __APPLE__
|
|
|
|
#include <TargetConditionals.h>
|
|
|
|
#endif
|
|
|
|
|
2019-02-07 19:32:58 +00:00
|
|
|
int
|
2022-12-13 17:42:11 +00:00
|
|
|
tutorial_main (int argc, char *argv[])
|
2019-02-07 19:32:58 +00:00
|
|
|
{
|
|
|
|
GstElement *pipeline, *audio_source, *tee, *audio_queue, *audio_convert,
|
|
|
|
*audio_resample, *audio_sink;
|
2012-05-07 16:06:31 +00:00
|
|
|
GstElement *video_queue, *visual, *video_convert, *video_sink;
|
|
|
|
GstBus *bus;
|
|
|
|
GstMessage *msg;
|
|
|
|
GstPad *tee_audio_pad, *tee_video_pad;
|
|
|
|
GstPad *queue_audio_pad, *queue_video_pad;
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
/* Initialize GStreamer */
|
|
|
|
gst_init (&argc, &argv);
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
/* Create the elements */
|
|
|
|
audio_source = gst_element_factory_make ("audiotestsrc", "audio_source");
|
|
|
|
tee = gst_element_factory_make ("tee", "tee");
|
|
|
|
audio_queue = gst_element_factory_make ("queue", "audio_queue");
|
|
|
|
audio_convert = gst_element_factory_make ("audioconvert", "audio_convert");
|
2012-05-15 10:21:42 +00:00
|
|
|
audio_resample = gst_element_factory_make ("audioresample", "audio_resample");
|
2012-05-07 16:06:31 +00:00
|
|
|
audio_sink = gst_element_factory_make ("autoaudiosink", "audio_sink");
|
|
|
|
video_queue = gst_element_factory_make ("queue", "video_queue");
|
|
|
|
visual = gst_element_factory_make ("wavescope", "visual");
|
2013-10-31 09:01:26 +00:00
|
|
|
video_convert = gst_element_factory_make ("videoconvert", "video_convert");
|
2012-05-07 16:06:31 +00:00
|
|
|
video_sink = gst_element_factory_make ("autovideosink", "video_sink");
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
/* Create the empty pipeline */
|
|
|
|
pipeline = gst_pipeline_new ("test-pipeline");
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2019-02-07 19:32:58 +00:00
|
|
|
if (!pipeline || !audio_source || !tee || !audio_queue || !audio_convert
|
|
|
|
|| !audio_resample || !audio_sink || !video_queue || !visual
|
|
|
|
|| !video_convert || !video_sink) {
|
2012-05-07 16:06:31 +00:00
|
|
|
g_printerr ("Not all elements could be created.\n");
|
|
|
|
return -1;
|
|
|
|
}
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
/* Configure elements */
|
2012-05-09 12:16:08 +00:00
|
|
|
g_object_set (audio_source, "freq", 215.0f, NULL);
|
|
|
|
g_object_set (visual, "shader", 0, "style", 1, NULL);
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
/* Link all elements that can be automatically linked because they have "Always" pads */
|
2019-02-07 19:32:58 +00:00
|
|
|
gst_bin_add_many (GST_BIN (pipeline), audio_source, tee, audio_queue,
|
|
|
|
audio_convert, audio_resample, audio_sink, video_queue, visual,
|
|
|
|
video_convert, video_sink, NULL);
|
|
|
|
if (gst_element_link_many (audio_source, tee, NULL) != TRUE
|
|
|
|
|| gst_element_link_many (audio_queue, audio_convert, audio_resample,
|
|
|
|
audio_sink, NULL) != TRUE
|
|
|
|
|| gst_element_link_many (video_queue, visual, video_convert, video_sink,
|
|
|
|
NULL) != TRUE) {
|
2012-05-07 16:06:31 +00:00
|
|
|
g_printerr ("Elements could not be linked.\n");
|
|
|
|
gst_object_unref (pipeline);
|
|
|
|
return -1;
|
|
|
|
}
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
/* Manually link the Tee, which has "Request" pads */
|
2021-04-22 15:26:33 +00:00
|
|
|
tee_audio_pad = gst_element_request_pad_simple (tee, "src_%u");
|
2019-02-07 19:32:58 +00:00
|
|
|
g_print ("Obtained request pad %s for audio branch.\n",
|
|
|
|
gst_pad_get_name (tee_audio_pad));
|
2012-05-07 16:06:31 +00:00
|
|
|
queue_audio_pad = gst_element_get_static_pad (audio_queue, "sink");
|
2021-04-22 15:26:33 +00:00
|
|
|
tee_video_pad = gst_element_request_pad_simple (tee, "src_%u");
|
2019-02-07 19:32:58 +00:00
|
|
|
g_print ("Obtained request pad %s for video branch.\n",
|
|
|
|
gst_pad_get_name (tee_video_pad));
|
2012-05-07 16:06:31 +00:00
|
|
|
queue_video_pad = gst_element_get_static_pad (video_queue, "sink");
|
|
|
|
if (gst_pad_link (tee_audio_pad, queue_audio_pad) != GST_PAD_LINK_OK ||
|
|
|
|
gst_pad_link (tee_video_pad, queue_video_pad) != GST_PAD_LINK_OK) {
|
|
|
|
g_printerr ("Tee could not be linked.\n");
|
|
|
|
gst_object_unref (pipeline);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
gst_object_unref (queue_audio_pad);
|
|
|
|
gst_object_unref (queue_video_pad);
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
/* Start playing the pipeline */
|
|
|
|
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
/* Wait until error or EOS */
|
|
|
|
bus = gst_element_get_bus (pipeline);
|
2019-02-07 19:32:58 +00:00
|
|
|
msg =
|
|
|
|
gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
|
|
|
|
GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
/* Release the request pads from the Tee, and unref them */
|
|
|
|
gst_element_release_request_pad (tee, tee_audio_pad);
|
|
|
|
gst_element_release_request_pad (tee, tee_video_pad);
|
|
|
|
gst_object_unref (tee_audio_pad);
|
|
|
|
gst_object_unref (tee_video_pad);
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
/* Free resources */
|
|
|
|
if (msg != NULL)
|
|
|
|
gst_message_unref (msg);
|
|
|
|
gst_object_unref (bus);
|
|
|
|
gst_element_set_state (pipeline, GST_STATE_NULL);
|
2016-11-05 08:18:49 +00:00
|
|
|
|
2012-05-07 16:06:31 +00:00
|
|
|
gst_object_unref (pipeline);
|
|
|
|
return 0;
|
|
|
|
}
|
2022-12-13 17:42:11 +00:00
|
|
|
|
|
|
|
int
|
|
|
|
main (int argc, char *argv[])
|
|
|
|
{
|
|
|
|
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
|
|
|
|
return gst_macos_main (tutorial_main, argc, argv, NULL);
|
|
|
|
#else
|
|
|
|
return tutorial_main (argc, argv);
|
|
|
|
#endif
|
|
|
|
}
|