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