expanded gamma lut, with floor
[sparrow.git] / gstsparrow.h
blobcf510da7a3adb85fc95c28d8d1163f246bb7ffb3
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 32
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 typedef struct sparrow_map_path_s {
137 int dx;
138 int dy;
139 int n;
140 }sparrow_map_path_t;
143 typedef struct sparrow_frame_s {
144 gint32 offset;
145 guint32 jpeg_size;
146 guint8 summary[48];
147 gint32 successors[8];
148 } sparrow_frame_t;
150 typedef struct sparrow_shared_s {
151 guint8 *jpeg_blob;
152 guint32 blob_size;
153 sparrow_frame_t *index;
154 guint32 image_count;
155 } sparrow_shared_t;
158 typedef struct _GstSparrow GstSparrow;
159 typedef struct _GstSparrowClass GstSparrowClass;
162 * GstSparrow:
164 * Opaque data structure.
166 struct _GstSparrow
168 GstVideoFilter videofilter;
169 sparrow_shared_t *shared; /* images, shared between the vaious instances */
170 sparrow_format in;
171 sparrow_format out;
173 /*some calibration modes have big unwieldy structs that attach here */
174 void *helper_struct;
176 /* properties / command line options */
177 gboolean debug;
178 gboolean use_timer;
179 guint32 rng_seed;
181 /* misc */
182 dsfmt_t *dsfmt; /*rng*/
184 /*state */
185 sparrow_state state;
186 gint32 countdown; /*intra-state timing*/
188 guint8 *debug_frame; /* for constructing debug images */
189 GstBuffer *in_buffer;
191 guint32 colour;
192 guint32 frame_count;
194 const char *reload;
195 const char *save;
196 gboolean serial;
198 /*debug timer */
199 struct timeval timer_start;
200 struct timeval timer_stop;
201 FILE * timer_log;
203 /*calibration results */
204 guint32 lag;
205 guint8 *screenmask;
206 /*full sized LUT */
207 guint32 *map_lut;
208 /*for jpeg decompression*/
209 struct jpeg_decompress_struct *cinfo;
210 int jpeg_colourspace;
214 struct _GstSparrowClass
216 GstVideoFilterClass parent_class;
219 GType gst_sparrow_get_type(void);
222 GST_DEBUG_CATEGORY_EXTERN (sparrow_debug);
223 #define GST_CAT_DEFAULT sparrow_debug
225 /* GstSparrow signals and args */
226 enum
228 /* FILL ME */
229 LAST_SIGNAL
232 enum
234 PROP_0,
235 PROP_DEBUG,
236 PROP_TIMER,
237 PROP_RNG_SEED,
238 PROP_COLOUR,
239 PROP_RELOAD,
240 PROP_SAVE,
241 PROP_SERIAL
244 #define DEFAULT_PROP_CALIBRATE TRUE
245 #define DEFAULT_PROP_DEBUG FALSE
246 #define DEFAULT_PROP_TIMER FALSE
247 #define DEFAULT_PROP_RNG_SEED -1
248 #define DEFAULT_PROP_COLOUR SPARROW_GREEN
249 #define DEFAULT_PROP_RELOAD ""
250 #define DEFAULT_PROP_SAVE ""
251 #define DEFAULT_PROP_SERIAL FALSE
253 #define QUOTE_(x) #x
254 #define QUOTE(x) QUOTE_(x)
256 /*timing utility code */
257 #define TIME_TRANSFORM 1
259 #define TIMER_START(sparrow) do{ \
260 if (sparrow->timer_log){ \
261 if ((sparrow)->timer_start.tv_sec){ \
262 GST_DEBUG("timer already running!\n"); \
264 else { \
265 gettimeofday(&((sparrow)->timer_start), NULL); \
268 } while (0)
270 static inline void
271 TIMER_STOP(GstSparrow *sparrow)
273 if (sparrow->timer_log){
274 struct timeval *start = &(sparrow->timer_start);
275 struct timeval *stop = &(sparrow->timer_stop);
276 if (start->tv_sec == 0){
277 GST_DEBUG("the timer isn't running!\n");
278 return;
280 gettimeofday(stop, NULL);
281 guint32 t = ((stop->tv_sec - start->tv_sec) * 1000000 +
282 stop->tv_usec - start->tv_usec);
284 #if SPARROW_NOISY_DEBUG
285 GST_DEBUG("took %u microseconds (%0.5f of a frame)\n",
286 t, (double)t * (25.0 / 1000000.0));
287 #endif
289 fprintf(sparrow->timer_log, "%d %6d\n", sparrow->state, t);
290 fflush(sparrow->timer_log);
291 start->tv_sec = 0; /* mark it as unused */
295 /* GST_DISABLE_GST_DEBUG is set in gstreamer compilation. If it is set, we
296 need our own debug channel. */
297 #ifdef GST_DISABLE_GST_DEBUG
299 #undef GST_DEBUG
301 static FILE *_sparrow_bloody_debug_flags = NULL;
302 static void
303 GST_DEBUG(const char *msg, ...){
304 if (! _sparrow_bloody_debug_flags){
305 _sparrow_bloody_debug_flags = fopen("/tmp/sparrow.log", "wb");
306 if (! _sparrow_bloody_debug_flags){
307 exit(1);
310 va_list argp;
311 va_start(argp, msg);
312 vfprintf(_sparrow_bloody_debug_flags, msg, argp);
313 va_end(argp);
314 fflush(_sparrow_bloody_debug_flags);
317 #define GST_ERROR GST_DEBUG
318 #define GST_WARNING GST_DEBUG
319 #define GST_INFO GST_DEBUG
320 #define GST_LOG GST_DEBUG
321 #define GST_FIXME GST_DEBUG
323 #endif
324 #define LOG_LINENO() GST_DEBUG("%-25s line %4d \n", __func__, __LINE__ );
327 G_END_DECLS
328 #endif /* __GST_VIDEO_SPARROW_H__ */