71
67
if (cnt->conf.autobright) {
73
int brightness_window_high;
74
int brightness_window_low;
75
int brightness_target;
76
int i, j = 0, avg = 0, step = 0;
78
if (cnt->conf.brightness)
79
brightness_target = cnt->conf.brightness;
81
brightness_target = 128;
83
brightness_window_high = MIN2(brightness_target + 10, 255);
84
brightness_window_low = MAX2(brightness_target - 10, 1);
86
for (i = 0; i < cnt->imgs.motionsize; i += 101) {
92
if (avg > brightness_window_high || avg < brightness_window_low) {
69
if (vid_do_autobright(cnt, viddev)) {
93
70
/* If we already read the VIDIOGPICT - we should not do it again */
94
71
if (!make_change) {
95
72
if (ioctl(dev, VIDIOCGPICT, &vid_pic)==-1)
96
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCGPICT)");
98
/* average is above window - turn down brigtness - go for the target */
99
if (avg > brightness_window_high) {
100
step = MIN2((avg - brightness_target)/5+1, viddev->brightness);
101
if (viddev->brightness > step+1) {
102
viddev->brightness -= step;
103
vid_pic.brightness = viddev->brightness * 256;
107
/* average is below window - turn up brigtness - go for the target */
108
if (avg < brightness_window_low) {
109
step = MIN2((brightness_target - avg)/5+1, 255 - viddev->brightness);
110
if (viddev->brightness < 255-step ) {
111
viddev->brightness += step;
112
vid_pic.brightness = viddev->brightness * 256;
73
motion_log(LOG_ERR, 1, "ioctl (VIDIOCGPICT)");
76
vid_pic.brightness = viddev->brightness * 256;
118
81
if (cnt->conf.brightness && cnt->conf.brightness != viddev->brightness) {
119
82
if (!make_change) {
120
83
if (ioctl(dev, VIDIOCGPICT, &vid_pic)==-1)
121
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCGPICT)");
84
motion_log(LOG_ERR, 1, "ioctl (VIDIOCGPICT)");
130
93
if (make_change) {
131
94
if (ioctl(dev, VIDIOCSPICT, &vid_pic)==-1)
132
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCSPICT)");
137
void yuv422to420p(unsigned char *map, unsigned char *cap_map, int width, int height)
139
unsigned char *src, *dest, *src2, *dest2;
142
/* Create the Y plane */
145
for (i=width*height; i; i--) {
149
/* Create U and V planes */
151
src2=cap_map+width*2+1;
152
dest=map+width*height;
153
dest2=dest+(width*height)/4;
154
for (i=height/2; i; i--) {
155
for (j=width/2; j; j--) {
156
*dest=((int)*src+(int)*src2)/2;
160
*dest2=((int)*src+(int)*src2)/2;
170
void rgb24toyuv420p(unsigned char *map, unsigned char *cap_map, int width, int height)
172
unsigned char *y, *u, *v;
173
unsigned char *r, *g, *b;
181
v=u+(width*height)/4;
182
memset(u, 0, width*height/4);
183
memset(v, 0, width*height/4);
185
for(loop=0; loop<height; loop++) {
186
for(i=0; i<width; i+=2) {
187
*y++=(9796**r+19235**g+3736**b)>>15;
188
*u+=((-4784**r-9437**g+14221**b)>>17)+32;
189
*v+=((20218**r-16941**g-3277**b)>>17)+32;
193
*y++=(9796**r+19235**g+3736**b)>>15;
194
*u+=((-4784**r-9437**g+14221**b)>>17)+32;
195
*v+=((20218**r-16941**g-3277**b)>>17)+32;
95
motion_log(LOG_ERR, 1, "ioctl (VIDIOCSPICT)");
211
101
/*******************************************************************************************
212
102
Video4linux capture routines
216
static unsigned char *v4l_start(struct context *cnt, struct video_dev *viddev, int width, int height, int input, int norm,
217
unsigned long freq, int tuner_number)
106
unsigned char *v4l_start(struct context *cnt, struct video_dev *viddev, int width, int height,
107
int input, int norm, unsigned long freq, int tuner_number)
109
int dev = viddev->fd;
220
110
struct video_capability vid_caps;
221
111
struct video_channel vid_chnl;
222
112
struct video_tuner vid_tuner;
223
struct video_window vid_win;
224
113
struct video_mbuf vid_buf;
225
114
struct video_mmap vid_mmap;
228
117
if (ioctl (dev, VIDIOCGCAP, &vid_caps) == -1) {
229
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCGCAP)");
118
motion_log(LOG_ERR, 1, "ioctl (VIDIOCGCAP)");
232
if (vid_caps.type & VID_TYPE_MONOCHROME) viddev->v4l_fmt=VIDEO_PALETTE_GREY;
122
if (vid_caps.type & VID_TYPE_MONOCHROME)
123
viddev->v4l_fmt=VIDEO_PALETTE_GREY;
233
125
if (input != IN_DEFAULT) {
234
126
memset(&vid_chnl, 0, sizeof(struct video_channel));
235
127
vid_chnl.channel = input;
236
129
if (ioctl (dev, VIDIOCGCHAN, &vid_chnl) == -1) {
237
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCGCHAN)");
130
motion_log(LOG_ERR, 1, "ioctl (VIDIOCGCHAN)");
239
132
vid_chnl.channel = input;
240
133
vid_chnl.norm = norm;
241
134
if (ioctl (dev, VIDIOCSCHAN, &vid_chnl) == -1) {
242
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCSCHAN)");
135
motion_log(LOG_ERR, 1, "ioctl (VIDIOCSCHAN)");
248
142
vid_tuner.tuner = tuner_number;
249
143
if (ioctl (dev, VIDIOCGTUNER, &vid_tuner)==-1) {
250
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCGTUNER)");
144
motion_log(LOG_ERR, 1, "ioctl (VIDIOCGTUNER)");
252
146
if (vid_tuner.flags & VIDEO_TUNER_LOW) {
253
147
freq=freq*16; /* steps of 1/16 KHz */
255
149
freq=(freq*10)/625;
257
151
if (ioctl(dev, VIDIOCSFREQ, &freq)==-1) {
258
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCSFREQ)");
152
motion_log(LOG_ERR, 1, "ioctl (VIDIOCSFREQ)");
261
155
if (cnt->conf.setup_mode)
262
motion_log(cnt, -1, 0, "Frequency set");
156
motion_log(-1, 0, "Frequency set");
265
160
if (ioctl (dev, VIDIOCGMBUF, &vid_buf) == -1) {
266
motion_log(cnt, LOG_WARNING, 0, "No mmap falling back on read");
267
if (ioctl (dev, VIDIOCGWIN, &vid_win)== -1) {
268
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCGWIN)");
272
vid_win.height=height;
274
if (ioctl (dev, VIDIOCSWIN, &vid_win)== -1) {
275
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCSWIN)");
278
motion_log(cnt, LOG_WARNING, 0, "V4L capturing using read is deprecated!");
279
motion_log(cnt, LOG_WARNING, 0, "Motion now only supports mmap.");
280
motion_log(cnt, LOG_WARNING, 0, "Motion Exits.");
281
exit(1); //FIXME - This seems like an old oops that was never cleaned out or fixed
282
viddev->v4l_read_img=1;
283
map=mymalloc(cnt ,width*height*3);
284
viddev->v4l_maxbuffer=1;
285
viddev->v4l_curbuffer=0;
286
viddev->v4l_buffers[0]=map;
161
motion_log(LOG_ERR, 0, "ioctl(VIDIOCGMBUF) - Error device does not support memory map");
162
motion_log(LOG_ERR, 0, "V4L capturing using read is deprecated!");
163
motion_log(LOG_ERR, 0, "Motion only supports mmap.");
288
166
map=mmap(0, vid_buf.size, PROT_READ|PROT_WRITE, MAP_SHARED, dev, 0);
289
167
viddev->size_map=vid_buf.size;
290
168
if (vid_buf.frames>1) {
291
169
viddev->v4l_maxbuffer=2;
292
170
viddev->v4l_buffers[0]=map;
293
viddev->v4l_buffers[1]=map+vid_buf.offsets[1];
171
viddev->v4l_buffers[1]=(unsigned char *)map + vid_buf.offsets[1];
295
173
viddev->v4l_buffers[0]=map;
296
174
viddev->v4l_maxbuffer=1;
299
if ((unsigned char *)-1 == (unsigned char *)map) {
177
if (MAP_FAILED == map) {
302
180
viddev->v4l_curbuffer=0;
305
183
vid_mmap.width=width;
306
184
vid_mmap.height=height;
307
185
if (ioctl(dev, VIDIOCMCAPTURE, &vid_mmap) == -1) {
308
motion_log(cnt, LOG_DEBUG, 1, "Failed with YUV420P, trying YUV422 palette");
186
motion_log(LOG_DEBUG, 1, "Failed with YUV420P, trying YUV422 palette");
309
187
viddev->v4l_fmt=VIDEO_PALETTE_YUV422;
310
188
vid_mmap.format=viddev->v4l_fmt;
311
189
/* Try again... */
312
190
if (ioctl(dev, VIDIOCMCAPTURE, &vid_mmap) == -1) {
313
motion_log(cnt, LOG_DEBUG, 1, "Failed with YUV422, trying RGB24 palette");
314
viddev->v4l_fmt=VIDEO_PALETTE_RGB24;
191
motion_log(LOG_DEBUG, 1, "Failed with YUV422, trying YUYV palette");
192
viddev->v4l_fmt=VIDEO_PALETTE_YUYV;
315
193
vid_mmap.format=viddev->v4l_fmt;
317
195
if (ioctl(dev, VIDIOCMCAPTURE, &vid_mmap) == -1) {
318
motion_log(cnt, LOG_DEBUG, 1, "Failed with RGB24, trying GREYSCALE palette");
319
viddev->v4l_fmt=VIDEO_PALETTE_GREY;
196
motion_log(LOG_DEBUG, 1, "Failed with YUYV, trying RGB24 palette");
197
viddev->v4l_fmt=VIDEO_PALETTE_RGB24;
320
198
vid_mmap.format=viddev->v4l_fmt;
321
/* Try one last time... */
322
201
if (ioctl(dev, VIDIOCMCAPTURE, &vid_mmap) == -1) {
323
motion_log(cnt, LOG_ERR, 1, "Failed with all supported palettes "
202
motion_log(LOG_DEBUG, 1, "Failed with RGB24, trying GREYSCALE palette");
203
viddev->v4l_fmt=VIDEO_PALETTE_GREY;
204
vid_mmap.format=viddev->v4l_fmt;
205
/* Try one last time... */
206
if (ioctl(dev, VIDIOCMCAPTURE, &vid_mmap) == -1) {
207
motion_log(LOG_ERR, 1, "Failed with all supported palettes "
351
* v4l_next fetches a video frame from a v4l device
245
* v4l_next fetches a video frame from a v4l device
353
* cnt Pointer to the context for this thread
354
* viddev Pointer to struct containing video device handle
248
* viddev Pointer to struct containing video device handle amd device parameters
355
249
* map Pointer to the buffer in which the function puts the new image
356
250
* width Width of image in pixels
357
251
* height Height of image in pixels
362
* 1 Non fatal error (not implemented)
255
* V4L_FATAL_ERROR Fatal error
256
* Positive with bit 0 set and bit 1 unset
257
* Non fatal error (not implemented)
364
int v4l_next(struct context *cnt, struct video_dev *viddev, unsigned char *map, int width, int height)
259
int v4l_next(struct video_dev *viddev, unsigned char *map, int width, int height)
367
int frame=viddev->v4l_curbuffer;
261
int dev = viddev->fd;
262
int frame = viddev->v4l_curbuffer;
368
263
struct video_mmap vid_mmap;
369
unsigned char *cap_map=NULL;
264
unsigned char *cap_map;
371
266
sigset_t set, old;
373
if (viddev->v4l_read_img) {
374
if (read(dev, map, viddev->v4l_bufsize) != viddev->v4l_bufsize)
377
vid_mmap.format=viddev->v4l_fmt;
378
vid_mmap.width=width;
379
vid_mmap.height=height;
380
/* Block signals during IOCTL */
382
sigaddset (&set, SIGCHLD);
383
sigaddset (&set, SIGALRM);
384
sigaddset (&set, SIGUSR1);
385
sigaddset (&set, SIGTERM);
386
sigaddset (&set, SIGHUP);
387
pthread_sigmask (SIG_BLOCK, &set, &old);
389
cap_map=viddev->v4l_buffers[viddev->v4l_curbuffer];
390
viddev->v4l_curbuffer++;
391
if (viddev->v4l_curbuffer >= viddev->v4l_maxbuffer)
392
viddev->v4l_curbuffer=0;
393
vid_mmap.frame=viddev->v4l_curbuffer;
395
if (ioctl(dev, VIDIOCMCAPTURE, &vid_mmap) == -1) {
396
motion_log(cnt, LOG_ERR, 1, "mcapture error in proc %d", getpid());
397
sigprocmask (SIG_UNBLOCK, &old, NULL);
401
vid_mmap.frame=frame;
402
if (ioctl(dev, VIDIOCSYNC, &vid_mmap.frame) == -1) {
403
motion_log(cnt, LOG_ERR, 1, "sync error in proc %d", getpid());
404
sigprocmask (SIG_UNBLOCK, &old, NULL);
407
pthread_sigmask (SIG_UNBLOCK, &old, NULL); /*undo the signal blocking*/
409
if (!viddev->v4l_read_img) {
410
switch (viddev->v4l_fmt) {
411
case VIDEO_PALETTE_RGB24:
412
rgb24toyuv420p(map, cap_map, width, height);
414
case VIDEO_PALETTE_YUV422:
415
yuv422to420p(map, cap_map, width, height);
418
memcpy(map, cap_map, viddev->v4l_bufsize);
268
/* MMAP method is used */
269
vid_mmap.format = viddev->v4l_fmt;
270
vid_mmap.width = width;
271
vid_mmap.height = height;
273
/* Block signals during IOCTL */
275
sigaddset(&set, SIGCHLD);
276
sigaddset(&set, SIGALRM);
277
sigaddset(&set, SIGUSR1);
278
sigaddset(&set, SIGTERM);
279
sigaddset(&set, SIGHUP);
280
pthread_sigmask (SIG_BLOCK, &set, &old);
282
cap_map = viddev->v4l_buffers[viddev->v4l_curbuffer];
283
viddev->v4l_curbuffer++;
285
if (viddev->v4l_curbuffer >= viddev->v4l_maxbuffer)
286
viddev->v4l_curbuffer = 0;
288
vid_mmap.frame = viddev->v4l_curbuffer;
290
if (ioctl(dev, VIDIOCMCAPTURE, &vid_mmap) == -1) {
291
motion_log(LOG_ERR, 1, "mcapture error in proc %d", getpid());
292
sigprocmask (SIG_UNBLOCK, &old, NULL);
293
return V4L_FATAL_ERROR;
296
vid_mmap.frame=frame;
298
if (ioctl(dev, VIDIOCSYNC, &vid_mmap.frame) == -1) {
299
motion_log(LOG_ERR, 1, "sync error in proc %d", getpid());
300
sigprocmask (SIG_UNBLOCK, &old, NULL);
303
pthread_sigmask (SIG_UNBLOCK, &old, NULL); /*undo the signal blocking*/
305
switch (viddev->v4l_fmt) {
306
case VIDEO_PALETTE_RGB24:
307
conv_rgb24toyuv420p(map, cap_map, width, height);
309
case VIDEO_PALETTE_YUYV:
310
case VIDEO_PALETTE_YUV422:
311
conv_yuv422to420p(map, cap_map, width, height);
314
memcpy(map, cap_map, viddev->v4l_bufsize);
507
403
vloopbacks=fopen("/proc/video/vloopback/vloopbacks", "r");
508
404
if (!vloopbacks) {
509
motion_log(cnt, LOG_ERR, 1, "Failed to open '/proc/video/vloopback/vloopbacks'");
405
motion_log(LOG_ERR, 1, "Failed to open '/proc/video/vloopback/vloopbacks'");
513
409
/* Read vloopback version*/
514
410
if (!fgets(buffer, 255, vloopbacks)) {
515
motion_log(cnt, LOG_ERR, 1, "Unable to read vloopback version");
411
motion_log(LOG_ERR, 1, "Unable to read vloopback version");
519
415
fprintf(stderr,"\t%s", buffer);
521
/* Read explaination line */
417
/* Read explanation line */
523
419
if (!fgets(buffer, 255, vloopbacks)) {
524
motion_log(cnt, LOG_ERR, 1, "Unable to read vloopback explanation line");
420
motion_log(LOG_ERR, 1, "Unable to read vloopback explanation line");
626
522
if (ioctl(dev, VIDIOCGPICT, &vid_pic)== -1) {
627
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCGPICT)");
523
motion_log(LOG_ERR, 1, "ioctl (VIDIOCGPICT)");
630
526
vid_pic.palette=type;
631
527
if (ioctl(dev, VIDIOCSPICT, &vid_pic)== -1) {
632
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCSPICT)");
528
motion_log(LOG_ERR, 1, "ioctl (VIDIOCSPICT)");
635
531
if (ioctl(dev, VIDIOCGWIN, &vid_win)== -1) {
636
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCGWIN)");
532
motion_log(LOG_ERR, 1, "ioctl (VIDIOCGWIN)");
639
535
vid_win.height=height;
640
536
vid_win.width=width;
641
537
if (ioctl(dev, VIDIOCSWIN, &vid_win)== -1) {
642
motion_log(cnt, LOG_ERR, 1, "ioctl (VIDIOCSWIN)");
538
motion_log(LOG_ERR, 1, "ioctl (VIDIOCSWIN)");
650
546
return write(dev, image, size);
653
/*****************************************************************************
654
Wrappers calling the actual capture routines
655
*****************************************************************************/
657
#endif /*WITHOUT_V4L*/
658
/* big lock for vid_start */
659
pthread_mutex_t vid_mutex;
662
/* structure used for per device locking */
663
struct video_dev **viddevs=NULL;
665
void vid_init(struct context *cnt)
668
viddevs=mymalloc(cnt, sizeof(struct video_dev *));
672
pthread_mutex_init(&vid_mutex, NULL);
675
/* Called by childs to get rid of open video devices */
681
while(viddevs[++i]) {
682
close(viddevs[i]->fd);
687
void vid_cleanup(void)
691
while(viddevs[++i]) {
692
munmap(viddevs[i]->v4l_buffers[0],viddevs[i]->size_map);
699
#endif /*WITHOUT_V4L*/
701
int vid_start (struct context *cnt)
703
struct config *conf=&cnt->conf;
706
if (conf->netcam_url) {
707
return netcam_start(cnt);
713
int width, height, input, norm, tuner_number;
714
unsigned long frequency;
716
/* We use width and height from conf in this function. They will be assigned
717
* to width and height in imgs here, and cap_width and cap_height in
718
* rotate_data won't be set until in rotate_init.
721
height = conf->height;
724
frequency = conf->frequency;
725
tuner_number = conf->tuner_number;
727
pthread_mutex_lock(&vid_mutex);
729
/* Transfer width and height from conf to imgs. The imgs values are the ones
730
* that is used internally in Motion. That way, setting width and height via
731
* xmlrpc won't screw things up.
733
cnt->imgs.width=width;
734
cnt->imgs.height=height;
736
while (viddevs[++i]) {
737
if (!strcmp(conf->video_device, viddevs[i]->video_device)) {
739
cnt->imgs.type=viddevs[i]->v4l_fmt;
740
switch (cnt->imgs.type) {
741
case VIDEO_PALETTE_GREY:
742
cnt->imgs.motionsize=width*height;
743
cnt->imgs.size=width*height;
745
case VIDEO_PALETTE_RGB24:
746
case VIDEO_PALETTE_YUV422:
747
cnt->imgs.type=VIDEO_PALETTE_YUV420P;
748
case VIDEO_PALETTE_YUV420P:
749
cnt->imgs.motionsize=width*height;
750
cnt->imgs.size=(width*height*3)/2;
754
pthread_mutex_unlock(&vid_mutex);
759
viddevs=myrealloc(cnt, viddevs, sizeof(struct video_dev *)*(i+2), "vid_start");
760
viddevs[i]=mymalloc(cnt, sizeof(struct video_dev));
761
memset(viddevs[i], 0, sizeof(struct video_dev));
764
pthread_mutexattr_init(&viddevs[i]->attr);
765
pthread_mutex_init(&viddevs[i]->mutex, NULL);
767
dev=open(conf->video_device, O_RDWR);
769
motion_log(cnt, LOG_ERR, 1, "Failed to open video device %s", conf->video_device);
770
motion_log(cnt, LOG_ERR, 0, "Motion Exits");
774
viddevs[i]->video_device=conf->video_device;
776
viddevs[i]->input=input;
777
viddevs[i]->height=height;
778
viddevs[i]->width=width;
779
viddevs[i]->freq=frequency;
780
viddevs[i]->tuner_number=tuner_number;
782
/* We set brightness, contrast, saturation and hue = 0 so that they only get
783
* set if the config is not zero.
785
viddevs[i]->brightness=0;
786
viddevs[i]->contrast=0;
787
viddevs[i]->saturation=0;
789
viddevs[i]->owner=-1;
791
viddevs[i]->v4l_fmt=VIDEO_PALETTE_YUV420P;
793
if (!v4l_start (cnt, viddevs[i], width, height, input, norm, frequency, tuner_number)) {
794
pthread_mutex_unlock(&vid_mutex);
797
cnt->imgs.type=viddevs[i]->v4l_fmt;
798
switch (cnt->imgs.type) {
799
case VIDEO_PALETTE_GREY:
800
cnt->imgs.size=width*height;
801
cnt->imgs.motionsize=width*height;
803
case VIDEO_PALETTE_RGB24:
804
case VIDEO_PALETTE_YUV422:
805
cnt->imgs.type=VIDEO_PALETTE_YUV420P;
806
case VIDEO_PALETTE_YUV420P:
807
cnt->imgs.size=(width*height*3)/2;
808
cnt->imgs.motionsize=width*height;
812
pthread_mutex_unlock(&vid_mutex);
814
#endif /*WITHOUT_V4L*/
820
* vid_next fetches a video frame from a either v4l device or netcam
822
* cnt Pointer to the context for this thread
823
* map Pointer to the buffer in which the function puts the new image
828
* -2 Fatal Netcam error
829
* 1 Non fatal V4L error (not implemented)
830
* 2 Non fatal Netcam error
832
int vid_next(struct context *cnt, unsigned char *map)
834
struct config *conf=&cnt->conf;
837
if (conf->netcam_url) {
838
ret = netcam_next(cnt, map);
845
int dev = cnt->video_dev;
847
/* NOTE: Since this is a capture, we need to use capture dimensions. */
848
width = cnt->rotate_data.cap_width;
849
height = cnt->rotate_data.cap_height;
852
if (viddevs[i]->fd==dev)
858
if (viddevs[i]->owner!=cnt->threadnr) {
859
pthread_mutex_lock(&viddevs[i]->mutex);
860
viddevs[i]->owner=cnt->threadnr;
861
viddevs[i]->frames=conf->roundrobin_frames;
865
v4l_set_input(cnt, viddevs[i], map, width, height, conf->input, conf->norm,
866
conf->roundrobin_skip, conf->frequency, conf->tuner_number);
867
ret = v4l_next(cnt, viddevs[i], map, width, height);
869
if (--viddevs[i]->frames <= 0) {
870
viddevs[i]->owner=-1;
871
pthread_mutex_unlock(&viddevs[i]->mutex);
874
if(cnt->rotate_data.degrees > 0) {
875
/* rotate the image as specified */
876
rotate_map(cnt, map);
879
#endif /*WITHOUT_V4L*/
884
int vid_startpipe (struct context *cnt, char *devname, int width, int height, int type)
886
return v4l_startpipe(cnt, devname, width, height, type);
550
int vid_startpipe(const char *devname, int width, int height, int type)
552
return v4l_startpipe( (char *)devname, width, height, type);
889
555
int vid_putpipe (int dev, unsigned char *image, int size)
891
return v4l_putpipe (dev, image, size);
557
return v4l_putpipe(dev, image, size);
893
559
#endif /*WITHOUT_V4L*/