glvideomixer: need update output geometry after src caps reconfigure
authorHaihua Hu <jared.hu@nxp.com>
Mon, 18 Sep 2017 07:42:00 +0000 (15:42 +0800)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:32:30 +0000 (19:32 +0000)
Need update output geometry when sink caps changed and use
gst_structure_set to update caps if structure is fixed

https://bugzilla.gnome.org/show_bug.cgi?id=787820

ext/gl/gstglvideomixer.c
ext/gl/gstglvideomixer.h

index 7180220..45a85a7 100644 (file)
@@ -1076,6 +1076,7 @@ _fixate_caps (GstAggregator * agg, GstCaps * caps)
       best_fps_d = fps_d;
     }
   }
+  mix->output_geo_changed = TRUE;
   GST_OBJECT_UNLOCK (vagg);
 
   if (best_fps_n <= 0 || best_fps_d <= 0 || best_fps == 0.0) {
@@ -1085,10 +1086,14 @@ _fixate_caps (GstAggregator * agg, GstCaps * caps)
   }
 
   s = gst_caps_get_structure (ret, 0);
-  gst_structure_fixate_field_nearest_int (s, "width", best_width);
-  gst_structure_fixate_field_nearest_int (s, "height", best_height);
-  gst_structure_fixate_field_nearest_fraction (s, "framerate", best_fps_n,
-      best_fps_d);
+  if (!gst_structure_fixate_field_nearest_int (s, "width", best_width))
+    gst_structure_set (s, "width", G_TYPE_INT, best_width, NULL);
+  if (!gst_structure_fixate_field_nearest_int (s, "height", best_height))
+    gst_structure_set (s, "height", G_TYPE_INT, best_height, NULL);
+  if (!gst_structure_fixate_field_nearest_fraction (s, "framerate", best_fps_n,
+          best_fps_d))
+    gst_structure_set (s, "framerate", GST_TYPE_FRACTION, best_fps_n,
+        best_fps_d, NULL);
   ret = gst_caps_fixate (ret);
 
   return ret;
@@ -1483,7 +1488,8 @@ gst_gl_video_mixer_callback (gpointer stuff)
 
     _init_vbo_indices (video_mixer);
 
-    if (pad->geometry_change || !pad->vertex_buffer) {
+    if (video_mixer->output_geo_changed || pad->geometry_change
+        || !pad->vertex_buffer) {
       gint pad_width, pad_height;
       gfloat w, h;
 
@@ -1551,6 +1557,7 @@ gst_gl_video_mixer_callback (gpointer stuff)
 
     walk = g_list_next (walk);
   }
+  video_mixer->output_geo_changed = FALSE;
   GST_OBJECT_UNLOCK (video_mixer);
 
   gl->DisableVertexAttribArray (attr_position_loc);
index f352646..c734efb 100644 (file)
@@ -126,6 +126,8 @@ struct _GstGLVideoMixer
     GLuint vbo_indices;
     GLuint checker_vbo;
     GstGLMemory *out_tex;
+
+    gboolean output_geo_changed;
 };
 
 struct _GstGLVideoMixerClass