<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>