~ubuntu-branches/ubuntu/quantal/gst-plugins-bad-multiverse0.10/quantal

« back to all changes in this revision

Viewing changes to gst/geometrictransform/gstmirror.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastian Dröge
  • Date: 2010-09-03 16:57:09 UTC
  • mfrom: (1.1.17 upstream)
  • Revision ID: james.westby@ubuntu.com-20100903165709-5158pp06sfg0i6dv
Tags: 0.10.20-1
* New upstream release:
  + debian/build-deps.in:
    - Update build dependencies.
* debian/source/format,
  debian/compat,
  debian/rules,
  debian/patches:
  + Update to debhelper compat level 7.
  + Update to source format 3.0 (quilt).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * GStreamer
 
3
 * Copyright (C) 2010 Filippo Argiolas <filippo.argiolas@gmail.com>
 
4
 *
 
5
 * Permission is hereby granted, free of charge, to any person obtaining a
 
6
 * copy of this software and associated documentation files (the "Software"),
 
7
 * to deal in the Software without restriction, including without limitation
 
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 
9
 * and/or sell copies of the Software, and to permit persons to whom the
 
10
 * Software is furnished to do so, subject to the following conditions:
 
11
 *
 
12
 * The above copyright notice and this permission notice shall be included in
 
13
 * all copies or substantial portions of the Software.
 
14
 *
 
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
18
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 
21
 * DEALINGS IN THE SOFTWARE.
 
22
 *
 
23
 * Alternatively, the contents of this file may be used under the
 
24
 * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
 
25
 * which case the following provisions apply instead of the ones
 
26
 * mentioned above:
 
27
 *
 
28
 * This library is free software; you can redistribute it and/or
 
29
 * modify it under the terms of the GNU Library General Public
 
30
 * License as published by the Free Software Foundation; either
 
31
 * version 2 of the License, or (at your option) any later version.
 
32
 *
 
33
 * This library is distributed in the hope that it will be useful,
 
34
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
35
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
36
 * Library General Public License for more details.
 
37
 *
 
38
 * You should have received a copy of the GNU Library General Public
 
39
 * License along with this library; if not, write to the
 
40
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 
41
 * Boston, MA 02111-1307, USA.
 
42
 */
 
43
 
 
44
#ifdef HAVE_CONFIG_H
 
45
#  include <config.h>
 
46
#endif
 
47
 
 
48
#include <gst/gst.h>
 
49
#include <math.h>
 
50
 
 
51
#include "gstmirror.h"
 
52
 
 
53
GST_DEBUG_CATEGORY_STATIC (gst_mirror_debug);
 
54
#define GST_CAT_DEFAULT gst_mirror_debug
 
55
 
 
56
enum
 
57
{
 
58
  PROP_0,
 
59
  PROP_MODE
 
60
};
 
61
 
 
62
#define DEFAULT_PROP_MODE GST_MIRROR_MODE_LEFT
 
63
 
 
64
GST_BOILERPLATE (GstMirror, gst_mirror, GstGeometricTransform,
 
65
    GST_TYPE_GEOMETRIC_TRANSFORM);
 
66
 
 
67
#define GST_TYPE_MIRROR_MODE (gst_mirror_mode_get_type())
 
68
static GType
 
69
gst_mirror_mode_get_type (void)
 
70
{
 
71
  static GType mode_type = 0;
 
72
 
 
73
  static const GEnumValue modes[] = {
 
74
    {GST_MIRROR_MODE_LEFT, "Split horizontally and reflect left into right",
 
75
        "left"},
 
76
    {GST_MIRROR_MODE_RIGHT, "Split horizontally and reflect right into left",
 
77
        "right"},
 
78
    {GST_MIRROR_MODE_TOP, "Split vertically and reflect top into bottom",
 
79
        "top"},
 
80
    {GST_MIRROR_MODE_BOTTOM, "Split vertically and reflect bottom into top",
 
81
        "bottom"},
 
82
    {0, NULL, NULL},
 
83
  };
 
84
 
 
85
  if (!mode_type) {
 
86
    mode_type = g_enum_register_static ("GstMirrorMode", modes);
 
87
  }
 
88
  return mode_type;
 
89
}
 
90
 
 
91
 
 
92
static void
 
93
gst_mirror_set_property (GObject * object, guint prop_id,
 
94
    const GValue * value, GParamSpec * pspec)
 
95
{
 
96
  GstMirror *filter = GST_MIRROR_CAST (object);
 
97
 
 
98
  switch (prop_id) {
 
99
    case PROP_MODE:
 
100
      GST_OBJECT_LOCK (filter);
 
101
      filter->mode = g_value_get_enum (value);
 
102
      GST_OBJECT_UNLOCK (filter);
 
103
      break;
 
104
    default:
 
105
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 
106
      break;
 
107
  }
 
108
}
 
