summaryrefslogtreecommitdiff
path: root/clutter-gst/clutter-gst-aspectratio.c
diff options
context:
space:
mode:
Diffstat (limited to 'clutter-gst/clutter-gst-aspectratio.c')
-rw-r--r--clutter-gst/clutter-gst-aspectratio.c102
1 files changed, 88 insertions, 14 deletions
diff --git a/clutter-gst/clutter-gst-aspectratio.c b/clutter-gst/clutter-gst-aspectratio.c
index 21b3802..f426802 100644
--- a/clutter-gst/clutter-gst-aspectratio.c
+++ b/clutter-gst/clutter-gst-aspectratio.c
@@ -133,6 +133,35 @@ clutter_gst_aspectratio_get_frame_box (ClutterGstAspectratio *self,
}
}
+static void
+clutter_gst_aspectratio_get_overlay_box (ClutterGstAspectratio *self,
+ ClutterGstBox *input_box,
+ ClutterGstBox *paint_box,
+ const ClutterGstBox *frame_input,
+ const ClutterGstBox *frame_box,
+ ClutterGstFrame *frame,
+ ClutterGstOverlay *overlay)
+{
+ gfloat box_width = frame_box->x2 - frame_box->x1,
+ box_height = frame_box->y2 - frame_box->y1;
+
+ /* texturing input */
+ input_box->x1 = (overlay->position.x1 - MAX (frame_input->x1 * frame->resolution.width, overlay->position.x1))
+ / (overlay->position.x2 - overlay->position.x1);
+ input_box->y1 = (overlay->position.y1 - MAX (frame_input->y1 * frame->resolution.height, overlay->position.y1))
+ / (overlay->position.y2 - overlay->position.y1);
+ input_box->x2 = 1 - (overlay->position.x2 - MIN (frame_input->x2 * frame->resolution.width, overlay->position.x2))
+ / (overlay->position.x2 - overlay->position.x1);
+ input_box->y2 = 1 - (overlay->position.y2 - MIN (frame_input->y2 * frame->resolution.height, overlay->position.y2))
+ / (overlay->position.y2 - overlay->position.y1);
+
+ /* vertex output */
+ paint_box->x1 = frame_box->x1 + overlay->position.x1 * box_width / frame->resolution.width;
+ paint_box->y1 = frame_box->y1 + overlay->position.y1 * box_height / frame->resolution.height;
+ paint_box->x2 = frame_box->x1 + overlay->position.x2 * box_width / frame->resolution.width;
+ paint_box->y2 = frame_box->y1 + overlay->position.y2 * box_height / frame->resolution.height;
+}
+
/**/
static gboolean
@@ -161,8 +190,8 @@ clutter_gst_aspectratio_paint_content (ClutterContent *content,
{
ClutterGstAspectratio *self = CLUTTER_GST_ASPECTRATIO (content);
ClutterGstAspectratioPrivate *priv = self->priv;
- ClutterGstFrame *frame =
- clutter_gst_content_get_frame (CLUTTER_GST_CONTENT (content));
+ ClutterGstContent *gst_content = CLUTTER_GST_CONTENT (content);
+ ClutterGstFrame *frame = clutter_gst_content_get_frame (gst_content);
ClutterGstBox input_box, paint_box;
ClutterActorBox content_box;
ClutterPaintNode *node;
@@ -228,21 +257,66 @@ clutter_gst_aspectratio_paint_content (ClutterContent *content,
clutter_paint_node_unref (node);
}
- cogl_pipeline_set_color4ub (frame->pipeline,
- paint_opacity, paint_opacity,
- paint_opacity, paint_opacity);
+ if (clutter_gst_content_get_paint_frame (gst_content))
+ {
+ cogl_pipeline_set_color4ub (frame->pipeline,
+ paint_opacity, paint_opacity,
+ paint_opacity, paint_opacity);
+
+ node = clutter_pipeline_node_new (frame->pipeline);
+ clutter_paint_node_set_name (node, "AspectRatioVideoFrame");
- node = clutter_pipeline_node_new (frame->pipeline);
- clutter_paint_node_set_name (node, "AspectRatioVideoFrame");
+ clutter_paint_node_add_texture_rectangle_custom (node,
+ paint_box.x1, paint_box.y1,
+ paint_box.x2, paint_box.y2,
+ input_box.x1, input_box.y1,
+ input_box.x2, input_box.y2);
- clutter_paint_node_add_texture_rectangle_custom (node,
- paint_box.x1, paint_box.y1,
- paint_box.x2, paint_box.y2,
- input_box.x1, input_box.y1,
- input_box.x2, input_box.y2);
+ clutter_paint_node_add_child (root, node);
+ clutter_paint_node_unref (node);
+ }
+
+ if (clutter_gst_content_get_paint_overlays (gst_content))
+ {
+ ClutterGstOverlays *overlays = clutter_gst_content_get_overlays (gst_content);
- clutter_paint_node_add_child (root, node);
- clutter_paint_node_unref (node);
+ if (overlays)
+ {
+ guint i;
+
+ for (i = 0; i < overlays->overlays->len; i++)
+ {
+ ClutterGstOverlay *overlay =
+ g_ptr_array_index (overlays->overlays, i);
+ ClutterGstBox overlay_box;
+ ClutterGstBox overlay_input_box;
+
+ clutter_gst_aspectratio_get_overlay_box (self,
+ &overlay_input_box,
+ &overlay_box,
+ &input_box,
+ &paint_box,
+ frame,
+ overlay);
+
+ cogl_pipeline_set_color4ub (overlay->pipeline,
+ paint_opacity, paint_opacity,
+ paint_opacity, paint_opacity);
+
+ node = clutter_pipeline_node_new (overlay->pipeline);
+ clutter_paint_node_set_name (node, "AspectRatioVideoOverlay");
+
+ clutter_paint_node_add_texture_rectangle_custom (node,
+ overlay_box.x1, overlay_box.y1,
+ overlay_box.x2, overlay_box.y2,
+ overlay_input_box.x1, overlay_input_box.y1,
+ overlay_input_box.x2, overlay_input_box.y2);
+
+ clutter_paint_node_add_child (root, node);
+ clutter_paint_node_unref (node);
+ }
+ }
+ }
}
static void