I'm writting small program which extracts width and height from video file.
After creating a pipeline, I'm adding *filesrc* element and *decodebin* elements. On *decodebin*, I'm attaching handler to the *new-decoded-pad* callback. Then add it to the pipeline, link and play (with help of g_main_loop_run). The source attached. In the handler of *new-decoded-pad* signal, I'm getting caps from pad, then GstStructure of that caps. From structure, I want to extract width and height. After then, I'm exiting from g_mail_loop and program. But there are error: every time, I got 0 (zero) for width and height. I suppose, that I'm doing something totally wrong ;-( Can some one explain me my mistake? *** SOURCE *** #include <gst/gst.h> GMainLoop *loop; static void newpad (GstElement *decodebin, GstPad *pad, gboolean last, gpointer data) { GstCaps *caps; GstStructure *str; /* Get caps from pad */ caps = gst_pad_get_caps (pad); /* Get structure */ str = gst_caps_get_structure (caps, 0); /* Get height */ gint height = 0; gst_structure_get_int (str, "height", &height); g_print ("%d\n", height); gst_caps_unref (caps); g_main_loop_quit (loop); } gint main (gint argc, gchar *argv[]) { GstElement *pipeline, *src, *dec; gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); if (argc != 2) { g_print ("Usage: %s <filename>\n", argv[0]); return -1; } /* Pipeline */ pipeline = gst_pipeline_new ("pipeline"); /* Source (file) */ src = gst_element_factory_make ("filesrc", "source"); g_object_set (G_OBJECT (src), "location", argv[1], NULL); /* Decodebin */ dec = gst_element_factory_make ("decodebin", "decoder"); g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (newpad), NULL); /* Add and Link */ gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL); gst_element_link_many (src, dec, NULL); /* Play */ gst_element_set_state (pipeline, GST_STATE_PLAYING); g_main_loop_run (loop); /* Free */ gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (GST_OBJECT (pipeline)); return 0; } ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/gstreamer-devel |
Probably you're getting audio pad first.
You should extract width/height info whenever there is a video pad. Check the structure name in newpad function. It should contain either "video" or "image" string. On Fri, Jul 18, 2008 at 3:20 PM, AlannY <[hidden email]> wrote: > I'm writting small program which extracts width and height from video file. > > After creating a pipeline, I'm adding *filesrc* element and *decodebin* > elements. On *decodebin*, I'm attaching handler to the *new-decoded-pad* > callback. Then add it to the pipeline, link and play (with help of > g_main_loop_run). The source attached. > > In the handler of *new-decoded-pad* signal, I'm getting caps from pad, > then GstStructure of that caps. From structure, I want to extract width > and height. After then, I'm exiting from g_mail_loop and program. > > But there are error: every time, I got 0 (zero) for width and height. > > I suppose, that I'm doing something totally wrong ;-( Can some one > explain me my mistake? > > *** SOURCE *** > > #include <gst/gst.h> > > GMainLoop *loop; > > static void > newpad (GstElement *decodebin, > GstPad *pad, > gboolean last, > gpointer data) > { > GstCaps *caps; > GstStructure *str; > > /* Get caps from pad */ > caps = gst_pad_get_caps (pad); > /* Get structure */ > str = gst_caps_get_structure (caps, 0); > > /* Get height */ > gint height = 0; > gst_structure_get_int (str, "height", &height); > > g_print ("%d\n", height); > > gst_caps_unref (caps); > > g_main_loop_quit (loop); > } > > gint > main (gint argc, > gchar *argv[]) > { > GstElement *pipeline, *src, *dec; > > gst_init (&argc, &argv); > loop = g_main_loop_new (NULL, FALSE); > > if (argc != 2) { > g_print ("Usage: %s <filename>\n", argv[0]); > return -1; > } > > /* Pipeline */ > pipeline = gst_pipeline_new ("pipeline"); > > /* Source (file) */ > src = gst_element_factory_make ("filesrc", "source"); > g_object_set (G_OBJECT (src), "location", argv[1], NULL); > > /* Decodebin */ > dec = gst_element_factory_make ("decodebin", "decoder"); > g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (newpad), NULL); > > /* Add and Link */ > gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL); > gst_element_link_many (src, dec, NULL); > > /* Play */ > gst_element_set_state (pipeline, GST_STATE_PLAYING); > g_main_loop_run (loop); > > /* Free */ > gst_element_set_state (pipeline, GST_STATE_NULL); > gst_object_unref (GST_OBJECT (pipeline)); > > return 0; > } > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK & win great prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > gstreamer-devel mailing list > [hidden email] > https://lists.sourceforge.net/lists/listinfo/gstreamer-devel > ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |