summaryrefslogtreecommitdiff
path: root/ext/gl/gstglvideoflip.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/gl/gstglvideoflip.c')
-rw-r--r--ext/gl/gstglvideoflip.c98
1 files changed, 60 insertions, 38 deletions
diff --git a/ext/gl/gstglvideoflip.c b/ext/gl/gstglvideoflip.c
index 690396d1b..5d2dac5ee 100644
--- a/ext/gl/gstglvideoflip.c
+++ b/ext/gl/gstglvideoflip.c
@@ -46,6 +46,7 @@ enum
{
PROP_0,
PROP_METHOD,
+ PROP_VIDEO_DIRECTION
};
static GstStaticPadTemplate _sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
@@ -98,11 +99,6 @@ gst_video_flip_method_get_type (void)
return video_flip_method_type;
}
-#define gst_gl_video_flip_parent_class parent_class
-G_DEFINE_TYPE_WITH_CODE (GstGLVideoFlip, gst_gl_video_flip,
- GST_TYPE_BIN, GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT,
- "glvideoflip", 0, "glvideoflip element"););
-
static void gst_gl_video_flip_finalize (GObject * object);
static void gst_gl_video_flip_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
@@ -115,6 +111,24 @@ static GstPadProbeReturn _trans_src_probe (GstPad * pad, GstPadProbeInfo * info,
gpointer user_data);
static void
+gst_gl_video_flip_video_direction_interface_init (GstVideoDirectionInterface
+ * iface);
+
+#define gst_gl_video_flip_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstGLVideoFlip, gst_gl_video_flip,
+ GST_TYPE_BIN, GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT,
+ "glvideoflip", 0, "glvideoflip element");
+ G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_DIRECTION,
+ gst_gl_video_flip_video_direction_interface_init););
+
+static void
+gst_gl_video_flip_video_direction_interface_init (GstVideoDirectionInterface
+ * iface)
+{
+ /* We implement the video-direction property */
+}
+
+static void
gst_gl_video_flip_class_init (GstGLVideoFlipClass * klass)
{
GObjectClass *gobject_class;
@@ -128,10 +142,13 @@ gst_gl_video_flip_class_init (GstGLVideoFlipClass * klass)
gobject_class->get_property = gst_gl_video_flip_get_property;
g_object_class_install_property (gobject_class, PROP_METHOD,
- g_param_spec_enum ("method", "method", "method",
+ g_param_spec_enum ("method", "method",
+ "method (deprecated, use video-direction instead)",
GST_TYPE_GL_VIDEO_FLIP_METHOD, DEFAULT_METHOD,
GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
+ g_object_class_override_property (gobject_class, PROP_VIDEO_DIRECTION,
+ "video-direction");
gst_element_class_add_static_pad_template (element_class, &_src_template);
gst_element_class_add_static_pad_template (element_class, &_sink_template);
@@ -233,10 +250,10 @@ _transform_caps (GstGLVideoFlip * vf, GstPadDirection direction, GstCaps * caps)
gst_structure_get_int (structure, "height", &height)) {
switch (vf->active_method) {
- case GST_GL_VIDEO_FLIP_METHOD_90R:
- case GST_GL_VIDEO_FLIP_METHOD_90L:
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_UL_LR:
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_UR_LL:
+ case GST_VIDEO_ORIENTATION_90R:
+ case GST_VIDEO_ORIENTATION_90L:
+ case GST_VIDEO_ORIENTATION_UL_LR:
+ case GST_VIDEO_ORIENTATION_UR_LL:
gst_structure_set (structure, "width", G_TYPE_INT, height,
"height", G_TYPE_INT, width, NULL);
if (gst_structure_get_fraction (structure, "pixel-aspect-ratio",
@@ -251,10 +268,10 @@ _transform_caps (GstGLVideoFlip * vf, GstPadDirection direction, GstCaps * caps)
}
}
break;
- case GST_GL_VIDEO_FLIP_METHOD_IDENTITY:
- case GST_GL_VIDEO_FLIP_METHOD_180:
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_HORIZ:
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_VERT:
+ case GST_VIDEO_ORIENTATION_IDENTITY:
+ case GST_VIDEO_ORIENTATION_180:
+ case GST_VIDEO_ORIENTATION_HORIZ:
+ case GST_VIDEO_ORIENTATION_VERT:
break;
default:
g_assert_not_reached ();
@@ -268,7 +285,7 @@ _transform_caps (GstGLVideoFlip * vf, GstPadDirection direction, GstCaps * caps)
/* with object lock */
static void
-_set_active_method (GstGLVideoFlip * vf, GstGLVideoFlipMethod method,
+_set_active_method (GstGLVideoFlip * vf, GstVideoOrientationMethod method,
GstCaps * caps)
{
gfloat rot_z = 0., scale_x = 1.0, scale_y = 1.0;
@@ -276,34 +293,34 @@ _set_active_method (GstGLVideoFlip * vf, GstGLVideoFlipMethod method,
GstPad *srcpad;
switch (method) {
- case GST_GL_VIDEO_FLIP_METHOD_IDENTITY:
+ case GST_VIDEO_ORIENTATION_IDENTITY:
break;
- case GST_GL_VIDEO_FLIP_METHOD_90R:
+ case GST_VIDEO_ORIENTATION_90R:
scale_x *= vf->aspect;
scale_y *= 1. / vf->aspect;
rot_z = 90.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_180:
+ case GST_VIDEO_ORIENTATION_180:
rot_z = 180.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_90L:
+ case GST_VIDEO_ORIENTATION_90L:
scale_x *= vf->aspect;
scale_y *= 1. / vf->aspect;
rot_z = 270.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_HORIZ:
+ case GST_VIDEO_ORIENTATION_HORIZ:
scale_x *= -1.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_UR_LL:
+ case GST_VIDEO_ORIENTATION_UR_LL:
scale_x *= -vf->aspect;
scale_y *= 1. / vf->aspect;
rot_z = 90.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_VERT:
+ case GST_VIDEO_ORIENTATION_VERT:
scale_x *= -1.;
rot_z = 180.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_UL_LR:
+ case GST_VIDEO_ORIENTATION_UL_LR:
scale_x *= -vf->aspect;
scale_y *= 1. / vf->aspect;
rot_z = 270.;
@@ -331,10 +348,17 @@ _set_active_method (GstGLVideoFlip * vf, GstGLVideoFlipMethod method,
}
static void
-gst_gl_video_flip_set_method (GstGLVideoFlip * vf, GstGLVideoFlipMethod method,
- gboolean from_tag)
+gst_gl_video_flip_set_method (GstGLVideoFlip * vf,
+ GstVideoOrientationMethod method, gboolean from_tag)
{
GST_OBJECT_LOCK (vf);
+
+ if (method == GST_VIDEO_ORIENTATION_CUSTOM) {
+ GST_WARNING_OBJECT (vf, "unsupported custom orientation");
+ GST_OBJECT_UNLOCK (vf);
+ return;
+ }
+
/* Store updated method */
if (from_tag)
vf->tag_method = method;
@@ -342,7 +366,7 @@ gst_gl_video_flip_set_method (GstGLVideoFlip * vf, GstGLVideoFlipMethod method,
vf->method = method;
/* Get the new method */
- if (vf->method == GST_GL_VIDEO_FLIP_METHOD_AUTO)
+ if (vf->method == GST_VIDEO_ORIENTATION_AUTO)
method = vf->tag_method;
else
method = vf->method;
@@ -367,6 +391,7 @@ gst_gl_video_flip_set_property (GObject * object, guint prop_id,
switch (prop_id) {
case PROP_METHOD:
+ case PROP_VIDEO_DIRECTION:
gst_gl_video_flip_set_method (vf, g_value_get_enum (value), FALSE);
break;
default:
@@ -383,6 +408,7 @@ gst_gl_video_flip_get_property (GObject * object, guint prop_id,
switch (prop_id) {
case PROP_METHOD:
+ case PROP_VIDEO_DIRECTION:
g_value_set_enum (value, vf->method);
break;
default:
@@ -409,29 +435,25 @@ _input_sink_probe (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
if (gst_tag_list_get_string (taglist, "image-orientation",
&orientation)) {
if (!g_strcmp0 ("rotate-0", orientation))
- gst_gl_video_flip_set_method (vf, GST_GL_VIDEO_FLIP_METHOD_IDENTITY,
+ gst_gl_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_IDENTITY,
TRUE);
else if (!g_strcmp0 ("rotate-90", orientation))
- gst_gl_video_flip_set_method (vf, GST_GL_VIDEO_FLIP_METHOD_90R,
- TRUE);
+ gst_gl_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_90R, TRUE);
else if (!g_strcmp0 ("rotate-180", orientation))
- gst_gl_video_flip_set_method (vf, GST_GL_VIDEO_FLIP_METHOD_180,
- TRUE);
+ gst_gl_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_180, TRUE);
else if (!g_strcmp0 ("rotate-270", orientation))
- gst_gl_video_flip_set_method (vf, GST_GL_VIDEO_FLIP_METHOD_90L,
- TRUE);
+ gst_gl_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_90L, TRUE);
else if (!g_strcmp0 ("flip-rotate-0", orientation))
gst_gl_video_flip_set_method (vf,
- GST_GL_VIDEO_FLIP_METHOD_FLIP_HORIZ, TRUE);
+ GST_VIDEO_ORIENTATION_HORIZ, TRUE);
else if (!g_strcmp0 ("flip-rotate-90", orientation))
gst_gl_video_flip_set_method (vf,
- GST_GL_VIDEO_FLIP_METHOD_FLIP_UR_LL, TRUE);
+ GST_VIDEO_ORIENTATION_UR_LL, TRUE);
else if (!g_strcmp0 ("flip-rotate-180", orientation))
- gst_gl_video_flip_set_method (vf,
- GST_GL_VIDEO_FLIP_METHOD_FLIP_VERT, TRUE);
+ gst_gl_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_VERT, TRUE);
else if (!g_strcmp0 ("flip-rotate-270", orientation))
gst_gl_video_flip_set_method (vf,
- GST_GL_VIDEO_FLIP_METHOD_FLIP_UL_LR, TRUE);
+ GST_VIDEO_ORIENTATION_UL_LR, TRUE);
g_free (orientation);
}