<div dir="ltr"><div><div><div><div><div><div>Hello Everyone,<br><br><br></div>I am using a framegrabber to capture frames from multiple v4l2 source cameras. So here is how i am doing it...<br><br></div>1) Creating a framesource reference pointer for every source depending on the number of sources.<br><br></div>2) Once the framesource reference pointer is created ,a constructor is called which initializes the Gstreamer Pipeline for every source<br></div><div>    starts playing it.<br></div> <br>   Here is the pipeline ... <br><br></div>   v4l2src device  -> videoconvert -> appsink.<br><br></div><div>3) And then the fetch() function is used to pull the buffer from the appsink and use the buffer for further processing.<br><br></div><div>However I am  facing a problem here.<br><br><br></div><div>This application works perfectly for the following configurations of v4l2src caps and app-sink caps respectively.<br></div><div>  v4l2srccaps appsink-caps<br></div><div>1) YUY2     RGB<br></div><div><br>2) RGB       YUY2<br></div><div><br>3) RGB      RGBA<br><br></div><div>However for the following configurations, it captures properly for the first time in all the devices but fails to capture for the second time... no error messages though ....it just keeps waiting <br><br></div><div>    v4l2src-caps appsink-caps<br></div><div><br>1) YUY2 YUY2<br><br></div><div>2) RGB RGB <br><br></div><div>Any help would be appreciated :)<br><br></div><div>The following is the code for the pipeline initialization.<br><br>bool GStreamerCameraFrameSourceImpl::InitializeGstPipeLine()<br>{<br>    GstStateChangeReturn status;<br>    end = true;<br><br>    pipeline = GST_PIPELINE(gst_pipeline_new(NULL));<br>    if (pipeline == NULL)<br>    {<br>        NVXIO_PRINT("Cannot create Gstreamer pipeline");<br>        return false;<br>    }<br><br>    bus = gst_pipeline_get_bus(GST_PIPELINE (pipeline));<br><br>    // create v4l2src<br>    GstElement * v4l2src = gst_element_factory_make("v4l2src", NULL);<br>    if (v4l2src == NULL)<br>    {<br>        NVXIO_PRINT("Cannot create v4l2src");<br>        FinalizeGstPipeLine();<br><br>        return false;<br>    }<br><br>    std::ostringstream cameraDev;<br>    cameraDev << "/dev/video" << cameraIdx;<br>    g_object_set(G_OBJECT(v4l2src), "device", cameraDev.str().c_str(), NULL);<br><br>    gst_bin_add(GST_BIN(pipeline), v4l2src);<br><br>    // create color convert element<br>    GstElement * color = gst_element_factory_make(COLOR_ELEM, NULL);<br>    if (color == NULL)<br>    {<br>        NVXIO_PRINT("Cannot create %s element", COLOR_ELEM);<br>        FinalizeGstPipeLine();<br><br>        return false;<br>    }<br><br>    gst_bin_add(GST_BIN(pipeline), color);<br>    <br>    /*GstElement * scale = gst_element_factory_make("videoscale", NULL);<br>    if (scale == NULL)<br>    {<br>        NVXIO_PRINT("Cannot create videoscale element");<br>        FinalizeGstPipeLine();<br><br>        return false;<br>    }<br><br>    gst_bin_add(GST_BIN(pipeline), scale);<br>*/<br><br>    // create appsink element<br>    sink = gst_element_factory_make("appsink", NULL);<br>    if (sink == NULL)<br>    {<br>        NVXIO_PRINT("Cannot create appsink element");<br>        FinalizeGstPipeLine();<br><br>        return false;<br>    }<br><br>    gst_bin_add(GST_BIN(pipeline), sink);<br><br>    // if initial values for FrameSource::Parameters are not<br>    // specified, let's set them manually to prevent very huge images<br>    if (configuration.frameWidth == (vx_uint32)-1)<br>        configuration.frameWidth = 1920;<br>    if (configuration.frameHeight == (vx_uint32)-1)<br>        configuration.frameHeight = 1080;<br>    if (configuration.fps == (vx_uint32)-1)<br>        configuration.fps = 30;<br><br>#if GST_VERSION_MAJOR == 0<br>    std::unique_ptr<GstCaps, GStreamerObjectDeleter> caps_v42lsrc(<br>        gst_caps_new_simple ("video/x-raw-rgb",<br>                             "width", GST_TYPE_INT_RANGE, 1, (int)configuration.frameWidth,<br>                             "height", GST_TYPE_INT_RANGE, 1, (int)configuration.frameHeight,<br>                             "framerate", GST_TYPE_FRACTION, (int)configuration.fps,<br>                             NULL));<br>#else<br>    std::ostringstream stream;<br>    /*stream << "video/x-raw, format=(string){RGB, GRAY8}, width=[1," << configuration.frameWidth <<<br>              "], height=[1," << configuration.frameHeight << "], framerate=" << configuration.fps << "/1;";*/<br>    stream << "video/x-raw, format=(string)RGB, width=" << configuration.frameWidth <<<br>              ", height=" << configuration.frameHeight << ";";          <br><br>    std::unique_ptr<GstCaps, GStreamerObjectDeleter> caps_v42lsrc(gst_caps_from_string(stream.str().c_str()));<br>#endif<br><br>    if (!caps_v42lsrc)<br>    {   <br>        NVXIO_PRINT("Failed to create caps");<br>        FinalizeGstPipeLine();<br><br>        return false;<br>    }<br><br>    // link elements<br>    if (!gst_element_link_filtered(v4l2src, color, caps_v42lsrc.get()))<br>    {<br>        NVXIO_PRINT("GStreamer: cannot link v4l2src -> color using caps");<br>        FinalizeGstPipeLine();<br><br>        return false;<br>    }<br><br>    // link elements<br>    /*if (!gst_element_link(color, scale))<br>    {<br>        NVXIO_PRINT("GStreamer: cannot link color -> scale");<br>        FinalizeGstPipeLine();<br>        std::cout << "Cannot link color and scale\n";<br><br>        return false;<br>    }*/<br>    <br>    if (!gst_element_link(color, sink))<br>    {<br>        NVXIO_PRINT("GStreamer: cannot link color -> appsink");<br>        FinalizeGstPipeLine();<br><br>        return false;<br>    }<br><br>    gst_app_sink_set_max_buffers (GST_APP_SINK(sink), 1);<br>    gst_app_sink_set_drop (GST_APP_SINK(sink), true);<br><br>    // do not emit signals: all calls will be synchronous and blocking<br>    gst_app_sink_set_emit_signals (GST_APP_SINK(sink), 0);<br><br>#if GST_VERSION_MAJOR == 0<br>    std::unique_ptr<GstCaps, GStreamerObjectDeleter> caps_appsink(<br>            gst_caps_new_simple("video/x-raw-rgb",<br>                                "bpp",        G_TYPE_INT, 24,<br>                                "red_mask",   G_TYPE_INT, 0xFF0000,<br>                                "green_mask", G_TYPE_INT, 0x00FF00,<br>                                "blue_mask",  G_TYPE_INT, 0x0000FF,<br>                                NULL));<br>#else<br>    // support 1 and 4 channel 8 bit data<br>    std::unique_ptr<GstCaps, GStreamerObjectDeleter> caps_appsink(<br>            gst_caps_from_string("video/x-raw, format=(string){RGBA, GRAY8};"));<br>#endif<br>    gst_app_sink_set_caps(GST_APP_SINK(sink), caps_appsink.get());<br><br>    // Force pipeline to play video as fast as possible, ignoring system clock<br>    gst_pipeline_use_clock(pipeline, NULL);<br><br>    status = gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING);<br>    handleGStreamerMessages();<br><br>    if (status == GST_STATE_CHANGE_ASYNC)<br>    {<br>        // wait for status update<br>        status = gst_element_get_state(GST_ELEMENT(pipeline), NULL, NULL, GST_CLOCK_TIME_NONE);<br>    }<br>    <br>    if (status == GST_STATE_CHANGE_FAILURE)<br>    {<br>        NVXIO_PRINT("GStreamer: unable to start playback");<br>        FinalizeGstPipeLine();<br>        <br>        std::cout << "Cannot initialize Gstreamer pipeline because of STATE_CHANGE_FAILURE" << std::endl;<br><br>        return false;<br>    }<br><br>    // explicitly set params to -1 to ensure<br>    // their update in the updateConfiguration() function<br>    configuration.frameWidth = (vx_uint32)-1;<br>    configuration.frameHeight = (vx_uint32)-1;<br><br>    if (!updateConfiguration(color, configuration))<br>    {<br>        FinalizeGstPipeLine();<br>        return false;<br>    }<br><br>    end = false;<br><br>    return true;<br>}<br><br>}<br></div><div><br></div><div> <br></div></div>