glvideomixer: need update output geometry after src caps reconfigure

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
This commit is contained in:
Haihua Hu 2017-09-18 15:42:00 +08:00 committed by Tim-Philipp Müller
parent c33fc416b2
commit 60eeef12a0
2 changed files with 14 additions and 5 deletions

View 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);

View file

@ -126,6 +126,8 @@ struct _GstGLVideoMixer
GLuint vbo_indices;
GLuint checker_vbo;
GstGLMemory *out_tex;
gboolean output_geo_changed;
};
struct _GstGLVideoMixerClass