enum
{
PROP_0,
- PROP_METHOD
+ PROP_METHOD,
+ PROP_VIDEO_DIRECTION
/* FILL ME */
};
return video_flip_method_type;
}
+static void
+gst_video_flip_video_direction_interface_init (GstVideoDirectionInterface *
+ iface)
+{
+ /* We implement the video-direction property */
+}
+
#define gst_video_flip_parent_class parent_class
-G_DEFINE_TYPE (GstVideoFlip, gst_video_flip, GST_TYPE_VIDEO_FILTER);
+G_DEFINE_TYPE_WITH_CODE (GstVideoFlip, gst_video_flip, GST_TYPE_VIDEO_FILTER,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_DIRECTION,
+ gst_video_flip_video_direction_interface_init))
static GstCaps *
gst_video_flip_transform_caps (GstBaseTransform * trans,
gst_structure_get_int (structure, "height", &height)) {
switch (videoflip->active_method) {
- case GST_VIDEO_FLIP_METHOD_90R:
- case GST_VIDEO_FLIP_METHOD_90L:
- case GST_VIDEO_FLIP_METHOD_TRANS:
- case GST_VIDEO_FLIP_METHOD_OTHER:
+ 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",
}
}
break;
- case GST_VIDEO_FLIP_METHOD_IDENTITY:
- case GST_VIDEO_FLIP_METHOD_180:
- case GST_VIDEO_FLIP_METHOD_HORIZ:
- case GST_VIDEO_FLIP_METHOD_VERT:
+ case GST_VIDEO_ORIENTATION_IDENTITY:
+ case GST_VIDEO_ORIENTATION_180:
+ case GST_VIDEO_ORIENTATION_HORIZ:
+ case GST_VIDEO_ORIENTATION_VERT:
gst_structure_set (structure, "width", G_TYPE_INT, width,
"height", G_TYPE_INT, height, NULL);
break;
+ case GST_VIDEO_ORIENTATION_CUSTOM:
+ GST_WARNING_OBJECT (videoflip, "unsuported custom orientation");
+ break;
default:
g_assert_not_reached ();
break;
dest_v_height = GST_VIDEO_FRAME_COMP_HEIGHT (dest, 2);
switch (videoflip->active_method) {
- case GST_VIDEO_FLIP_METHOD_90R:
+ case GST_VIDEO_ORIENTATION_90R:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_90L:
+ case GST_VIDEO_ORIENTATION_90L:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_180:
+ case GST_VIDEO_ORIENTATION_180:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_HORIZ:
+ case GST_VIDEO_ORIENTATION_HORIZ:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_VERT:
+ case GST_VIDEO_ORIENTATION_VERT:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_TRANS:
+ case GST_VIDEO_ORIENTATION_UL_LR:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_OTHER:
+ case GST_VIDEO_ORIENTATION_UR_LL:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_IDENTITY:
+ case GST_VIDEO_ORIENTATION_IDENTITY:
g_assert_not_reached ();
break;
default:
dest_uv_height = GST_VIDEO_FRAME_COMP_HEIGHT (dest, 1);
switch (videoflip->active_method) {
- case GST_VIDEO_FLIP_METHOD_90R:
+ case GST_VIDEO_ORIENTATION_90R:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_90L:
+ case GST_VIDEO_ORIENTATION_90L:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_180:
+ case GST_VIDEO_ORIENTATION_180:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_HORIZ:
+ case GST_VIDEO_ORIENTATION_HORIZ:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_VERT:
+ case GST_VIDEO_ORIENTATION_VERT:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_TRANS:
+ case GST_VIDEO_ORIENTATION_UL_LR:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_OTHER:
+ case GST_VIDEO_ORIENTATION_UR_LL:
/* Flip Y */
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
}
}
break;
- case GST_VIDEO_FLIP_METHOD_IDENTITY:
+ case GST_VIDEO_ORIENTATION_IDENTITY:
g_assert_not_reached ();
break;
default:
bpp = GST_VIDEO_FRAME_COMP_PSTRIDE (src, 0);
switch (videoflip->active_method) {
- case GST_VIDEO_FLIP_METHOD_90R:
+ case GST_VIDEO_ORIENTATION_90R:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x++) {
for (z = 0; z < bpp; z++) {
}
}
break;
- case GST_VIDEO_FLIP_METHOD_90L:
+ case GST_VIDEO_ORIENTATION_90L:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x++) {
for (z = 0; z < bpp; z++) {
}
}
break;
- case GST_VIDEO_FLIP_METHOD_180:
+ case GST_VIDEO_ORIENTATION_180:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x++) {
for (z = 0; z < bpp; z++) {
}
}
break;
- case GST_VIDEO_FLIP_METHOD_HORIZ:
+ case GST_VIDEO_ORIENTATION_HORIZ:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x++) {
for (z = 0; z < bpp; z++) {
}
}
break;
- case GST_VIDEO_FLIP_METHOD_VERT:
+ case GST_VIDEO_ORIENTATION_VERT:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x++) {
for (z = 0; z < bpp; z++) {
}
}
break;
- case GST_VIDEO_FLIP_METHOD_TRANS:
+ case GST_VIDEO_ORIENTATION_UL_LR:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x++) {
for (z = 0; z < bpp; z++) {
}
}
break;
- case GST_VIDEO_FLIP_METHOD_OTHER:
+ case GST_VIDEO_ORIENTATION_UR_LL:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x++) {
for (z = 0; z < bpp; z++) {
}
}
break;
- case GST_VIDEO_FLIP_METHOD_IDENTITY:
+ case GST_VIDEO_ORIENTATION_IDENTITY:
g_assert_not_reached ();
break;
default:
bpp = y_stride;
switch (videoflip->active_method) {
- case GST_VIDEO_FLIP_METHOD_90R:
+ case GST_VIDEO_ORIENTATION_90R:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x += 2) {
guint8 u;
}
}
break;
- case GST_VIDEO_FLIP_METHOD_90L:
+ case GST_VIDEO_ORIENTATION_90L:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x += 2) {
guint8 u;
}
}
break;
- case GST_VIDEO_FLIP_METHOD_180:
+ case GST_VIDEO_ORIENTATION_180:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x += 2) {
guint8 u;
}
}
break;
- case GST_VIDEO_FLIP_METHOD_HORIZ:
+ case GST_VIDEO_ORIENTATION_HORIZ:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x += 2) {
guint8 u;
}
}
break;
- case GST_VIDEO_FLIP_METHOD_VERT:
+ case GST_VIDEO_ORIENTATION_VERT:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x += 2) {
guint8 u;
}
}
break;
- case GST_VIDEO_FLIP_METHOD_TRANS:
+ case GST_VIDEO_ORIENTATION_UL_LR:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x += 2) {
guint8 u;
}
}
break;
- case GST_VIDEO_FLIP_METHOD_OTHER:
+ case GST_VIDEO_ORIENTATION_UR_LL:
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x += 2) {
guint8 u;
}
}
break;
- case GST_VIDEO_FLIP_METHOD_IDENTITY:
+ case GST_VIDEO_ORIENTATION_IDENTITY:
g_assert_not_reached ();
break;
default:
/* Check that they are correct */
switch (vf->active_method) {
- case GST_VIDEO_FLIP_METHOD_90R:
- case GST_VIDEO_FLIP_METHOD_90L:
- case GST_VIDEO_FLIP_METHOD_TRANS:
- case GST_VIDEO_FLIP_METHOD_OTHER:
+ case GST_VIDEO_ORIENTATION_90R:
+ case GST_VIDEO_ORIENTATION_90L:
+ case GST_VIDEO_ORIENTATION_UL_LR:
+ case GST_VIDEO_ORIENTATION_UR_LL:
if ((in_info->width != out_info->height) ||
(in_info->height != out_info->width)) {
GST_ERROR_OBJECT (vf, "we are inverting width and height but caps "
goto beach;
}
break;
- case GST_VIDEO_FLIP_METHOD_IDENTITY:
+ case GST_VIDEO_ORIENTATION_IDENTITY:
break;
- case GST_VIDEO_FLIP_METHOD_180:
- case GST_VIDEO_FLIP_METHOD_HORIZ:
- case GST_VIDEO_FLIP_METHOD_VERT:
+ case GST_VIDEO_ORIENTATION_180:
+ case GST_VIDEO_ORIENTATION_HORIZ:
+ case GST_VIDEO_ORIENTATION_VERT:
if ((in_info->width != out_info->width) ||
(in_info->height != out_info->height)) {
GST_ERROR_OBJECT (vf, "we are keeping width and height but caps "
}
static void
-gst_video_flip_set_method (GstVideoFlip * videoflip, GstVideoFlipMethod method,
- gboolean from_tag)
+gst_video_flip_set_method (GstVideoFlip * videoflip,
+ GstVideoOrientationMethod method, gboolean from_tag)
{
GST_OBJECT_LOCK (videoflip);
+ if (method == GST_VIDEO_ORIENTATION_CUSTOM) {
+ GST_WARNING_OBJECT (videoflip, "unsupported custom orientation");
+ GST_OBJECT_UNLOCK (videoflip);
+ return;
+ }
+
/* Store updated method */
if (from_tag)
videoflip->tag_method = method;
videoflip->method = method;
/* Get the new method */
- if (videoflip->method == GST_VIDEO_FLIP_METHOD_AUTO)
+ if (videoflip->method == GST_VIDEO_ORIENTATION_AUTO)
method = videoflip->tag_method;
else
method = videoflip->method;
if (method != videoflip->active_method) {
+ GEnumValue *active_method_enum, *method_enum;
GstBaseTransform *btrans = GST_BASE_TRANSFORM (videoflip);
+ GEnumClass *enum_class =
+ g_type_class_ref (GST_TYPE_VIDEO_ORIENTATION_METHOD);
+ active_method_enum =
+ g_enum_get_value (enum_class, videoflip->active_method);
+ method_enum = g_enum_get_value (enum_class, method);
GST_DEBUG_OBJECT (videoflip, "Changing method from %s to %s",
- video_flip_methods[videoflip->active_method].value_nick,
- video_flip_methods[method].value_nick);
+ active_method_enum ? active_method_enum->value_nick : "(nil)",
+ method_enum ? method_enum->value_nick : "(nil)");
+ g_type_class_unref (enum_class);
videoflip->active_method = method;
GST_OBJECT_UNLOCK (videoflip);
gst_base_transform_set_passthrough (btrans,
- method == GST_VIDEO_FLIP_METHOD_IDENTITY);
+ method == GST_VIDEO_ORIENTATION_IDENTITY);
gst_base_transform_reconfigure_src (btrans);
} else {
GST_OBJECT_UNLOCK (videoflip);
gst_video_flip_transform_frame (GstVideoFilter * vfilter,
GstVideoFrame * in_frame, GstVideoFrame * out_frame)
{
+ GEnumClass *enum_class;
+ GEnumValue *active_method_enum;
GstVideoFlip *videoflip = GST_VIDEO_FLIP (vfilter);
if (G_UNLIKELY (videoflip->process == NULL))
goto not_negotiated;
+ enum_class = g_type_class_ref (GST_TYPE_VIDEO_ORIENTATION_METHOD);
+ active_method_enum = g_enum_get_value (enum_class, videoflip->active_method);
GST_LOG_OBJECT (videoflip, "videoflip: flipping (%s)",
- video_flip_methods[videoflip->active_method].value_nick);
+ active_method_enum ? active_method_enum->value_nick : "(nil)");
+ g_type_class_unref (enum_class);
GST_OBJECT_LOCK (videoflip);
videoflip->process (videoflip, out_frame, in_frame);
gst_structure_get_double (structure, "pointer_y", &y)) {
GST_DEBUG_OBJECT (vf, "converting %fx%f", x, y);
switch (vf->active_method) {
- case GST_VIDEO_FLIP_METHOD_90R:
+ case GST_VIDEO_ORIENTATION_90R:
new_x = y;
new_y = out_info->width - x;
break;
- case GST_VIDEO_FLIP_METHOD_90L:
+ case GST_VIDEO_ORIENTATION_90L:
new_x = out_info->height - y;
new_y = x;
break;
- case GST_VIDEO_FLIP_METHOD_OTHER:
+ case GST_VIDEO_ORIENTATION_UR_LL:
new_x = out_info->height - y;
new_y = out_info->width - x;
break;
- case GST_VIDEO_FLIP_METHOD_TRANS:
+ case GST_VIDEO_ORIENTATION_UL_LR:
new_x = y;
new_y = x;
break;
- case GST_VIDEO_FLIP_METHOD_180:
+ case GST_VIDEO_ORIENTATION_180:
new_x = out_info->width - x;
new_y = out_info->height - y;
break;
- case GST_VIDEO_FLIP_METHOD_HORIZ:
+ case GST_VIDEO_ORIENTATION_HORIZ:
new_x = out_info->width - x;
new_y = y;
break;
- case GST_VIDEO_FLIP_METHOD_VERT:
+ case GST_VIDEO_ORIENTATION_VERT:
new_x = x;
new_y = out_info->height - y;
break;
if (gst_tag_list_get_string (taglist, "image-orientation", &orientation)) {
if (!g_strcmp0 ("rotate-0", orientation))
- gst_video_flip_set_method (vf, GST_VIDEO_FLIP_METHOD_IDENTITY, TRUE);
+ gst_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_IDENTITY, TRUE);
else if (!g_strcmp0 ("rotate-90", orientation))
- gst_video_flip_set_method (vf, GST_VIDEO_FLIP_METHOD_90R, TRUE);
+ gst_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_90R, TRUE);
else if (!g_strcmp0 ("rotate-180", orientation))
- gst_video_flip_set_method (vf, GST_VIDEO_FLIP_METHOD_180, TRUE);
+ gst_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_180, TRUE);
else if (!g_strcmp0 ("rotate-270", orientation))
- gst_video_flip_set_method (vf, GST_VIDEO_FLIP_METHOD_90L, TRUE);
+ gst_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_90L, TRUE);
else if (!g_strcmp0 ("flip-rotate-0", orientation))
- gst_video_flip_set_method (vf, GST_VIDEO_FLIP_METHOD_HORIZ, TRUE);
+ gst_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_HORIZ, TRUE);
else if (!g_strcmp0 ("flip-rotate-90", orientation))
- gst_video_flip_set_method (vf, GST_VIDEO_FLIP_METHOD_TRANS, TRUE);
+ gst_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_UL_LR, TRUE);
else if (!g_strcmp0 ("flip-rotate-180", orientation))
- gst_video_flip_set_method (vf, GST_VIDEO_FLIP_METHOD_VERT, TRUE);
+ gst_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_VERT, TRUE);
else if (!g_strcmp0 ("flip-rotate-270", orientation))
- gst_video_flip_set_method (vf, GST_VIDEO_FLIP_METHOD_OTHER, TRUE);
+ gst_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_UR_LL, TRUE);
g_free (orientation);
}
switch (prop_id) {
case PROP_METHOD:
+ case PROP_VIDEO_DIRECTION:
gst_video_flip_set_method (videoflip, g_value_get_enum (value), FALSE);
break;
default:
switch (prop_id) {
case PROP_METHOD:
+ case PROP_VIDEO_DIRECTION:
g_value_set_enum (value, videoflip->method);
break;
default:
gobject_class->get_property = gst_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_VIDEO_FLIP_METHOD, PROP_METHOD_DEFAULT,
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_set_static_metadata (gstelement_class, "Video flipper",
"Filter/Effect/Video",
{
/* AUTO is not valid for active method, this is just to ensure we setup the
* method in gst_video_flip_set_method() */
- videoflip->active_method = GST_VIDEO_FLIP_METHOD_AUTO;
+ videoflip->active_method = GST_VIDEO_ORIENTATION_AUTO;
}