<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        font-size:10.5pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
/* Page Definitions */
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-CN" link="blue" vlink="purple" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hi experts:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I’m adding a video conversion element (vaSurface based), caps negotiation goes ok on its sinkpad.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">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:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Is there anything I missed to support src pad caps negotiation?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">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?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">thanks<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">source code reference is here:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><a href="https://gitorious.org/~halley/vaapi/halleys-gstreamer-vaapi/commit/86e74b6fb25da611fefe82d0bf6d9857638b8fca">https://gitorious.org/~halley/vaapi/halleys-gstreamer-vaapi/commit/86e74b6fb25da611fefe82d0bf6d9857638b8fca</a>
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/gst/vaapi/gstvaapipostproc.c b/gst/vaapi/gstvaapipostproc.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 67a82ee..6b4aa00 100755<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/gst/vaapi/gstvaapipostproc.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/gst/vaapi/gstvaapipostproc.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -41,6 +41,9 @@<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> #define GST_PLUGIN_NAME "vaapipostproc"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#define GST_PLUGIN_DESC "A video postprocessing filter"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+#define PRINT_MARK_ printf("  %s, %s, %d  ", __FILE__, __FUNCTION__, __LINE__)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+#define PRINT_MARK printf("  %s, %s, %d \n", __FILE__, __FUNCTION__, __LINE__)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+#define PRINTF  printf<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> GST_DEBUG_CATEGORY_STATIC(gst_debug_vaapipostproc);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#define GST_CAT_DEFAULT gst_debug_vaapipostproc<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -263,6 +266,7 @@ static gboolean gst_vaapipostproc_context_deinit(GstVaapiPostproc *postproc)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     free (vpp);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    postproc->vpp = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     return TRUE;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -771,8 +775,8 @@ gst_vaapipostproc_ensure_allowed_caps(GstVaapiPostproc *postproc)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> static GstCaps *<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-gst_vaapipostproc_get_caps(GstPad *pad)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+gst_vaapipostproc_sinkpad_get_caps(GstPad *pad)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+{    PRINT_MARK;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     GstVaapiPostproc * const postproc = get_vaapipostproc_from_pad(pad);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     GstCaps *out_caps;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -785,17 +789,50 @@ gst_vaapipostproc_get_caps(GstPad *pad)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     return out_caps;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+static GstCaps *<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+gst_vaapipostproc_srcpad_get_caps(GstPad *pad)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+{    PRINT_MARK;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    GstVaapiPostproc * const postproc = get_vaapipostproc_from_pad(pad);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    GstCaps *out_caps;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    if (gst_vaapipostproc_ensure_allowed_caps(postproc))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+        out_caps = gst_caps_ref(postproc->allowed_caps);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    else<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+        out_caps = gst_caps_new_empty();<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    gst_object_unref(postproc);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    PRINT_MARK_; PRINTF("out_caps: %s\n", gst_caps_to_string(out_caps));<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    return out_caps;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">static gboolean<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-gst_vaapipostproc_set_caps(GstPad *pad, GstCaps *caps)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+gst_vaapipostproc_sinkpad_set_caps(GstPad *pad, GstCaps *caps)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+{    PRINT_MARK;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     GstVaapiPostproc * const postproc = get_vaapipostproc_from_pad(pad);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     gboolean success = FALSE;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     g_return_val_if_fail(pad == postproc->sinkpad, FALSE);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    PRINTF("%s, caps: %s\n", __FUNCTION__, gst_caps_to_string(caps));<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     do {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">         if (!gst_vaapipostproc_update_sink_caps(postproc, caps))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">             break;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+        success = TRUE;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    } while (0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    gst_object_unref(postproc);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    return success;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+// todo gst_vaapipostproc_reset should be done in both srcpad_set_caps and sinkpad_set_caps<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+static gboolean<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+gst_vaapipostproc_srcpad_set_caps(GstPad *pad, GstCaps *caps)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+{    PRINT_MARK;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    GstVaapiPostproc * const postproc = get_vaapipostproc_from_pad(pad);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    gboolean success = FALSE;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    g_return_val_if_fail(pad == postproc->srcpad, FALSE);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    PRINTF("%s, caps: %s\n", __FUNCTION__, gst_caps_to_string(caps));<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    do {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">         if (!gst_vaapipostproc_update_src_caps(postproc, caps))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">             break;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">         if (!gst_vaapipostproc_reset(postproc, postproc->sinkpad_caps))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -1201,8 +1238,8 @@ gst_vaapipostproc_init(GstVaapiPostproc *postproc)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     );<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     postproc->sinkpad_caps = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-    gst_pad_set_getcaps_function(postproc->sinkpad, gst_vaapipostproc_get_caps);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-    gst_pad_set_setcaps_function(postproc->sinkpad, gst_vaapipostproc_set_caps);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    gst_pad_set_getcaps_function(postproc->sinkpad, gst_vaapipostproc_sinkpad_get_caps);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    gst_pad_set_setcaps_function(postproc->sinkpad, gst_vaapipostproc_sinkpad_set_caps);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     gst_pad_set_chain_function(postproc->sinkpad, gst_vaapipostproc_chain);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     gst_pad_set_event_function(postproc->sinkpad, gst_vaapipostproc_sink_event);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     gst_pad_set_query_function(postproc->sinkpad, gst_vaapipostproc_query);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -1215,6 +1252,9 @@ gst_vaapipostproc_init(GstVaapiPostproc *postproc)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     );<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     postproc->srcpad_caps = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    gst_pad_set_getcaps_function(postproc->srcpad, gst_vaapipostproc_srcpad_get_caps);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    gst_pad_set_setcaps_function(postproc->srcpad, gst_vaapipostproc_srcpad_set_caps);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+    // gst_pad_set_chain_function(postproc->srcpad, gst_vaapipostproc_chain);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     gst_pad_set_event_function(postproc->srcpad, gst_vaapipostproc_src_event);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     gst_pad_set_query_function(postproc->srcpad, gst_vaapipostproc_query);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     gst_element_add_pad(GST_ELEMENT(postproc), postproc->srcpad);<o:p></o:p></span></p>
</div>
</body>
</html>