1
votes

gst-launch-1.0 --gst-debug-level=2 dvbsrc modulation="QAM 256" frequency=147000000 ! decodebin name=demux demux. ! queue ! audioresample ! audioconvert ! voaacenc ! mux. mpegtsmux name=mux ! udpsink host=127.01.01.10 port=22 demux. ! queue ! videoconvert ! videoscale ! x264enc bitrate=1258 tune=zerolatency ! video/x-h264,stream-format=byte-stream,profile=high,width=540,height=380,key-int-max=15 ! mux.

I am trying pipeline way to making this command line. But I am facing many types of errors. I can't be making a command line using the Gstreamer framework. I want to convert it into code.

 #include <gst/gst.h>

 #include <glib.h>

 int main(int argc, char * argv[]) {
   GstElement * pipeline, * filter, * audio_source, * tee, * audio_queue, * audio_convert, * audio_resample, * audio_sink;
   GstElement * video_queue, * visual, * video_convert, * video_sink;
   GstBus * bus;
   GstMessage * msg;
   GstCaps * filtercaps;
   GstPad * tee_audio_pad, * tee_video_pad;
   GstPad * queue_audio_pad, * queue_video_pad;
   /* Initialize GStreamer */
   gst_init( & argc, & argv);
   /* 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");
   audio_resample = gst_element_factory_make("audioresample", "audio_resample");
   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");
   video_convert = gst_element_factory_make("videoconvert", "csp");
   video_sink = gst_element_factory_make("autovideosink", "video_sink");
   filter = gst_element_factory_make("capsfilter", "filter");
   g_assert(filter != NULL); /* should always exist */

   /* Create the empty pipeline */
   pipeline = gst_pipeline_new("test-pipeline");
   if (!pipeline || !audio_source || !tee || !audio_queue || !audio_convert || !audio_resample || !audio_sink || !video_queue || !visual || !video_convert || !video_sink) {
     g_printerr("Not all elements could be created.\n");
     return -1;
   }
   /* Configure elements */
   g_object_set(audio_source, "freq", 215.0 f, NULL);
   g_object_set(visual, "shader", 0, "style", 1, NULL);
   /* Link all elements that can be automatically linked because they have "Always" pads */
   gst_bin_add_many(GST_BIN(pipeline), filter, 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) {
     g_printerr("Elements could not be linked.\n");
     gst_object_unref(pipeline);
     return -1;
   }
   /* Manually link the , which has "Request" pads */
   tee_audio_pad = gst_element_get_request_pad(tee, "src_%u");
   g_print("Obtained request pad %s for audio branch.\n", gst_pad_get_name(tee_audio_pad));
   queue_audio_pad = gst_element_get_static_pad(audio_queue, "sink");
   tee_video_pad = gst_element_get_request_pad(tee, "src_%u");
   g_print("Obtained request pad %s for video branch.\n", gst_pad_get_name(tee_video_pad));
   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;
   }
   filtercaps = gst_caps_new_simple("video/x-raw",
     "format", G_TYPE_STRING, "RGB16",
     "width", G_TYPE_INT, 640,
     "height", G_TYPE_INT, 480,
     "framerate", GST_TYPE_FRACTION, 25, 1,
     NULL);
   g_object_set(G_OBJECT(filter), "caps", filtercaps, NULL);
   gst_caps_unref(filtercaps);
   gst_object_unref(queue_audio_pad);
   gst_object_unref(queue_video_pad);
   /* Start playing the pipeline */
   gst_element_set_state(pipeline, GST_STATE_PLAYING);
   /* Wait until error or EOS */
   bus = gst_element_get_bus(pipeline);
   msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
   /* 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);
   /* Free resources */
   if (msg != NULL) {
     gst_message_unref(msg);
   }

   gst_object_unref(bus);
   gst_element_set_state(pipeline, GST_STATE_NULL);
   gst_object_unref(pipeline);
   return 0;
 }
1

1 Answers

0
votes

You are not doing any kind of error checking in the code. So check if all commands succeed and which don't. More you can make you life much easier when you use gst_parse_launch() function and use your command line version which should be working for you.