in memory jpeg decoding, using libjpeg_turbo
[sparrow.git] / gstsparrow.h
blob76f849efdf9583215139a7ecd9d97f9f56497953
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 rmask;
121 guint32 gmask;
122 guint32 bmask;
123 guint32 colours[3];
124 } sparrow_format;
127 typedef enum sparrow_axis_s {
128 SPARROW_HORIZONTAL,
129 SPARROW_VERTICAL,
130 } sparrow_axis_t;
133 /* a mesh of these contains the mapping from input to output.
134 stored in a fixed point notation.
136 #define SPARROW_FIXED_POINT 8
137 #define SPARROW_MAP_LUT_SHIFT 1
138 #define SPARROW_FP_2_LUT (SPARROW_FIXED_POINT - SPARROW_MAP_LUT_SHIFT)
140 typedef struct sparrow_map_path_s {
141 int dx;
142 int dy;
143 int n;
144 }sparrow_map_path_t;
147 typedef struct sparrow_map_row_s {
148 int start;
149 int end;
150 int in_x;
151 int in_y;
152 sparrow_map_path_t *points;
153 }sparrow_map_row_t;
155 typedef struct sparrow_map_s {
156 sparrow_map_row_t *rows;
157 void *point_mem;
158 }sparrow_map_t;
160 typedef struct sparrow_map_lut_s{
161 guint16 x;
162 guint16 y;
163 } sparrow_map_lut_t;
166 typedef struct _GstSparrow GstSparrow;
167 typedef struct _GstSparrowClass GstSparrowClass;
170 * GstSparrow:
172 * Opaque data structure.
174 struct _GstSparrow
176 GstVideoFilter videofilter;
178 sparrow_format in;
179 sparrow_format out;
181 /*some calibration modes have big unwieldy structs that attach here */
182 void *helper_struct;
184 /* properties / command line options */
185 gboolean debug;
186 gboolean use_timer;
187 gint calibrate_flag; /*whether to calibrate */
188 guint32 rng_seed;
190 /* misc */
191 dsfmt_t *dsfmt; /*rng*/
193 /*state */
194 sparrow_state state;
195 gint32 countdown; /*intra-state timing*/
197 /*buffer pointers for previous frames */
198 guint8 *in_frame;
199 guint8 *debug_frame;
201 GstBuffer *in_buffer;
202 GstBuffer *prev_buffer;
203 /*don't need work_buffer */
205 guint32 colour;
206 guint32 frame_count;
208 const char *reload;
209 const char *save;
211 /*debug timer */
212 struct timeval timer_start;
213 struct timeval timer_stop;
214 FILE * timer_log;
216 /*calibration results */
217 guint32 lag;
218 guint8 *screenmask;
219 sparrow_map_t map;
220 /*full sized LUT */
221 sparrow_map_lut_t *map_lut;
222 /*for jpeg decompression*/
223 struct jpeg_decompress_struct *cinfo;
227 struct _GstSparrowClass
229 GstVideoFilterClass parent_class;
232 GType gst_sparrow_get_type(void);
235 GST_DEBUG_CATEGORY_EXTERN (sparrow_debug);
236 #define GST_CAT_DEFAULT sparrow_debug
238 /* GstSparrow signals and args */
239 enum
241 /* FILL ME */
242 LAST_SIGNAL
245 enum
247 PROP_0,
248 PROP_CALIBRATE,
249 PROP_DEBUG,
250 PROP_TIMER,
251 PROP_RNG_SEED,
252 PROP_COLOUR,
253 PROP_RELOAD,
254 PROP_SAVE
257 #define DEFAULT_PROP_CALIBRATE TRUE
258 #define DEFAULT_PROP_DEBUG FALSE
259 #define DEFAULT_PROP_TIMER FALSE
260 #define DEFAULT_PROP_RNG_SEED -1
261 #define DEFAULT_PROP_COLOUR SPARROW_GREEN
262 #define DEFAULT_PROP_RELOAD ""
263 #define DEFAULT_PROP_SAVE ""
265 #define QUOTE_(x) #x
266 #define QUOTE(x) QUOTE_(x)
268 /*timing utility code */
269 #define TIME_TRANSFORM 1
271 #define TIMER_START(sparrow) do{ \
272 if (sparrow->timer_log){ \
273 if ((sparrow)->timer_start.tv_sec){ \
274 GST_DEBUG("timer already running!\n"); \
276 else { \
277 gettimeofday(&((sparrow)->timer_start), NULL); \
280 } while (0)
282 static inline void
283 TIMER_STOP(GstSparrow *sparrow)
285 if (sparrow->timer_log){
286 struct timeval *start = &(sparrow->timer_start);
287 struct timeval *stop = &(sparrow->timer_stop);
288 if (start->tv_sec == 0){
289 GST_DEBUG("the timer isn't running!\n");
290 return;
292 gettimeofday(stop, NULL);
293 guint32 t = ((stop->tv_sec - start->tv_sec) * 1000000 +
294 stop->tv_usec - start->tv_usec);
296 #if SPARROW_NOISY_DEBUG
297 GST_DEBUG("took %u microseconds (%0.5f of a frame)\n",
298 t, (double)t * (25.0 / 1000000.0));
299 #endif
301 fprintf(sparrow->timer_log, "%d %6d\n", sparrow->state, t);
302 fflush(sparrow->timer_log);
303 start->tv_sec = 0; /* mark it as unused */
307 /* GST_DISABLE_GST_DEBUG is set in gstreamer compilation. If it is set, we
308 need our own debug channel. */
309 #ifdef GST_DISABLE_GST_DEBUG
311 #undef GST_DEBUG
313 static FILE *_sparrow_bloody_debug_flags = NULL;
314 static void
315 GST_DEBUG(const char *msg, ...){
316 if (! _sparrow_bloody_debug_flags){
317 _sparrow_bloody_debug_flags = fopen("/tmp/sparrow.log", "wb");
318 if (! _sparrow_bloody_debug_flags){
319 exit(1);
322 va_list argp;
323 va_start(argp, msg);
324 vfprintf(_sparrow_bloody_debug_flags, msg, argp);
325 va_end(argp);
326 fflush(_sparrow_bloody_debug_flags);
329 #define GST_ERROR GST_DEBUG
330 #define GST_WARNING GST_DEBUG
331 #define GST_INFO GST_DEBUG
332 #define GST_LOG GST_DEBUG
333 #define GST_FIXME GST_DEBUG
335 #endif
336 #define LOG_LINENO() GST_DEBUG("%-25s line %4d \n", __func__, __LINE__ );
339 G_END_DECLS
340 #endif /* __GST_VIDEO_SPARROW_H__ */