Hi everyone, I'm newbie on gstreamer. I'm using nxp I.MX8 and i need your helps."gst-launch-1.0 rtspsrc location=rtsp://192.168.1.43:554/stream0 latency=0 name=src src. ! rtph264depay ! queue ! h264parse ! vpudec ! videoconvert ! videoscale ! waylandsink window-width=352 window-height=288"
This command runs succesfully in terminal. But i want to write C code of this command and i tried this. Attached code in this mail. The problem of me when i run the code that attached, i have an error like showed below.
Error message: "Pipeline state changed from NULL to READY: Pipeline state changed from READY to PAUSED: Error received from element udpsrc0: Internal data stream error." Can anyone help me?
#include <gst/gst.h> #include <string.h> #include <stdlib.h> #include <stdio.h> /* Structure to contain all our information, so we can pass it to callbacks */ typedef struct _Data { GstElement *pipeline; GstElement *source; GstElement *videoQueue; GstElement *videoParser; GstElement *videoDepayloader; GstElement *videoDecoder; GstElement *videoSink; GstElement *videoConvert; GstElement *videoScale; } Data; /* Handler for the pad-added signal */ int main(int argc, char *argv[]) { Data data; GstBus *bus; GstMessage *msg; GstPad *pad; gboolean terminate = FALSE; GstStateChangeReturn ret; /* Initialize GStreamer */ gst_init (NULL,NULL); data.source = gst_element_factory_make ("rtspsrc", "source"); data.videoQueue = gst_element_factory_make ("queue", "videoQueue"); data.videoDepayloader = gst_element_factory_make ("rtph264depay", "videoDepayloader"); data.videoDecoder = gst_element_factory_make ("vpudec", "videoDecoder"); data.videoSink = gst_element_factory_make ("waylandsink", "videoSink"); data.videoParser = gst_element_factory_make("h264parse", "videoParser"); data.videoConvert = gst_element_factory_make("videoconvert", "video-convert"); data.videoScale = gst_element_factory_make("videoscale", "videoScale"); /* Create the empty pipeline */ data.pipeline = gst_pipeline_new ("rtsp-pipeline"); if (!data.source) { g_printerr ("source elements could be created.\n"); return -1; } if(!data.videoQueue){ g_printerr ("videoQueue elements could be created.\n"); return -1; } if(!data.videoDepayloader){ g_printerr ("videoDepayloader elements could be created.\n"); return -1; } if(!data.videoDecoder){ g_printerr ("videoDecoder elements could be created.\n"); return -1; } if(!data.videoSink){ g_printerr ("videoSink elements could be created.\n"); return -1; } if(!data.videoParser){ g_printerr ("videoParser elements could be created.\n"); return -1; } if(!data.videoConvert){ g_printerr ("videoConvert elements could be created.\n"); return -1; } if(!data.videoScale){ g_printerr ("videoScale elements could be created.\n"); return -1; } /* Configure elements */ /* Configure elements */ g_object_set(data.source, "location", "rtsp://192.168.1.43/h264cif", NULL); g_object_set(data.source, "latency", 0, NULL); gst_bin_add_many (GST_BIN (data.pipeline), data.source, data.videoDepayloader, data.videoQueue, data.videoParser, data.videoDecoder, data.videoConvert, data.videoScale, data.videoSink, NULL); //GST_DEBUG=4 gst-launch-1.0 rtspsrc location=rtsp://192.168.1.43:554/stream0 latency=0 name=src src. ! rtph264depay ! queue ! h264parse ! vpudec ! videoconvert ! videoscale ! waylandsink window-width=352 window-height=288 if (!(gst_element_link_many(data.videoDepayloader, data.videoQueue, data.videoParser, data.videoDecoder, data.videoScale, data.videoConvert, data.videoSink, NULL))) { g_printerr("Error linking fields... \n"); exit (-1); } /*if(!gst_element_link(data.videoDepayloader, data.videoQueue)){ g_printerr("Error linking payloader -> queue \n"); exit (-1); } if(!gst_element_link(data.videoQueue, data.videoParser)){ g_printerr("Error linking queue -> parser \n"); exit (-1); } if(!gst_element_link(data.videoParser, data.videoDecoder)){ g_printerr("Error linking parser -> decoder \n"); exit (-1); } if(!gst_element_link(data.videoDecoder, data.videoConvert)){ g_printerr("Error linking decoder -> convert \n"); exit (-1); } if(!gst_element_link(data.videoConvert, data.videoScale)){ g_printerr("Error linking convert -> scale \n"); exit (-1); } if(!gst_element_link(data.videoScale, data.videoSink)){ g_printerr("Error linking scale ->sink \n"); exit (-1); }*/ /* Start playing */ ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { g_print ("Unable to set the pipeline to the playing state.\n"); gst_object_unref (data.pipeline); exit(1); } /* Listen to the bus */ bus = gst_element_get_bus (data.pipeline); do { msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS); /* Parse message */ if (msg != NULL) { GError *err; gchar *debug_info; switch (GST_MESSAGE_TYPE (msg)) { case GST_MESSAGE_ERROR: gst_message_parse_error (msg, &err, &debug_info); g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message); g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none"); g_clear_error (&err); g_free (debug_info); terminate = TRUE; break; case GST_MESSAGE_EOS: g_print ("End-Of-Stream reached.\n"); terminate = TRUE; break; case GST_MESSAGE_STATE_CHANGED: /* We are only interested in state-changed messages from the pipeline */ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data.pipeline)) { GstState old_state, new_state, pending_state; gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state); g_print ("Pipeline state changed from %s to %s:\n", gst_element_state_get_name (old_state), gst_element_state_get_name (new_state)); } break; default: /* We should not reach here */ g_printerr ("Unexpected message received.\n"); break; } gst_message_unref (msg); } } while (!terminate); /* Free resources */ gst_object_unref (bus); gst_element_set_state (data.pipeline, GST_STATE_NULL); gst_object_unref (data.pipeline); return 0; }
_______________________________________________ gstreamer-embedded mailing list gstreamer-embedded@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/gstreamer-embedded