setcaps on src pad isn't invoked

Zhao, Halley halley.zhao at intel.com
Mon Aug 27 19:55:42 PDT 2012


Hi experts:
I'm adding a video conversion element (vaSurface based), caps negotiation goes ok on its sinkpad.
But when I try to add caps negotiation on its src pad to support downlink capsfilter, setcaps isn't invoked at all, though getacps is called:
Is there anything I missed to support src pad caps negotiation?
I noticed that most audio/video conversion element uses GstBaseTransformClass as parent_class, while I'm using GstElementClass. Do I have to use GstbaseTransformClass instead?
thanks

source code reference is here:
https://gitorious.org/~halley/vaapi/halleys-gstreamer-vaapi/commit/86e74b6fb25da611fefe82d0bf6d9857638b8fca

diff --git a/gst/vaapi/gstvaapipostproc.c b/gst/vaapi/gstvaapipostproc.c
index 67a82ee..6b4aa00 100755
--- a/gst/vaapi/gstvaapipostproc.c
+++ b/gst/vaapi/gstvaapipostproc.c
@@ -41,6 +41,9 @@
 #define GST_PLUGIN_NAME "vaapipostproc"
#define GST_PLUGIN_DESC "A video postprocessing filter"
+#define PRINT_MARK_ printf("  %s, %s, %d  ", __FILE__, __FUNCTION__, __LINE__)
+#define PRINT_MARK printf("  %s, %s, %d \n", __FILE__, __FUNCTION__, __LINE__)
+#define PRINTF  printf
 GST_DEBUG_CATEGORY_STATIC(gst_debug_vaapipostproc);
#define GST_CAT_DEFAULT gst_debug_vaapipostproc
@@ -263,6 +266,7 @@ static gboolean gst_vaapipostproc_context_deinit(GstVaapiPostproc *postproc)
     }

     free (vpp);
+    postproc->vpp = NULL;
     return TRUE;
}
@@ -771,8 +775,8 @@ gst_vaapipostproc_ensure_allowed_caps(GstVaapiPostproc *postproc)
}
 static GstCaps *
-gst_vaapipostproc_get_caps(GstPad *pad)
-{
+gst_vaapipostproc_sinkpad_get_caps(GstPad *pad)
+{    PRINT_MARK;
     GstVaapiPostproc * const postproc = get_vaapipostproc_from_pad(pad);
     GstCaps *out_caps;
@@ -785,17 +789,50 @@ gst_vaapipostproc_get_caps(GstPad *pad)
     return out_caps;
}
+static GstCaps *
+gst_vaapipostproc_srcpad_get_caps(GstPad *pad)
+{    PRINT_MARK;
+    GstVaapiPostproc * const postproc = get_vaapipostproc_from_pad(pad);
+    GstCaps *out_caps;
+
+    if (gst_vaapipostproc_ensure_allowed_caps(postproc))
+        out_caps = gst_caps_ref(postproc->allowed_caps);
+    else
+        out_caps = gst_caps_new_empty();
+
+    gst_object_unref(postproc);
+    PRINT_MARK_; PRINTF("out_caps: %s\n", gst_caps_to_string(out_caps));
+    return out_caps;
+}
static gboolean
-gst_vaapipostproc_set_caps(GstPad *pad, GstCaps *caps)
-{
+gst_vaapipostproc_sinkpad_set_caps(GstPad *pad, GstCaps *caps)
+{    PRINT_MARK;
     GstVaapiPostproc * const postproc = get_vaapipostproc_from_pad(pad);
     gboolean success = FALSE;
     g_return_val_if_fail(pad == postproc->sinkpad, FALSE);
+    PRINTF("%s, caps: %s\n", __FUNCTION__, gst_caps_to_string(caps));
     do {
         if (!gst_vaapipostproc_update_sink_caps(postproc, caps))
             break;
+        success = TRUE;
+    } while (0);
+    gst_object_unref(postproc);
+    return success;
+}
+
+// todo gst_vaapipostproc_reset should be done in both srcpad_set_caps and sinkpad_set_caps
+static gboolean
+gst_vaapipostproc_srcpad_set_caps(GstPad *pad, GstCaps *caps)
+{    PRINT_MARK;
+    GstVaapiPostproc * const postproc = get_vaapipostproc_from_pad(pad);
+    gboolean success = FALSE;
+
+    g_return_val_if_fail(pad == postproc->srcpad, FALSE);
+
+    PRINTF("%s, caps: %s\n", __FUNCTION__, gst_caps_to_string(caps));
+    do {
         if (!gst_vaapipostproc_update_src_caps(postproc, caps))
             break;
         if (!gst_vaapipostproc_reset(postproc, postproc->sinkpad_caps))
@@ -1201,8 +1238,8 @@ gst_vaapipostproc_init(GstVaapiPostproc *postproc)
     );
     postproc->sinkpad_caps = NULL;
-    gst_pad_set_getcaps_function(postproc->sinkpad, gst_vaapipostproc_get_caps);
-    gst_pad_set_setcaps_function(postproc->sinkpad, gst_vaapipostproc_set_caps);
+    gst_pad_set_getcaps_function(postproc->sinkpad, gst_vaapipostproc_sinkpad_get_caps);
+    gst_pad_set_setcaps_function(postproc->sinkpad, gst_vaapipostproc_sinkpad_set_caps);
     gst_pad_set_chain_function(postproc->sinkpad, gst_vaapipostproc_chain);
     gst_pad_set_event_function(postproc->sinkpad, gst_vaapipostproc_sink_event);
     gst_pad_set_query_function(postproc->sinkpad, gst_vaapipostproc_query);
@@ -1215,6 +1252,9 @@ gst_vaapipostproc_init(GstVaapiPostproc *postproc)
     );
     postproc->srcpad_caps = NULL;
+    gst_pad_set_getcaps_function(postproc->srcpad, gst_vaapipostproc_srcpad_get_caps);
+    gst_pad_set_setcaps_function(postproc->srcpad, gst_vaapipostproc_srcpad_set_caps);
+    // gst_pad_set_chain_function(postproc->srcpad, gst_vaapipostproc_chain);
     gst_pad_set_event_function(postproc->srcpad, gst_vaapipostproc_src_event);
     gst_pad_set_query_function(postproc->srcpad, gst_vaapipostproc_query);
     gst_element_add_pad(GST_ELEMENT(postproc), postproc->srcpad);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20120828/161c8260/attachment-0001.html>


More information about the gstreamer-devel mailing list