summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clutter-gst/clutter-gst-video-sink.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/clutter-gst/clutter-gst-video-sink.c b/clutter-gst/clutter-gst-video-sink.c
index c40e6e9..d57a6c8 100644
--- a/clutter-gst/clutter-gst-video-sink.c
+++ b/clutter-gst/clutter-gst-video-sink.c
@@ -400,12 +400,12 @@ add_layer_cache_entry (ClutterGstVideoSink *sink,
default_source =
g_strdup_printf (" cogl_layer *= clutter_gst_sample_video%i "
- "(cogl_tex_coord%i_in.st);\n",
+ "(cogl_tex_coord%i_in.st * clutter_gst_transform);\n",
priv->video_start,
priv->video_start);
entry->default_sample_snippet =
cogl_snippet_new (COGL_SNIPPET_HOOK_LAYER_FRAGMENT,
- NULL, /* declarations */
+ "uniform mat2 clutter_gst_transform;\n",
default_source);
g_free (default_source);
@@ -966,6 +966,30 @@ clutter_gst_video_sink_setup_conversions (ClutterGstVideoSink *sink,
cogl_pipeline_add_snippet (pipeline, entry->fragment_snippet);
}
+/* Transformation for cropped videos */
+
+static void
+clutter_gst_video_sink_setup_transformation (ClutterGstVideoSink *sink,
+ CoglPipeline *pipeline)
+{
+ ClutterGstVideoSinkPrivate *priv = sink->priv;
+ float transform[] = { 1.0, 0.0,
+ 0.0, 1.0 };
+ gint transform_location;
+
+ if (priv->frame[0] != NULL)
+ {
+ transform[0] = (float) GST_VIDEO_INFO_COMP_WIDTH (&priv->info, 0) /
+ (float) cogl_texture_get_width (priv->frame[0]);
+ transform[3] = (float) GST_VIDEO_INFO_COMP_HEIGHT (&priv->info, 0) /
+ (float) cogl_texture_get_height (priv->frame[0]);
+ }
+ transform_location =
+ cogl_pipeline_get_uniform_location (pipeline, "clutter_gst_transform");
+ cogl_pipeline_set_uniform_matrix (pipeline, transform_location,
+ 2, 1, FALSE, transform);
+}
+
/**/
static gboolean
@@ -2625,6 +2649,7 @@ clutter_gst_video_sink_setup_pipeline (ClutterGstVideoSink *sink,
{
clutter_gst_video_sink_setup_conversions (sink, pipeline);
clutter_gst_video_sink_setup_balance (sink, pipeline);
+ clutter_gst_video_sink_setup_transformation (sink, pipeline);
priv->renderer->setup_pipeline (sink, pipeline);
}
}