Internal data stream error:

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Internal data stream error:

alisemih
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
Reply | Threaded
Open this post in threaded view
|

Re: Internal data stream error:

gotsring
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
Reply | Threaded
Open this post in threaded view
|

Re: Internal data stream error:

alisemih
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
Reply | Threaded
Open this post in threaded view
|

Re: Internal data stream error:

Nicolas Dufresne-5
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.

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?

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.




--
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