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>
33 #define SPARROW_PPM_DEBUG 1
35 #define TIMER_LOG_FILE "/tmp/timer.log"
37 #include "sparrowconfig.h"
38 #include "dSFMT/dSFMT.h"
42 #define UNUSED __attribute__ ((unused))
44 #warning UNUSED is set
47 /* the common recommendation for function visibility is to default to 'hidden'
48 and specifically mark the unhidden ('default') ones, but this might muck
49 with gstreamer macros, some of which declare functions, and most sparrow
50 functions are static anyway, so it is simpler to whitelist visibility.
52 http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-fvisibility-2135
54 (actually, it seems like all functions are invisible or static, except the
55 ones that gstreamer makes in macros).
58 #define INVISIBLE __attribute__ ((visibility("hidden")))
60 #warning INVISIBLE is set
64 typedef guint32 pix_t
;
65 #define PIXSIZE (sizeof(pix_t))
68 #define CALIBRATE_ON_MIN_T 2
69 #define CALIBRATE_ON_MAX_T 7
70 #define CALIBRATE_OFF_MIN_T 2
71 #define CALIBRATE_OFF_MAX_T 9
72 #define CALIBRATE_SELF_SIZE 24
74 #define CALIBRATE_MAX_VOTE_ERROR 5
75 #define CALIBRATE_MAX_BEST_ERROR 2
76 #define CALIBRATE_INITIAL_WAIT 72
77 #define CALIBRATE_RETRY_WAIT 16
79 #define CALIBRATE_SIGNAL_THRESHOLD 200
81 #define SPARROW_N_IPL_IN 3
83 #define MAX_CALIBRATE_SHAPES 4
85 #define FAKE_OTHER_PROJECTION 1
87 #define WAIT_COUNTDOWN (MAX(CALIBRATE_OFF_MAX_T, CALIBRATE_ON_MAX_T) + 3)
89 #define GST_TYPE_SPARROW \
90 (gst_sparrow_get_type())
91 #define GST_SPARROW(obj) \
92 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPARROW,GstSparrow))
93 #define GST_SPARROW_CLASS(klass) \
94 (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPARROW,GstSparrowClass))
95 #define GST_IS_SPARROW(obj) \
96 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPARROW))
97 #define GST_IS_SPARROW_CLASS(klass) \
98 (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPARROW))
103 SPARROW_STATUS_QUO
= 0,
109 SPARROW_WAIT_FOR_GRID
,
114 SPARROW_NEXT_STATE
/*magical last state: alias for next in sequence */
123 #define MAX_CALIBRATION_LAG 12
124 typedef struct lag_times_s
{
129 typedef struct sparrow_format_s
{
144 enum calibration_shape
{
152 typedef struct sparrow_shape_s
{
153 /*Calibration shape definition -- a rectangle.*/
154 enum calibration_shape shape
;
161 typedef struct sparrow_calibrate_s
{
162 /*calibration state, and shape and pattern definition */
163 gboolean on
; /*for calibration pattern */
168 } sparrow_calibrate_t
;
170 typedef struct sparrow_find_screen_s
{
174 } sparrow_find_screen_t
;
177 typedef struct _GstSparrow GstSparrow
;
178 typedef struct _GstSparrowClass GstSparrowClass
;
183 * Opaque data structure.
187 GstVideoFilter videofilter
;
191 sparrow_shape_t shapes
[MAX_CALIBRATE_SHAPES
];
194 sparrow_calibrate_t calibrate
;
197 gint calibrate_flag
; /*whether to calibrate */
200 dsfmt_t
*dsfmt
; /*rng*/
205 lag_times_t
*lag_table
;
209 gint32 countdown
; /*intra-state timing*/
211 /*buffer pointers for previous frames */
217 GstBuffer
*in_buffer
;
218 GstBuffer
*prev_buffer
;
219 /*don't need work_buffer */
221 IplImage
*in_ipl
[SPARROW_N_IPL_IN
];
228 struct timeval timer_start
;
229 struct timeval timer_stop
;
230 sparrow_find_screen_t findscreen
;
233 IplImage
*screenmask_ipl
;
239 struct _GstSparrowClass
241 GstVideoFilterClass parent_class
;
244 GType
gst_sparrow_get_type(void);
247 GST_DEBUG_CATEGORY_EXTERN (sparrow_debug
);
248 #define GST_CAT_DEFAULT sparrow_debug
250 /* GstSparrow signals and args */
266 #define DEFAULT_PROP_CALIBRATE TRUE
267 #define DEFAULT_PROP_DEBUG FALSE
268 #define DEFAULT_PROP_TIMER FALSE
269 #define DEFAULT_PROP_RNG_SEED -1
271 /*timing utility code */
272 #define TIME_TRANSFORM 1
274 #define TIMER_START(sparrow) do{ \
275 if (sparrow->timer_log){ \
276 if ((sparrow)->timer_start.tv_sec){ \
277 GST_DEBUG("timer already running!\n"); \
280 gettimeofday(&((sparrow)->timer_start), NULL); \
286 TIMER_STOP(GstSparrow
*sparrow
)
288 if (sparrow
->timer_log
){
289 struct timeval
*start
= &(sparrow
->timer_start
);
290 struct timeval
*stop
= &(sparrow
->timer_stop
);
291 if (start
->tv_sec
== 0){
292 GST_DEBUG("the timer isn't running!\n");
295 gettimeofday(stop
, NULL
);
296 guint32 t
= ((stop
->tv_sec
- start
->tv_sec
) * 1000000 +
297 stop
->tv_usec
- start
->tv_usec
);
299 #if SPARROW_NOISY_DEBUG
300 GST_DEBUG("took %u microseconds (%0.5f of a frame)\n",
301 t
, (double)t
* (25.0 / 1000000.0));
304 fprintf(sparrow
->timer_log
, "%d %6d\n", sparrow
->state
, t
);
305 fflush(sparrow
->timer_log
);
306 start
->tv_sec
= 0; /* mark it as unused */
310 /* GST_DISABLE_GST_DEBUG is set in gstreamer compilation. If it is set, we
311 need our own debug channel. */
312 #ifdef GST_DISABLE_GST_DEBUG
316 static FILE *_sparrow_bloody_debug_flags
= NULL
;
318 GST_DEBUG(const char *msg
, ...){
319 if (! _sparrow_bloody_debug_flags
){
320 _sparrow_bloody_debug_flags
= fopen("/tmp/sparrow.log", "wb");
321 if (! _sparrow_bloody_debug_flags
){
327 vfprintf(_sparrow_bloody_debug_flags
, msg
, argp
);
329 fflush(_sparrow_bloody_debug_flags
);
332 #define GST_ERROR GST_DEBUG
333 #define GST_WARNING GST_DEBUG
334 #define GST_INFO GST_DEBUG
335 #define GST_LOG GST_DEBUG
336 #define GST_FIXME GST_DEBUG
339 #define LOG_LINENO() GST_DEBUG("%-25s line %4d \n", __func__, __LINE__ );
343 #endif /* __GST_VIDEO_SPARROW_H__ */