Problem creating a sometiems pad for a decodebin element

gayathri1818 gayathri.devi at linoy.in
Fri Aug 9 09:55:45 UTC 2019


I'm trying to write the following pipeline in C++ code: 
gst-launch-1.0 filesrc location=video.mp4 ! decodebin ! nvvidconv !
'video/x-raw, format=(string)I420, width=(int)1280, height=(int)720' !
omxh264enc ! qtmux ! filesink location=test.mp4 -e.

decodebin element's src has sometimes pads, so I manually linked decodebin
and nvvidconv in callback function which gets  called when pad-added signal
is triggered.
But unfortunately the callback function is not getting triggered.

code:
typedef struct {
    GstPipeline *pipeline;
    GstAppSrc  *src;
    GstElement *decoder;
    GstElement *videoconv;
    GstElement *filter1;
    GstElement *filter2;
    GstElement *encoder;
    GstElement *qtmux;
    GstElement *sink;

    GstClockTime timestamp;
    guint sourceid;
} gst_app_t;

static gst_app_t gst_app;

// callback function
static void cb_new_pad (GstElement *element, GstPad *new_pad, gst_app_t
*app)
{
    GstPad *videoconv_pad = gst_element_get_static_pad(app->videoconv ,
"sink");
    g_print(" obtained gst pad %s for videoconv \n" ,
gst_pad_get_name(videoconv_pad));
    GstPadLinkReturn ret; 
    GstCaps *new_pad_caps = NULL;
    GstStructure *new_pad_struct = NULL;
    const gchar *new_pad_type = NULL;
    g_print ("Received new pad '%s' from '%s':\n", GST_PAD_NAME (new_pad),
GST_ELEMENT_NAME (element));
    if(gst_pad_is_linked(videoconv_pad)){
        g_print("Already linked");
        exit;
    }
    new_pad_caps = gst_pad_get_current_caps (new_pad);
    new_pad_struct = gst_caps_get_structure (new_pad_caps, 0);
    new_pad_type = gst_structure_get_name (new_pad_struct);
    ret = gst_pad_link (new_pad, videoconv_pad);
    if (GST_PAD_LINK_FAILED (ret)) {
        g_print ("Type is '%s' but link failed.\n", new_pad_type);
    }
    else {
        g_print ("Link succeeded (type '%s').\n", new_pad_type);
    }
    if (GST_PAD_LINK_FAILED (ret)) {
        g_print ("Type is '%s' but link failed.\n", new_pad_type);
    }
    else {
        g_print ("Link succeeded (type '%s').\n", new_pad_type);
    }
}

int main(int argc , char **argv){
    gst_app_t *app = &gst_app;
    GstStateChangeReturn state_ret;
    gst_init(NULL, NULL);
    app->pipeline        = (GstPipeline*)gst_pipeline_new("pipeline");
    app->src                = (GstAppSrc*)gst_element_factory_make("appsrc",
"appsrc");
    app->filter1            = gst_element_factory_make ("capsfilter",
"filter1");
    app->decoder        = gst_element_factory_make("decodebin" , "decoder");
    app->videoconv     = gst_element_factory_make ("videoconvert" ,
"nvvidconv");
    app->encoder        = gst_element_factory_make ("omxh264enc", "omx");
    app->qtmux           = gst_element_factory_make("qtmux"      , "mux");
    app->sink              = gst_element_factory_make ("filesink"  ,
"filesink");

    if( !app->pipeline || !app->src  || !app->filter1 || !app->filter2   ||
        !app->encoder  || !app->qtmux       || !app->decoder ||
!app->videoconv ||
        !app->sink)  {
        printf("Error creating pipeline elements!\n");
        exit(2);
    }

    //Attach elements to pipeline
    gst_bin_add_many(
        GST_BIN(app->pipeline),
        (GstElement*)app->src,
        app->decoder,
        app->videoconv,
        app->filter1,
        app->encoder,
        app->qtmux,
        app->sink,
        NULL);

    //Set pipeline element attributes
    g_object_set (app->src, "format", GST_FORMAT_TIME, NULL);
    GstCaps *filtercaps1 = gst_caps_new_simple ("video/x-raw",
                                                "format", G_TYPE_STRING,
"I420",
                                                "width", G_TYPE_INT, 1280,
                                                "height", G_TYPE_INT, 720,
                                                NULL);
    g_object_set (G_OBJECT (app->filter1), "caps", filtercaps1, NULL);
    
    //Link elements together
    if(!gst_element_link((GstElement*)app->src , app->decoder)){
        g_print("Error linking src and decodebin");
        exit(2);
    }
    if(!gst_element_link_many(app->videoconv , app->filter1 , app->encoder,
NULL)){
        g_print("Error liniking gst elements");
        exit(2);
    if(!gst_element_link(app->qtmux , app->sink)){
        g_print("Error linking qtmux and filesink");
        exit(2);
    }
    g_signal_connect(app->decoder , "pad-added" , G_CALLBACK(cb_new_pad) ,
app);

    GstPad *qtmux_pad = gst_element_get_request_pad(app->qtmux ,
"video_%u");

    GstPad *encoder_pad = gst_element_get_static_pad(app->encoder , "src");

    if(gst_pad_link(encoder_pad , qtmux_pad) != GST_PAD_LINK_OK){
        g_print("couldnt link encoder and qtmux");
    }
    state_ret = gst_element_set_state((GstElement*)app->pipeline,
GST_STATE_PLAYING);
}



--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/


More information about the gstreamer-devel mailing list