[gst-devel] how to get the final caps of gstplaybin (or gstdecodebin)?

Zhao, Halley halley.zhao at intel.com
Fri Nov 14 11:10:26 CET 2008


In gstplaybin.c, after the dynamic pipeline has created, I try to get the final src pad (caps) of gstplaybin (gstdecodebin), but failed in function: gen_video_element();
I recursively parse the element in gstplaybin, but gst_caps_get_structure() will report error that "gst_caps_get_structure: assertion `GST_IS_CAPS (caps)' failed".
The error msg and my source code is as following, thanks for your help

################error message:
====element name -2:mpeg2dec0
    file: gstplaybin.c, func: gen_video_element,      line: 920
    file: gstplaybin.c, func: gen_video_element,      line: 926
it is not a bin
    file: gstplaybin.c, func: gen_video_element,      line: 935

(gst-launch-0.10:14448): GStreamer-CRITICAL **: gst_caps_get_structure: assertion `GST_IS_CAPS (caps)' failed
===Error, we can't find the src structure of play_bin, wuwu~~~
====element name -2:fakesink
===Error, we can't find the src pad of play_bin, wuwu~~~
====element name -2:typefind
    file: gstplaybin.c, func: gen_video_element,      line: 920
    file: gstplaybin.c, func: gen_video_element,      line: 926
it is not a bin
    file: gstplaybin.c, func: gen_video_element,      line: 935

################my src codec
iter = gst_bin_iterate_elements (GST_BIN_CAST(play_bin));

    while (!done) {
        switch (gst_iterator_next (iter, &data)) {
          case GST_ITERATOR_OK:
          {
              child = GST_ELEMENT_CAST (data);
              temp_name = gst_element_get_name (child);
              if(!strncmp(temp_name, "decodebin",9))
              {
                  GstIterator *iter_2 = NULL;
                  gboolean done_2 = FALSE;
                  gpointer data_2 = NULL;
                  GstElement *child_2=NULL;
                  gboolean res_2 = TRUE;
                  gchar *temp_name_2 = NULL;

                  iter_2 = gst_bin_iterate_elements (GST_BIN_CAST(child));

                  while (!done_2) {
                      switch (gst_iterator_next (iter_2, &data_2)) {
                        case GST_ITERATOR_OK:
                        {
                            child_2 = GST_ELEMENT_CAST (data_2);
                            temp_name_2 = gst_element_get_name (child_2);
                            PRINTF("====element name -2:%s\n",temp_name_2);
                            g_free (temp_name_2);

                            if ((play_bin_src_pad = gst_element_get_pad (child_2, "src")) == NULL) {
                                PRINTF("===Error, we can't find the src pad of play_bin, wuwu~~~\n");
                                break;
                            }

                            PRINT_MARK;
                            if (play_bin_src_caps = gst_pad_get_caps (play_bin_src_pad) == NULL) {
                                PRINTF("===Error, we can't find the src caps of play_bin, wuwu~~~\n");
                                break;
                            }

                            PRINT_MARK;
                            if (GST_IS_BIN(child_2)) {
                                PRINTF("it is a bin\n");
                            }
                            else
                            {
                                PRINTF("it is not a bin\n");
                            }

                            PRINT_MARK;
                            if ((structure = gst_caps_get_structure (play_bin_src_caps, 0)) == NULL) {
                            PRINTF("===Error, we can't find the src structure of play_bin, wuwu~~~\n");
                            break;
                            }

                            PRINT_MARK;
                          structure_name = gst_structure_get_name(structure);
                          PRINTF("==== structure_name: %s====\n",structure_name);

                            gst_object_unref (structure);
                            gst_object_unref (structure_name);
                            gst_object_unref (child_2);

                        }
                       break;
                        case GST_ITERATOR_RESYNC:
                          gst_iterator_resync (iter_2);
                          res_2 = TRUE;
                          break;
                        case GST_ITERATOR_DONE:
                          done_2 = TRUE;
                          break;
                        case GST_ITERATOR_ERROR:
                          g_assert_not_reached ();
                          break;
                      }
                  }
                gst_iterator_free (iter_2);

              }

              g_free (temp_name);

                // gst_object_unref (child);
            }
           break;
            case GST_ITERATOR_RESYNC:
              gst_iterator_resync (iter);
              res = TRUE;
              break;
            case GST_ITERATOR_DONE:
              done = TRUE;
              break;
            case GST_ITERATOR_ERROR:
              g_assert_not_reached ();
              break;
          }
    }
    gst_iterator_free (iter);
ZHAO, Halley (Aihua)
Email: halley.zhao at intel.com<mailto:aihua.zhao at intel.com>
Tel: +86(21)61166476
iNet: 8821-6476
SSG/OTC/UMD 3W033

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20081114/b3d41e5d/attachment.htm>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: gen_video_element.c
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20081114/b3d41e5d/attachment.txt>


More information about the gstreamer-devel mailing list