NVarguscamerasrc unable to restart pipeline

Hi all,

I have been testing nvarguscamerasrc on a Jetson TX2 board (JetPack 4.2.0).
In my test I created a simple GStreamer application with a video source and display.

At first, I tested with a videotestsrc, in this case the pipeline is able to change states from PLAY to STOP and PLAY again.

I followed the same approach using nvarguscamerasrc instead of videotestsrc.
In this test, the pipeline is able to PLAY and change to STOP, but when trying to set the pipeline in PLAY again, the application crashes.

In resume, the pipelines state sequence PLAY-STOP-PLAY doesn’t work when the video source is nvarguscamerasrc.

Is there a known issue about nvarguscamerasrc unable to set PLAY state after stopping a pipeline?

Application code below.

#include <gst/gst.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  GstElement *pipeline, *source, *sink;
  GstBus *bus;
  GstMessage *msg;
  GstStateChangeReturn ret;

  /* Initialize GStreamer */
  gst_init (&argc, &argv);

  /* Create the elements */
  //source = gst_element_factory_make ("videotestsrc", "source");
  source = gst_element_factory_make ("nvarguscamerasrc", "source");
  sink = gst_element_factory_make ("autovideosink", "sink");

  /* Create the empty pipeline */
  pipeline = gst_pipeline_new ("test-pipeline");

  if (!pipeline || !source || !sink) {
    g_printerr ("Not all elements could be created.\n");
    return -1;
  }

  /* Build the pipeline */
  gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
  if (gst_element_link (source, sink) != TRUE) {
    g_printerr ("Elements could not be linked.\n");
    gst_object_unref (pipeline);
    return -1;
  }

  /* Modify the source's properties */
  g_object_set (source, "pattern", 0, NULL);

  /* Start playing */
  ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
  if (ret == GST_STATE_CHANGE_FAILURE) {
    g_printerr ("Unable to set the pipeline to the playing state.\n");
    gst_object_unref (pipeline);
    return -1;
  }

  sleep(10); 

 /* Stop playing */
  ret = gst_element_set_state (pipeline, GST_STATE_NULL);
  if (ret == GST_STATE_CHANGE_FAILURE) {
    g_printerr ("Unable to set the pipeline to the stop state.\n");
    gst_object_unref (pipeline);
    return -1;
  }

  sleep(10); 

 /* Start playing */
  ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
  if (ret == GST_STATE_CHANGE_FAILURE) {
    g_printerr ("Unable to set the pipeline to the stop state.\n");
    gst_object_unref (pipeline);
    return -1;
  }

  /* 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);

  /* 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);
        break;
      case GST_MESSAGE_EOS:
        g_print ("End-Of-Stream reached.\n");
        break;
      default:
        /* We should not reach here because we only asked for ERRORs and EOS */
        g_printerr ("Unexpected message received.\n");
        break;
    }
    gst_message_unref (msg);
  }

  /* Free resources */
  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
  return 0;
}

Compile command:
gcc test_pipeline.c -o test_pipeline pkg-config --cflags --libs gstreamer-1.0

Regards,
Greivin F.

Hi,
Yes, it is known. On r32.1, please try this prebuilt lib
Also suggest you upgrade to latest version.