<div dir="ltr">It looks like it is a copy paste from compositor, should we offer such a functionnality in videoaggregator itself instead of copying that code around? We could imagine that vmethod is actually default behaviour and classes that do not want it could remove its implementation  (overriding it with NULL)  maybe?<br>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 25, 2014 at 4:03 AM, Matthew Waters <span dir="ltr"><<a href="mailto:ystreet@kemper.freedesktop.org" target="_blank">ystreet@kemper.freedesktop.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Module: gst-plugins-bad<br>
Branch: master<br>
Commit: c37ace184428e3096f57ccd89b67434eab632e6e<br>
URL:    <a href="http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=c37ace184428e3096f57ccd89b67434eab632e6e" target="_blank">http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=c37ace184428e3096f57ccd89b67434eab632e6e</a><br>

<br>
Author: Matthew Waters <<a href="mailto:ystreet00@gmail.com">ystreet00@gmail.com</a>><br>
Date:   Wed Jun 25 12:00:34 2014 +1000<br>
<br>
glvideomixer: bas output width/height on the pad properties<br>
<br>
Allows automatic negotiation of the size in the following case:<br>
gst-launch-1.0 glvideomixer name=m sink_0::xpos=0 sink_1::xpos=320 ! glimagesink \<br>
    videotestsrc ! m. \<br>
    videotestsrc pattern=1 ! m.<br>
<br>
<a href="https://bugzilla.gnome.org/show_bug.cgi?id=731878" target="_blank">https://bugzilla.gnome.org/show_bug.cgi?id=731878</a><br>
<br>
---<br>
<br>
 ext/gl/gstglvideomixer.c |   51 +++++++++++++++++++++++++++++++++++++++++++++-<br>
 1 file changed, 50 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/ext/gl/gstglvideomixer.c b/ext/gl/gstglvideomixer.c<br>
index 1d0299c..7b3904e 100644<br>
--- a/ext/gl/gstglvideomixer.c<br>
+++ b/ext/gl/gstglvideomixer.c<br>
@@ -60,6 +60,7 @@ static void gst_gl_video_mixer_set_property (GObject * object, guint prop_id,<br>
 static void gst_gl_video_mixer_get_property (GObject * object, guint prop_id,<br>
     GValue * value, GParamSpec * pspec);<br>
<br>
+static gboolean _update_info (GstVideoAggregator * vagg, GstVideoInfo * info);<br>
 static void gst_gl_video_mixer_reset (GstGLMixer * mixer);<br>
 static gboolean gst_gl_video_mixer_init_shader (GstGLMixer * mixer,<br>
     GstCaps * outcaps);<br>
@@ -249,6 +250,7 @@ gst_gl_video_mixer_class_init (GstGLVideoMixerClass * klass)<br>
   GObjectClass *gobject_class;<br>
   GstElementClass *element_class;<br>
   GstAggregatorClass *agg_class = (GstAggregatorClass *) klass;<br>
+  GstVideoAggregatorClass *vagg_class = (GstVideoAggregatorClass *) klass;<br>
<br>
   gobject_class = (GObjectClass *) klass;<br>
   element_class = GST_ELEMENT_CLASS (klass);<br>
@@ -265,8 +267,9 @@ gst_gl_video_mixer_class_init (GstGLVideoMixerClass * klass)<br>
   GST_GL_MIXER_CLASS (klass)->process_textures =<br>
       gst_gl_video_mixer_process_textures;<br>
<br>
-  agg_class->sinkpads_type = GST_TYPE_GL_VIDEO_MIXER_PAD;<br>
+  vagg_class->update_info = _update_info;<br>
<br>
+  agg_class->sinkpads_type = GST_TYPE_GL_VIDEO_MIXER_PAD;<br>
 }<br>
<br>
 static void<br>
@@ -298,6 +301,52 @@ gst_gl_video_mixer_get_property (GObject * object, guint prop_id,<br>
   }<br>
 }<br>
<br>
+static gboolean<br>
+_update_info (GstVideoAggregator * vagg, GstVideoInfo * info)<br>
+{<br>
+  GList *l;<br>
+  gint best_width = -1, best_height = -1;<br>
+  gboolean ret = FALSE;<br>
+<br>
+  GST_OBJECT_LOCK (vagg);<br>
+  for (l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) {<br>
+    GstVideoAggregatorPad *vaggpad = l->data;<br>
+    GstGLVideoMixerPad *mixer_pad = GST_GL_VIDEO_MIXER_PAD (vaggpad);<br>
+    gint this_width, this_height;<br>
+    gint width, height;<br>
+<br>
+    if (mixer_pad->width > 0)<br>
+      width = mixer_pad->width;<br>
+    else<br>
+      width = GST_VIDEO_INFO_WIDTH (&vaggpad->info);<br>
+<br>
+    if (mixer_pad->height > 0)<br>
+      height = mixer_pad->height;<br>
+    else<br>
+      height = GST_VIDEO_INFO_HEIGHT (&vaggpad->info);<br>
+<br>
+    if (width == 0 || height == 0)<br>
+      continue;<br>
+<br>
+    this_width = width + MAX (mixer_pad->xpos, 0);<br>
+    this_height = height + MAX (mixer_pad->ypos, 0);<br>
+<br>
+    if (best_width < this_width)<br>
+      best_width = this_width;<br>
+    if (best_height < this_height)<br>
+      best_height = this_height;<br>
+  }<br>
+  GST_OBJECT_UNLOCK (vagg);<br>
+<br>
+  if (best_width > 0 && best_height > 0) {<br>
+    gst_video_info_set_format (info, GST_VIDEO_INFO_FORMAT (info),<br>
+        best_width, best_height);<br>
+    ret = TRUE;<br>
+  }<br>
+<br>
+  return ret;<br>
+}<br>
+<br>
 static void<br>
 gst_gl_video_mixer_reset (GstGLMixer * mixer)<br>
 {<br>
<br>
_______________________________________________<br>
gstreamer-commits mailing list<br>
<a href="mailto:gstreamer-commits@lists.freedesktop.org">gstreamer-commits@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-commits" target="_blank">http://lists.freedesktop.org/mailman/listinfo/gstreamer-commits</a><br>
</blockquote></div><br></div>