109
 
 
110
static void
 
111
gst_mirror_get_property (GObject * object, guint prop_id,
 
112
    GValue * value, GParamSpec * pspec)
 
113
{
 
114
  GstMirror *filter = GST_MIRROR_CAST (object);
 
115
 
 
116
  switch (prop_id) {
 
117
    case PROP_MODE:
 
118
      g_value_set_enum (value, filter->mode);
 
119
      break;
 
120
    default:
 
121
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 
122
      break;
 
123
  }
 
124
}
 
125
 
 
126
static void
 
127
gst_mirror_base_init (gpointer gclass)
 
128
{
 
129
  GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
 
130
 
 
131
  gst_element_class_set_details_simple (element_class,
 
132
      "mirror",
 
133
      "Transform/Effect/Video",
 
134
      "Split the image into two halves and reflect one over each other",
 
135
      "Filippo Argiolas <filippo.argiolas@gmail.com");
 
136
}
 
137
 
 
138
static gboolean
 
139
mirror_map (GstGeometricTransform * gt, gint x, gint y, gdouble * in_x,
 
140
    gdouble * in_y)
 
141
{
 
142
  GstMirror *mirror = GST_MIRROR_CAST (gt);
 
143
 
 
144
  gdouble hw = gt->width / 2.0 - 1.0;
 
145
  gdouble hh = gt->height / 2.0 - 1.0;
 
146
 
 
147
  switch (mirror->mode) {
 
148
    case GST_MIRROR_MODE_LEFT:
 
149
      if (x > hw)
 
150
        *in_x = gt->width - 1.0 - x;
 
151
      else
 
152
        *in_x = x;
 
153
      *in_y = y;
 
154
      break;
 
155
    case GST_MIRROR_MODE_RIGHT:
 
156
      if (x > hw)
 
157
        *in_x = x;
 
158
      else
 
159
        *in_x = gt->width - 1.0 - x;
 
160
      *in_y = y;
 
161
      break;
 
162
    case GST_MIRROR_MODE_TOP:
 
163
      if (y > hh)
 
164
        *in_y = gt->height - 1.0 - y;
 
165
      else
 
166
        *in_y = y;
 
167
      *in_x = x;
 
168
      break;
 
169
    case GST_MIRROR_MODE_BOTTOM:
 
170
      if (y > hh)
 
171
        *in_y = y;
 
172
      else
 
173
        *in_y = gt->height - 1.0 - y;
 
174
      *in_x = x;
 
175
      break;
 
176
    default:
 
177
      g_assert_not_reached ();
 
178
  }
 
179
 
 
180
  GST_DEBUG_OBJECT (mirror, "Inversely mapped %d %d into %lf %lf",
 
181
      x, y, *in_x, *in_y);
 
182
 
 
183
  return TRUE;
 
184
}
 
185
 
 
186
static void
 
187
gst_mirror_class_init (GstMirrorClass * klass)
 
188
{
 
189
  GObjectClass *gobject_class;
 
190
  GstGeometricTransformClass *gstgt_class;
 
191
 
 
192
  gobject_class = (GObjectClass *) klass;
 
193
  gstgt_class = (GstGeometricTransformClass *) klass;
 
194
 
 
195
  gobject_class->set_property = gst_mirror_set_property;
 
196
  gobject_class->get_property = gst_mirror_get_property;
 
197
 
 
198
  g_object_class_install_property (gobject_class, PROP_MODE,
 
199
      g_param_spec_enum ("mode", "Mirror Mode",
 
200
          "How to split the video frame and which side reflect",
 
201
          GST_TYPE_MIRROR_MODE, DEFAULT_PROP_MODE,
 
202
          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
203
 
 
204
  parent_class = g_type_class_peek_parent (klass);
 
205
 
 
206
  gstgt_class->map_func = mirror_map;
 
207
}
 
208
 
 
209
static void
 
210
gst_mirror_init (GstMirror * filter, GstMirrorClass * gclass)
 
211
{
 
212
  GstGeometricTransform *gt = GST_GEOMETRIC_TRANSFORM (filter);
 
213
 
 
214
  filter->mode = DEFAULT_PROP_MODE;
 
215
  gt->off_edge_pixels = GST_GT_OFF_EDGES_PIXELS_CLAMP;
 
216
}
 
217
 
 
218
gboolean
 
219
gst_mirror_plugin_init (GstPlugin * plugin)
 
220
{
 
221
  GST_DEBUG_CATEGORY_INIT (gst_mirror_debug, "mirror", 0, "mirror");
 
222
 
 
223
  return gst_element_register (plugin, "mirror", GST_RANK_NONE,
 
224
      GST_TYPE_MIRROR);
 
225
}