184 lines
6.3 KiB
Diff
Executable File
184 lines
6.3 KiB
Diff
Executable File
diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
|
|
index 6dbe9ff..8069603 100644
|
|
--- a/ext/wayland/gstwaylandsink.c
|
|
+++ b/ext/wayland/gstwaylandsink.c
|
|
@@ -65,7 +65,22 @@ enum
|
|
PROP_WAYLAND_POSITION_X, /* add property (position_x) */
|
|
PROP_WAYLAND_POSITION_Y, /* add property (position_y) */
|
|
PROP_WAYLAND_OUT_WIDTH, /* add property (out_width) */
|
|
- PROP_WAYLAND_OUT_HEIGHT /* add property (out_height) */
|
|
+ PROP_WAYLAND_OUT_HEIGHT, /* add property (out_height) */
|
|
+ PROP_WAYLAND_OUT_VFLIP, /* add property (out_vflip) */
|
|
+ PROP_WAYLAND_OUT_HFLIP, /* add property (out_hflip) */
|
|
+ PROP_WAYLAND_OUT_TRANSFORM /* add property (out_transform) */
|
|
+};
|
|
+
|
|
+enum
|
|
+{
|
|
+ WAYLAND_OUT_TRANSFORM_NORMAL,
|
|
+ WAYLAND_OUT_TRANSFORM_90,
|
|
+ WAYLAND_OUT_TRANSFORM_180,
|
|
+ WAYLAND_OUT_TRANSFORM_270,
|
|
+ WAYLAND_OUT_TRANSFORM_FLIPPED,
|
|
+ WAYLAND_OUT_TRANSFORM_FLIPPED_90,
|
|
+ WAYLAND_OUT_TRANSFORM_FLIPPED_180,
|
|
+ WAYLAND_OUT_TRANSFORM_FLIPPED_270
|
|
};
|
|
|
|
GST_DEBUG_CATEGORY (gstwayland_debug);
|
|
@@ -267,6 +282,36 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
|
|
1080,
|
|
0,
|
|
G_PARAM_READWRITE));
|
|
+ /* install property (out_transform) */
|
|
+ g_object_class_install_property (G_OBJECT_CLASS(klass), PROP_WAYLAND_OUT_TRANSFORM,
|
|
+ g_param_spec_int ("transform",
|
|
+ "transform",
|
|
+ "Wayland Out_transform value from the application",
|
|
+ 0,
|
|
+ 7,
|
|
+ 0,
|
|
+ G_PARAM_READWRITE));
|
|
+ /* install property (out_vflip) */
|
|
+ g_object_class_install_property (G_OBJECT_CLASS(klass), PROP_WAYLAND_OUT_VFLIP,
|
|
+ g_param_spec_int ("vflip",
|
|
+ "transform",
|
|
+ "Wayland Out_vertial_flip value from the application",
|
|
+ 0,
|
|
+ 1,
|
|
+ 0,
|
|
+ G_PARAM_READWRITE));
|
|
+ /* install property (out_hflip) */
|
|
+ g_object_class_install_property (G_OBJECT_CLASS(klass), PROP_WAYLAND_OUT_HFLIP,
|
|
+ g_param_spec_int ("hflip",
|
|
+ "transform",
|
|
+ "Wayland Out_horizontal_flip value from the application",
|
|
+ 0,
|
|
+ 1,
|
|
+ 0,
|
|
+ G_PARAM_READWRITE));
|
|
+
|
|
+
|
|
+
|
|
}
|
|
|
|
static void
|
|
@@ -279,6 +324,9 @@ gst_wayland_sink_init (GstWaylandSink * sink)
|
|
sink->scale = 0;
|
|
sink->out_width = 0;
|
|
sink->out_height = 0;
|
|
+ sink->out_transform = -1;
|
|
+ sink->out_vflip = 0;
|
|
+ sink->out_hflip = 0;
|
|
}
|
|
|
|
static void
|
|
@@ -305,10 +353,22 @@ gst_wayland_sink_get_property (GObject * object,
|
|
/* set out_width property */
|
|
g_value_set_int (value, sink->out_width);
|
|
break;
|
|
- case PROP_WAYLAND_OUT_HEIGHT:
|
|
+ case PROP_WAYLAND_OUT_HEIGHT:
|
|
/* set out_height property */
|
|
g_value_set_int (value, sink->out_height);
|
|
break;
|
|
+ case PROP_WAYLAND_OUT_TRANSFORM:
|
|
+ /* set out_transform property */
|
|
+ g_value_set_int (value, sink->out_transform);
|
|
+ break;
|
|
+ case PROP_WAYLAND_OUT_VFLIP:
|
|
+ /* set out_vflip property */
|
|
+ g_value_set_int (value, sink->out_vflip);
|
|
+ break;
|
|
+ case PROP_WAYLAND_OUT_HFLIP:
|
|
+ /* set out_hflip property */
|
|
+ g_value_set_int (value, sink->out_hflip);
|
|
+ break;
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
break;
|
|
@@ -339,10 +399,22 @@ gst_wayland_sink_set_property (GObject * object,
|
|
/* get out_width property */
|
|
sink->out_width = g_value_get_int (value);
|
|
break;
|
|
- case PROP_WAYLAND_OUT_HEIGHT:
|
|
+ case PROP_WAYLAND_OUT_HEIGHT:
|
|
/* get out_height property */
|
|
sink->out_height = g_value_get_int (value);
|
|
break;
|
|
+ case PROP_WAYLAND_OUT_TRANSFORM:
|
|
+ /* get out_tranform property */
|
|
+ sink->out_transform = g_value_get_int (value);
|
|
+ break;
|
|
+ case PROP_WAYLAND_OUT_VFLIP:
|
|
+ /* get out_vflip property */
|
|
+ sink->out_vflip = g_value_get_int (value);
|
|
+ break;
|
|
+ case PROP_WAYLAND_OUT_HFLIP:
|
|
+ /* get out_hflip property */
|
|
+ sink->out_hflip = g_value_get_int (value);
|
|
+ break;
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
break;
|
|
@@ -431,6 +503,15 @@ gst_wayland_sink_find_display (GstWaylandSink * sink)
|
|
sink->display->position_y = sink->position_y;
|
|
sink->display->out_width = sink->out_width;
|
|
sink->display->out_height = sink->out_height;
|
|
+ /* set flip and hflip */
|
|
+ if (sink->out_vflip)
|
|
+ sink->display->out_transform = WAYLAND_OUT_TRANSFORM_FLIPPED_180;
|
|
+ if (sink->out_hflip)
|
|
+ sink->display->out_transform = WAYLAND_OUT_TRANSFORM_FLIPPED;
|
|
+ if (sink->out_vflip && sink->out_hflip)
|
|
+ sink->display->out_transform = WAYLAND_OUT_TRANSFORM_180;
|
|
+
|
|
+
|
|
GST_OBJECT_UNLOCK (sink);
|
|
|
|
if (error) {
|
|
diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h
|
|
index c3ec0df..599eaf6 100644
|
|
--- a/ext/wayland/gstwaylandsink.h
|
|
+++ b/ext/wayland/gstwaylandsink.h
|
|
@@ -70,7 +70,10 @@ struct _GstWaylandSink
|
|
gint position_y; /* property(position_y) */
|
|
gint out_width; /* property out_width */
|
|
gint out_height; /* property out_height */
|
|
+ gint out_vflip;
|
|
+ gint out_hflip;
|
|
uint32_t scale;
|
|
+ gint out_transform; /* property out_transform */
|
|
};
|
|
|
|
struct _GstWaylandSinkClass
|
|
diff --git a/ext/wayland/wldisplay.h b/ext/wayland/wldisplay.h
|
|
index 1568d31..7c43916 100644
|
|
--- a/ext/wayland/wldisplay.h
|
|
+++ b/ext/wayland/wldisplay.h
|
|
@@ -70,6 +70,7 @@ struct _GstWlDisplay
|
|
gint position_y; /* property(position_y) */
|
|
gint out_width; /* property out_width */
|
|
gint out_height; /* property out_height */
|
|
+ gint out_transform; /* property out_transform */
|
|
|
|
GstVideoCropMeta crop; /* crop info */
|
|
|
|
diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c
|
|
index c64f3ce..6b4705e 100644
|
|
--- a/ext/wayland/wlwindow.c
|
|
+++ b/ext/wayland/wlwindow.c
|
|
@@ -147,6 +147,12 @@ gst_wl_window_new_internal (GstWlDisplay * display, GMutex * render_lock)
|
|
}
|
|
}
|
|
|
|
+ /* use out_transform to set flip and rotation */
|
|
+ if (display->out_transform > 0) {
|
|
+ wl_surface_set_buffer_transform(window->area_surface, display->out_transform);
|
|
+ wl_surface_set_buffer_transform(window->video_surface, display->out_transform);
|
|
+ }
|
|
+
|
|
/* do not accept input */
|
|
region = wl_compositor_create_region (display->compositor);
|
|
wl_surface_set_input_region (window->area_surface, region);
|