Hi everyone,
I'm trying to develop c application for rtspsrc. My pipeline: 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 The pipeline runs succesfull with gst-launch. And i want to write this pipeline's c code. So i tried to write c code that the following in below. The pipeline elements linked successfull. When i set playing state of pipeline i've got "Internal data stream error". How can i fix this problem? Can anyone help me? My C code: #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 */ 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); if(!gst_element_link(data.videoDepayloader, data.videoQueue)){ g_printerr("Error linking payloader -> queue \n"); exit (-1); } else { g_print("payloader -> queue linked\n"); } if(!gst_element_link(data.videoQueue, data.videoParser)){ g_printerr("Error linking queue -> parser \n"); exit (-1); } else { g_print("queue -> parser linked\n"); } if(!gst_element_link(data.videoParser, data.videoDecoder)){ g_printerr("Error linking parser -> decoder \n"); exit (-1); } else { g_print("queue -> parser linked\n"); } if(!gst_element_link(data.videoDecoder, data.videoConvert)){ g_printerr("Error linking decoder -> convert \n"); exit (-1); } else { g_print("decoder -> convert linked\n"); } if(!gst_element_link(data.videoConvert, data.videoScale)){ g_printerr("Error linking convert -> scale \n"); exit (-1); } else { g_print("convert -> scale linked\n"); } if(!gst_element_link(data.videoScale, data.videoSink)){ g_printerr("Error linking scale ->sink \n"); exit (-1); } else { g_print("scale ->sink linked\n"); } /* 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; } -- Sent from: http://gstreamer-devel.966125.n4.nabble.com/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
In general, you can debug by running your program with the command option --gst-debug=4 (or some other level, I usually go between 3 and 5, see docs for more info). This should help narrow down what the error is, just search the console output for any CRITICAL
or WARNING messages.
To get this command option to do anything in your program, you have to pass the program arguments to GStreamer by changing the init function to
gst_init(argc, argv);
From: gstreamer-devel <[hidden email]> on behalf of alisemih <[hidden email]>
Sent: Friday, September 4, 2020 5:24 AM To: [hidden email] <[hidden email]> Subject: Internal data stream error: Hi everyone,
I'm trying to develop c application for rtspsrc. My pipeline: 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 The pipeline runs succesfull with gst-launch. And i want to write this pipeline's c code. So i tried to write c code that the following in below. The pipeline elements linked successfull. When i set playing state of pipeline i've got "Internal data stream error". How can i fix this problem? Can anyone help me? My C code: #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 */ 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); if(!gst_element_link(data.videoDepayloader, data.videoQueue)){ g_printerr("Error linking payloader -> queue \n"); exit (-1); } else { g_print("payloader -> queue linked\n"); } if(!gst_element_link(data.videoQueue, data.videoParser)){ g_printerr("Error linking queue -> parser \n"); exit (-1); } else { g_print("queue -> parser linked\n"); } if(!gst_element_link(data.videoParser, data.videoDecoder)){ g_printerr("Error linking parser -> decoder \n"); exit (-1); } else { g_print("queue -> parser linked\n"); } if(!gst_element_link(data.videoDecoder, data.videoConvert)){ g_printerr("Error linking decoder -> convert \n"); exit (-1); } else { g_print("decoder -> convert linked\n"); } if(!gst_element_link(data.videoConvert, data.videoScale)){ g_printerr("Error linking convert -> scale \n"); exit (-1); } else { g_print("convert -> scale linked\n"); } if(!gst_element_link(data.videoScale, data.videoSink)){ g_printerr("Error linking scale ->sink \n"); exit (-1); } else { g_print("scale ->sink linked\n"); } /* 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; } -- Sent from: http://gstreamer-devel.966125.n4.nabble.com/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
I debugged with debug mode 4 and i analyzed output. So i catched some things.
FIXME default gstutils.c:3981:gst_pad_create_stream_id_internal:<fakesrc1:src> Creating random stream-id, consider implementing a deterministic way of creating a stream-id WARN rtpjitterbuffer rtpjitterbuffer.c:570:calculate_skew: delta - skew: 0:00:01.020225793 too big, reset skew WARN basesrc gstbasesrc.c:3055:gst_base_src_loop:<udpsrc0> error: Internal data stream error. WARN basesrc gstbasesrc.c:3055:gst_base_src_loop:<udpsrc0> error: streaming stopped, reason not-linked (-1) WARN rtspsrc gstrtspsrc.c:5915:gst_rtsp_src_receive_response:<source> receive interrupted WARN rtspsrc gstrtspsrc.c:7669:gst_rtspsrc_close:<source> TEARDOWN interrupted How do i fixed these? -- Sent from: http://gstreamer-devel.966125.n4.nabble.com/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
In reply to this post by gotsring
Le lun. 7 sept. 2020 10 h 00, alisemih <[hidden email]> a écrit : I debugged with debug mode 4 and i analyzed output. So i catched some things. What is relevant here is "not-linked" error. rtspsrc element only know during RTSP handshake which streams will be available. For each stream it will create and expose a pad. Application must watch for pad-added signal and link these pads to the rest of the pipeline. If I remember well, you have to link at least one pad in order to avoid this error. p.s. you can read and inspect the "current_caps" on the exposed pad to learn more about what stream format that new pad is exposing.
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |