Writing gstreamer pipeline in c

When I use the following pipelines:
client

gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,encoding-name=H264,payload=96 ! rtph264depay ! h264parse ! avdec_h264 ! autovideosink

server

gst-launch-1.0 v4l2src !  video/x-raw,width=640,height=480 !  x264enc tune=zerolatency byte-stream=true  bitrate=3000 threads=2 !  h264parse config-interval=1 !  rtph264pay ! udpsink host=192.168.1.10 port=5000

it works well: I get a video on the client screen of my server webcam.
But if I try to replace the server pipeline by the following code:

    <#include <gst/gst.h>

static GMainLoop *loop;

gint
main (gint   argc,
      gchar *argv[])
{
  GstElement *pipeline;
  GstElement *source, *capsfilter, *rtp, *parse, *dec, *sink;

  /* init */
  gst_init (&argc, &argv);

  /* create pipeline, add handler */
  pipeline = gst_pipeline_new ("my_pipeline");

    // create elements
    //source = gst_element_factory_make("v4l2src", "source");
    source = gst_element_factory_make("udpsrc", "source");
    g_object_set(G_OBJECT(source), "port", 5001, NULL);
        capsfilter = gst_element_factory_make("capsfilter","cfilter");
        g_object_set(G_OBJECT(capsfilter),"caps",gst_caps_new_simple("application/x-rtp","payload",G_TYPE_INT,96, "encodingname",G_TYPE_STRING,"H264",NULL),NULL);
        rtp = gst_element_factory_make("rtph264depay","rtp_depayload");
    parse = gst_element_factory_make("h264parse","parser");
    dec = gst_element_factory_make("avdec_h264","decoder");
    sink = gst_element_factory_make("autovideosink", "sink");
    
    // add to pipeline before linking
    gst_bin_add_many(GST_BIN(pipeline), source, capsfilter, rtp, parse, dec, sink, NULL);
    
    // link
    if (!gst_element_link_many(source, capsfilter, rtp, parse, dec, sink, NULL)) {
        g_warning("Failed to link elements");
    }
    // start playing
    gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);

  /* create a mainloop that runs/iterates the default GLib main context
   * (context NULL), in other words: makes the context check if anything
   * it watches for has happened. When a message has been posted on the
   * bus, the default main context will automatically call our
   * my_bus_callback() function to notify us of that message.
   * The main loop will be run until someone calls g_main_loop_quit()
   */
  loop = g_main_loop_new (NULL, FALSE);
  g_main_loop_run (loop);

  /* clean up */
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
  g_main_loop_unref (loop);

  return 0;
}>

I do not get any video.
What do I do wrong?