samprat
samprat

Reputation: 2214

gstreamer code failed to link all GST ELEMENTS

Ubuntu 14.04 Gstreamer 0.10 Code Sdk : Qt .

I am quite new to Gstreamer. when I use gst-launch tool on my terminal I can successfully see camera attached to my workstation capture &streams videos.

To proceed ahead , I have written c code in Qt. It compiled properly and when I run it , it opens new Xterm window and throw error "Elements could not be linked" Am I doing it wrong or Do I need to do something else to view streaming

Below is my code( its heavily inspired by other people's code)

.Pro File

QT       += core

QT       -= gui
QT       += core gui
QT       += network
QT           +=core

QMAKE_CXXFLAGS+= -std=c++11
QMAKE_LFLAGS +=  -std=c++11

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets



TARGET = justtest

PKGCONFIG +=glib-2.0
PKGCONFIG += gstreamer-0.10
CONFIG += link_pkgconfig
CONFIG   += console
CONFIG   -= app_bundle


TEMPLATE = app
INCLUDEPATH += pkg-config --cflags glib-2.0
INCLUDEPATH += /usr/include/glib-2.0/glib/
INCLUDEPATH +=/usr/include/libxml2/
INCLUDEPATH += /usr/include/gstreamer-0.10/
SOURCES += main.cpp

main.cpp

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


static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
  GMainLoop *loop = (GMainLoop *) data;

  switch (GST_MESSAGE_TYPE (msg)) {

    case GST_MESSAGE_EOS:
      g_print ("End of stream\n");
      g_main_loop_quit (loop);
      break;

    case GST_MESSAGE_ERROR: {
      gchar  *debug;
      GError *error;

      gst_message_parse_error (msg, &error, &debug);
      g_free (debug);

      g_printerr ("Error: %s\n", error->message);
      g_error_free (error);

      g_main_loop_quit (loop);
      break;
    }
    default:
      break;
  }

  return TRUE;
}

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

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

  loop = g_main_loop_new( NULL, FALSE );
  // Create the elements
  source = gst_element_factory_make ("v4l2src", "source");
  sink = gst_element_factory_make ("autovideosink", "sink");
  convert =gst_element_factory_make("ffmpegcolorspace","convert");
  videoenc = gst_element_factory_make ("ffdec_mpeg4", "videoenc");
  // Create the empty pipeline
  pipeline = gst_pipeline_new ("test-pipeline");

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

  //set der source
      g_object_set (G_OBJECT ( source ), "device", "/dev/video0", NULL);

      // we add a message handler
        bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
        gst_bus_add_watch (bus, bus_call, loop);
        gst_object_unref (bus);


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


 // if (gst_element_link (source, convert) != TRUE) {
        //  g_printerr ("Elements could not be linked source -convert.\n");
        //  gst_object_unref (pipeline);
         // return -1;
     // }

  if( gst_element_link_many ( source, convert, videoenc, sink,
                             NULL) != TRUE )
    {
       g_printerr ("Elements could not be linked source -convert.\n");
    }

    g_print("Linked all the Elements together\n");
    // Iterate
      g_print ("Running...\n");
      g_main_loop_run (loop);

      // Out of the main loop, clean up nicely
      g_print ("Returned, stopping playback\n");
      gst_element_set_state (pipeline, GST_STATE_NULL);

      g_print ("Deleting pipeline\n");
      gst_object_unref (GST_OBJECT (pipeline));
      return 0;
}

OUTPUT: ON NEW X TERM window

"Elements could not be linked"
Press <Return> to close this window

Upvotes: 2

Views: 3371

Answers (1)

thiagoss
thiagoss

Reputation: 2094

You seem to be trying to link the same element twice, that is not possible.

You link convert to sink and then a few lines below you try linking convert ! videoenc ! sink.

Using the decoder (which you named videoenc) will only work if you know that your camera provides mpeg4 video, otherwise it will fail negotiation. If your camera supports raw formats, just remove the decoder from the pipeline.

Again, 0.10 is unmantained and obsolete for years, please consider moving to 1.x.

Upvotes: 1

Related Questions