From: <enl...@li...> - 2001-07-11 08:07:19
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: fooo =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -3 -r1.43 -r1.44 --- webcam.c 2001/07/10 23:08:35 1.43 +++ webcam.c 2001/07/11 08:07:16 1.44 @@ -461,6 +461,9 @@ int i = 0; int j = lag_reduce; + if(grab_fd == -1) + grab_init(); + if (j == 0) j++; |
From: <enl...@li...> - 2001-07-12 17:45:14
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: oops, I broke autogain etc on pwc cams =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -3 -r1.44 -r1.45 --- webcam.c 2001/07/11 08:07:16 1.44 +++ webcam.c 2001/07/12 17:45:13 1.45 @@ -170,12 +170,21 @@ int find_palette(int fd, struct video_mmap *vid) { + if (try_palette(fd, VIDEO_PALETTE_RGB24, 24)) + { + printf("negotiated palette RGB24\n"); + return VIDEO_PALETTE_RGB24; + } if (try_palette(fd, VIDEO_PALETTE_YUV420P, 16)) - return VIDEO_PALETTE_YUV420P; + { + printf("negotiated palette YUV420P\n"); + return VIDEO_PALETTE_YUV420P; + } if (try_palette(fd, VIDEO_PALETTE_YUV420, 16)) + { + printf("negotiated palette YUV420\n"); return VIDEO_PALETTE_YUV420; - if (try_palette(fd, VIDEO_PALETTE_RGB24, 24)) - return VIDEO_PALETTE_RGB24; + } fprintf(stderr, "No supported palette found, please report your device to the author\n"); exit(2); @@ -233,9 +242,6 @@ vwin.flags &= ~PWC_FPS_FRMASK; vwin.flags |= (cam_framerate << PWC_FPS_SHIFT); } - - /* Turning on snapshot mode */ - vwin.flags |= PWC_FPS_SNAPSHOT; ioctl(grab_fd, VIDIOCSWIN, &vwin); if (ioctl(grab_fd, VIDIOCPWCSAGC, &gain) < 0) |
From: <enl...@li...> - 2001-07-12 18:19:56
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: foo =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -3 -r1.45 -r1.46 --- webcam.c 2001/07/12 17:45:13 1.45 +++ webcam.c 2001/07/12 18:19:56 1.46 @@ -243,7 +243,12 @@ vwin.flags |= (cam_framerate << PWC_FPS_SHIFT); } - ioctl(grab_fd, VIDIOCSWIN, &vwin); + /* Turning off snapshot mode */ + vwin.flags &= ~(PWC_FPS_SNAPSHOT); + + if(ioctl(grab_fd, VIDIOCSWIN, &vwin) < 0) + perror("trying to set extra pwc flags"); + if (ioctl(grab_fd, VIDIOCPWCSAGC, &gain) < 0) perror("trying to set gain"); if (ioctl(grab_fd, VIDIOCPWCSSHUTTER, &shutter) < 0) |
From: <enl...@li...> - 2001-07-12 18:57:51
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: *ahem, fixed the brightness problem =P =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -3 -r1.46 -r1.47 --- webcam.c 2001/07/12 18:19:56 1.46 +++ webcam.c 2001/07/12 18:57:50 1.47 @@ -210,14 +210,17 @@ exit(1); } - memset(&cam_pic, 0, sizeof(struct video_picture)); - cam_pic.contrast = 65535 * (cam_contrast / 100); - cam_pic.brightness = 65535 * (cam_brightness / 100); - cam_pic.hue = 65535 * (cam_hue / 100); - cam_pic.colour = 65535 * (cam_colour / 100); - cam_pic.whiteness = 65535 * (cam_whiteness / 100); - + if(ioctl(grab_fd, VIDIOCGPICT, &cam_pic) < 0) + perror("getting pic info"); + cam_pic.contrast = 65535 * ((float)cam_contrast / 100); + cam_pic.brightness = 65535 * ((float)cam_brightness / 100); + cam_pic.hue = 65535 * ((float)cam_hue / 100); + cam_pic.colour = 65535 * ((float)cam_colour / 100); + cam_pic.whiteness = 65535 * ((float)cam_whiteness / 100); + if (ioctl(grab_fd, VIDIOCSPICT, &cam_pic) < 0) + perror("setting cam pic"); device_palette = find_palette(grab_fd, &grab_buf); + grab_buf.format = device_palette; grab_buf.frame = 0; grab_buf.width = grab_width; @@ -1101,7 +1104,7 @@ cam_framerate = 1; /* print config */ - fprintf(stderr, "camE v1.1 - (c) 1999, 2000 Gerd Knorr, Tom Gilbert\n"); + fprintf(stderr, "camE v1.2 - (c) 1999, 2000 Gerd Knorr, Tom Gilbert\n"); fprintf(stderr, "grabber config: size %dx%d, input %d, norm %d, " "jpeg quality %d\n", grab_width, grab_height, grab_input, |
From: <enl...@li...> - 2001-07-16 19:05:03
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: time to debug this ov511 problem =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.47 retrieving revision 1.48 diff -u -3 -r1.47 -r1.48 --- webcam.c 2001/07/12 18:57:50 1.47 +++ webcam.c 2001/07/16 19:05:01 1.48 @@ -227,6 +227,7 @@ grab_buf.height = grab_height; ioctl(grab_fd, VIDIOCGMBUF, &vid_mbuf); + printf("%s detected\n", grab_cap.name); /* special philips features */ if (sscanf(grab_cap.name, "Philips %d webcam", &type) > 0) @@ -236,7 +237,7 @@ int gain = -1; /* philips cam detected, maybe enable special features */ - printf("Philips %d webcam detected\n", type); + printf("enabling pwc-specific features\n"); ioctl(grab_fd, VIDIOCGWIN, &vwin); if (vwin.flags & PWC_FPS_MASK) |
From: <enl...@li...> - 2001-08-08 19:37:44
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: Added -c option to specify config file, and normal -v (version) and -h (usage) options too. Sends all output to the logfile now, if it's enabled. =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -3 -r1.48 -r1.49 --- webcam.c 2001/07/16 19:05:01 1.48 +++ webcam.c 2001/08/08 19:37:43 1.49 @@ -37,6 +37,8 @@ #include "parseconfig.h" #include "pwc-ioctl.h" +#define VERSION "1.2" + void log(char *fmt, ...); char *ftp_host = "www"; @@ -172,17 +174,17 @@ { if (try_palette(fd, VIDEO_PALETTE_RGB24, 24)) { - printf("negotiated palette RGB24\n"); + log("negotiated palette RGB24\n"); return VIDEO_PALETTE_RGB24; } if (try_palette(fd, VIDEO_PALETTE_YUV420P, 16)) { - printf("negotiated palette YUV420P\n"); - return VIDEO_PALETTE_YUV420P; + log("negotiated palette YUV420P\n"); + return VIDEO_PALETTE_YUV420P; } if (try_palette(fd, VIDEO_PALETTE_YUV420, 16)) { - printf("negotiated palette YUV420\n"); + log("negotiated palette YUV420\n"); return VIDEO_PALETTE_YUV420; } fprintf(stderr, @@ -210,13 +212,13 @@ exit(1); } - if(ioctl(grab_fd, VIDIOCGPICT, &cam_pic) < 0) + if (ioctl(grab_fd, VIDIOCGPICT, &cam_pic) < 0) perror("getting pic info"); - cam_pic.contrast = 65535 * ((float)cam_contrast / 100); - cam_pic.brightness = 65535 * ((float)cam_brightness / 100); - cam_pic.hue = 65535 * ((float)cam_hue / 100); - cam_pic.colour = 65535 * ((float)cam_colour / 100); - cam_pic.whiteness = 65535 * ((float)cam_whiteness / 100); + cam_pic.contrast = 65535 * ((float) cam_contrast / 100); + cam_pic.brightness = 65535 * ((float) cam_brightness / 100); + cam_pic.hue = 65535 * ((float) cam_hue / 100); + cam_pic.colour = 65535 * ((float) cam_colour / 100); + cam_pic.whiteness = 65535 * ((float) cam_whiteness / 100); if (ioctl(grab_fd, VIDIOCSPICT, &cam_pic) < 0) perror("setting cam pic"); device_palette = find_palette(grab_fd, &grab_buf); @@ -227,7 +229,7 @@ grab_buf.height = grab_height; ioctl(grab_fd, VIDIOCGMBUF, &vid_mbuf); - printf("%s detected\n", grab_cap.name); + log("%s detected\n", grab_cap.name); /* special philips features */ if (sscanf(grab_cap.name, "Philips %d webcam", &type) > 0) @@ -237,7 +239,7 @@ int gain = -1; /* philips cam detected, maybe enable special features */ - printf("enabling pwc-specific features\n"); + log("enabling pwc-specific features\n"); ioctl(grab_fd, VIDIOCGWIN, &vwin); if (vwin.flags & PWC_FPS_MASK) @@ -250,7 +252,7 @@ /* Turning off snapshot mode */ vwin.flags &= ~(PWC_FPS_SNAPSHOT); - if(ioctl(grab_fd, VIDIOCSWIN, &vwin) < 0) + if (ioctl(grab_fd, VIDIOCSWIN, &vwin) < 0) perror("trying to set extra pwc flags"); if (ioctl(grab_fd, VIDIOCPWCSAGC, &gain) < 0) @@ -476,8 +478,8 @@ int i = 0; int j = lag_reduce; - if(grab_fd == -1) - grab_init(); + if (grab_fd == -1) + grab_init(); if (j == 0) j++; @@ -916,6 +918,21 @@ return if_nametoindex(watch_interface); } +void version(void) +{ + printf("camE version %s\n", VERSION); + exit(0); +} + +void usage(void) +{ + printf("usage: camE [OPTION]\n"); + printf(" -c FILE Use config file FILE\n"); + printf(" -f Don't fork to background\n"); + printf(" -h -v This message\n"); + exit(0); +} + int main(int argc, char *argv[]) { @@ -930,12 +947,34 @@ int just_shot = 0, upload_successful = 1; int new_delay; FILE *fp; + int ch; + int dont_fork = 0; + char *config_file = NULL; - if ((argc >= 2) && (!strcmp(argv[1], "-f"))) + while ((ch = getopt(argc, argv, "c:fhv")) != EOF) { - /* don't fork */ + switch (ch) + { + case 'c': + config_file = strdup(optarg); + break; + case 'f': + dont_fork = 1; + break; + case 'h': + usage(); + break; + case 'v': + version(); + break; + case '?': + default: + usage(); + break; + } } - else + + if (!dont_fork) { /* fork and die */ if ((childpid = fork()) < 0) @@ -948,9 +987,15 @@ } /* read config */ - sprintf(filename, "%s/%s", getenv("HOME"), ".camErc"); - fprintf(stderr, "reading config file: %s\n", filename); - cfg_parse_file(filename); + if (config_file) + { + cfg_parse_file(config_file); + } + else + { + sprintf(filename, "%s/%s", getenv("HOME"), ".camErc"); + cfg_parse_file(filename); + } if (NULL != (val = cfg_get_str("ftp", "host"))) ftp_host = val; @@ -1103,17 +1148,7 @@ cam_framerate = 60; if (cam_framerate < 1) cam_framerate = 1; - - /* print config */ - fprintf(stderr, "camE v1.2 - (c) 1999, 2000 Gerd Knorr, Tom Gilbert\n"); - fprintf(stderr, - "grabber config: size %dx%d, input %d, norm %d, " - "jpeg quality %d\n", grab_width, grab_height, grab_input, - grab_norm, grab_quality); - if (ftp_do) - fprintf(stderr, "ftp config:\n %s@%s:%s\n %s => %s\n", ftp_user, - ftp_host, ftp_dir, ftp_tmp, ftp_file); - + /* clear logfile */ if (logfile) { @@ -1121,6 +1156,15 @@ if (fp) fclose(fp); } + + /* print config */ + log("camE " VERSION " - (c) 1999, 2000 Gerd Knorr, Tom Gilbert\n"); + log("grabber config: size %dx%d, input %d, norm %d, " + "jpeg quality %d\n", grab_width, grab_height, grab_input, + grab_norm, grab_quality); + if (ftp_do) + log("ftp config:\n %s@%s:%s\n %s => %s\n", ftp_user, + ftp_host, ftp_dir, ftp_tmp, ftp_file); /* init everything */ grab_init(); |
From: <enl...@li...> - 2001-09-07 21:03:06
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: example.camErc example.camErc.ssh webcam.c Log Message: option to upload an offline image when you stop the cam =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc,v retrieving revision 1.17 retrieving revision 1.18 diff -u -3 -r1.17 -r1.18 --- example.camErc 2001/07/10 23:08:35 1.17 +++ example.camErc 2001/09/07 20:58:06 1.18 @@ -100,8 +100,10 @@ # file to check for before shooting. while this file exists, no shots will # be taken. blockfile = /home/gilbertt/BLOCKCAM +# image to upload when blockfile is first put in place +offline_image = /home/gilbertt/.block.jpg # File to check before shotting, while this file exists, shots will be taken. -# but not uploaded. +# but not uploaded. blockimage will not be uploaded if you set this. uploadblockfile = /home/gilbertt/BLOCKUPLOAD # Shots will only be taken/uploaded if the specified interface is active. #watch_interface = ppp0 =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc.ssh,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- example.camErc.ssh 2001/07/10 19:30:50 1.5 +++ example.camErc.ssh 2001/09/07 20:58:06 1.6 @@ -84,6 +84,8 @@ # file to check for before shooting. while this file exists, no shots will # be taken. blockfile = /home/gilbertt/BLOCKCAM +# image to upload when blockfile is first put in place +offline_image = /home/gilbertt/.block.jpg # File to check before shotting, while this file exists, shots will be taken. # but not uploaded. uploadblockfile = /home/gilbertt/BLOCKUPLOAD =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -3 -r1.49 -r1.50 --- webcam.c 2001/08/08 19:37:43 1.49 +++ webcam.c 2001/09/07 20:58:06 1.50 @@ -105,6 +105,7 @@ Imlib_Font title_fn, text_fn; char *ftp_interface = "-"; char *watch_interface = NULL; +char *offline_image = NULL; int interface_active = 0; int device_palette; @@ -736,7 +737,7 @@ /* upload local to tmp then MV to remote */ void -ftp_upload1(char *local, char *remote, char *tmp) +ftp_upload(char *local, char *remote, char *tmp) { char buf[2096]; FILE *infile; @@ -918,13 +919,15 @@ return if_nametoindex(watch_interface); } -void version(void) +void +version(void) { printf("camE version %s\n", VERSION); exit(0); } -void usage(void) +void +usage(void) { printf("usage: camE [OPTION]\n"); printf(" -c FILE Use config file FILE\n"); @@ -934,6 +937,67 @@ } int +do_upload(char *file) +{ + struct stat st; + int upload_successful = 1; + if (ftp_do) + { + if ((upload_blockfile && (stat(upload_blockfile, &st) == -1)) + || !upload_blockfile) + { + log("*** uploading via ftp\n"); + ftp_upload(file, ftp_file, ftp_tmp); + log("shot uploaded\n"); + if (action_post_upload) + { + log("running post upload action\n"); + system(action_post_upload); + log("post upload action done\n"); + } + } + } + else if (scp_target) + { + char target_buf[2048]; + char cmd_buf[4096]; + char *scp_args[] = { "scp", "-BCq", NULL, NULL, NULL }; + char *ssh_args[] = { "ssh", "-n", "-q", NULL, NULL, NULL }; + + if (!upload_blockfile + || (upload_blockfile && (stat(upload_blockfile, &st) == -1))) + { + log("uploading via scp\n"); + snprintf(target_buf, sizeof(target_buf), "%s:%s/%s", scp_target, + ftp_dir, ftp_tmp); + snprintf(cmd_buf, sizeof(cmd_buf), "mv %s/%s %s/%s", ftp_dir, + ftp_tmp, ftp_dir, ftp_file); + scp_args[2] = file; + scp_args[3] = target_buf; + if ((upload_successful = + execvp_with_timeout(scp_timeout, "scp", scp_args))) + { + ssh_args[3] = scp_target; + ssh_args[4] = cmd_buf; + if ((upload_successful = + execvp_with_timeout(scp_timeout, "ssh", ssh_args))) + { + log("shot uploaded\n"); + + if (action_post_upload) + { + log("running post upload action\n"); + system(action_post_upload); + log("post upload action done\n"); + } + } + } + } + } + return upload_successful; +} + +int main(int argc, char *argv[]) { unsigned char *val; @@ -949,6 +1013,7 @@ FILE *fp; int ch; int dont_fork = 0; + int offline_done = 1; char *config_file = NULL; while ((ch = getopt(argc, argv, "c:fhv")) != EOF) @@ -1067,6 +1132,8 @@ overlay_file = val; if (NULL != (val = cfg_get_str("grab", "watch_interface"))) watch_interface = val; + if (NULL != (val = cfg_get_str("grab", "offline_image"))) + offline_image = val; if (-1 != (i = cfg_get_int("grab", "width"))) grab_width = i; if (-1 != (i = cfg_get_int("grab", "height"))) @@ -1148,7 +1215,7 @@ cam_framerate = 60; if (cam_framerate < 1) cam_framerate = 1; - + /* clear logfile */ if (logfile) { @@ -1159,16 +1226,9 @@ /* print config */ log("camE " VERSION " - (c) 1999, 2000 Gerd Knorr, Tom Gilbert\n"); - log("grabber config: size %dx%d, input %d, norm %d, " - "jpeg quality %d\n", grab_width, grab_height, grab_input, - grab_norm, grab_quality); - if (ftp_do) - log("ftp config:\n %s@%s:%s\n %s => %s\n", ftp_user, - ftp_host, ftp_dir, ftp_tmp, ftp_file); + log("grabber config: size %dx%d, input %d, norm %d, " "jpeg quality %d\n", + grab_width, grab_height, grab_input, grab_norm, grab_quality); - /* init everything */ - grab_init(); - imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT); imlib_add_path_to_font_path(ttf_dir); imlib_add_path_to_font_path("."); @@ -1186,7 +1246,26 @@ text_fn = imlib_load_font(text_font); if (!text_fn) fprintf(stderr, "can't load font %s\n", text_font); + if (offline_image) + { + Imlib_Image image = imlib_load_image(offline_image); + if (!image) + { + fprintf(stderr, "can't load offline image %s, ignoring\n", + offline_image); + offline_image = NULL; + } + else + { + imlib_context_set_image(image); + imlib_free_image_and_decache(); + } + } + + /* init everything */ + grab_init(); + /* go! */ for (;;) { @@ -1195,10 +1274,10 @@ end_shot = 0; start_shot = 0; - if (((grab_blockfile && (stat(grab_blockfile, &st) == -1)) || !grab_blockfile) && check_interface(watch_interface)) { + offline_done = 0; time(&start_shot); if (action_pre_shot) { @@ -1268,61 +1347,17 @@ do_postprocess(temp_file); archive_jpeg(image); gib_imlib_free_image_and_decache(image); - if (ftp_do) - { - if ((upload_blockfile && (stat(upload_blockfile, &st) == -1)) - || !upload_blockfile) - { - log("*** uploading via ftp\n"); - ftp_upload1(temp_file, ftp_file, ftp_tmp); - log("shot uploaded\n"); - if (action_post_upload) - { - log("running post upload action\n"); - system(action_post_upload); - log("post upload action done\n"); - } - } - } - else if (scp_target) - { - char target_buf[2048]; - char cmd_buf[4096]; - char *scp_args[] = { "scp", "-BCq", NULL, NULL, NULL }; - char *ssh_args[] = { "ssh", "-n", "-q", NULL, NULL, NULL }; - - if ((upload_blockfile && (stat(upload_blockfile, &st) == -1)) - || !upload_blockfile) - { - log("uploading via scp\n"); - snprintf(target_buf, sizeof(target_buf), "%s:%s/%s", - scp_target, ftp_dir, ftp_tmp); - snprintf(cmd_buf, sizeof(cmd_buf), "mv %s/%s %s/%s", ftp_dir, - ftp_tmp, ftp_dir, ftp_file); - scp_args[2] = temp_file; - scp_args[3] = target_buf; - if ((upload_successful = - execvp_with_timeout(scp_timeout, "scp", scp_args))) - { - ssh_args[3] = scp_target; - ssh_args[4] = cmd_buf; - if ((upload_successful = - execvp_with_timeout(scp_timeout, "ssh", ssh_args))) - { - log("shot uploaded\n"); - - if (action_post_upload) - { - log("running post upload action\n"); - system(action_post_upload); - log("post upload action done\n"); - } - } - } - } - } + upload_successful = do_upload(temp_file); just_shot = 1; time(&end_shot); + } + else if (offline_image && !offline_done + && ((upload_blockfile && (stat(upload_blockfile, &st) == -1)) + || !upload_blockfile) && check_interface(watch_interface)) + { + /* blockfile was just created */ + log("uploading offline image\n"); + offline_done = do_upload(offline_image); } new_delay = grab_delay; if (just_shot && upload_successful) |
From: <enl...@li...> - 2002-02-21 00:08:29
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: Code submission from missen <mi...@mi...> Adds ftp keepalive option, which keeps the ftp connection open, instead of reopening it for each shot. I'm not sure if this will handle having an ftp session timed out, or disconnected very gracefully, so please test. =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -3 -r1.50 -r1.51 --- webcam.c 7 Sep 2001 20:58:06 -0000 1.50 +++ webcam.c 21 Feb 2002 00:07:58 -0000 1.51 @@ -52,6 +52,7 @@ pid_t childpid = 0; int ftp_passive = 1; int ftp_do = 1; +int ftp_keepalive = 1; char *scp_target = NULL; char *grab_device = "/dev/video0"; char *grab_text = ""; /* strftime */ @@ -127,6 +128,9 @@ int delay_correct = 0; int reinit_device = 0; +int connections = 0; +CURL *curl_handle = NULL; + struct video_picture cam_pic; /* these work for v4l only, not v4l2 */ @@ -742,7 +746,6 @@ char buf[2096]; FILE *infile; CURLcode ret; - CURL *curl_handle; struct stat st; struct curl_slist *post_commands = NULL; char *passwd_string, *url_string; @@ -763,7 +766,10 @@ post_commands = curl_slist_append(post_commands, buf); /* init the curl session */ - curl_handle = curl_easy_init(); + if(connections < 1) { + curl_handle = curl_easy_init(); + connections++; + } curl_easy_setopt(curl_handle, CURLOPT_INFILE, infile); curl_easy_setopt(curl_handle, CURLOPT_INFILESIZE, st.st_size); @@ -904,8 +910,11 @@ } /* cleanup curl stuff */ - curl_easy_cleanup(curl_handle); - curl_slist_free_all(post_commands); + if(!ftp_keepalive) { + curl_easy_cleanup(curl_handle); + curl_slist_free_all(post_commands); + connections--; + } free(url_string); free(passwd_string); fclose(infile); @@ -1080,6 +1089,8 @@ ftp_debug = i; if (-1 != (i = cfg_get_int("ftp", "do"))) ftp_do = i; + if (-1 != (i = cfg_get_int("ftp", "keepalive"))) + ftp_keepalive = i; if (-1 != (i = cfg_get_int("ftp", "timeout"))) ftp_timeout = i; if (NULL != (val = cfg_get_str("ftp", "interface"))) @@ -1358,6 +1369,7 @@ /* blockfile was just created */ log("uploading offline image\n"); offline_done = do_upload(offline_image); + log("OFFLINE\n"); } new_delay = grab_delay; if (just_shot && upload_successful) |
From: <enl...@li...> - 2002-02-23 12:49:55
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: Check errors saving images, lots of people don't have imlib2 installed, or have it installed without the loaders (apparently the rpm is braindead wrt deps or something), so it's kinda useful to tell them when the save fails. * once again wishes for a proper imlib2 strerror(). =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -3 -r1.51 -r1.52 --- webcam.c 21 Feb 2002 00:07:58 -0000 1.51 +++ webcam.c 23 Feb 2002 12:49:54 -0000 1.52 @@ -39,7 +39,8 @@ #define VERSION "1.2" -void log(char *fmt, ...); +void log(char *fmt, + ...); char *ftp_host = "www"; char *ftp_user = "webcam"; @@ -141,467 +142,449 @@ static int grab_fd = -1; static int grab_size = 0; static unsigned char *grab_data = NULL; -Imlib_Image convert_yuv420p_to_imlib2(unsigned char *mem, int width, +Imlib_Image convert_yuv420p_to_imlib2(unsigned char *mem, + int width, int height); -int execvp_with_timeout(int timeout, char *file, char **argv); +int execvp_with_timeout(int timeout, + char *file, + char **argv); void alarm_handler(int sig); +int save_image(Imlib_Image image, char *file); void close_device() { - if (munmap(grab_data, grab_size) != 0) - { - perror("munmap()"); - exit(1); - } - grab_data = NULL; - if (close(grab_fd)) - perror("close(grab_fd) "); - grab_fd = -1; + if (munmap(grab_data, grab_size) != 0) { + perror("munmap()"); + exit(1); + } + grab_data = NULL; + if (close(grab_fd)) + perror("close(grab_fd) "); + grab_fd = -1; } int -try_palette(int fd, int pal, int depth) -{ - cam_pic.palette = pal; - cam_pic.depth = depth; - if (ioctl(fd, VIDIOCSPICT, &cam_pic) < 0) - return FALSE; - if (ioctl(fd, VIDIOCGPICT, &cam_pic) < 0) - return FALSE; - if (cam_pic.palette == pal) - return TRUE; - return FALSE; +try_palette(int fd, + int pal, + int depth) +{ + cam_pic.palette = pal; + cam_pic.depth = depth; + if (ioctl(fd, VIDIOCSPICT, &cam_pic) < 0) + return FALSE; + if (ioctl(fd, VIDIOCGPICT, &cam_pic) < 0) + return FALSE; + if (cam_pic.palette == pal) + return TRUE; + return FALSE; } int -find_palette(int fd, struct video_mmap *vid) +find_palette(int fd, + struct video_mmap *vid) { - if (try_palette(fd, VIDEO_PALETTE_RGB24, 24)) - { - log("negotiated palette RGB24\n"); - return VIDEO_PALETTE_RGB24; - } - if (try_palette(fd, VIDEO_PALETTE_YUV420P, 16)) - { - log("negotiated palette YUV420P\n"); - return VIDEO_PALETTE_YUV420P; - } - if (try_palette(fd, VIDEO_PALETTE_YUV420, 16)) - { - log("negotiated palette YUV420\n"); - return VIDEO_PALETTE_YUV420; - } - fprintf(stderr, - "No supported palette found, please report your device to the author\n"); - exit(2); - return 0; + if (try_palette(fd, VIDEO_PALETTE_RGB24, 24)) { + log("negotiated palette RGB24\n"); + return VIDEO_PALETTE_RGB24; + } + if (try_palette(fd, VIDEO_PALETTE_YUV420P, 16)) { + log("negotiated palette YUV420P\n"); + return VIDEO_PALETTE_YUV420P; + } + if (try_palette(fd, VIDEO_PALETTE_YUV420, 16)) { + log("negotiated palette YUV420\n"); + return VIDEO_PALETTE_YUV420; + } + fprintf(stderr, + "No supported palette found, please report your device to the author\n"); + exit(2); + return 0; } void grab_init() { - struct video_capability grab_cap; - struct video_channel grab_chan; - struct video_mbuf vid_mbuf; - int type; - - if ((grab_fd = open(grab_device, O_RDWR)) == -1) - { - fprintf(stderr, "open %s: %s\n", grab_device, strerror(errno)); - exit(1); - } - if (ioctl(grab_fd, VIDIOCGCAP, &grab_cap) == -1) - { - fprintf(stderr, "%s: no v4l device\n", grab_device); - exit(1); - } - - if (ioctl(grab_fd, VIDIOCGPICT, &cam_pic) < 0) - perror("getting pic info"); - cam_pic.contrast = 65535 * ((float) cam_contrast / 100); - cam_pic.brightness = 65535 * ((float) cam_brightness / 100); - cam_pic.hue = 65535 * ((float) cam_hue / 100); - cam_pic.colour = 65535 * ((float) cam_colour / 100); - cam_pic.whiteness = 65535 * ((float) cam_whiteness / 100); - if (ioctl(grab_fd, VIDIOCSPICT, &cam_pic) < 0) - perror("setting cam pic"); - device_palette = find_palette(grab_fd, &grab_buf); - - grab_buf.format = device_palette; - grab_buf.frame = 0; - grab_buf.width = grab_width; - grab_buf.height = grab_height; - - ioctl(grab_fd, VIDIOCGMBUF, &vid_mbuf); - log("%s detected\n", grab_cap.name); - - /* special philips features */ - if (sscanf(grab_cap.name, "Philips %d webcam", &type) > 0) - { - struct video_window vwin; - int shutter = -1; - int gain = -1; - - /* philips cam detected, maybe enable special features */ - log("enabling pwc-specific features\n"); - - ioctl(grab_fd, VIDIOCGWIN, &vwin); - if (vwin.flags & PWC_FPS_MASK) - { - /* Set new framerate */ - vwin.flags &= ~PWC_FPS_FRMASK; - vwin.flags |= (cam_framerate << PWC_FPS_SHIFT); - } - - /* Turning off snapshot mode */ - vwin.flags &= ~(PWC_FPS_SNAPSHOT); - - if (ioctl(grab_fd, VIDIOCSWIN, &vwin) < 0) - perror("trying to set extra pwc flags"); - - if (ioctl(grab_fd, VIDIOCPWCSAGC, &gain) < 0) - perror("trying to set gain"); - if (ioctl(grab_fd, VIDIOCPWCSSHUTTER, &shutter) < 0) - perror("trying to set shutter"); - } - - /* set image source and TV norm */ - grab_chan.channel = grab_input; - if (ioctl(grab_fd, VIDIOCGCHAN, &grab_chan) == -1) - { - perror("ioctl VIDIOCGCHAN"); - exit(1); - } - grab_chan.channel = grab_input; - grab_chan.norm = grab_norm; - if (ioctl(grab_fd, VIDIOCSCHAN, &grab_chan) == -1) - { - perror("ioctl VIDIOCSCHAN"); - exit(1); - } - - /* grab_size = grab_buf.width * grab_buf.height * 3; */ - grab_size = vid_mbuf.size; - grab_data = - mmap(0, grab_size, PROT_READ | PROT_WRITE, MAP_SHARED, grab_fd, 0); - if ((grab_data == NULL) || (-1 == (int) grab_data)) - { - fprintf(stderr, - "couldn't mmap vidcam. your card doesn't support that?\n"); - exit(1); - } + struct video_capability grab_cap; + struct video_channel grab_chan; + struct video_mbuf vid_mbuf; + int type; + + if ((grab_fd = open(grab_device, O_RDWR)) == -1) { + fprintf(stderr, "open %s: %s\n", grab_device, strerror(errno)); + exit(1); + } + if (ioctl(grab_fd, VIDIOCGCAP, &grab_cap) == -1) { + fprintf(stderr, "%s: no v4l device\n", grab_device); + exit(1); + } + + if (ioctl(grab_fd, VIDIOCGPICT, &cam_pic) < 0) + perror("getting pic info"); + cam_pic.contrast = 65535 * ((float) cam_contrast / 100); + cam_pic.brightness = 65535 * ((float) cam_brightness / 100); + cam_pic.hue = 65535 * ((float) cam_hue / 100); + cam_pic.colour = 65535 * ((float) cam_colour / 100); + cam_pic.whiteness = 65535 * ((float) cam_whiteness / 100); + if (ioctl(grab_fd, VIDIOCSPICT, &cam_pic) < 0) + perror("setting cam pic"); + device_palette = find_palette(grab_fd, &grab_buf); + + grab_buf.format = device_palette; + grab_buf.frame = 0; + grab_buf.width = grab_width; + grab_buf.height = grab_height; + + ioctl(grab_fd, VIDIOCGMBUF, &vid_mbuf); + log("%s detected\n", grab_cap.name); + + /* special philips features */ + if (sscanf(grab_cap.name, "Philips %d webcam", &type) > 0) { + struct video_window vwin; + int shutter = -1; + int gain = -1; + + /* philips cam detected, maybe enable special features */ + log("enabling pwc-specific features\n"); + + ioctl(grab_fd, VIDIOCGWIN, &vwin); + if (vwin.flags & PWC_FPS_MASK) { + /* Set new framerate */ + vwin.flags &= ~PWC_FPS_FRMASK; + vwin.flags |= (cam_framerate << PWC_FPS_SHIFT); + } + + /* Turning off snapshot mode */ + vwin.flags &= ~(PWC_FPS_SNAPSHOT); + + if (ioctl(grab_fd, VIDIOCSWIN, &vwin) < 0) + perror("trying to set extra pwc flags"); + + if (ioctl(grab_fd, VIDIOCPWCSAGC, &gain) < 0) + perror("trying to set gain"); + if (ioctl(grab_fd, VIDIOCPWCSSHUTTER, &shutter) < 0) + perror("trying to set shutter"); + } + + /* set image source and TV norm */ + grab_chan.channel = grab_input; + if (ioctl(grab_fd, VIDIOCGCHAN, &grab_chan) == -1) { + perror("ioctl VIDIOCGCHAN"); + exit(1); + } + grab_chan.channel = grab_input; + grab_chan.norm = grab_norm; + if (ioctl(grab_fd, VIDIOCSCHAN, &grab_chan) == -1) { + perror("ioctl VIDIOCSCHAN"); + exit(1); + } + + /* grab_size = grab_buf.width * grab_buf.height * 3; */ + grab_size = vid_mbuf.size; + grab_data = + mmap(0, grab_size, PROT_READ | PROT_WRITE, MAP_SHARED, grab_fd, 0); + if ((grab_data == NULL) || (-1 == (int) grab_data)) { + fprintf(stderr, + "couldn't mmap vidcam. your card doesn't support that?\n"); + exit(1); + } } /* This is a really simplistic approach. Speedups are welcomed. */ Imlib_Image -convert_yuv420p_to_imlib2(unsigned char *src, int width, int height) -{ - int line, col; - int y, u, v, yy, vr = 0, ug = 0, vg = 0, ub = 0; - int r, g, b; - unsigned char *sy, *su, *sv; - Imlib_Image im; - DATA32 *data, *dest; - - im = imlib_create_image(width, height); - imlib_context_set_image(im); - data = imlib_image_get_data(); - dest = data; - - sy = src; - su = sy + (width * height); - sv = su + (width * height / 4); - - for (line = 0; line < height; line++) - { - for (col = 0; col < width; col++) - { - y = *sy++; - yy = y << 8; - u = *su - 128; - ug = 88 * u; - ub = 454 * u; - v = *sv - 128; - vg = 183 * v; - vr = 359 * v; - - if ((col & 1) == 0) - { - su++; - sv++; - } - - r = (yy + vr) >> 8; - g = (yy - ug - vg) >> 8; - b = (yy + ub) >> 8; - - if (r < 0) - r = 0; - if (r > 255) - r = 255; - if (g < 0) - g = 0; - if (g > 255) - g = 255; - if (b < 0) - b = 0; - if (b > 255) - b = 255; +convert_yuv420p_to_imlib2(unsigned char *src, + int width, + int height) +{ + int line, col; + int y, u, v, yy, vr = 0, ug = 0, vg = 0, ub = 0; + int r, g, b; + unsigned char *sy, *su, *sv; + Imlib_Image im; + DATA32 *data, *dest; + + im = imlib_create_image(width, height); + imlib_context_set_image(im); + data = imlib_image_get_data(); + dest = data; + + sy = src; + su = sy + (width * height); + sv = su + (width * height / 4); + + for (line = 0; line < height; line++) { + for (col = 0; col < width; col++) { + y = *sy++; + yy = y << 8; + u = *su - 128; + ug = 88 * u; + ub = 454 * u; + v = *sv - 128; + vg = 183 * v; + vr = 359 * v; + + if ((col & 1) == 0) { + su++; + sv++; + } + + r = (yy + vr) >> 8; + g = (yy - ug - vg) >> 8; + b = (yy + ub) >> 8; + + if (r < 0) + r = 0; + if (r > 255) + r = 255; + if (g < 0) + g = 0; + if (g > 255) + g = 255; + if (b < 0) + b = 0; + if (b > 255) + b = 255; - *dest = (r << 16) | (g << 8) | b | 0xff000000; - dest++; - } - if ((line & 1) == 0) - { - su -= width / 2; - sv -= width / 2; - } - } - imlib_image_put_back_data(data); - return im; + *dest = (r << 16) | (g << 8) | b | 0xff000000; + dest++; + } + if ((line & 1) == 0) { + su -= width / 2; + sv -= width / 2; + } + } + imlib_image_put_back_data(data); + return im; } /* This is a really simplistic approach. Speedups are welcomed. */ Imlib_Image -convert_yuv420i_to_imlib2(unsigned char *src, int width, int height) -{ - int line, col, linewidth; - int y, u, v, yy, vr = 0, ug = 0, vg = 0, ub = 0; - int r, g, b; - unsigned char *sy, *su, *sv; - Imlib_Image im; - DATA32 *data, *dest; - - im = imlib_create_image(width, height); - imlib_context_set_image(im); - data = imlib_image_get_data(); - dest = data; - - linewidth = width + (width >> 1); - sy = src; - su = sy + 4; - sv = su + linewidth; - - /* - The biggest problem is the interlaced data, and the fact that odd - add even lines have V and U data, resp. - */ - - for (line = 0; line < height; line++) - { - for (col = 0; col < width; col++) - { - y = *sy++; - yy = y << 8; - if ((col & 1) == 0) - { - /* only at even colums we update the u/v data */ - u = *su - 128; - ug = 88 * u; - ub = 454 * u; - v = *sv - 128; - vg = 183 * v; - vr = 359 * v; - - su++; - sv++; - } - if ((col & 3) == 3) - { - sy += 2; /* skip u/v */ - su += 4; /* skip y */ - sv += 4; /* skip y */ - } - r = (yy + vr) >> 8; - g = (yy - ug - vg) >> 8; - b = (yy + ub) >> 8; - - if (r < 0) - r = 0; - if (r > 255) - r = 255; - if (g < 0) - g = 0; - if (g > 255) - g = 255; - if (b < 0) - b = 0; - if (b > 255) - b = 255; +convert_yuv420i_to_imlib2(unsigned char *src, + int width, + int height) +{ + int line, col, linewidth; + int y, u, v, yy, vr = 0, ug = 0, vg = 0, ub = 0; + int r, g, b; + unsigned char *sy, *su, *sv; + Imlib_Image im; + DATA32 *data, *dest; + + im = imlib_create_image(width, height); + imlib_context_set_image(im); + data = imlib_image_get_data(); + dest = data; + + linewidth = width + (width >> 1); + sy = src; + su = sy + 4; + sv = su + linewidth; + + /* + The biggest problem is the interlaced data, and the fact that odd + add even lines have V and U data, resp. + */ + + for (line = 0; line < height; line++) { + for (col = 0; col < width; col++) { + y = *sy++; + yy = y << 8; + if ((col & 1) == 0) { + /* only at even colums we update the u/v data */ + u = *su - 128; + ug = 88 * u; + ub = 454 * u; + v = *sv - 128; + vg = 183 * v; + vr = 359 * v; + + su++; + sv++; + } + if ((col & 3) == 3) { + sy += 2; /* skip u/v */ + su += 4; /* skip y */ + sv += 4; /* skip y */ + } + r = (yy + vr) >> 8; + g = (yy - ug - vg) >> 8; + b = (yy + ub) >> 8; + + if (r < 0) + r = 0; + if (r > 255) + r = 255; + if (g < 0) + g = 0; + if (g > 255) + g = 255; + if (b < 0) + b = 0; + if (b > 255) + b = 255; - *dest = (r << 16) | (g << 8) | b | 0xff000000; - dest++; - } - if (line & 1) - { - su += linewidth; - sv += linewidth; - } - else - { - su -= linewidth; - sv -= linewidth; - } - } - imlib_image_put_back_data(data); - return im; + *dest = (r << 16) | (g << 8) | b | 0xff000000; + dest++; + } + if (line & 1) { + su += linewidth; + sv += linewidth; + } else { + su -= linewidth; + sv -= linewidth; + } + } + imlib_image_put_back_data(data); + return im; } Imlib_Image -convert_rgb24_to_imlib2(unsigned char *mem, int width, int height) -{ - Imlib_Image im; - DATA32 *data, *dest; - unsigned char *src; - int i; - - im = imlib_create_image(width, height); - imlib_context_set_image(im); - data = imlib_image_get_data(); - - dest = data; - src = mem; - i = width * height; - while (i--) - { - *dest = (src[2] << 16) | (src[1] << 8) | src[0] | 0xff000000; - dest++; - src += 3; - } +convert_rgb24_to_imlib2(unsigned char *mem, + int width, + int height) +{ + Imlib_Image im; + DATA32 *data, *dest; + unsigned char *src; + int i; + + im = imlib_create_image(width, height); + imlib_context_set_image(im); + data = imlib_image_get_data(); + + dest = data; + src = mem; + i = width * height; + while (i--) { + *dest = (src[2] << 16) | (src[1] << 8) | src[0] | 0xff000000; + dest++; + src += 3; + } - imlib_image_put_back_data(data); + imlib_image_put_back_data(data); - return im; + return im; } Imlib_Image -grab_one(int *width, int *height) +grab_one(int *width, + int *height) { - Imlib_Image im; - int i = 0; - int j = lag_reduce; - - if (grab_fd == -1) - grab_init(); - - if (j == 0) - j++; - - while (j--) - { - if (ioctl(grab_fd, VIDIOCMCAPTURE, &grab_buf) == -1) - { - perror("ioctl VIDIOCMCAPTURE"); - return NULL; - } - if (ioctl(grab_fd, VIDIOCSYNC, &i) == -1) - { - perror("ioctl VIDIOCSYNC"); - return NULL; - } - } - switch (device_palette) - { - case VIDEO_PALETTE_YUV420P: - im = - convert_yuv420p_to_imlib2(grab_data, grab_buf.width, - grab_buf.height); - break; - case VIDEO_PALETTE_YUV420: - im = - convert_yuv420i_to_imlib2(grab_data, grab_buf.width, - grab_buf.height); - break; - case VIDEO_PALETTE_RGB24: - im = - convert_rgb24_to_imlib2(grab_data, grab_buf.width, - grab_buf.height); - break; - default: - fprintf(stderr, "eeek"); - exit(2); - } - if (close_dev) - close_device(); - if (im) - { - imlib_context_set_image(im); - imlib_image_attach_data_value("quality", NULL, grab_quality, NULL); - } - *width = grab_buf.width; - *height = grab_buf.height; - return im; + Imlib_Image im; + int i = 0; + int j = lag_reduce; + + if (grab_fd == -1) + grab_init(); + + if (j == 0) + j++; + + while (j--) { + if (ioctl(grab_fd, VIDIOCMCAPTURE, &grab_buf) == -1) { + perror("ioctl VIDIOCMCAPTURE"); + return NULL; + } + if (ioctl(grab_fd, VIDIOCSYNC, &i) == -1) { + perror("ioctl VIDIOCSYNC"); + return NULL; + } + } + switch (device_palette) { + case VIDEO_PALETTE_YUV420P: + im = + convert_yuv420p_to_imlib2(grab_data, grab_buf.width, grab_buf.height); + break; + case VIDEO_PALETTE_YUV420: + im = + convert_yuv420i_to_imlib2(grab_data, grab_buf.width, grab_buf.height); + break; + case VIDEO_PALETTE_RGB24: + im = + convert_rgb24_to_imlib2(grab_data, grab_buf.width, grab_buf.height); + break; + default: + fprintf(stderr, "eeek"); + exit(2); + } + if (close_dev) + close_device(); + if (im) { + imlib_context_set_image(im); + imlib_image_attach_data_value("quality", NULL, grab_quality, NULL); + } + *width = grab_buf.width; + *height = grab_buf.height; + return im; } char * get_message(void) { - static char buffer[4096]; - FILE *fp; + static char buffer[4096]; + FILE *fp; - fp = fopen(grab_infofile, "r"); - if (fp) - { - fgets(buffer, sizeof(buffer), fp); - fclose(fp); - return buffer; - } - return NULL; + fp = fopen(grab_infofile, "r"); + if (fp) { + fgets(buffer, sizeof(buffer), fp); + fclose(fp); + return buffer; + } + return NULL; } /* ---------------------------------------------------------------------- */ void -add_time_text(Imlib_Image image, char *message, int width, int height) -{ - time_t t; - struct tm *tm; - char line[255], title_line[255]; - int len; - int x, y, w, h; - - time(&t); - tm = localtime(&t); - strftime(line, 254, grab_text, tm); - if (title_text) - strftime(title_line, 254, title_text, tm); - - if (message) - strcat(line, message); - line[127] = '\0'; - - len = strlen(line); - - if (line[len - 1] == '\n') - line[--len] = '\0'; - - if (title_text && title_fn) - { - gib_imlib_get_text_size(title_fn, title_line, title_style, &w, &h, - IMLIB_TEXT_TO_RIGHT); - x = width - w - 2; - y = 2; - gib_imlib_image_fill_rectangle(image, x - 2, y - 1, w + 4, h + 2, bg_r, - bg_g, bg_b, bg_a); - gib_imlib_text_draw(image, title_fn, title_style, x, y, title_line, - IMLIB_TEXT_TO_RIGHT, title_r, title_g, title_b, - title_a); - } - - if (line && text_fn) - { - gib_imlib_get_text_size(text_fn, line, text_style, &w, &h, - IMLIB_TEXT_TO_RIGHT); - x = 2; - y = height - h - 2; - gib_imlib_image_fill_rectangle(image, x - 2, y - 1, w + 4, h + 2, bg_r, - bg_g, bg_b, bg_a); - gib_imlib_text_draw(image, text_fn, text_style, x, y, line, - IMLIB_TEXT_TO_RIGHT, text_r, text_g, text_b, - text_a); - } +add_time_text(Imlib_Image image, + char *message, + int width, + int height) +{ + time_t t; + struct tm *tm; + char line[255], title_line[255]; + int len; + int x, y, w, h; + + time(&t); + tm = localtime(&t); + strftime(line, 254, grab_text, tm); + if (title_text) + strftime(title_line, 254, title_text, tm); + + if (message) + strcat(line, message); + line[127] = '\0'; + + len = strlen(line); + + if (line[len - 1] == '\n') + line[--len] = '\0'; + + if (title_text && title_fn) { + gib_imlib_get_text_size(title_fn, title_line, title_style, &w, &h, + IMLIB_TEXT_TO_RIGHT); + x = width - w - 2; + y = 2; + gib_imlib_image_fill_rectangle(image, x - 2, y - 1, w + 4, h + 2, bg_r, + bg_g, bg_b, bg_a); + gib_imlib_text_draw(image, title_fn, title_style, x, y, title_line, + IMLIB_TEXT_TO_RIGHT, title_r, title_g, title_b, + title_a); + } + + if (line && text_fn) { + gib_imlib_get_text_size(text_fn, line, text_style, &w, &h, + IMLIB_TEXT_TO_RIGHT); + x = 2; + y = height - h - 2; + gib_imlib_image_fill_rectangle(image, x - 2, y - 1, w + 4, h + 2, bg_r, + bg_g, bg_b, bg_a); + gib_imlib_text_draw(image, text_fn, text_style, x, y, line, + IMLIB_TEXT_TO_RIGHT, text_r, text_g, text_b, text_a); + } } /* ---------------------------------------------------------------------- */ @@ -609,834 +592,843 @@ void do_postprocess(char *filename) { - if (grab_postprocess) - { - char buf[4096]; - - log("executing postprocessing\n"); - snprintf(buf, sizeof(buf), "%s %s", grab_postprocess, filename); - system(buf); - } + if (grab_postprocess) { + char buf[4096]; + + log("executing postprocessing\n"); + snprintf(buf, sizeof(buf), "%s %s", grab_postprocess, filename); + system(buf); + } } void archive_jpeg(Imlib_Image im) { - char buffer[1028]; - char date[128]; - time_t t; - struct tm *tm; - struct stat st; - - if (grab_archive) - { - time(&t); - tm = localtime(&t); - strftime(date, 127, "%Y-%m-%d_%H%M%S", tm); - - do - { - snprintf(buffer, sizeof(buffer), "%s/webcam_%s.%s", grab_archive, - date, archive_ext); - } - while (stat(buffer, &st) == 0); - gib_imlib_save_image(im, buffer); - } + char buffer[1028]; + char date[128]; + time_t t; + struct tm *tm; + struct stat st; + + if (grab_archive) { + time(&t); + tm = localtime(&t); + strftime(date, 127, "%Y-%m-%d_%H%M%S", tm); + + do { + snprintf(buffer, sizeof(buffer), "%s/webcam_%s.%s", grab_archive, date, + archive_ext); + } + while (stat(buffer, &st) == 0); + save_image(im, buffer); + } } void -log(char *fmt, ...) +log(char *fmt, + ...) { - va_list args; - time_t t; - struct tm *tm; - char date[128]; - FILE *fp; - - if (!logfile) - return; - - fp = fopen(logfile, "a"); - if (!fp) - { - fprintf(stderr, "can't open log file %s\n", logfile); - exit(2); - } + va_list args; + time_t t; + struct tm *tm; + char date[128]; + FILE *fp; + + if (!logfile) { + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + return; + } + + fp = fopen(logfile, "a"); + if (!fp) { + fprintf(stderr, "can't open log file %s\n", logfile); + exit(2); + } + + time(&t); + tm = localtime(&t); + strftime(date, 127, "%d/%m %H:%M:%S", tm); + fprintf(fp, "%s ", date); + va_start(args, fmt); + vfprintf(fp, fmt, args); + va_end(args); + fclose(fp); +} - time(&t); - tm = localtime(&t); - strftime(date, 127, "%d/%m %H:%M:%S", tm); - fprintf(fp, "%s ", date); - va_start(args, fmt); - vfprintf(fp, fmt, args); - va_end(args); - fclose(fp); +int +save_image(Imlib_Image image, + char *file) +{ + Imlib_Load_Error err; + + gib_imlib_save_image_with_error_return(image, file, &err); + if ((err) || (!image)) { + switch (err) { + case IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST: + log("%s - File does not exist", file); + break; + case IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY: + log("%s - Directory specified for image filename", file); + break; + case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ: + log("%s - No read access to directory", file); + break; + case IMLIB_LOAD_ERROR_UNKNOWN: + case IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT: + log("%s - No Imlib2 loader for that file format", file); + break; + case IMLIB_LOAD_ERROR_PATH_TOO_LONG: + log("%s - Path specified is too long", file); + break; + case IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT: + log("%s - Path component does not exist", file); + break; + case IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY: + log("%s - Path component is not a directory", file); + break; + case IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE: + log("%s - Path points outside address space", file); + break; + case IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS: + log("%s - Too many levels of symbolic links", file); + break; + case IMLIB_LOAD_ERROR_OUT_OF_MEMORY: + log("While loading %s - Out of memory", file); + break; + case IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS: + eprintf("While loading %s - Out of file descriptors", file); + break; + case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE: + log("%s - Cannot write to directory", file); + break; + case IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE: + log("%s - Cannot write - out of disk space", file); + break; + default: + log("While loading %s - Unknown error (%d). Attempting to continue", + file, err); + break; + } + return 0; + } + return 1; } void draw_overlay(Imlib_Image image) { - int w, h; + int w, h; - w = gib_imlib_image_get_width(overlay_im); - h = gib_imlib_image_get_height(overlay_im); - gib_imlib_blend_image_onto_image(image, overlay_im, 0, 0, 0, w, h, - overlay_x, overlay_y, w, h, 0, - gib_imlib_image_has_alpha(overlay_im), 0); + w = gib_imlib_image_get_width(overlay_im); + h = gib_imlib_image_get_height(overlay_im); + gib_imlib_blend_image_onto_image(image, overlay_im, 0, 0, 0, w, h, + overlay_x, overlay_y, w, h, 0, + gib_imlib_image_has_alpha(overlay_im), 0); }; void bw_res_change(int diff) { - int temp = 0; + int temp = 0; - if (!diff) - return; + if (!diff) + return; - if (v_curr == -1) - { + if (v_curr == -1) { - while (temp < 5) - { - if (grab_buf.height == v_height[temp]) - v_curr = temp; - temp++; - } - if (v_curr == -1) - { - bw_percent = 100; - fprintf(stderr, - "You don't appear to be running any of the resolutions\n"); - fprintf(stderr, - "req'd by the bandwidth limiter. It has been deactivated.\n"); - log("method bw_percent killed, not at support'd res\n"); - } - } - - if (diff > (grab_delay * bw_percent) / 100) - { - log("bw_res_change Not enough bandwidth.\n"); - if (v_force < -1 && v_curr > 0) - { - log("bw_res_change Reducing image resolution.\n"); - grab_buf.height = v_height[--v_curr]; - grab_buf.width = v_width[v_curr]; - } - v_force--; - } - else if (diff < (grab_delay * bw_percent) / 200) - { - if (v_force > 1 && v_curr < 5) - { - log("bw_res_change Increasing image resolution.\n"); - grab_buf.height = v_height[++v_curr]; - grab_buf.width = v_width[v_curr]; - } - v_force++; - } - else - v_force = 0; + while (temp < 5) { + if (grab_buf.height == v_height[temp]) + v_curr = temp; + temp++; + } + if (v_curr == -1) { + bw_percent = 100; + fprintf(stderr, + "You don't appear to be running any of the resolutions\n"); + fprintf(stderr, + "req'd by the bandwidth limiter. It has been deactivated.\n"); + log("method bw_percent killed, not at support'd res\n"); + } + } + + if (diff > (grab_delay * bw_percent) / 100) { + log("bw_res_change Not enough bandwidth.\n"); + if (v_force < -1 && v_curr > 0) { + log("bw_res_change Reducing image resolution.\n"); + grab_buf.height = v_height[--v_curr]; + grab_buf.width = v_width[v_curr]; + } + v_force--; + } else if (diff < (grab_delay * bw_percent) / 200) { + if (v_force > 1 && v_curr < 5) { + log("bw_res_change Increasing image resolution.\n"); + grab_buf.height = v_height[++v_curr]; + grab_buf.width = v_width[v_curr]; + } + v_force++; + } else + v_force = 0; } /* upload local to tmp then MV to remote */ void -ftp_upload(char *local, char *remote, char *tmp) -{ - char buf[2096]; - FILE *infile; - CURLcode ret; - struct stat st; - struct curl_slist *post_commands = NULL; - char *passwd_string, *url_string; - - infile = fopen(local, "r"); - - if (!infile) - { - fprintf(stderr, "camE: Couldn't open temp file to upload it\n"); - perror("ftp_upload(): "); - return; - } - fstat(fileno(infile), &st); - - snprintf(buf, sizeof(buf), "rnfr %s", tmp); - post_commands = curl_slist_append(post_commands, buf); - snprintf(buf, sizeof(buf), "rnto %s", remote); - post_commands = curl_slist_append(post_commands, buf); - - /* init the curl session */ - if(connections < 1) { - curl_handle = curl_easy_init(); - connections++; - } - - curl_easy_setopt(curl_handle, CURLOPT_INFILE, infile); - curl_easy_setopt(curl_handle, CURLOPT_INFILESIZE, st.st_size); - - passwd_string = gib_strjoin(":", ftp_user, ftp_pass, NULL); - curl_easy_setopt(curl_handle, CURLOPT_USERPWD, passwd_string); - - /* set URL to save to */ - url_string = gib_strjoin("/", "ftp:/", ftp_host, ftp_dir, tmp, NULL); - curl_easy_setopt(curl_handle, CURLOPT_URL, url_string); - - /* no progress meter please */ - curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); - - /* shut up completely */ - if (ftp_debug) - curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1); - else - curl_easy_setopt(curl_handle, CURLOPT_MUTE, 1); - - curl_easy_setopt(curl_handle, CURLOPT_POSTQUOTE, post_commands); - - curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1); - - if (!ftp_passive) - curl_easy_setopt(curl_handle, CURLOPT_FTPPORT, ftp_interface); - - /* get it! */ - ret = curl_easy_perform(curl_handle); - /* TODO check error */ - if (ret) - { - fprintf(stderr, "\ncamE: error sending via ftp: "); - log("EEEE error: "); - switch (ret) - { - case CURLE_URL_MALFORMAT: - fprintf(stderr, "Badly formatted ftp host or directory\n"); - log("Badly formatted ftp host or directory\n"); - break; - case CURLE_URL_MALFORMAT_USER: - fprintf(stderr, "Badly formatted ftp username\n"); - log("Badly formatted ftp username\n"); - break; - case CURLE_COULDNT_RESOLVE_PROXY: - fprintf(stderr, "Couldn't resolve proxy\n"); - log("Couldn't resolve proxy\n"); - break; - case CURLE_COULDNT_RESOLVE_HOST: - fprintf(stderr, "Unable to resolve ftp host\n"); - log("Unable to resolve ftp host\n"); - break; - case CURLE_COULDNT_CONNECT: - fprintf(stderr, "Unable to connect to ftp host\n"); - log("Unable to connect to ftp host\n"); - break; - case CURLE_FTP_WEIRD_SERVER_REPLY: - fprintf(stderr, "Wierd server reply detected\n"); - log("Wierd server reply detected\n"); - break; - case CURLE_FTP_ACCESS_DENIED: - fprintf(stderr, "Access denied to ftp upload\n"); - log("Access denied to ftp upload\n"); - break; - case CURLE_FTP_USER_PASSWORD_INCORRECT: - fprintf(stderr, "Incorrect password for ftp login\n"); - log("Incorrect password for ftp login\n"); - break; - case CURLE_FTP_WEIRD_PASS_REPLY: - fprintf(stderr, "Wierd password reply from server\n"); - log("Wierd password reply from server\n"); - break; - case CURLE_FTP_WEIRD_USER_REPLY: - fprintf(stderr, "Wierd user reply from server\n"); - log("Wierd user reply from server\n"); - break; - case CURLE_FTP_WEIRD_PASV_REPLY: - fprintf(stderr, "Wierd passive reply from server\n"); - log("Wierd passive reply from server\n"); - break; - case CURLE_FTP_CANT_GET_HOST: - fprintf(stderr, "No route to host\n"); - log("No route to host\n"); - break; - case CURLE_FTP_COULDNT_SET_BINARY: - fprintf(stderr, "Couldn't set binary mode\n"); - log("Couldn't set binary mode\n"); - break; - case CURLE_PARTIAL_FILE: - fprintf(stderr, "Only partial file uploaded\n"); - log("Only partial file uploaded\n"); - break; - case CURLE_FTP_WRITE_ERROR: - fprintf(stderr, "Write error\n"); - log("Write error\n"); - break; - case CURLE_FTP_QUOTE_ERROR: - fprintf(stderr, "Misquoted ftp command - check ftp config\n"); - log("Misquoted ftp command - check ftp config\n"); - break; - case CURLE_WRITE_ERROR: - fprintf(stderr, "Write error\n"); - log("Write error\n"); - break; - case CURLE_MALFORMAT_USER: /* the user name is illegally specified */ - fprintf(stderr, "Malformatted username\n"); - log("Malformatted username\n"); - break; - case CURLE_FTP_COULDNT_STOR_FILE: /* failed FTP upload */ - fprintf(stderr, "Couldn't STOR the file\n"); - log("Couldn't STOR the file\n"); - break; - case CURLE_READ_ERROR: /* could open/read from file */ - fprintf(stderr, "Couldn't open temp file\n"); - log("Couldn't open temp file\n"); - break; - case CURLE_OUT_OF_MEMORY: - fprintf(stderr, "Out of memory\n"); - log("Out of memory\n"); - break; - case CURLE_OPERATION_TIMEOUTED: /* the timeout time was reached */ - fprintf(stderr, "Upload timed out\n"); - log("Upload timed out\n"); - break; - case CURLE_FTP_PORT_FAILED: /* FTP PORT operation failed */ - fprintf(stderr, "ftp PORT failed\n"); - log("ftp PORT failed\n"); - break; - case CURLE_FILE_COULDNT_READ_FILE: - fprintf(stderr, "Couldn't read temp file\n"); - log("Couldn't read temp file\n"); - break; - default: - fprintf(stderr, "unknown error, attempting to continue\n"); - log("unknown error, attempting to continue\n"); - break; - } - } +ftp_upload(char *local, + char *remote, + char *tmp) +{ + char buf[2096]; + FILE *infile; + CURLcode ret; + struct stat st; + struct curl_slist *post_commands = NULL; + char *passwd_string, *url_string; + + infile = fopen(local, "r"); + + if (!infile) { + fprintf(stderr, "camE: Couldn't open temp file to upload it\n"); + perror("ftp_upload(): "); + return; + } + fstat(fileno(infile), &st); + + snprintf(buf, sizeof(buf), "rnfr %s", tmp); + post_commands = curl_slist_append(post_commands, buf); + snprintf(buf, sizeof(buf), "rnto %s", remote); + post_commands = curl_slist_append(post_commands, buf); + + /* init the curl session */ + if (connections < 1) { + curl_handle = curl_easy_init(); + connections++; + } + + curl_easy_setopt(curl_handle, CURLOPT_INFILE, infile); + curl_easy_setopt(curl_handle, CURLOPT_INFILESIZE, st.st_size); + + passwd_string = gib_strjoin(":", ftp_user, ftp_pass, NULL); + curl_easy_setopt(curl_handle, CURLOPT_USERPWD, passwd_string); + + /* set URL to save to */ + url_string = gib_strjoin("/", "ftp:/", ftp_host, ftp_dir, tmp, NULL); + curl_easy_setopt(curl_handle, CURLOPT_URL, url_string); + + /* no progress meter please */ + curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); + + /* shut up completely */ + if (ftp_debug) + curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1); + else + curl_easy_setopt(curl_handle, CURLOPT_MUTE, 1); + + curl_easy_setopt(curl_handle, CURLOPT_POSTQUOTE, post_commands); + + curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1); + + if (!ftp_passive) + curl_easy_setopt(curl_handle, CURLOPT_FTPPORT, ftp_interface); + + /* get it! */ + ret = curl_easy_perform(curl_handle); + /* TODO check error */ + if (ret) { + fprintf(stderr, "\ncamE: error sending via ftp: "); + log("EEEE error: "); + switch (ret) { + case CURLE_URL_MALFORMAT: + fprintf(stderr, "Badly formatted ftp host or directory\n"); + log("Badly formatted ftp host or directory\n"); + break; + case CURLE_URL_MALFORMAT_USER: + fprintf(stderr, "Badly formatted ftp username\n"); + log("Badly formatted ftp username\n"); + break; + case CURLE_COULDNT_RESOLVE_PROXY: + fprintf(stderr, "Couldn't resolve proxy\n"); + log("Couldn't resolve proxy\n"); + break; + case CURLE_COULDNT_RESOLVE_HOST: + fprintf(stderr, "Unable to resolve ftp host\n"); + log("Unable to resolve ftp host\n"); + break; + case CURLE_COULDNT_CONNECT: + fprintf(stderr, "Unable to connect to ftp host\n"); + log("Unable to connect to ftp host\n"); + break; + case CURLE_FTP_WEIRD_SERVER_REPLY: + fprintf(stderr, "Wierd server reply detected\n"); + log("Wierd server reply detected\n"); + break; + case CURLE_FTP_ACCESS_DENIED: + fprintf(stderr, "Access denied to ftp upload\n"); + log("Access denied to ftp upload\n"); + break; + case CURLE_FTP_USER_PASSWORD_INCORRECT: + fprintf(stderr, "Incorrect password for ftp login\n"); + log("Incorrect password for ftp login\n"); + break; + case CURLE_FTP_WEIRD_PASS_REPLY: + fprintf(stderr, "Wierd password reply from server\n"); + log("Wierd password reply from server\n"); + break; + case CURLE_FTP_WEIRD_USER_REPLY: + fprintf(stderr, "Wierd user reply from server\n"); + log("Wierd user reply from server\n"); + break; + case CURLE_FTP_WEIRD_PASV_REPLY: + fprintf(stderr, "Wierd passive reply from server\n"); + log("Wierd passive reply from server\n"); + break; + case CURLE_FTP_CANT_GET_HOST: + fprintf(stderr, "No route to host\n"); + log("No route to host\n"); + break; + case CURLE_FTP_COULDNT_SET_BINARY: + fprintf(stderr, "Couldn't set binary mode\n"); + log("Couldn't set binary mode\n"); + break; + case CURLE_PARTIAL_FILE: + fprintf(stderr, "Only partial file uploaded\n"); + log("Only partial file uploaded\n"); + break; + case CURLE_FTP_WRITE_ERROR: + fprintf(stderr, "Write error\n"); + log("Write error\n"); + break; + case CURLE_FTP_QUOTE_ERROR: + fprintf(stderr, "Misquoted ftp command - check ftp config\n"); + log("Misquoted ftp command - check ftp config\n"); + break; + case CURLE_WRITE_ERROR: + fprintf(stderr, "Write error\n"); + log("Write error\n"); + break; + case CURLE_MALFORMAT_USER: /* the user name is illegally specified */ + fprintf(stderr, "Malformatted username\n"); + log("Malformatted username\n"); + break; + case CURLE_FTP_COULDNT_STOR_FILE: /* failed FTP upload */ + fprintf(stderr, "Couldn't STOR the file\n"); + log("Couldn't STOR the file\n"); + break; + case CURLE_READ_ERROR: /* could open/read from file */ + fprintf(stderr, "Couldn't open temp file\n"); + log("Couldn't open temp file\n"); + break; + case CURLE_OUT_OF_MEMORY: + fprintf(stderr, "Out of memory\n"); + log("Out of memory\n"); + break; + case CURLE_OPERATION_TIMEOUTED: /* the timeout time was reached */ + fprintf(stderr, "Upload timed out\n"); + log("Upload timed out\n"); + break; + case CURLE_FTP_PORT_FAILED: /* FTP PORT operation failed */ + fprintf(stderr, "ftp PORT failed\n"); + log("ftp PORT failed\n"); + break; + case CURLE_FILE_COULDNT_READ_FILE: + fprintf(stderr, "Couldn't read temp file\n"); + log("Couldn't read temp file\n"); + break; + default: + fprintf(stderr, "unknown error, attempting to continue\n"); + log("unknown error, attempting to continue\n"); + break; + } + } - /* cleanup curl stuff */ - if(!ftp_keepalive) { - curl_easy_cleanup(curl_handle); - curl_slist_free_all(post_commands); - connections--; - } - free(url_string); - free(passwd_string); - fclose(infile); + /* cleanup curl stuff */ + if (!ftp_keepalive) { + curl_easy_cleanup(curl_handle); + curl_slist_free_all(post_commands); + connections--; + } + free(url_string); + free(passwd_string); + fclose(infile); } int check_interface(char *watch_interface) { - if (watch_interface == NULL) - return 1; - return if_nametoindex(watch_interface); + if (watch_interface == NULL) + return 1; + return if_nametoindex(watch_interface); } void version(void) { - printf("camE version %s\n", VERSION); - exit(0); + printf("camE version %s\n", VERSION); + exit(0); } void usage(void) { - printf("usage: camE [OPTION]\n"); - printf(" -c FILE Use config file FILE\n"); - printf(" -f Don't fork to background\n"); - printf(" -h -v This message\n"); - exit(0); + printf("usage: camE [OPTION]\n"); + printf(" -c FILE Use config file FILE\n"); + printf(" -f Don't fork to background\n"); + printf(" -h -v This message\n"); + exit(0); } int do_upload(char *file) { - struct stat st; - int upload_successful = 1; - if (ftp_do) - { - if ((upload_blockfile && (stat(upload_blockfile, &st) == -1)) - || !upload_blockfile) - { - log("*** uploading via ftp\n"); - ftp_upload(file, ftp_file, ftp_tmp); - log("shot uploaded\n"); - if (action_post_upload) - { + struct stat st; + int upload_successful = 1; + + if (ftp_do) { + if ((upload_blockfile && (stat(upload_blockfile, &st) == -1)) + || !upload_blockfile) { + log("*** uploading via ftp\n"); + ftp_upload(file, ftp_file, ftp_tmp); + log("shot uploaded\n"); + if (action_post_upload) { + log("running post upload action\n"); + system(action_post_upload); + log("post upload action done\n"); + } + } + } else if (scp_target) { + char target_buf[2048]; + char cmd_buf[4096]; + char *scp_args[] = { "scp", "-BCq", NULL, NULL, NULL }; + char *ssh_args[] = { "ssh", "-n", "-q", NULL, NULL, NULL }; + + if (!upload_blockfile + || (upload_blockfile && (stat(upload_blockfile, &st) == -1))) { + log("uploading via scp\n"); + snprintf(target_buf, sizeof(target_buf), "%s:%s/%s", scp_target, + ftp_dir, ftp_tmp); + snprintf(cmd_buf, sizeof(cmd_buf), "mv %s/%s %s/%s", ftp_dir, ftp_tmp, + ftp_dir, ftp_file); + scp_args[2] = file; + scp_args[3] = target_buf; + if ((upload_successful = + execvp_with_timeout(scp_timeout, "scp", scp_args))) { + ssh_args[3] = scp_target; + ssh_args[4] = cmd_buf; + if ((upload_successful = + execvp_with_timeout(scp_timeout, "ssh", ssh_args))) { + log("shot uploaded\n"); + + if (action_post_upload) { log("running post upload action\n"); system(action_post_upload); log("post upload action done\n"); - } - } - } - else if (scp_target) - { - char target_buf[2048]; - char cmd_buf[4096]; - char *scp_args[] = { "scp", "-BCq", NULL, NULL, NULL }; - char *ssh_args[] = { "ssh", "-n", "-q", NULL, NULL, NULL }; - - if (!upload_blockfile - || (upload_blockfile && (stat(upload_blockfile, &st) == -1))) - { - log("uploading via scp\n"); - snprintf(target_buf, sizeof(target_buf), "%s:%s/%s", scp_target, - ftp_dir, ftp_tmp); - snprintf(cmd_buf, sizeof(cmd_buf), "mv %s/%s %s/%s", ftp_dir, - ftp_tmp, ftp_dir, ftp_file); - scp_args[2] = file; - scp_args[3] = target_buf; - if ((upload_successful = - execvp_with_timeout(scp_timeout, "scp", scp_args))) - { - ssh_args[3] = scp_target; - ssh_args[4] = cmd_buf; - if ((upload_successful = - execvp_with_timeout(scp_timeout, "ssh", ssh_args))) - { - log("shot uploaded\n"); - - if (action_post_upload) - { - log("running post upload action\n"); - system(action_post_upload); - log("post upload action done\n"); - } - } - } + } + } } - } - return upload_successful; + } + } + return upload_successful; } int -main(int argc, char *argv[]) +main(int argc, + char *argv[]) { - unsigned char *val; - Imlib_Image image, tmp_image; - char filename[100]; - int width, height, i; - struct stat st; - pid_t childpid; - time_t start_shot; - time_t end_shot; - int just_shot = 0, upload_successful = 1; - int new_delay; - FILE *fp; - int ch; - int dont_fork = 0; - int offline_done = 1; - char *config_file = NULL; - - while ((ch = getopt(argc, argv, "c:fhv")) != EOF) - { - switch (ch) - { - case 'c': - config_file = strdup(optarg); - break; - case 'f': - dont_fork = 1; - break; - case 'h': - usage(); - break; - case 'v': - version(); - break; - case '?': - default: - usage(); - break; - } - } + unsigned char *val; + Imlib_Image image, tmp_image; + char filename[100]; + int width, height, i; + struct stat st; + pid_t childpid; + time_t start_shot; + time_t end_shot; + int just_shot = 0, upload_successful = 1; + int new_delay; + FILE *fp; + int ch; + int dont_fork = 0; + int offline_done = 1; + char *config_file = NULL; + + while ((ch = getopt(argc, argv, "c:fhv")) != EOF) { + switch (ch) { + case 'c': + config_file = strdup(optarg); + break; + case 'f': + dont_fork = 1; + break; + case 'h': + usage(); + break; + case 'v': + version(); + break; + case '?': + default: + usage(); + break; + } + } - if (!dont_fork) - { - /* fork and die */ - if ((childpid = fork()) < 0) - { - fprintf(stderr, "fork (%s)\n", strerror(errno)); - return (2); - } - else if (childpid > 0) - exit(0); /* parent */ - } - - /* read config */ - if (config_file) - { - cfg_parse_file(config_file); - } - else - { - sprintf(filename, "%s/%s", getenv("HOME"), ".camErc"); - cfg_parse_file(filename); - } - - if (NULL != (val = cfg_get_str("ftp", "host"))) - ftp_host = val; - if (NULL != (val = cfg_get_str("ftp", "user"))) - ftp_user = val; - if (NULL != (val = cfg_get_str("ftp", "pass"))) - ftp_pass = val; - if (NULL != (val = cfg_get_str("ftp", "dir"))) - ftp_dir = val; - if (NULL != (val = cfg_get_str("ftp", "file"))) - ftp_file = val; - if (NULL != (val = cfg_get_str("ftp", "tmp"))) - ftp_tmp = val; - if (-1 != (i = cfg_get_int("ftp", "passive"))) - ftp_passive = i; - if (-1 != (i = cfg_get_int("ftp", "debug"))) - ftp_debug = i; - if (-1 != (i = cfg_get_int("ftp", "do"))) - ftp_do = i; - if (-1 != (i = cfg_get_int("ftp", "keepalive"))) - ftp_keepalive = i; - if (-1 != (i = cfg_get_int("ftp", "timeout"))) - ftp_timeout = i; - if (NULL != (val = cfg_get_str("ftp", "interface"))) - ftp_interface = val; - - if (NULL != (val = cfg_get_str("scp", "target"))) - scp_target = val; - if (-1 != (i = cfg_get_int("scp", "timeout"))) - scp_timeout = i; - - if (NULL != (val = cfg_get_str("grab", "device"))) - grab_device = val; - if (NULL != (val = cfg_get_str("grab", "text"))) - grab_text = val; - if (NULL != (val = cfg_get_str("grab", "infofile"))) - grab_infofile = val; - if (NULL != (val = cfg_get_str("grab", "action_pre_shot"))) - action_pre_shot = val; - if (NULL != (val = cfg_get_str("grab", "action_post_shot"))) - action_post_shot = val; - if (NULL != (val = cfg_get_str("grab", "action_post_upload"))) - action_post_upload = val; - if (NULL != (val = cfg_get_str("grab", "archive"))) - grab_archive = val; - if (NULL != (val = cfg_get_str("grab", "blockfile"))) - grab_blockfile = val; - if (NULL != (val = cfg_get_str("grab", "uploadblockfile"))) - upload_blockfile = val; - if (NULL != (val = cfg_get_str("grab", "postprocess"))) - grab_postprocess = val; - if (NULL != (val = cfg_get_str("grab", "title_text"))) - title_text = val; - if (NULL != (val = cfg_get_str("grab", "archive_ext"))) - archive_ext = val; - if (NULL != (val = cfg_get_str("grab", "logfile"))) - logfile = val; - if (NULL != (val = cfg_get_str("grab", "ttf_dir"))) - ttf_dir = val; - if (NULL != (val = cfg_get_str("grab", "title_font"))) - title_font = val; - if (NULL != (val = cfg_get_str("grab", "text_font"))) - text_font = val; - if (NULL != (val = cfg_get_str("grab", "temp_file"))) - temp_file = val; - if (NULL != (val = cfg_get_str("grab", "title_style"))) - title_style_file = val; - if (NULL != (val = cfg_get_str("grab", "text_style"))) - text_style_file = val; - if (NULL != (val = cfg_get_str("grab", "overlay_image"))) - overlay_file = val; - if (NULL != (val = cfg_get_str("grab", "watch_interface"))) - watch_interface = val; - if (NULL != (val = cfg_get_str("grab", "offline_image"))) - offline_image = val; - if (-1 != (i = cfg_get_int("grab", "width"))) - grab_width = i; - if (-1 != (i = cfg_get_int("grab", "height"))) - grab_height = i; - if (-1 != (i = cfg_get_int("grab", "delay"))) - grab_delay = i; - if (-1 != (i = cfg_get_int("grab", "correct"))) - delay_correct = 1; - if (-1 != (i = cfg_get_int("grab", "percent"))) - bw_percent = i; - if (-1 != (i = cfg_get_int("grab", "quality"))) - grab_quality = i; - if (-1 != (i = cfg_get_int("grab", "input"))) - grab_input = i; - if (-1 != (i = cfg_get_int("grab", "norm"))) - grab_norm = i; - if (-1 != (i = cfg_get_int("grab", "text_r"))) - text_r = i; - if (-1 != (i = cfg_get_int("grab", "text_g"))) - text_g = i; - if (-1 != (i = cfg_get_int("grab", "text_b"))) - text_b = i; - if (-1 != (i = cfg_get_int("grab", "text_a"))) - text_a = i; - if (-1 != (i = cfg_get_int("grab", "title_r"))) - title_r = i; - if (-1 != (i = cfg_get_int("grab", "title_g"))) - title_g = i; - if (-1 != (i = cfg_get_int("grab", "title_b"))) - title_b = i; - if (-1 != (i = cfg_get_int("grab", "title_a"))) - title_a = i; - if (-1 != (i = cfg_get_int("grab", "bg_r"))) - bg_r = i; - if (-1 != (i = cfg_get_int("grab", "bg_g"))) - bg_g = i; - if (-1 != (i = cfg_get_int("grab", "bg_b"))) - bg_b = i; - if (-1 != (i = cfg_get_int("grab", "bg_a"))) - bg_a = i; - if (-1 != (i = cfg_get_int("grab", "close_dev"))) - close_dev = i; - if (-1 != (i = cfg_get_int("grab", "lag_reduce"))) - lag_reduce = i; - if (-1 != (i = cfg_get_int("grab", "overlay_x"))) - overlay_x = i; - if (-1 != (i = cfg_get_int("grab", "overlay_y"))) - overlay_y = i; - if (-1 != (i = cfg_get_int("grab", "colour"))) - cam_colour = i; - if (-1 != (i = cfg_get_int("grab", "brightness"))) - cam_brightness = i; - if (-1 != (i = cfg_get_int("grab", "contrast"))) - cam_contrast = i; - if (-1 != (i = cfg_get_int("grab", "hue"))) - cam_hue = i; - if (-1 != (i = cfg_get_int("grab", "whiteness"))) - cam_whiteness = i; - if (-1 != (i = cfg_get_int("grab", "framerate"))) - cam_framerate = i; - if (-1 != (i = cfg_get_int("grab", "crop"))) - crop = i; - if (-1 != (i = cfg_get_int("grab", "crop_width"))) - crop_width = i; - if (-1 != (i = cfg_get_int("grab", "crop_height"))) - crop_height = i; - if (-1 != (i = cfg_get_int("grab", "crop_x"))) - crop_x = i; - if (-1 != (i = cfg_get_int("grab", "crop_y"))) - crop_y = i; - if (-1 != (i = cfg_get_int("grab", "scale"))) - scale = i; - if (-1 != (i = cfg_get_int("grab", "scale_width"))) - scale_width = i; - if (-1 != (i = cfg_get_int("grab", "scale_height"))) - scale_height = i; - - if (cam_framerate > 60) - cam_framerate = 60; - if (cam_framerate < 1) - cam_framerate = 1; - - /* clear logfile */ - if (logfile) - { - fp = fopen(logfile, "w"); - if (fp) - fclose(fp); - } - - /* print config */ - log("camE " VERSION " - (c) 1999, 2000 Gerd Knorr, Tom Gilbert\n"); - log("grabber config: size %dx%d, input %d, norm %d, " "jpeg quality %d\n", - grab_width, grab_height, grab_input, grab_norm, grab_quality); - - imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT); - imlib_add_path_to_font_path(ttf_dir); - imlib_add_path_to_font_path("."); - imlib_context_set_operation(IMLIB_OP_COPY); - imlib_set_cache_size(0); - if (title_style_file) - title_style = gib_style_new_from_ascii(title_style_file); - if (text_style_file) - text_style = gib_style_new_from_ascii(text_style_file); - if (overlay_file) - overlay_im = imlib_load_image(overlay_file); - title_fn = imlib_load_font(title_font); - if (!title_fn) - fprintf(stderr, "can't load font %s\n", title_font); - text_fn = imlib_load_font(text_font); - if (!text_fn) - fprintf(stderr, "can't load font %s\n", text_font); - if (offline_image) - { - Imlib_Image image = imlib_load_image(offline_image); - - if (!image) - { - fprintf(stderr, "can't load offline image %s, ignoring\n", - offline_image); - offline_image = NULL; - } - else - { - imlib_context_set_image(image); - imlib_free_image_and_decache(); + if (!dont_fork) { + /* fork and die */ + if ((childpid = fork()) < 0) { + fprintf(stderr, "fork (%s)\n", strerror(errno)); + return (2); + } else if (childpid > 0) + exit(0); /* parent */ + } + + /* read config */ + if (config_file) { + cfg_parse_file(config_file); + } else { + sprintf(filename, "%s/%s", getenv("HOME"), ".camErc"); + cfg_parse_file(filename); + } + + if (NULL != (val = cfg_get_str("ftp", "host"))) + ftp_host = val; + if (NULL != (val = cfg_get_str("ftp", "user"))) + ftp_user = val; + if (NULL != (val = cfg_get_str("ftp", "pass"))) + ftp_pass = val; + if (NULL != (val = cfg_get_str("ftp", "dir"))) + ftp_dir = val; + if (NULL != (val = cfg_get_str("ftp", "file"))) + ftp_file = val; + if (NULL != (val = cfg_get_str("ftp", "tmp"))) + ftp_tmp = val; + if (-1 != (i = cfg_get_int("ftp", "passive"))) + ftp_passive = i; + if (-1 != (i = cfg_get_int("ftp", "debug"))) + ftp_debug = i; + if (-1 != (i = cfg_get_int("ftp", "do"))) + ftp_do = i; + if (-1 != (i = cfg_get_int("ftp", "keepalive"))) + ftp_keepalive = i; + if (-1 != (i = cfg_get_int("ftp", "timeout"))) + ftp_timeout = i; + if (NULL != (val = cfg_get_str("ftp", "interface"))) + ftp_interface = val; + + if (NULL != (val = cfg_get_str("scp", "target"))) + scp_target = val; + if (-1 != (i = cfg_get_int("scp", "timeout"))) + scp_timeout = i; + + if (NULL != (val = cfg_get_str("grab", "device"))) + grab_device = val; + if (NULL != (val = cfg_get_str("grab", "text"))) + grab_text = val; + if (NULL != (val = cfg_get_str("grab", "infofile"))) + grab_infofile = val; + if (NULL != (val = cfg_get_str("grab", "action_pre_shot"))) + action_pre_shot = val; + if (NULL != (val = cfg_get_str("grab", "action_post_shot"))) + action_post_shot = val; + if (NULL != (val = cfg_get_str("grab", "action_post_upload"))) + action_post_upload = val; + if (NULL != (val = cfg_get_str("grab", "archive"))) + grab_archive = val; + if (NULL != (val = cfg_get_str("grab", "blockfile"))) + grab_blockfile = val; + if (NULL != (val = cfg_get_str("grab", "uploadblockfile"))) + upload_blockfile = val; + if (NULL != (val = cfg_get_str("grab", "postprocess"))) + grab_postprocess = val; + if (NULL != (val = cfg_get_str("grab", "title_text"))) + title_text = val; + if (NULL != (val = cfg_get_str("grab", "archive_ext"))) + archive_ext = val; + if (NULL != (val = cfg_get_str("grab", "logfile"))) + logfile = val; + if (NULL != (val = cfg_get_str("grab", "ttf_dir"))) + ttf_dir = val; + if (NULL != (val = cfg_get_str("grab", "title_font"))) + title_font = val; + if (NULL != (val = cfg_get_str("grab", "text_font"))) + text_font = val; + if (NULL != (val = cfg_get_str("grab", "temp_file"))) + temp_file = val; + if (NULL != (val = cfg_get_str("grab", "title_style"))) + title_style_file = val; + if (NULL != (val = cfg_get_str("grab", "text_style"))) + text_style_file = val; + if (NULL != (val = cfg_get_str("grab", "overlay_image"))) + overlay_file = val; + if (NULL != (val = cfg_get_str("grab", "watch_interface"))) + watch_interface = val; + if (NULL != (val = cfg_get_str("grab", "offline_image"))) + offline_image = val; + if (-1 != (i = cfg_get_int("grab", "width"))) + grab_width = i; + if (-1 != (i = cfg_get_int("grab", "height"))) + grab_height = i; + if (-1 != (i = cfg_get_int("grab", "delay"))) + grab_delay = i; + if (-1 != (i = cfg_get_int("grab", "correct"))) + delay_correct = 1; + if (-1 != (i = cfg_get_int("grab", "percent"))) + bw_percent = i; + if (-1 != (i = cfg_get_int("grab", "quality"))) + grab_quality = i; + if (-1 != (i = cfg_get_int("grab", "input"))) + grab_input... [truncated message content] |
From: <enl...@li...> - 2002-02-23 12:52:36
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: more useful =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -3 -r1.52 -r1.53 --- webcam.c 23 Feb 2002 12:49:54 -0000 1.52 +++ webcam.c 23 Feb 2002 12:52:35 -0000 1.53 @@ -149,7 +149,8 @@ char *file, char **argv); void alarm_handler(int sig); -int save_image(Imlib_Image image, char *file); +int save_image(Imlib_Image image, + char *file); void close_device() @@ -667,48 +668,54 @@ if ((err) || (!image)) { switch (err) { case IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST: - log("%s - File does not exist", file); + log("Error saving image %s - File does not exist", file); break; case IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY: - log("%s - Directory specified for image filename", file); + log("Error saving image %s - Directory specified for image filename", + file); break; case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ: - log("%s - No read access to directory", file); + log("Error saving image %s - No read access to directory", file); break; case IMLIB_LOAD_ERROR_UNKNOWN: case IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT: - log("%s - No Imlib2 loader for that file format", file); + log("Error saving image %s - No Imlib2 loader for that file format", + file); break; case IMLIB_LOAD_ERROR_PATH_TOO_LONG: - log("%s - Path specified is too long", file); + log("Error saving image %s - Path specified is too long", file); break; case IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT: - log("%s - Path component does not exist", file); + log("Error saving image %s - Path component does not exist", file); break; case IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY: - log("%s - Path component is not a directory", file); + log("Error saving image %s - Path component is not a directory", + file); break; case IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE: - log("%s - Path points outside address space", file); + log("Error saving image %s - Path points outside address space", + file); break; case IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS: - log("%s - Too many levels of symbolic links", file); + log("Error saving image %s - Too many levels of symbolic links", + file); break; case IMLIB_LOAD_ERROR_OUT_OF_MEMORY: - log("While loading %s - Out of memory", file); + log("Error saving image %s - Out of memory", file); break; case IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS: eprintf("While loading %s - Out of file descriptors", file); break; case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE: - log("%s - Cannot write to directory", file); + log("Error saving image %s - Cannot write to directory", file); break; case IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE: - log("%s - Cannot write - out of disk space", file); + log("Error saving image %s - Cannot write - out of disk space", file); break; default: - log("While loading %s - Unknown error (%d). Attempting to continue", - file, err); + log + ("Error saving image %s - Unknown error (%d). Attempting to continue", + file, err); break; } return 0; |
From: <enl...@li...> - 2002-02-26 20:02:40
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: example.camErc webcam.c Log Message: Patch from David H Muir <dh...@li...> (love that domain name) to add an archive_shot_every to the config file. Set to 1 to archive every shot, 2 to archive every other shot, 3 for every third... etc. Set to 0 to disable archiving. =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc,v retrieving revision 1.18 retrieving revision 1.19 diff -u -3 -r1.18 -r1.19 --- example.camErc 7 Sep 2001 20:58:06 -0000 1.18 +++ example.camErc 26 Feb 2002 20:02:06 -0000 1.19 @@ -9,6 +9,8 @@ # camE uploads to a temp file, and moves it across when done # this way people don't view half-uploaded images tmp = uploading.jpg +# keep the connection open (1) or reopen it for each shot (0) +keepalive = 1 # do passive ftp? passive = 1 #an interface to use for non-passive ftp. use "-" to let libcurl choose, or @@ -63,6 +65,9 @@ archive = /opt/images/webcam # extension (determines type) of archived images. archive_ext = jpg +# determines how many shots are taken before a pic is archived +# (1 == every pic, 0 == don't archive) +archive_shot_every = 1 # jpeg quality (you can save as png etc too, but then quality does squat) quality = 80 input = 0 =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -3 -r1.53 -r1.54 --- webcam.c 23 Feb 2002 12:52:35 -0000 1.53 +++ webcam.c 26 Feb 2002 20:02:06 -0000 1.54 @@ -93,6 +93,7 @@ char *ttf_dir = "/usr/X11R6/lib/X11/fonts/TrueType"; char *archive_ext = "jpg"; char *grab_archive = NULL; +int archive_shot_every = 1; /* default to archive every shot */ char *grab_blockfile = NULL; char *upload_blockfile = NULL; char *grab_postprocess = NULL; @@ -610,8 +611,12 @@ time_t t; struct tm *tm; struct stat st; + static int shot_counter = 0; - if (grab_archive) { + shot_counter++; + + if (grab_archive && archive_shot_every + && shot_counter >= archive_shot_every) { time(&t); tm = localtime(&t); strftime(date, 127, "%Y-%m-%d_%H%M%S", tm); @@ -622,6 +627,7 @@ } while (stat(buffer, &st) == 0); save_image(im, buffer); + shot_counter = 0; } } @@ -637,6 +643,7 @@ if (!logfile) { va_start(args, fmt); + fprintf(stderr, "camE: "); vfprintf(stderr, fmt, args); va_end(args); return; @@ -1246,6 +1253,8 @@ scale_width = i; if (-1 != (i = cfg_get_int("grab", "scale_height"))) scale_height = i; + if (-1 != (i = cfg_get_int("grab", "archive_shot_every"))) + archive_shot_every = i; if (cam_framerate > 60) cam_framerate = 60; |
From: <enl...@li...> - 2002-02-28 01:53:09
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: example.camErc example.camErc.ssh pwc-ioctl.h webcam.c Log Message: tidy curl stuff a little, fix memory leak in keepalive mode, and add whitebalance controls for philips cameras =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- example.camErc 26 Feb 2002 20:02:06 -0000 1.19 +++ example.camErc 27 Feb 2002 19:23:38 -0000 1.20 @@ -48,14 +48,31 @@ # percentage of the delay to spend uploading the image, # 100 disables, useful values are < 40 percent = 100 -# only for philps cams right now + +######################################################## +# PWC specific features (only for philps cams right now) + +# framerate of cam capture, lower fps -> less grainy image, more chance or +# blurred motion framerate = 5 -# image settings + +# image settings (0-100) colour = 50 brightness = 50 contrast = 50 hue = 50 whiteness = 50 + +# White balance mode +# can be "auto", "indoor", "outdoor", "fluorescent" or "manual" +pwc_wb_mode = auto +# if _mode is set to manual, these two controls affect the balance +# (0-100) +pwc_wb_red = 50 +pwc_wb_blue = 50 +######################################################## + + # where to log activity. comment out this line to disable logging logfile = /home/gilbertt/.camlog # gets the message text from here. one line allowed only. means you can do =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc.ssh,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- example.camErc.ssh 7 Sep 2001 20:58:06 -0000 1.6 +++ example.camErc.ssh 27 Feb 2002 19:23:38 -0000 1.7 @@ -30,14 +30,30 @@ # percentage of the delay to spend uploading the image, # 100 disables, useful values are < 40 percent = 100 -# only for philps cams right now + +######################################################## +# PWC specific features (only for philps cams right now) + +# framerate of cam capture, lower fps -> less grainy image, more chance or +# blurred motion framerate = 5 -# image settings + +# image settings (0-100) colour = 50 brightness = 50 contrast = 50 hue = 50 whiteness = 50 + +# White balance mode +# can be "auto", "indoor", "outdoor", "fluorescent" or "manual" +pwc_wb_mode = auto +# if _mode is set to manual, these two controls affect the balance +# (0-100) +pwc_wb_red = 50 +pwc_wb_blue = 50 +######################################################## + # where to log activity. comment out this line to disable logging logfile = /home/gilbertt/.camlog # gets the message text from here. one line allowed only. means you can do =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/pwc-ioctl.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- pwc-ioctl.h 10 Jul 2001 19:30:50 -0000 1.1 +++ pwc-ioctl.h 27 Feb 2002 19:23:38 -0000 1.2 @@ -1,6 +1,29 @@ #ifndef PWC_IOCTL_H #define PWC_IOCTL_H +/* (C) 2001 Nemosoft Unv. we...@sm... + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* + Changes + 2001/08/03 Alvarado Added ioctl constants to access methods for + changing white balance and red/blue gains + */ + /* These are private ioctl() commands, specific for the Philips webcams. They contain functions not found in other webcams, and settings not specified in the Video4Linux API. @@ -8,12 +31,16 @@ The #define names are built up like follows: VIDIOC VIDeo IOCtl prefix PWC Philps WebCam - [GS] optional: Get or Set - ... The function + G optional: Get + S optional: Set + ... the function */ -/* The frame rate is encoded in the video_window.flags parameter, - in the high 16 bits, since some flags are defined nowadays. The following + + + +/* The frame rate is encoded in the video_window.flags parameter using + the upper 16 bits, since some flags are defined nowadays. The following defines provide a mask and shift to filter out this value. In 'Snapshot' mode the camera freezes its automatic exposure and colour @@ -24,10 +51,38 @@ #define PWC_FPS_FRMASK 0x003F0000 #define PWC_FPS_SNAPSHOT 0x00400000 -/* These are private ioctl() commands, specific for the Philips webcams. - They contain functions not found in other webcams, and settings not - specified in the Video4Linux API. - */ + +/* pwc_whitebalance.mode values */ +#define PWC_WB_INDOOR 0 +#define PWC_WB_OUTDOOR 1 +#define PWC_WB_FL 2 +#define PWC_WB_MANUAL 3 +#define PWC_WB_AUTO 4 + +/* Used with VIDIOCPWC[SG]AWB (Auto White Balance). + Set mode to one of the PWC_WB_* values above. + *red and *blue are the respective gains of these colour components inside + the camera; range 0..65535 + When mode == PWC_WB_MANUAL, manual_red and manual_blue are set or read; + otherwise undefined. + read_red and read_blue are read-only. +*/ + +struct pwc_whitebalance +{ + int mode; + int manual_red, manual_blue; /* R/W */ + int read_red, read_blue; /* R/O */ +}; + + +/* Used with VIDIOCPWC[SG]LED */ +struct pwc_leds +{ + int led_on; /* Led on-time; range = 0..25000 */ + int led_off; /* Led off-time; range = 0..25000 */ +}; + /* Restore user settings */ @@ -41,7 +96,7 @@ means use uncompressed modes when available; 1 is low compression, 2 is medium and 3 is high compression preferred. Of course, the higher the compression, the lower the bandwidth used but more chance of artefacts - in the image. The driver automaticly chooses a higher compression when + in the image. The driver automatically chooses a higher compression when the preferred mode is not available. */ /* Set preferred compression quality (0 = uncompressed, 3 = highest compression) */ @@ -53,7 +108,16 @@ #define VIDIOCPWCSAGC _IOW('v', 200, int) /* Get AGC; int < 0 = auto; >= 0 = fixed, range 0..65535 */ #define VIDIOCPWCGAGC _IOR('v', 200, int) - /* Set shutter speed; int < 0 = auto; >= 0 = fixed, range 0..65536 */ + /* Set shutter speed; int < 0 = auto; >= 0 = fixed, range 0..65535 */ #define VIDIOCPWCSSHUTTER _IOW('v', 201, int) + + /* Color compensation (Auto White Balance) */ +#define VIDIOCPWCSAWB _IOW('v', 202, struct pwc_whitebalance) +#define VIDIOCPWCGAWB _IOR('v', 202, struct pwc_whitebalance) + + /* Turn LED on/off ; int range 0..65535 */ +#define VIDIOCPWCSLED _IOW('v', 205, struct pwc_leds) + /* Get state of LED; int range 0..65535 */ +#define VIDIOCPWCGLED _IOR('v', 205, struct pwc_leds) #endif =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.54 retrieving revision 1.55 diff -u -3 -r1.54 -r1.55 --- webcam.c 26 Feb 2002 20:02:06 -0000 1.54 +++ webcam.c 27 Feb 2002 19:23:38 -0000 1.55 @@ -37,7 +37,7 @@ #include "parseconfig.h" #include "pwc-ioctl.h" -#define VERSION "1.2" +#define VERSION "1.3" void log(char *fmt, ...); @@ -111,6 +111,9 @@ char *offline_image = NULL; int interface_active = 0; int device_palette; +char *pwc_wb_mode = "auto"; +int pwc_wb_red = 50; +int pwc_wb_blue = 50; int crop = 0; int crop_x = 0; @@ -245,6 +248,7 @@ struct video_window vwin; int shutter = -1; int gain = -1; + struct pwc_whitebalance wb; /* philips cam detected, maybe enable special features */ log("enabling pwc-specific features\n"); @@ -266,6 +270,28 @@ perror("trying to set gain"); if (ioctl(grab_fd, VIDIOCPWCSSHUTTER, &shutter) < 0) perror("trying to set shutter"); + + wb.mode = PWC_WB_AUTO; + wb.manual_red = 50; + wb.manual_blue = 50; + if(!strcasecmp(pwc_wb_mode, "auto")) { + wb.mode = PWC_WB_AUTO; + } else if(!strcasecmp(pwc_wb_mode, "indoor")) { + wb.mode = PWC_WB_INDOOR; + } else if(!strcasecmp(pwc_wb_mode, "outdoor")) { + wb.mode = PWC_WB_OUTDOOR; + } else if(!strcasecmp(pwc_wb_mode, "fluorescent")) { + wb.mode = PWC_WB_FL; + } else if(!strcasecmp(pwc_wb_mode, "manual")) { + wb.mode = PWC_WB_MANUAL; + wb.manual_red = 65535 * ((float) pwc_wb_red / 100); + wb.manual_blue = 65535 * ((float) pwc_wb_blue / 100); + } else { + log("unknown pwc white balance mode '%s' ignored\n", pwc_wb_mode); + } + + if (ioctl(grab_fd, VIDIOCPWCSAWB, &wb) < 0) + perror("trying to set pwc white balance mode"); } /* set image source and TV norm */ @@ -797,61 +823,65 @@ FILE *infile; CURLcode ret; struct stat st; - struct curl_slist *post_commands = NULL; + static struct curl_slist *post_commands = NULL; char *passwd_string, *url_string; infile = fopen(local, "r"); if (!infile) { - fprintf(stderr, "camE: Couldn't open temp file to upload it\n"); + log("camE: Couldn't open temp file to upload it\n"); perror("ftp_upload(): "); return; } fstat(fileno(infile), &st); - snprintf(buf, sizeof(buf), "rnfr %s", tmp); - post_commands = curl_slist_append(post_commands, buf); - snprintf(buf, sizeof(buf), "rnto %s", remote); - post_commands = curl_slist_append(post_commands, buf); + if(!post_commands) { + snprintf(buf, sizeof(buf), "rnfr %s", tmp); + post_commands = curl_slist_append(post_commands, buf); + snprintf(buf, sizeof(buf), "rnto %s", remote); + post_commands = curl_slist_append(post_commands, buf); + } /* init the curl session */ if (connections < 1) { curl_handle = curl_easy_init(); connections++; + + passwd_string = gib_strjoin(":", ftp_user, ftp_pass, NULL); + curl_easy_setopt(curl_handle, CURLOPT_USERPWD, passwd_string); + free(passwd_string); + + /* set URL to save to */ + url_string = gib_strjoin("/", "ftp:/", ftp_host, ftp_dir, tmp, NULL); + curl_easy_setopt(curl_handle, CURLOPT_URL, url_string); + free(url_string); + + /* no progress meter please */ + curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); + + /* shut up completely */ + if (ftp_debug) + curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1); + else + curl_easy_setopt(curl_handle, CURLOPT_MUTE, 1); + + curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1); + + if (!ftp_passive) + curl_easy_setopt(curl_handle, CURLOPT_FTPPORT, ftp_interface); + + curl_easy_setopt(curl_handle, CURLOPT_POSTQUOTE, post_commands); } curl_easy_setopt(curl_handle, CURLOPT_INFILE, infile); curl_easy_setopt(curl_handle, CURLOPT_INFILESIZE, st.st_size); - passwd_string = gib_strjoin(":", ftp_user, ftp_pass, NULL); - curl_easy_setopt(curl_handle, CURLOPT_USERPWD, passwd_string); - - /* set URL to save to */ - url_string = gib_strjoin("/", "ftp:/", ftp_host, ftp_dir, tmp, NULL); - curl_easy_setopt(curl_handle, CURLOPT_URL, url_string); - - /* no progress meter please */ - curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); - - /* shut up completely */ - if (ftp_debug) - curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1); - else - curl_easy_setopt(curl_handle, CURLOPT_MUTE, 1); - - curl_easy_setopt(curl_handle, CURLOPT_POSTQUOTE, post_commands); - - curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1); - - if (!ftp_passive) - curl_easy_setopt(curl_handle, CURLOPT_FTPPORT, ftp_interface); - /* get it! */ ret = curl_easy_perform(curl_handle); /* TODO check error */ if (ret) { fprintf(stderr, "\ncamE: error sending via ftp: "); - log("EEEE error: "); + log("camE error: "); switch (ret) { case CURLE_URL_MALFORMAT: fprintf(stderr, "Badly formatted ftp host or directory\n"); @@ -959,11 +989,10 @@ /* cleanup curl stuff */ if (!ftp_keepalive) { curl_easy_cleanup(curl_handle); - curl_slist_free_all(post_commands); connections--; + curl_slist_free_all(post_commands); + post_commands = NULL; } - free(url_string); - free(passwd_string); fclose(infile); } @@ -1177,6 +1206,8 @@ watch_interface = val; if (NULL != (val = cfg_get_str("grab", "offline_image"))) offline_image = val; + if (NULL != (val = cfg_get_str("grab", "pwc_wb_mode"))) + pwc_wb_mode = val; if (-1 != (i = cfg_get_int("grab", "width"))) grab_width = i; if (-1 != (i = cfg_get_int("grab", "height"))) @@ -1255,6 +1286,10 @@ scale_height = i; if (-1 != (i = cfg_get_int("grab", "archive_shot_every"))) archive_shot_every = i; + if (-1 != (i = cfg_get_int("grab", "pwc_wb_red"))) + pwc_wb_red = i; + if (-1 != (i = cfg_get_int("grab", "pwc_wb_blue"))) + pwc_wb_blue = i; if (cam_framerate > 60) cam_framerate = 60; |
From: <enl...@li...> - 2002-02-28 19:35:28
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: AUTHORS example.camErc webcam.c Log Message: Another fine patch from David H Muir <dh...@li...> Adds the ability to archive thumbnails of the cam image when archiving is enabled. Config options are: archive_thumbnails_create = <int> (0- disable, 1- enable) archive_thumbnails_dir = <string> (dest. directory) archive_thumbnails_width = <int> (width of thumbnails) archive_thumbnails_height = <int> (height of thumbnails) =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/AUTHORS,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- AUTHORS 10 Jul 2001 23:09:04 -0000 1.5 +++ AUTHORS 28 Feb 2002 19:35:24 -0000 1.6 @@ -10,3 +10,9 @@ Greg Gilbert <gr...@tr...> Cropping and scaling options + +David H Muir <dh...@li...> + only archive shots after so many taken + +missen <mi...@mi...> + ftp keepalive =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- example.camErc 27 Feb 2002 19:23:38 -0000 1.20 +++ example.camErc 28 Feb 2002 19:35:24 -0000 1.21 @@ -85,6 +85,11 @@ # determines how many shots are taken before a pic is archived # (1 == every pic, 0 == don't archive) archive_shot_every = 1 +# create archive thumbnails enable/disable flag and give width/height +archive_thumbnails_dir = /opt/images/webcam/thumbnails +archive_thumbnails_create = 1 +archive_thumbnails_width = 120 +archive_thumbnails_height = 90 # jpeg quality (you can save as png etc too, but then quality does squat) quality = 80 input = 0 =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -3 -r1.55 -r1.56 --- webcam.c 27 Feb 2002 19:23:38 -0000 1.55 +++ webcam.c 28 Feb 2002 19:35:24 -0000 1.56 @@ -93,7 +93,11 @@ char *ttf_dir = "/usr/X11R6/lib/X11/fonts/TrueType"; char *archive_ext = "jpg"; char *grab_archive = NULL; -int archive_shot_every = 1; /* default to archive every shot */ +int archive_shot_every = 1; /* default to archive every shot */ +char *archive_thumbnails_dir = NULL; +int archive_thumbnails_create = 0; /* default is not to create archive thumbnails */ +int archive_thumbnails_width = 120; +int archive_thumbnails_height = 90; char *grab_blockfile = NULL; char *upload_blockfile = NULL; char *grab_postprocess = NULL; @@ -274,24 +278,24 @@ wb.mode = PWC_WB_AUTO; wb.manual_red = 50; wb.manual_blue = 50; - if(!strcasecmp(pwc_wb_mode, "auto")) { + if (!strcasecmp(pwc_wb_mode, "auto")) { wb.mode = PWC_WB_AUTO; - } else if(!strcasecmp(pwc_wb_mode, "indoor")) { + } else if (!strcasecmp(pwc_wb_mode, "indoor")) { wb.mode = PWC_WB_INDOOR; - } else if(!strcasecmp(pwc_wb_mode, "outdoor")) { + } else if (!strcasecmp(pwc_wb_mode, "outdoor")) { wb.mode = PWC_WB_OUTDOOR; - } else if(!strcasecmp(pwc_wb_mode, "fluorescent")) { + } else if (!strcasecmp(pwc_wb_mode, "fluorescent")) { wb.mode = PWC_WB_FL; - } else if(!strcasecmp(pwc_wb_mode, "manual")) { + } else if (!strcasecmp(pwc_wb_mode, "manual")) { wb.mode = PWC_WB_MANUAL; wb.manual_red = 65535 * ((float) pwc_wb_red / 100); wb.manual_blue = 65535 * ((float) pwc_wb_blue / 100); } else { log("unknown pwc white balance mode '%s' ignored\n", pwc_wb_mode); } - + if (ioctl(grab_fd, VIDIOCPWCSAWB, &wb) < 0) - perror("trying to set pwc white balance mode"); + perror("trying to set pwc white balance mode"); } /* set image source and TV norm */ @@ -633,27 +637,43 @@ archive_jpeg(Imlib_Image im) { char buffer[1028]; + char thumbnail_buffer[1028]; char date[128]; time_t t; struct tm *tm; - struct stat st; static int shot_counter = 0; + Imlib_Image thumbnail_image; shot_counter++; - if (grab_archive && archive_shot_every - && shot_counter >= archive_shot_every) { + if (grab_archive && archive_shot_every + && shot_counter >= archive_shot_every) { time(&t); tm = localtime(&t); strftime(date, 127, "%Y-%m-%d_%H%M%S", tm); - do { - snprintf(buffer, sizeof(buffer), "%s/webcam_%s.%s", grab_archive, date, - archive_ext); - } - while (stat(buffer, &st) == 0); + snprintf(buffer, sizeof(buffer), "%s/webcam_%s.%s", grab_archive, date, + archive_ext); save_image(im, buffer); shot_counter = 0; + /* + * if archive thumbnails are enabled we save them here, + * same filenames just in "archive_thumbnails_directory" directory + * files are saved in the same format as archive + */ + if (archive_thumbnails_create && archive_thumbnails_width + && archive_thumbnails_height) { + snprintf(thumbnail_buffer, sizeof(buffer), "%s/webcam_%s.%s", + archive_thumbnails_dir, date, archive_ext); + thumbnail_image = + gib_imlib_create_cropped_scaled_image(im, 0, 0, + gib_imlib_image_get_width(im), + gib_imlib_image_get_height(im), + archive_thumbnails_width, + archive_thumbnails_height, 1); + save_image(thumbnail_image, thumbnail_buffer); + gib_imlib_free_image_and_decache(thumbnail_image); + } } } @@ -835,7 +855,7 @@ } fstat(fileno(infile), &st); - if(!post_commands) { + if (!post_commands) { snprintf(buf, sizeof(buf), "rnfr %s", tmp); post_commands = curl_slist_append(post_commands, buf); snprintf(buf, sizeof(buf), "rnto %s", remote); @@ -846,11 +866,11 @@ if (connections < 1) { curl_handle = curl_easy_init(); connections++; - + passwd_string = gib_strjoin(":", ftp_user, ftp_pass, NULL); curl_easy_setopt(curl_handle, CURLOPT_USERPWD, passwd_string); free(passwd_string); - + /* set URL to save to */ url_string = gib_strjoin("/", "ftp:/", ftp_host, ftp_dir, tmp, NULL); curl_easy_setopt(curl_handle, CURLOPT_URL, url_string); @@ -858,7 +878,7 @@ /* no progress meter please */ curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); - + /* shut up completely */ if (ftp_debug) curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1); @@ -866,10 +886,10 @@ curl_easy_setopt(curl_handle, CURLOPT_MUTE, 1); curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1); - + if (!ftp_passive) curl_easy_setopt(curl_handle, CURLOPT_FTPPORT, ftp_interface); - + curl_easy_setopt(curl_handle, CURLOPT_POSTQUOTE, post_commands); } @@ -1186,6 +1206,8 @@ title_text = val; if (NULL != (val = cfg_get_str("grab", "archive_ext"))) archive_ext = val; + if (NULL != (val = cfg_get_str("grab", "archive_thumbnails_dir"))) + archive_thumbnails_dir = val; if (NULL != (val = cfg_get_str("grab", "logfile"))) logfile = val; if (NULL != (val = cfg_get_str("grab", "ttf_dir"))) @@ -1286,6 +1308,12 @@ scale_height = i; if (-1 != (i = cfg_get_int("grab", "archive_shot_every"))) archive_shot_every = i; + if (-1 != (i = cfg_get_int("grab", "archive_thumbnails_create"))) + archive_thumbnails_create = i; + if (-1 != (i = cfg_get_int("grab", "archive_thumbnails_width"))) + archive_thumbnails_width = i; + if (-1 != (i = cfg_get_int("grab", "archive_thumbnails_height"))) + archive_thumbnails_height = i; if (-1 != (i = cfg_get_int("grab", "pwc_wb_red"))) pwc_wb_red = i; if (-1 != (i = cfg_get_int("grab", "pwc_wb_blue"))) |
From: <enl...@li...> - 2002-02-28 19:35:45
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: AUTHORS Log Message: authors =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/AUTHORS,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- AUTHORS 28 Feb 2002 19:35:24 -0000 1.6 +++ AUTHORS 28 Feb 2002 19:35:44 -0000 1.7 @@ -13,6 +13,7 @@ David H Muir <dh...@li...> only archive shots after so many taken + archive thumbnails missen <mi...@mi...> ftp keepalive |
From: <enl...@li...> - 2003-02-07 12:33:09
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: AUTHORS example.camErc example.camErc.ssh webcam.c Log Message: Patch from Birger Nissen <bi...@ek...> to archive shots into dated subdirectories. =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/AUTHORS,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- AUTHORS 28 Feb 2002 19:35:44 -0000 1.7 +++ AUTHORS 7 Feb 2003 12:33:06 -0000 1.8 @@ -17,3 +17,6 @@ missen <mi...@mi...> ftp keepalive + +Birger Nissen <bi...@ek...> + archive subdirs =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc,v retrieving revision 1.21 retrieving revision 1.22 diff -u -3 -r1.21 -r1.22 --- example.camErc 28 Feb 2002 19:35:24 -0000 1.21 +++ example.camErc 7 Feb 2003 12:33:07 -0000 1.22 @@ -80,6 +80,9 @@ infofile = /home/gilbertt/.caminfo # directory to archive pics in. They are datestamped and saved in here. archive = /opt/images/webcam +# archive pics in datestamped subdirs +# (1 == with subdirs, 0 == without subdirs) +archive_subdirs = 0 # extension (determines type) of archived images. archive_ext = jpg # determines how many shots are taken before a pic is archived =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc.ssh,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- example.camErc.ssh 27 Feb 2002 19:23:38 -0000 1.7 +++ example.camErc.ssh 7 Feb 2003 12:33:07 -0000 1.8 @@ -61,6 +61,9 @@ infofile = /home/gilbertt/.caminfo # directory to archive pics in. They are datestamped and saved in here. archive = /opt/images/webcam +# archive pics in datestamped subdirs +# (1 == with subdirs, 0 == without subdirs) +archive_subdirs = 0 # extension (determines type) of archived images. archive_ext = jpg # jpeg quality (you can save as png etc too, but then quality does squat) =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.56 retrieving revision 1.57 diff -u -3 -r1.56 -r1.57 --- webcam.c 28 Feb 2002 19:35:24 -0000 1.56 +++ webcam.c 7 Feb 2003 12:33:07 -0000 1.57 @@ -93,6 +93,8 @@ char *ttf_dir = "/usr/X11R6/lib/X11/fonts/TrueType"; char *archive_ext = "jpg"; char *grab_archive = NULL; +int archive_subdirs = 0; /* default to archive without */ + /* subdirs */ int archive_shot_every = 1; /* default to archive every shot */ char *archive_thumbnails_dir = NULL; int archive_thumbnails_create = 0; /* default is not to create archive thumbnails */ @@ -636,9 +638,12 @@ void archive_jpeg(Imlib_Image im) { - char buffer[1028]; - char thumbnail_buffer[1028]; + char buffer[PATH_MAX]; + char thumbnail_buffer[PATH_MAX]; char date[128]; + char year[5]; + char month[3]; + char day[3]; time_t t; struct tm *tm; static int shot_counter = 0; @@ -650,10 +655,40 @@ && shot_counter >= archive_shot_every) { time(&t); tm = localtime(&t); - strftime(date, 127, "%Y-%m-%d_%H%M%S", tm); - snprintf(buffer, sizeof(buffer), "%s/webcam_%s.%s", grab_archive, date, - archive_ext); + if (archive_subdirs) { + strftime(date, 128, "%H%M%S", tm); + strftime(year, 5, "%Y", tm); + strftime(month, 3, "%m", tm); + strftime(day, 3, "%d", tm); + + snprintf(buffer, sizeof(buffer), "%s/%s", grab_archive, year); + if (access(buffer, F_OK) == -1) { + mkdir(buffer, 0777); + log("Create new subdir %s\n", buffer); + } + + snprintf(buffer, sizeof(buffer), "%s/%s/%s", grab_archive, year, + month); + if (access(buffer, F_OK) == -1) { + mkdir(buffer, 0777); + log("Created new archive subdir %s\n", buffer); + } + + snprintf(buffer, sizeof(buffer), "%s/%s/%s/%s", grab_archive, year, + month, day); + if (access(buffer, F_OK) == -1) { + mkdir(buffer, 0777); + log("Created new archive subdir %s\n", buffer); + } + + snprintf(buffer, sizeof(buffer), "%s/%s/%s/%s/%s.%s", grab_archive, + year, month, day, date, archive_ext); + } else { + strftime(date, 127, "%Y-%m-%d_%H%M%S", tm); + snprintf(buffer, sizeof(buffer), "%s/webcam_%s.%s", grab_archive, date, + archive_ext); + } save_image(im, buffer); shot_counter = 0; /* @@ -663,8 +698,33 @@ */ if (archive_thumbnails_create && archive_thumbnails_width && archive_thumbnails_height) { - snprintf(thumbnail_buffer, sizeof(buffer), "%s/webcam_%s.%s", - archive_thumbnails_dir, date, archive_ext); + if (archive_subdirs) { + snprintf(buffer, sizeof(buffer), "%s/%s", archive_thumbnails_dir, year); + if (access(buffer, F_OK) == -1) { + mkdir(buffer, 0777); + log("Create new subdir %s\n", buffer); + } + + snprintf(buffer, sizeof(buffer), "%s/%s/%s", archive_thumbnails_dir, + year, month); + if (access(buffer, F_OK) == -1) { + mkdir(buffer, 0777); + log("Created new archive subdir %s\n", buffer); + } + + snprintf(buffer, sizeof(buffer), "%s/%s/%s/%s", + archive_thumbnails_dir, year, month, day); + if (access(buffer, F_OK) == -1) { + mkdir(buffer, 0777); + log("Created new archive subdir %s\n", buffer); + } + + snprintf(buffer, sizeof(buffer), "%s/%s/%s/%s/%s.%s", + archive_thumbnails_dir, year, month, day, date, archive_ext); + } else { + snprintf(thumbnail_buffer, sizeof(buffer), "%s/webcam_%s.%s", + archive_thumbnails_dir, date, archive_ext); + } thumbnail_image = gib_imlib_create_cropped_scaled_image(im, 0, 0, gib_imlib_image_get_width(im), @@ -1308,6 +1368,8 @@ scale_height = i; if (-1 != (i = cfg_get_int("grab", "archive_shot_every"))) archive_shot_every = i; + if (-1 != (i = cfg_get_int("grab", "archive_subdirs"))) + archive_subdirs = i; if (-1 != (i = cfg_get_int("grab", "archive_thumbnails_create"))) archive_thumbnails_create = i; if (-1 != (i = cfg_get_int("grab", "archive_thumbnails_width"))) |
From: <enl...@li...> - 2003-02-08 14:22:58
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: fixy fixy :) =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.57 retrieving revision 1.58 diff -u -3 -r1.57 -r1.58 --- webcam.c 7 Feb 2003 12:33:07 -0000 1.57 +++ webcam.c 8 Feb 2003 14:22:56 -0000 1.58 @@ -639,7 +639,6 @@ archive_jpeg(Imlib_Image im) { char buffer[PATH_MAX]; - char thumbnail_buffer[PATH_MAX]; char date[128]; char year[5]; char month[3]; @@ -665,7 +664,7 @@ snprintf(buffer, sizeof(buffer), "%s/%s", grab_archive, year); if (access(buffer, F_OK) == -1) { mkdir(buffer, 0777); - log("Create new subdir %s\n", buffer); + log("Created new archive subdir %s\n", buffer); } snprintf(buffer, sizeof(buffer), "%s/%s/%s", grab_archive, year, @@ -702,7 +701,7 @@ snprintf(buffer, sizeof(buffer), "%s/%s", archive_thumbnails_dir, year); if (access(buffer, F_OK) == -1) { mkdir(buffer, 0777); - log("Create new subdir %s\n", buffer); + log("Created new archive subdir %s\n", buffer); } snprintf(buffer, sizeof(buffer), "%s/%s/%s", archive_thumbnails_dir, @@ -722,7 +721,7 @@ snprintf(buffer, sizeof(buffer), "%s/%s/%s/%s/%s.%s", archive_thumbnails_dir, year, month, day, date, archive_ext); } else { - snprintf(thumbnail_buffer, sizeof(buffer), "%s/webcam_%s.%s", + snprintf(buffer, sizeof(buffer), "%s/webcam_%s.%s", archive_thumbnails_dir, date, archive_ext); } thumbnail_image = @@ -731,7 +730,7 @@ gib_imlib_image_get_height(im), archive_thumbnails_width, archive_thumbnails_height, 1); - save_image(thumbnail_image, thumbnail_buffer); + save_image(thumbnail_image, buffer); gib_imlib_free_image_and_decache(thumbnail_image); } } |
From: <enl...@li...> - 2003-02-25 13:23:11
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: fix for latest giblib =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.58 retrieving revision 1.59 diff -u -3 -r1.58 -r1.59 --- webcam.c 8 Feb 2003 14:22:56 -0000 1.58 +++ webcam.c 25 Feb 2003 13:22:38 -0000 1.59 @@ -816,7 +816,7 @@ log("Error saving image %s - Out of memory", file); break; case IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS: - eprintf("While loading %s - Out of file descriptors", file); + gib_eprintf("While loading %s - Out of file descriptors", file); break; case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE: log("Error saving image %s - Cannot write to directory", file); |
From: <enl...@li...> - 2003-02-25 13:25:50
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: latest giblib =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -3 -r1.59 -r1.60 --- webcam.c 25 Feb 2003 13:22:38 -0000 1.59 +++ webcam.c 25 Feb 2003 13:25:12 -0000 1.60 @@ -37,7 +37,7 @@ #include "parseconfig.h" #include "pwc-ioctl.h" -#define VERSION "1.3" +#define VERSION "1.4" void log(char *fmt, ...); |
From: <enl...@li...> - 2003-03-15 15:25:57
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: example.camErc webcam.c Log Message: Patch from James Ballantine <ja...@ba...> adds options to flip captured image vertically or horizontally before processing. =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc,v retrieving revision 1.22 retrieving revision 1.23 diff -u -3 -r1.22 -r1.23 --- example.camErc 7 Feb 2003 12:33:07 -0000 1.22 +++ example.camErc 15 Mar 2003 15:25:54 -0000 1.23 @@ -157,3 +157,10 @@ # scale = 1 # scale_width = 640 # scale_height = 480 +# +# Flip the image horizontally or vertically. +# Horizontal flipping is useful for some Philips cams +# which give a mirrored image when used with the pwc module. +# flip_horizontal = 1 +# flip_vertical = 1 + =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -3 -r1.60 -r1.61 --- webcam.c 25 Feb 2003 13:25:12 -0000 1.60 +++ webcam.c 15 Mar 2003 15:25:54 -0000 1.61 @@ -138,6 +138,8 @@ int bw_percent = 100; int delay_correct = 0; int reinit_device = 0; +int flip_horizontal = 0; +int flip_vertical = 0; int connections = 0; CURL *curl_handle = NULL; @@ -1379,6 +1381,10 @@ pwc_wb_red = i; if (-1 != (i = cfg_get_int("grab", "pwc_wb_blue"))) pwc_wb_blue = i; + if (-1 != (i = cfg_get_int("grab", "flip_horizontal"))) + flip_horizontal = 1; + if (-1 != (i = cfg_get_int("grab", "flip_vertical"))) + flip_vertical = 1; if (cam_framerate > 60) cam_framerate = 60; @@ -1494,6 +1500,14 @@ system(action_post_shot); log("post-shot action done\n"); } + + if (flip_horizontal) { + imlib_image_flip_horizontal(); + } + if (flip_vertical) { + imlib_image_flip_vertical(); + } + if (overlay_im) draw_overlay(image); add_time_text(image, get_message(), width, height); |
From: <enl...@li...> - 2003-03-26 08:54:16
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: Whoops. Feeding libcurl strings and then freeing them makes it mostly unhappy... =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.61 retrieving revision 1.62 diff -u -3 -r1.61 -r1.62 --- webcam.c 15 Mar 2003 15:25:54 -0000 1.61 +++ webcam.c 26 Mar 2003 08:54:12 -0000 1.62 @@ -905,7 +905,8 @@ CURLcode ret; struct stat st; static struct curl_slist *post_commands = NULL; - char *passwd_string, *url_string; + static char *passwd_string = NULL; + static char *url_string = NULL; infile = fopen(local, "r"); @@ -928,14 +929,16 @@ curl_handle = curl_easy_init(); connections++; + if (passwd_string) + free(passwd_string); passwd_string = gib_strjoin(":", ftp_user, ftp_pass, NULL); curl_easy_setopt(curl_handle, CURLOPT_USERPWD, passwd_string); - free(passwd_string); /* set URL to save to */ + if (url_string) + free(url_string); url_string = gib_strjoin("/", "ftp:/", ftp_host, ftp_dir, tmp, NULL); curl_easy_setopt(curl_handle, CURLOPT_URL, url_string); - free(url_string); /* no progress meter please */ curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); |
From: <enl...@li...> - 2003-06-10 09:30:23
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: AUTHORS example.camErc webcam.c Log Message: Patch from Abel Muiño <abe...@mu...> - optionally delete before rename when uploading via FTP =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/AUTHORS,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- AUTHORS 7 Feb 2003 12:33:06 -0000 1.8 +++ AUTHORS 10 Jun 2003 09:30:19 -0000 1.9 @@ -20,3 +20,6 @@ Birger Nissen <bi...@ek...> archive subdirs + +Abel Muiño <abe...@mu...> + optionally delete before move when uploading via FTP =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- example.camErc 15 Mar 2003 15:25:54 -0000 1.23 +++ example.camErc 10 Jun 2003 09:30:19 -0000 1.24 @@ -20,6 +20,9 @@ debug = 0 # Actually do the upload? If do = 0, just take and archive pics. do = 1 +# Some servers require us to explicitly delete the previous image +# In that case, enable this option +delete_first = 0 # you can set ftp->do to 0 above and use scp instead - you still need # the dir, file and tmp settings in the ftp section for this to work. =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.62 retrieving revision 1.63 diff -u -3 -r1.62 -r1.63 --- webcam.c 26 Mar 2003 08:54:12 -0000 1.62 +++ webcam.c 10 Jun 2003 09:30:19 -0000 1.63 @@ -37,7 +37,7 @@ #include "parseconfig.h" #include "pwc-ioctl.h" -#define VERSION "1.4" +#define VERSION "1.5" void log(char *fmt, ...); @@ -54,6 +54,7 @@ int ftp_passive = 1; int ftp_do = 1; int ftp_keepalive = 1; +int ftp_delete_first = 0; char *scp_target = NULL; char *grab_device = "/dev/video0"; char *grab_text = ""; /* strftime */ @@ -97,7 +98,7 @@ /* subdirs */ int archive_shot_every = 1; /* default to archive every shot */ char *archive_thumbnails_dir = NULL; -int archive_thumbnails_create = 0; /* default is not to create archive thumbnails */ +int archive_thumbnails_create = 0; /* default is not to create archive thumbnails */ int archive_thumbnails_width = 120; int archive_thumbnails_height = 90; char *grab_blockfile = NULL; @@ -918,6 +919,10 @@ fstat(fileno(infile), &st); if (!post_commands) { + if (ftp_delete_first) { + snprintf(buf, sizeof(buf), "dele %s", remote); + post_commands = curl_slist_append(post_commands, buf); + } snprintf(buf, sizeof(buf), "rnfr %s", tmp); post_commands = curl_slist_append(post_commands, buf); snprintf(buf, sizeof(buf), "rnto %s", remote); @@ -1035,15 +1040,15 @@ fprintf(stderr, "Write error\n"); log("Write error\n"); break; - case CURLE_MALFORMAT_USER: /* the user name is illegally specified */ + case CURLE_MALFORMAT_USER: /* the user name is illegally specified */ fprintf(stderr, "Malformatted username\n"); log("Malformatted username\n"); break; - case CURLE_FTP_COULDNT_STOR_FILE: /* failed FTP upload */ + case CURLE_FTP_COULDNT_STOR_FILE: /* failed FTP upload */ fprintf(stderr, "Couldn't STOR the file\n"); log("Couldn't STOR the file\n"); break; - case CURLE_READ_ERROR: /* could open/read from file */ + case CURLE_READ_ERROR: /* could open/read from file */ fprintf(stderr, "Couldn't open temp file\n"); log("Couldn't open temp file\n"); break; @@ -1051,11 +1056,11 @@ fprintf(stderr, "Out of memory\n"); log("Out of memory\n"); break; - case CURLE_OPERATION_TIMEOUTED: /* the timeout time was reached */ + case CURLE_OPERATION_TIMEOUTED: /* the timeout time was reached */ fprintf(stderr, "Upload timed out\n"); log("Upload timed out\n"); break; - case CURLE_FTP_PORT_FAILED: /* FTP PORT operation failed */ + case CURLE_FTP_PORT_FAILED: /* FTP PORT operation failed */ fprintf(stderr, "ftp PORT failed\n"); log("ftp PORT failed\n"); break; @@ -1240,6 +1245,8 @@ ftp_timeout = i; if (NULL != (val = cfg_get_str("ftp", "interface"))) ftp_interface = val; + if (-1 != (i = cfg_get_int("ftp", "delete_first"))) + ftp_delete_first = i; if (NULL != (val = cfg_get_str("scp", "target"))) scp_target = val; |
From: <enl...@li...> - 2003-06-23 12:24:57
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: release 1.6 =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -3 -r1.63 -r1.64 --- webcam.c 10 Jun 2003 09:30:19 -0000 1.63 +++ webcam.c 23 Jun 2003 12:24:26 -0000 1.64 @@ -37,7 +37,7 @@ #include "parseconfig.h" #include "pwc-ioctl.h" -#define VERSION "1.5" +#define VERSION "1.6" void log(char *fmt, ...); |
From: <enl...@li...> - 2003-06-25 08:22:40
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: AUTHORS Makefile example.camErc example.camErc.ssh webcam.c Log Message: Patch from Nathan Poznick <po...@co...> which implements an upload_every option, too allow you to archive more shots than you upload. =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/AUTHORS,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- AUTHORS 10 Jun 2003 09:30:19 -0000 1.9 +++ AUTHORS 25 Jun 2003 08:22:38 -0000 1.10 @@ -23,3 +23,6 @@ Abel Muiño <abe...@mu...> optionally delete before move when uploading via FTP + +Nathan Poznick <po...@co...> + upload_every option =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/Makefile,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- Makefile 16 May 2001 22:45:34 -0000 1.8 +++ Makefile 25 Jun 2003 08:22:38 -0000 1.9 @@ -7,7 +7,7 @@ mandir=$(ROOT)${prefix}/man CC=gcc -CFLAGS=-O3 -g -Wall -I$(srcdir)/.. -I.. -D_GNU_SOURCE `giblib-config --cflags` -lcurl +CFLAGS=-O3 -g -Wall -I$(srcdir)/.. -I.. -D_GNU_SOURCE `giblib-config --cflags` INSTALL=/usr/bin/install -c INSTALL_PROGRAM=${INSTALL} @@ -23,7 +23,7 @@ all build: $(PROGS) camE: $(OBJS) - $(CC) $(CFLAGS) -o $@ $(OBJS) `giblib-config --libs` + $(CC) $(CFLAGS) -o $@ $(OBJS) `giblib-config --libs` -lcurl install: all $(INSTALL_DIR) $(bindir) =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc,v retrieving revision 1.24 retrieving revision 1.25 diff -u -3 -r1.24 -r1.25 --- example.camErc 10 Jun 2003 09:30:19 -0000 1.24 +++ example.camErc 25 Jun 2003 08:22:38 -0000 1.25 @@ -23,9 +23,15 @@ # Some servers require us to explicitly delete the previous image # In that case, enable this option delete_first = 0 +# Determines how many shots are taken before an image is uploaded. +# (1 == every picture is uploaded, 10 would be every 10th image) +# (Defaults to 1 if not present) +upload_every = 1 # you can set ftp->do to 0 above and use scp instead - you still need # the dir, file and tmp settings in the ftp section for this to work. +# scp also honors the upload_every setting from the ftp section, and +# will also default to a value of 1 if not present. [scp] # target = user@host =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/example.camErc.ssh,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- example.camErc.ssh 7 Feb 2003 12:33:07 -0000 1.8 +++ example.camErc.ssh 25 Jun 2003 08:22:38 -0000 1.9 @@ -4,6 +4,7 @@ file = webcam.jpg tmp = uploading.jpg do = 0 +upload_every = 1 [scp] target = user@host =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.64 retrieving revision 1.65 diff -u -3 -r1.64 -r1.65 --- webcam.c 23 Jun 2003 12:24:26 -0000 1.64 +++ webcam.c 25 Jun 2003 08:22:38 -0000 1.65 @@ -53,6 +53,7 @@ pid_t childpid = 0; int ftp_passive = 1; int ftp_do = 1; +int ftp_upload_every = 1; /* default to upload every shot */ int ftp_keepalive = 1; int ftp_delete_first = 0; char *scp_target = NULL; @@ -1115,8 +1116,11 @@ { struct stat st; int upload_successful = 1; + static int shot_counter = 0; + + shot_counter++; - if (ftp_do) { + if (ftp_do && (shot_counter >= ftp_upload_every)) { if ((upload_blockfile && (stat(upload_blockfile, &st) == -1)) || !upload_blockfile) { log("*** uploading via ftp\n"); @@ -1128,7 +1132,8 @@ log("post upload action done\n"); } } - } else if (scp_target) { + shot_counter = 0; + } else if (scp_target && (shot_counter >= ftp_upload_every)) { char target_buf[2048]; char cmd_buf[4096]; char *scp_args[] = { "scp", "-BCq", NULL, NULL, NULL }; @@ -1159,6 +1164,7 @@ } } } + shot_counter = 0; } return upload_successful; } @@ -1218,6 +1224,8 @@ cfg_parse_file(config_file); } else { sprintf(filename, "%s/%s", getenv("HOME"), ".camErc"); + memset(filename, '\0', sizeof(filename)); + snprintf(filename, sizeof(filename)-1, "%s/%s", getenv("HOME"), ".camErc"); cfg_parse_file(filename); } @@ -1239,6 +1247,8 @@ ftp_debug = i; if (-1 != (i = cfg_get_int("ftp", "do"))) ftp_do = i; + if (-1 != (i = cfg_get_int("ftp", "upload_every"))) + ftp_upload_every = i; if (-1 != (i = cfg_get_int("ftp", "keepalive"))) ftp_keepalive = i; if (-1 != (i = cfg_get_int("ftp", "timeout"))) |
From: <enl...@li...> - 2003-06-25 08:25:13
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: webcam.c Log Message: think I found and squished a bug with the scaling code =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.65 retrieving revision 1.66 diff -u -3 -r1.65 -r1.66 --- webcam.c 25 Jun 2003 08:22:38 -0000 1.65 +++ webcam.c 25 Jun 2003 08:25:12 -0000 1.66 @@ -1512,6 +1512,7 @@ scale_width, scale_height, 1, 0, 0); gib_imlib_free_image_and_decache(image); image = tmp_image; + imlib_context_set_image(image); } log("** shot taken\n"); |
From: <enl...@li...> - 2003-10-01 10:30:28
|
Enlightenment CVS committal Author : gilbertt Project : misc Module : camE Dir : misc/camE Modified Files: AUTHORS webcam.c Log Message: Patch from Birger Nissen <bi...@ek...> to enable single shot mode (camE -s to just grab a single shot then exit, suitable for running from cron). =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/AUTHORS,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- AUTHORS 25 Jun 2003 08:22:38 -0000 1.10 +++ AUTHORS 1 Oct 2003 10:30:25 -0000 1.11 @@ -20,6 +20,7 @@ Birger Nissen <bi...@ek...> archive subdirs + single shot option Abel Muiño <abe...@mu...> optionally delete before move when uploading via FTP =================================================================== RCS file: /cvsroot/enlightenment/misc/camE/webcam.c,v retrieving revision 1.66 retrieving revision 1.67 diff -u -3 -r1.66 -r1.67 --- webcam.c 25 Jun 2003 08:25:12 -0000 1.66 +++ webcam.c 1 Oct 2003 10:30:25 -0000 1.67 @@ -1107,6 +1107,7 @@ printf("usage: camE [OPTION]\n"); printf(" -c FILE Use config file FILE\n"); printf(" -f Don't fork to background\n"); + printf(" -s Single shot\n"); printf(" -h -v This message\n"); exit(0); } @@ -1186,10 +1187,11 @@ FILE *fp; int ch; int dont_fork = 0; + int single_shot = 0; int offline_done = 1; char *config_file = NULL; - while ((ch = getopt(argc, argv, "c:fhv")) != EOF) { + while ((ch = getopt(argc, argv, "c:fshv")) != EOF) { switch (ch) { case 'c': config_file = strdup(optarg); @@ -1197,6 +1199,9 @@ case 'f': dont_fork = 1; break; + case 's': + single_shot = 1; + break; case 'h': usage(); break; @@ -1210,7 +1215,7 @@ } } - if (!dont_fork) { + if (!dont_fork && !single_shot) { /* fork and die */ if ((childpid = fork()) < 0) { fprintf(stderr, "fork (%s)\n", strerror(errno)); @@ -1457,7 +1462,7 @@ grab_init(); /* go! */ - for (;;) { + do { just_shot = 0; upload_successful = 1; end_shot = 0; @@ -1547,23 +1552,26 @@ offline_done = do_upload(offline_image); log("OFFLINE\n"); } - new_delay = grab_delay; - if (just_shot && upload_successful) { - end_shot = end_shot - start_shot; - if (bw_percent < 100) - bw_res_change(end_shot); - if (delay_correct && end_shot) { - new_delay -= end_shot; - if (new_delay < 0) - new_delay = 0; - log("Sleeping %d secs (corrected)\n", new_delay); - } else { - log("Sleeping %d secs\n", grab_delay); + + if (!single_shot) { + new_delay = grab_delay; + if (just_shot && upload_successful) { + end_shot = end_shot - start_shot; + if (bw_percent < 100) + bw_res_change(end_shot); + if (delay_correct && end_shot) { + new_delay -= end_shot; + if (new_delay < 0) + new_delay = 0; + log("Sleeping %d secs (corrected)\n", new_delay); + } else { + log("Sleeping %d secs\n", grab_delay); + } } + if (upload_successful && (new_delay > 0)) + sleep(new_delay); } - if (upload_successful && (new_delay > 0)) - sleep(new_delay); - } + } while(!single_shot); return 0; } |