0

I encountered different behavior with a gstreamer pipelines when implemented in C++ compared to gst-launch-1.0 execution in command line - the problem is with the bitrate property. Same problem as described bellow in both implementations (C++ & command line execution) occurs with omxh264enc encoder as well with control-rate property set to 2 (CBR mode).

The pipeline which used in command line was:

gst-launch-1.0 ximagesrc ! autovideoconvert ! x264enc bitrate=800 pass=0 ! video/x-h264, stream-format=byte-stream ! h264parse ! mpegtsmux ! udpsink host=127.0.0.1  port=1234 sync=false

The C++ implementation is:

        GstElement* pipeline;
        GstElement* appsrc;
        GstElement* videoConvert;
        GstElement* encoder;
        GstElement* encoderCapsFilter;
        GstElement* parser;
        GstElement* tsmux;
        GstElement* udpsink;

        pipeline = gst_pipeline_new ("pipeline");
        appsrc = gst_element_factory_make ("appsrc", "source");
        videoConvert = gst_element_factory_make ("autovideoconvert", "my_video_convertor");
        encoder =  gst_element_factory_make ("x264enc", "my_encoder");
        encoderCapsFilter = gst_element_factory_make("capsfilter", "my_caps");
        parser =  gst_element_factory_make ("h264parse", "my_parser");
        tsmux = gst_element_factory_make ("mpegtsmux", "my_muxer");
        udpsink = gst_element_factory_make ("udpsink", "my_udpsink");


        /*Configure appsrc*/
        g_object_set (G_OBJECT (appsrc), "caps", gst_caps_new_simple ("video/x-raw",
                                                                                  "format", G_TYPE_STRING, "I420",
                                                                                  "width", G_TYPE_INT, width,
                                                                                  "height", G_TYPE_INT, height,
                                                                                  "framerate", GST_TYPE_FRACTION, 25, 1, NULL), NULL);

        g_object_set(G_OBJECT(appsrc), "is-live" , true, NULL);
        /*Configure videoConvert*/
        /*Configure encoder*/
        g_object_set(G_OBJECT(encoder), "bitrate" , 800, NULL);
        g_object_set(G_OBJECT(encoder), "pass" , 0, NULL);
        /*Configure encoder caps*/
        g_object_set(G_OBJECT (encoderCapsFilter), "caps", gst_caps_from_string("video/x-h264, stream-format=byte-stream"), NULL);
        /*Configure h264parse*/
        /*Configure mpegtsmux*/
        /*Configure udpsink*/
        g_object_set(G_OBJECT(udpsink), "host" , "127.0.0.1", NULL);
        g_object_set(G_OBJECT(udpsink), "port" , 1234, NULL);
        g_object_set(G_OBJECT(udpsink), "sync" , false, NULL);

        // add
        gst_bin_add_many(GST_BIN(pipeline),
                         appsrc,
                         videoConvert,
                         encoder,
                         encoderCapsFilter,
                         parser,
                         tsmux,
                         udpsink,
                         NULL);

        // link
        if (!gst_element_link_many(appsrc,
                                   videoConvert,
                                   encoder,
                                   encoderCapsFilter,
                                   parser,
                                   tsmux,
                                   udpsink,
                                   NULL))
        {
            g_printerr("Elements could not be linked");
        }


bitrate is set to 800kbps and when testing this pipeline from command line with Wireshark the baudrate results around 800-850kbps which is good, when tested the same pipeline in C++ (to use appsrc instead of ximagesrc) the baudrate results in different and higher bitrate (around 1200-1300kbps).

What is missing to reach the same bitrate result when executed through command line? Is there more configuration to be done into the gst elements when implemented in C++?

LimeLuiz
  • 1
  • 2
  • Hi ! Have you tried to use ximagesrc instead of appsrc in your C Application ? Encoder "bitrate" variable seems to be goodly configured. How are you sending the data with AppSRC, are you sets the timestamps correctly ? You could as configure x264enc with tune : zerolatency (0x00000004) this is better when you do streaming. – Ludovic Bouguerra Nov 30 '22 at 18:35

0 Answers0