Lines 56-61
Link Here
|
56 |
struct video_picture grab_pic; |
56 |
struct video_picture grab_pic; |
57 |
struct video_capability grab_cap; |
57 |
struct video_capability grab_cap; |
58 |
struct video_mmap grab_buf; |
58 |
struct video_mmap grab_buf; |
|
|
59 |
static struct video_mbuf mbuf; |
60 |
|
59 |
int grab_fd, grab_size; |
61 |
int grab_fd, grab_size; |
60 |
unsigned char *grab_data; |
62 |
unsigned char *grab_data; |
61 |
char *pnm_buf=NULL; |
63 |
char *pnm_buf=NULL; |
Lines 66-72
Link Here
|
66 |
everybody else can update theirs from the config window */ |
68 |
everybody else can update theirs from the config window */ |
67 |
|
69 |
|
68 |
int fix_color=1; |
70 |
int fix_color=1; |
69 |
int hue=47104, contrast=65280, brightness=65280, colour=17152; |
71 |
int hue=32767, contrast=32767, brightness=32767, colour=32767; |
70 |
|
72 |
|
71 |
unsigned char* grab_one(int *, int *); |
73 |
unsigned char* grab_one(int *, int *); |
72 |
int grab_init(); |
74 |
int grab_init(); |
Lines 106-112
Link Here
|
106 |
return; |
108 |
return; |
107 |
} |
109 |
} |
108 |
|
110 |
|
109 |
current_pixbuf=gdk_pixbuf_new_from_data(grabit,GDK_COLORSPACE_RGB,FALSE,8,320,240,320*grab_pic.depth/8,NULL,NULL); |
111 |
current_pixbuf=gdk_pixbuf_new_from_data(grabit,GDK_COLORSPACE_RGB,FALSE,8,x,y,x*grab_pic.depth/8,NULL,NULL); |
110 |
|
112 |
|
111 |
gtk_image_set_from_pixbuf(GTK_IMAGE(current_image), current_pixbuf); |
113 |
gtk_image_set_from_pixbuf(GTK_IMAGE(current_image), current_pixbuf); |
112 |
gdk_pixbuf_unref(current_pixbuf); |
114 |
gdk_pixbuf_unref(current_pixbuf); |
Lines 163-168
Link Here
|
163 |
if (contrast > -1) grab_pic.contrast=contrast; |
165 |
if (contrast > -1) grab_pic.contrast=contrast; |
164 |
if (brightness > -1) grab_pic.brightness=brightness; |
166 |
if (brightness > -1) grab_pic.brightness=brightness; |
165 |
if (colour > -1) grab_pic.colour=colour; |
167 |
if (colour > -1) grab_pic.colour=colour; |
|
|
168 |
/* hardcoded... */ |
169 |
grab_pic.depth = 24; |
170 |
grab_pic.palette = VIDEO_PALETTE_RGB24; |
171 |
|
166 |
if (ioctl(grab_fd, VIDIOCSPICT, &grab_pic) == -1) { |
172 |
if (ioctl(grab_fd, VIDIOCSPICT, &grab_pic) == -1) { |
167 |
show_error_dialog("An error occurred at 'ioctl VIDIOCSPICT'.\nCould not set camera properties."); |
173 |
show_error_dialog("An error occurred at 'ioctl VIDIOCSPICT'.\nCould not set camera properties."); |
168 |
return; |
174 |
return; |
Lines 222-228
Link Here
|
222 |
grab_buf.width = x; |
228 |
grab_buf.width = x; |
223 |
grab_buf.height = y; |
229 |
grab_buf.height = y; |
224 |
grab_size = x * y * w; |
230 |
grab_size = x * y * w; |
225 |
grab_data = mmap(0,grab_size,PROT_READ|PROT_WRITE,MAP_SHARED,grab_fd,0); |
231 |
set_picture(); |
|
|
232 |
|
233 |
if (ioctl (grab_fd, VIDIOCGMBUF, &mbuf) < 0) { |
234 |
show_error_dialog("An error occurred at 'ioctl VIDIOCGMBUF'."); |
235 |
return 0; |
236 |
} |
237 |
printf("frames per capture: %i\n", mbuf.frames); |
238 |
if ((grab_data = mmap(0, mbuf.size, PROT_READ|PROT_WRITE, MAP_SHARED, |
239 |
grab_fd,0)) == MAP_FAILED) { |
240 |
perror("mmap"); |
241 |
show_error_dialog("An error occurred at 'mmap'."); |
242 |
return 0; |
243 |
} |
244 |
|
245 |
/* grab first frame */ |
246 |
if (-1 == ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf)) { |
247 |
show_error_dialog("An error occurred at 'ioctl VIDIOCMCAPTURE'."); |
248 |
return 0; |
249 |
} |
250 |
if (mbuf.frames > 1) grab_buf.frame = 1 - grab_buf.frame; |
251 |
|
226 |
return(1); |
252 |
return(1); |
227 |
} |
253 |
} |
228 |
|
254 |
|
Lines 239-261
Link Here
|
239 |
unsigned char* grab_one(int *width, int *height) { |
265 |
unsigned char* grab_one(int *width, int *height) { |
240 |
set_picture(); |
266 |
set_picture(); |
241 |
|
267 |
|
242 |
for (;;) { |
|
|
243 |
if (-1 == ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf)) { |
268 |
if (-1 == ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf)) { |
244 |
show_error_dialog("An error occurred at 'ioctl VIDIOCMCAPTURE'."); |
269 |
show_error_dialog("An error occurred at 'ioctl VIDIOCMCAPTURE'."); |
245 |
return NULL; |
270 |
return NULL; |
246 |
} else { |
271 |
} |
|
|
272 |
|
273 |
if (mbuf.frames > 1) grab_buf.frame = 1 - grab_buf.frame; |
247 |
if (-1 == ioctl(grab_fd,VIDIOCSYNC,&grab_buf)) { |
274 |
if (-1 == ioctl(grab_fd,VIDIOCSYNC,&grab_buf)) { |
248 |
show_error_dialog("An error occurred at 'ioctl VIDIOCSYNC'."); |
275 |
show_error_dialog("An error occurred at 'ioctl VIDIOCSYNC'."); |
249 |
return NULL; |
276 |
return NULL; |
250 |
} else { |
277 |
} |
251 |
if (fix_color) {fix_colour(grab_data, x, y); } |
278 |
if (fix_color) {fix_colour(grab_data + mbuf.offsets[grab_buf.frame], x, y); } |
252 |
*width = grab_buf.width; |
279 |
*width = grab_buf.width; |
253 |
*height = grab_buf.height; |
280 |
*height = grab_buf.height; |
254 |
return grab_data; |
281 |
return grab_data + mbuf.offsets[grab_buf.frame]; |
255 |
} |
|
|
256 |
} |
257 |
|
258 |
} |
259 |
} |
282 |
} |
260 |
|
283 |
|
261 |
|
284 |
|