various complicated half finished attempts at getting play right
[sparrow.git] / gstsparrow.h
blob6aac26d976614498256341711b7c964bbf6cc0fb
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))
43 /*XXX could be run time option */
44 #define USE_FULL_LUT 1
46 #define SPARROW_PPM_DEBUG 1
48 #define TIMER_LOG_FILE "/tmp/timer.log"
50 #include "sparrowconfig.h"
51 #include "dSFMT/dSFMT.h"
52 #include "cv.h"
54 #ifndef UNUSED
55 #define UNUSED __attribute__ ((unused))
56 #else
57 #warning UNUSED is set
58 #endif
60 /* the common recommendation for function visibility is to default to 'hidden'
61 and specifically mark the unhidden ('default') ones, but this might muck
62 with gstreamer macros, some of which declare functions, and most sparrow
63 functions are static anyway, so it is simpler to whitelist visibility.
65 http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-fvisibility-2135
67 (actually, it seems like all functions are invisible or static, except the
68 ones that gstreamer makes in macros).
70 #ifndef INVISIBLE
71 #define INVISIBLE __attribute__ ((visibility("hidden")))
72 #else
73 #warning INVISIBLE is set
74 #endif
77 typedef guint32 pix_t;
78 #define PIXSIZE (sizeof(pix_t))
80 #define SPARROW_N_IPL_IN 3
82 #define FAKE_OTHER_PROJECTION 1
85 #define LINE_PERIOD 16
86 #define H_LINE_OFFSET (LINE_PERIOD / 2)
87 #define V_LINE_OFFSET (LINE_PERIOD / 2)
90 typedef enum {
91 SPARROW_STATUS_QUO = 0,
92 SPARROW_INIT,
93 SPARROW_FIND_SELF,
94 SPARROW_FIND_SCREEN,
95 SPARROW_FIND_EDGES,
96 SPARROW_PLAY,
99 SPARROW_NEXT_STATE /*magical last state: alias for next in sequence */
100 } sparrow_state;
102 typedef enum {
103 SPARROW_WHITE = 0,
104 SPARROW_GREEN,
105 SPARROW_MAGENTA,
107 SPARROW_LAST_COLOUR
108 } sparrow_colour;
111 typedef struct sparrow_format_s {
112 gint32 width;
113 gint32 height;
114 guint32 pixcount;
115 guint32 size;
117 guint32 rshift;
118 guint32 gshift;
119 guint32 bshift;
120 guint32 rbyte;
121 guint32 gbyte;
122 guint32 bbyte;
123 guint32 rmask;
124 guint32 gmask;
125 guint32 bmask;
126 guint32 colours[3];
127 } sparrow_format;
130 typedef enum sparrow_axis_s {
131 SPARROW_HORIZONTAL,
132 SPARROW_VERTICAL,
133 } sparrow_axis_t;
136 /* a mesh of these contains the mapping from input to output.
137 stored in a fixed point notation.
139 #define SPARROW_FIXED_POINT 10
140 #define SPARROW_MAP_LUT_SHIFT 1
141 #define SPARROW_FP_2_LUT (SPARROW_FIXED_POINT - SPARROW_MAP_LUT_SHIFT)
143 typedef struct sparrow_map_path_s {
144 int dx;
145 int dy;
146 int n;
147 }sparrow_map_path_t;
150 typedef struct sparrow_map_row_s {
151 int start;
152 int end;
153 int in_x;
154 int in_y;
155 sparrow_map_path_t *points;
156 }sparrow_map_row_t;
158 typedef struct sparrow_map_s {
159 sparrow_map_row_t *rows;
160 void *point_mem;
161 }sparrow_map_t;
163 typedef struct sparrow_map_lut_s{
164 guint16 x;
165 guint16 y;
166 } sparrow_map_lut_t;
168 typedef struct sparrow_frame_s {
169 guint offset;
170 guint jpeg_size;
171 guint8 summary[48];
172 int successors[8];
173 } sparrow_frame_t;
175 typedef struct sparrow_shared_s {
176 guint8 *jpeg_blob;
177 size_t blob_size;
178 sparrow_frame_t *index;
179 guint image_count;
180 } sparrow_shared_t;
183 typedef struct _GstSparrow GstSparrow;
184 typedef struct _GstSparrowClass GstSparrowClass;
187 * GstSparrow:
189 * Opaque data structure.
191 struct _GstSparrow
193 GstVideoFilter videofilter;
194 sparrow_shared_t *shared; /* images, shared between the vaious instances */
195 sparrow_format in;
196 sparrow_format out;
198 /*some calibration modes have big unwieldy structs that attach here */
199 void *helper_struct;
201 /* properties / command line options */
202 gboolean debug;
203 gboolean use_timer;
204 guint32 rng_seed;
206 /* misc */
207 dsfmt_t *dsfmt; /*rng*/
209 /*state */
210 sparrow_state state;
211 gint32 countdown; /*intra-state timing*/
213 guint8 *debug_frame; /* for constructing debug images */
214 GstBuffer *in_buffer;
216 guint32 colour;
217 guint32 frame_count;
219 const char *reload;
220 const char *save;
222 /*debug timer */
223 struct timeval timer_start;
224 struct timeval timer_stop;
225 FILE * timer_log;
227 /*calibration results */
228 guint32 lag;
229 guint8 *screenmask;
230 sparrow_map_t map;
231 /*full sized LUT */
232 sparrow_map_lut_t *map_lut;
233 /*for jpeg decompression*/
234 struct jpeg_decompress_struct *cinfo;
238 struct _GstSparrowClass
240 GstVideoFilterClass parent_class;
243 GType gst_sparrow_get_type(void);
246 GST_DEBUG_CATEGORY_EXTERN (sparrow_debug);
247 #define GST_CAT_DEFAULT sparrow_debug
249 /* GstSparrow signals and args */
250 enum
252 /* FILL ME */
253 LAST_SIGNAL
256 enum
258 PROP_0,
259 PROP_DEBUG,
260 PROP_TIMER,
261 PROP_RNG_SEED,
262 PROP_COLOUR,
263 PROP_RELOAD,
264 PROP_SAVE
267 #define DEFAULT_PROP_CALIBRATE TRUE
268 #define DEFAULT_PROP_DEBUG FALSE
269 #define DEFAULT_PROP_TIMER FALSE
270 #define DEFAULT_PROP_RNG_SEED -1
271 #define DEFAULT_PROP_COLOUR SPARROW_GREEN
272 #define DEFAULT_PROP_RELOAD ""
273 #define DEFAULT_PROP_SAVE ""
275 #define QUOTE_(x) #x
276 #define QUOTE(x) QUOTE_(x)
278 /*timing utility code */
279 #define TIME_TRANSFORM 1
281 #define TIMER_START(sparrow) do{ \
282 if (sparrow->timer_log){ \
283 if ((sparrow)->timer_start.tv_sec){ \
284 GST_DEBUG("timer already running!\n"); \
286 else { \
287 gettimeofday(&((sparrow)->timer_start), NULL); \
290 } while (0)
292 static inline void
293 TIMER_STOP(GstSparrow *sparrow)
295 if (sparrow->timer_log){
296 struct timeval *start = &(sparrow->timer_start);
297 struct timeval *stop = &(sparrow->timer_stop);
298 if (start->tv_sec == 0){
299 GST_DEBUG("the timer isn't running!\n");
300 return;
302 gettimeofday(stop, NULL);
303 guint32 t = ((stop->tv_sec - start->tv_sec) * 1000000 +
304 stop->tv_usec - start->tv_usec);
306 #if SPARROW_NOISY_DEBUG
307 GST_DEBUG("took %u microseconds (%0.5f of a frame)\n",
308 t, (double)t * (25.0 / 1000000.0));
309 #endif
311 fprintf(sparrow->timer_log, "%d %6d\n", sparrow->state, t);
312 fflush(sparrow->timer_log);
313 start->tv_sec = 0; /* mark it as unused */
317 /* GST_DISABLE_GST_DEBUG is set in gstreamer compilation. If it is set, we
318 need our own debug channel. */
319 #ifdef GST_DISABLE_GST_DEBUG
321 #undef GST_DEBUG
323 static FILE *_sparrow_bloody_debug_flags = NULL;
324 static void
325 GST_DEBUG(const char *msg, ...){
326 if (! _sparrow_bloody_debug_flags){
327 _sparrow_bloody_debug_flags = fopen("/tmp/sparrow.log", "wb");
328 if (! _sparrow_bloody_debug_flags){
329 exit(1);
332 va_list argp;
333 va_start(argp, msg);
334 vfprintf(_sparrow_bloody_debug_flags, msg, argp);
335 va_end(argp);
336 fflush(_sparrow_bloody_debug_flags);
339 #define GST_ERROR GST_DEBUG
340 #define GST_WARNING GST_DEBUG
341 #define GST_INFO GST_DEBUG
342 #define GST_LOG GST_DEBUG
343 #define GST_FIXME GST_DEBUG
345 #endif
346 #define LOG_LINENO() GST_DEBUG("%-25s line %4d \n", __func__, __LINE__ );
349 G_END_DECLS
350 #endif /* __GST_VIDEO_SPARROW_H__ */