try to discard unconnected points.
[sparrow.git] / gstsparrow.h
blob2bacec7f01fed210ccfa060a161e29b02932f439
1 /* GStreamer
2 * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
3 * Copyright (C) <2003> David Schleef <ds@schleef.org>
4 * Copyright (C) <2003> Arwed v. Merkatz <v.merkatz@gmx.net>
5 * Copyright (C) <2006> Mark Nauwelaerts <manauw@skynet.be>
6 * Copyright (C) <2010> Douglas Bagnall <douglas@halo.gen.nz>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
25 #ifndef __GST_VIDEO_SPARROW_H__
26 #define __GST_VIDEO_SPARROW_H__
28 #include <gst/video/gstvideofilter.h>
29 #include <sys/time.h>
31 G_BEGIN_DECLS
32 #define GST_TYPE_SPARROW \
33 (gst_sparrow_get_type())
34 #define GST_SPARROW(obj) \
35 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPARROW,GstSparrow))
36 #define GST_SPARROW_CLASS(klass) \
37 (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPARROW,GstSparrowClass))
38 #define GST_IS_SPARROW(obj) \
39 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPARROW))
40 #define GST_IS_SPARROW_CLASS(klass) \
41 (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPARROW))
46 #define SPARROW_PPM_DEBUG 1
47 #define USE_SPARSE_MAP 1
49 #define TIMER_LOG_FILE "/tmp/timer.log"
51 #include "sparrowconfig.h"
52 #include "dSFMT/dSFMT.h"
53 #include "cv.h"
55 #ifndef UNUSED
56 #define UNUSED __attribute__ ((unused))
57 #else
58 #warning UNUSED is set
59 #endif
61 /* the common recommendation for function visibility is to default to 'hidden'
62 and specifically mark the unhidden ('default') ones, but this might muck
63 with gstreamer macros, some of which declare functions, and most sparrow
64 functions are static anyway, so it is simpler to whitelist visibility.
66 http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-fvisibility-2135
68 (actually, it seems like all functions are invisible or static, except the
69 ones that gstreamer makes in macros).
71 #ifndef INVISIBLE
72 #define INVISIBLE __attribute__ ((visibility("hidden")))
73 #else
74 #warning INVISIBLE is set
75 #endif
78 typedef guint32 pix_t;
79 #define PIXSIZE (sizeof(pix_t))
81 #define SPARROW_N_IPL_IN 3
83 #define FAKE_OTHER_PROJECTION 1
86 #define LINE_PERIOD 16
91 typedef enum {
92 SPARROW_STATUS_QUO = 0,
93 SPARROW_INIT,
94 SPARROW_FIND_SELF,
95 SPARROW_FIND_SCREEN,
96 SPARROW_FIND_EDGES,
97 SPARROW_PLAY,
100 SPARROW_NEXT_STATE /*magical last state: alias for next in sequence */
101 } sparrow_state;
103 typedef enum {
104 SPARROW_WHITE = 0,
105 SPARROW_GREEN,
106 SPARROW_MAGENTA,
107 } sparrow_colour;
110 typedef struct sparrow_format_s {
111 gint32 width;
112 gint32 height;
113 guint32 pixcount;
114 guint32 size;
116 guint32 rshift;
117 guint32 gshift;
118 guint32 bshift;
119 guint32 rmask;
120 guint32 gmask;
121 guint32 bmask;
122 guint32 colours[3];
123 } sparrow_format;
126 typedef enum sparrow_axis_s {
127 SPARROW_HORIZONTAL,
128 SPARROW_VERTICAL,
129 } sparrow_axis_t;
132 /* a mesh of these contains the mapping from input to output.
133 stored in a fixed point notation.
135 #define SPARROW_FIXED_POINT 8
137 typedef struct sparrow_map_point_s {
138 int x;
139 int y;
140 int dx;
141 int dy;
142 }sparrow_map_point_t;
144 typedef struct sparrow_map_row_s {
145 int start;
146 int end;
147 sparrow_map_point_t *points;
148 }sparrow_map_row_t;
150 typedef struct sparrow_map_s {
151 sparrow_map_row_t *rows;
152 void *point_mem;
153 }sparrow_map_t;
155 typedef struct sparrow_map_lut_s{
156 guint16 x;
157 guint16 y;
158 } sparrow_map_lut_t;
161 typedef struct _GstSparrow GstSparrow;
162 typedef struct _GstSparrowClass GstSparrowClass;
165 * GstSparrow:
167 * Opaque data structure.
169 struct _GstSparrow
171 GstVideoFilter videofilter;
173 sparrow_format in;
174 sparrow_format out;
176 /*some calibration modes have big unwieldy structs that attach here */
177 void *helper_struct;
179 /* properties / command line options */
180 gboolean debug;
181 gboolean use_timer;
182 gint calibrate_flag; /*whether to calibrate */
183 guint32 rng_seed;
185 /* misc */
186 dsfmt_t *dsfmt; /*rng*/
188 /*state */
189 sparrow_state state;
190 gint32 countdown; /*intra-state timing*/
192 /*buffer pointers for previous frames */
193 guint8 *in_frame;
194 guint8 *prev_frame;
195 guint8 *work_frame;
196 guint8 *debug_frame;
198 GstBuffer *in_buffer;
199 GstBuffer *prev_buffer;
200 /*don't need work_buffer */
202 guint32 colour;
203 guint32 frame_count;
205 /*debug timer */
206 struct timeval timer_start;
207 struct timeval timer_stop;
208 FILE * timer_log;
210 /*calibration results */
211 guint32 lag;
212 guint8 *screenmask;
213 sparrow_map_t map;
214 /*full sized LUT */
215 sparrow_map_lut_t *map_lut;
219 struct _GstSparrowClass
221 GstVideoFilterClass parent_class;
224 GType gst_sparrow_get_type(void);
227 GST_DEBUG_CATEGORY_EXTERN (sparrow_debug);
228 #define GST_CAT_DEFAULT sparrow_debug
230 /* GstSparrow signals and args */
231 enum
233 /* FILL ME */
234 LAST_SIGNAL
237 enum
239 PROP_0,
240 PROP_CALIBRATE,
241 PROP_DEBUG,
242 PROP_TIMER,
243 PROP_RNG_SEED
246 #define DEFAULT_PROP_CALIBRATE TRUE
247 #define DEFAULT_PROP_DEBUG FALSE
248 #define DEFAULT_PROP_TIMER FALSE
249 #define DEFAULT_PROP_RNG_SEED -1
251 /*timing utility code */
252 #define TIME_TRANSFORM 1
254 #define TIMER_START(sparrow) do{ \
255 if (sparrow->timer_log){ \
256 if ((sparrow)->timer_start.tv_sec){ \
257 GST_DEBUG("timer already running!\n"); \
259 else { \
260 gettimeofday(&((sparrow)->timer_start), NULL); \
263 } while (0)
265 static inline void
266 TIMER_STOP(GstSparrow *sparrow)
268 if (sparrow->timer_log){
269 struct timeval *start = &(sparrow->timer_start);
270 struct timeval *stop = &(sparrow->timer_stop);
271 if (start->tv_sec == 0){
272 GST_DEBUG("the timer isn't running!\n");
273 return;
275 gettimeofday(stop, NULL);
276 guint32 t = ((stop->tv_sec - start->tv_sec) * 1000000 +
277 stop->tv_usec - start->tv_usec);
279 #if SPARROW_NOISY_DEBUG
280 GST_DEBUG("took %u microseconds (%0.5f of a frame)\n",
281 t, (double)t * (25.0 / 1000000.0));
282 #endif
284 fprintf(sparrow->timer_log, "%d %6d\n", sparrow->state, t);
285 fflush(sparrow->timer_log);
286 start->tv_sec = 0; /* mark it as unused */
290 /* GST_DISABLE_GST_DEBUG is set in gstreamer compilation. If it is set, we
291 need our own debug channel. */
292 #ifdef GST_DISABLE_GST_DEBUG
294 #undef GST_DEBUG
296 static FILE *_sparrow_bloody_debug_flags = NULL;
297 static void
298 GST_DEBUG(const char *msg, ...){
299 if (! _sparrow_bloody_debug_flags){
300 _sparrow_bloody_debug_flags = fopen("/tmp/sparrow.log", "wb");
301 if (! _sparrow_bloody_debug_flags){
302 exit(1);
305 va_list argp;
306 va_start(argp, msg);
307 vfprintf(_sparrow_bloody_debug_flags, msg, argp);
308 va_end(argp);
309 fflush(_sparrow_bloody_debug_flags);
312 #define GST_ERROR GST_DEBUG
313 #define GST_WARNING GST_DEBUG
314 #define GST_INFO GST_DEBUG
315 #define GST_LOG GST_DEBUG
316 #define GST_FIXME GST_DEBUG
318 #endif
319 #define LOG_LINENO() GST_DEBUG("%-25s line %4d \n", __func__, __LINE__ );
322 G_END_DECLS
323 #endif /* __GST_VIDEO_SPARROW_H__ */