<div dir="ltr">I am new to gstreamer and I am trying to evaluate it for a project that streams video to web browsers. <br><br>I can run the video test src example using gst-launch and that works just fine. What I am having some trouble with is modifying the example to send raw video frames via appsrc. The modified example runs with playbin and I can see my test video. When the sink is webrtcsink, it runs without complaining, but the signaling server is never contacted based on the logs I see. Is there some configuration I am missing?<br><br>Source<br><br>#include <gst/gst.h><br><br>static GMainLoop *loop;<br>#define WIDTH 640<br>#define HEIGHT 480<br><br>static void<br>cb_need_data (GstElement *appsrc,<br>          guint       unused_size,<br>          gpointer    user_data)<br>{<br>  static gboolean white = FALSE;<br>  GstBuffer *buffer;<br>  GstFlowReturn ret;<br>  GstMapInfo map;<br>  static int sample = 0;<br>  g_print("sample\n");<br>  buffer = gst_buffer_new_and_alloc (WIDTH * HEIGHT * 3);<br>  gst_buffer_map (buffer, &map, GST_MAP_WRITE);<br><br>  guchar *raw = (guchar *) map.data;<br>  int i = 0;<br>  guchar value = sample % 255;<br>  for( i = 0; i < WIDTH * HEIGHT * 3; i++) {<br>    raw[i] = value;<br>  }<br><br>  g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);<br><br>  if (ret != GST_FLOW_OK) {<br>    /* something wrong, stop pushing */<br>    g_main_loop_quit (loop);<br>  }<br><br>  gst_buffer_unmap (buffer, &map);<br>  sample++;<br>}<br><br>gint<br>main (gint argc, gchar *argv[])<br>{<br>  GstElement *pipeline, *appsrc, *conv, *videosink;<br><br>  /* init GStreamer */<br>  gst_init (&argc, &argv);<br>  loop = g_main_loop_new (NULL, FALSE);<br><br>  /* setup pipeline */<br>  pipeline = gst_pipeline_new ("pipeline");<br>  appsrc = gst_element_factory_make ("appsrc", "source");<br>  conv = gst_element_factory_make ("videoconvert", "conv");<br>  videosink = gst_element_factory_make ("webrtcsink", "videosink");<br>  GstStructure *meta = gst_structure_from_string("meta,name=gst-stream", NULL);<br>  g_object_set(videosink, "meta", meta, NULL);<br><br>  /* setup */<br>  g_object_set (G_OBJECT (appsrc), "caps",<br>        gst_caps_new_simple ("video/x-raw",<br>                     "format", G_TYPE_STRING, "RGB",<br>                     "width", G_TYPE_INT, WIDTH,<br>                     "height", G_TYPE_INT, HEIGHT,<br>                     "framerate", GST_TYPE_FRACTION, 1, 1,<br>                     NULL), NULL);<br><br>  gst_bin_add_many (GST_BIN (pipeline), appsrc, conv, videosink, NULL);<br>  gst_element_link_many (appsrc, conv, videosink, NULL);<br>  /* setup appsrc */<br>  g_object_set (G_OBJECT (appsrc),<br>        "stream-type", 0,<br>        "is-live", TRUE,<br>        "format", GST_FORMAT_TIME, NULL);<br>  g_signal_connect (appsrc, "need-data", G_CALLBACK (cb_need_data), NULL);<br><br>  /* play */<br>  gst_element_set_state (pipeline, GST_STATE_PLAYING);<br>  g_main_loop_run (loop);<br><br>  /* clean up */<br>  gst_element_set_state (pipeline, GST_STATE_NULL);<br>  gst_object_unref (GST_OBJECT (pipeline));<br>  g_main_loop_unref (loop);<br><br>  return 0;<br>}<br></div>