summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorMark Nauwelaerts <mnauw@users.sourceforge.net>2017-01-09 21:04:51 +0100
committerMark Nauwelaerts <mnauw@users.sourceforge.net>2017-01-22 10:18:27 +0100
commit24b2422bf3f5a2b2b05fe323bf0993256b03b6ff (patch)
tree6e0eeb6c5e9ec17db75595c0f44ae432444797d0 /ext
parent387da78da38dba5ddf573adc1c3cf53f1e73f4cd (diff)
gdkpixbufoverlay: add a positioning coefficient pair
... so as to allow one clearly defined (absolute) positioning mode that can cater for a variety of absolute but also relative positioning with respect to edge or center.
Diffstat (limited to 'ext')
-rw-r--r--ext/gdk_pixbuf/gstgdkpixbufoverlay.c75
-rw-r--r--ext/gdk_pixbuf/gstgdkpixbufoverlay.h3
2 files changed, 73 insertions, 5 deletions
diff --git a/ext/gdk_pixbuf/gstgdkpixbufoverlay.c b/ext/gdk_pixbuf/gstgdkpixbufoverlay.c
index 9e316684a..38b8ecc97 100644
--- a/ext/gdk_pixbuf/gstgdkpixbufoverlay.c
+++ b/ext/gdk_pixbuf/gstgdkpixbufoverlay.c
@@ -86,6 +86,8 @@ enum
PROP_OFFSET_Y,
PROP_RELATIVE_X,
PROP_RELATIVE_Y,
+ PROP_COEF_X,
+ PROP_COEF_Y,
PROP_OVERLAY_WIDTH,
PROP_OVERLAY_HEIGHT,
PROP_ALPHA
@@ -185,13 +187,15 @@ gst_gdk_pixbuf_overlay_class_init (GstGdkPixbufOverlayClass * klass)
g_object_class_install_property (gobject_class, PROP_RELATIVE_X,
g_param_spec_double ("relative-x", "Relative X Offset",
"Horizontal offset of overlay image in fractions of video image "
- "width, from top-left corner of video image", 0.0, 1.0, 0.0,
+ "width, from top-left corner of video image"
+ " (in relative positioning)", -1.0, 1.0, 0.0,
GST_PARAM_CONTROLLABLE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_RELATIVE_Y,
g_param_spec_double ("relative-y", "Relative Y Offset",
"Vertical offset of overlay image in fractions of video image "
- "height, from top-left corner of video image", 0.0, 1.0, 0.0,
+ "height, from top-left corner of video image"
+ " (in relative positioning)", -1.0, 1.0, 0.0,
GST_PARAM_CONTROLLABLE | GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_OVERLAY_WIDTH,
@@ -240,6 +244,45 @@ gst_gdk_pixbuf_overlay_class_init (GstGdkPixbufOverlayClass * klass)
GST_TYPE_GDK_PIXBUF_POSITIONING_MODE, DEFAULT_POSITIONING_MODE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /* FIXME the following actually act as a RELATIVE_X/RELATIVE_Y,
+ * but those were already slightly mutated/abused with ABSOLUTE positioning,
+ * so let's keep that and follow suit
+ * Suffice it to say all that could do with cleanup (2.0 ??) */
+ /**
+ * GstGdkPixbufOverlay:coef-x:
+ *
+ * In absolute positioning mode, the x coordinate of overlay image's
+ * top-left corner is now given by
+ * offset-x + (relative-x * overlay_width) + (coef-x * video_width).
+ * This allows to align the image absolutely and relatively
+ * to any edge or center position.
+ *
+ * Since: 1.12
+ */
+ g_object_class_install_property (gobject_class, PROP_COEF_X,
+ g_param_spec_double ("coef-x", "Relative X Offset",
+ "Horizontal offset of overlay image in fractions of video image "
+ "width, from top-left corner of video image (absolute positioning)",
+ -1.0, 1.0, 0.0, GST_PARAM_CONTROLLABLE | GST_PARAM_MUTABLE_PLAYING
+ | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstGdkPixbufOverlay:coef-y:
+ *
+ * In absolute positioning mode, the y coordinate of overlay image's
+ * top-left corner is now given by
+ * offset-y + (relative-y * overlay_height) + (coef-y * video_height).
+ * This allows to align the image absolutely and relatively
+ * to any edge or center position.
+ *
+ * Since: 1.12
+ */
+ g_object_class_install_property (gobject_class, PROP_COEF_Y,
+ g_param_spec_double ("coef-y", "Relative Y Offset",
+ "Vertical offset of overlay image in fractions of video image "
+ "height, from top-left corner of video image (absolute positioning)",
+ -1.0, 1.0, 0.0, GST_PARAM_CONTROLLABLE | GST_PARAM_MUTABLE_PLAYING
+ | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_add_static_pad_template (element_class, &src_template);
@@ -260,6 +303,9 @@ gst_gdk_pixbuf_overlay_init (GstGdkPixbufOverlay * overlay)
overlay->relative_x = 0.0;
overlay->relative_y = 0.0;
+ overlay->coef_x = 0.0;
+ overlay->coef_y = 0.0;
+
overlay->positioning_mode = DEFAULT_POSITIONING_MODE;
overlay->overlay_width = 0;
@@ -320,6 +366,14 @@ gst_gdk_pixbuf_overlay_set_property (GObject * object, guint property_id,
overlay->relative_y = g_value_get_double (value);
overlay->update_composition = TRUE;
break;
+ case PROP_COEF_X:
+ overlay->coef_x = g_value_get_double (value);
+ overlay->update_composition = TRUE;
+ break;
+ case PROP_COEF_Y:
+ overlay->coef_y = g_value_get_double (value);
+ overlay->update_composition = TRUE;
+ break;
case PROP_OVERLAY_WIDTH:
overlay->overlay_width = g_value_get_int (value);
overlay->update_composition = TRUE;
@@ -371,6 +425,12 @@ gst_gdk_pixbuf_overlay_get_property (GObject * object, guint property_id,
case PROP_RELATIVE_Y:
g_value_set_double (value, overlay->relative_y);
break;
+ case PROP_COEF_X:
+ g_value_set_double (value, overlay->coef_x);
+ break;
+ case PROP_COEF_Y:
+ g_value_set_double (value, overlay->coef_y);
+ break;
case PROP_OVERLAY_WIDTH:
g_value_set_int (value, overlay->overlay_width);
break;
@@ -561,6 +621,7 @@ gst_gdk_pixbuf_overlay_update_composition (GstGdkPixbufOverlay * overlay)
overlay_meta = gst_buffer_get_video_meta (overlay->pixels);
positioning_mode = overlay->positioning_mode;
+ GST_DEBUG_OBJECT (overlay, "overlay positioning mode %d", positioning_mode);
width = overlay->overlay_width;
if (width == 0)
@@ -571,8 +632,10 @@ gst_gdk_pixbuf_overlay_update_composition (GstGdkPixbufOverlay * overlay)
height = overlay_meta->height;
if (positioning_mode == GST_GDK_PIXBUF_POSITIONING_PIXELS_ABSOLUTE) {
- x = overlay->offset_x + (overlay->relative_x * width);
- y = overlay->offset_y + (overlay->relative_y * height);
+ x = overlay->offset_x + (overlay->relative_x * width) +
+ (overlay->coef_x * video_width);
+ y = overlay->offset_y + (overlay->relative_y * height) +
+ (overlay->coef_y * video_height);
} else {
x = overlay->offset_x < 0 ?
video_width + overlay->offset_x - width +
@@ -586,9 +649,11 @@ gst_gdk_pixbuf_overlay_update_composition (GstGdkPixbufOverlay * overlay)
GST_DEBUG_OBJECT (overlay, "overlay image dimensions: %d x %d, alpha=%.2f",
overlay_meta->width, overlay_meta->height, overlay->alpha);
- GST_DEBUG_OBJECT (overlay, "properties: x,y: %d,%d (%g%%,%g%%) - WxH: %dx%d",
+ GST_DEBUG_OBJECT (overlay, "properties: x,y: %d,%d "
+ "(%g%%,%g%%) coef (%g%%,%g%%) - WxH: %dx%d",
overlay->offset_x, overlay->offset_y,
overlay->relative_x * 100.0, overlay->relative_y * 100.0,
+ overlay->coef_x * 100.0, overlay->coef_y * 100.0,
overlay->overlay_height, overlay->overlay_width);
GST_DEBUG_OBJECT (overlay, "overlay rendered: %d x %d @ %d,%d (onto %d x %d)",
width, height, x, y, video_width, video_height);
diff --git a/ext/gdk_pixbuf/gstgdkpixbufoverlay.h b/ext/gdk_pixbuf/gstgdkpixbufoverlay.h
index 36b919b28..8d80b015a 100644
--- a/ext/gdk_pixbuf/gstgdkpixbufoverlay.h
+++ b/ext/gdk_pixbuf/gstgdkpixbufoverlay.h
@@ -63,6 +63,9 @@ struct _GstGdkPixbufOverlay
gdouble relative_x;
gdouble relative_y;
+ gdouble coef_x;
+ gdouble coef_y;
+
GstGdkPixbufPositioningMode positioning_mode;
gint overlay_width;