gdImage *fx_scale(gdImage *src, char *options) { int w, h; gdImage *im; w = argtol(options, "x ", 0, 0, 10); h = argtol(options, "x ", 1, 0, 10); if(w < 0 || h < 0) { WARN("Invalid resolution: %s", options); return(src); } MSG("Scaling image from %ix%i -> %ix%i.", gdImageSX(src), gdImageSY(src), w, h); im = gdImageCreateTrueColor(w, h); if(!im) { WARN("Out of memory."); return(src); } gdImageCopyResampled(im, src, 0, 0, 0, 0, w, h, gdImageSX(src), gdImageSY(src)); gdImageDestroy(src); return(im); }
int fswc_getopts(fswebcam_config_t *config, int argc, char *argv[]) { int c; fswc_getopt_t s; static struct option long_opts[] = { {"help", no_argument, 0, '?'}, {"config", required_argument, 0, 'c'}, {"quiet", no_argument, 0, 'q'}, {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, OPT_VERSION}, {"loop", required_argument, 0, 'l'}, {"offset", required_argument, 0, OPT_OFFSET}, {"background", no_argument, 0, 'b'}, {"pid", required_argument, 0, OPT_PID}, {"log", required_argument, 0, 'L'}, {"device", required_argument, 0, 'd'}, {"input", required_argument, 0, 'i'}, {"list-inputs", no_argument, 0, OPT_LIST_INPUTS}, {"tuner", required_argument, 0, 't'}, {"list-tuners", no_argument, 0, OPT_LIST_TUNERS}, {"frequency", required_argument, 0, 'f'}, {"delay", required_argument, 0, 'D'}, {"resolution", required_argument, 0, 'r'}, {"fps", required_argument, 0, OPT_FPS}, {"list-framesizes", no_argument, 0, OPT_LIST_FRAMESIZES}, {"list-framerates", no_argument, 0, OPT_LIST_FRAMERATES}, {"frames", required_argument, 0, 'F'}, {"skip", required_argument, 0, 'S'}, {"palette", required_argument, 0, 'p'}, {"dumpframe", required_argument, 0, OPT_DUMPFRAME}, {"read", no_argument, 0, 'R'}, {"list-formats", no_argument, 0, OPT_LIST_FORMATS}, {"set", required_argument, 0, 's'}, {"list-controls", no_argument, 0, OPT_LIST_CONTROLS}, {"revert", no_argument, 0, OPT_REVERT}, {"flip", required_argument, 0, OPT_FLIP}, {"crop", required_argument, 0, OPT_CROP}, {"scale", required_argument, 0, OPT_SCALE}, {"rotate", required_argument, 0, OPT_ROTATE}, {"deinterlace", no_argument, 0, OPT_DEINTERLACE}, {"invert", no_argument, 0, OPT_INVERT}, {"greyscale", no_argument, 0, OPT_GREYSCALE}, {"swapchannels", required_argument, 0, OPT_SWAPCHANNELS}, {"no-banner", no_argument, 0, OPT_NO_BANNER}, {"top-banner", no_argument, 0, OPT_TOP_BANNER}, {"bottom-banner", no_argument, 0, OPT_BOTTOM_BANNER}, {"banner-colour", required_argument, 0, OPT_BG_COLOUR}, {"line-colour", required_argument, 0, OPT_BL_COLOUR}, {"text-colour", required_argument, 0, OPT_FG_COLOUR}, {"font", required_argument, 0, OPT_FONT}, {"no-shadow", no_argument, 0, OPT_NO_SHADOW}, {"shadow", no_argument, 0, OPT_SHADOW}, {"title", required_argument, 0, OPT_TITLE}, {"no-title", no_argument, 0, OPT_NO_TITLE}, {"subtitle", required_argument, 0, OPT_SUBTITLE}, {"no-subtitle", no_argument, 0, OPT_NO_SUBTITLE}, {"timestamp", required_argument, 0, OPT_TIMESTAMP}, {"no-timestamp", no_argument, 0, OPT_NO_TIMESTAMP}, {"gmt", no_argument, 0, OPT_GMT}, {"info", required_argument, 0, OPT_INFO}, {"no-info", no_argument, 0, OPT_NO_INFO}, {"underlay", required_argument, 0, OPT_UNDERLAY}, {"no-underlay", no_argument, 0, OPT_NO_UNDERLAY}, {"overlay", required_argument, 0, OPT_OVERLAY}, {"no-overlay", no_argument, 0, OPT_NO_OVERLAY}, {"jpeg", required_argument, 0, OPT_JPEG}, {"png", required_argument, 0, OPT_PNG}, {"save", required_argument, 0, OPT_SAVE}, {"exec", required_argument, 0, OPT_EXEC}, {0, 0, 0, 0} }; char *opts = "-qc:vl:bL:d:i:t:f:D:r:F:s:S:p:R"; s.opts = opts; s.long_opts = long_opts; s.opt_index = 0; s.filename = NULL; s.f = NULL; s.line = 0; /* Set the defaults. */ config->loop = 0; config->offset = 0; config->background = 0; config->pidfile = NULL; config->logfile = NULL; config->gmt = 0; config->start = 0; config->device = strdup("/dev/video0"); config->input = NULL; config->tuner = 0; config->frequency = 0; config->delay = 0; config->use_read = 0; config->list = 0; config->width = 384; config->height = 288; config->fps = 0; config->frames = 1; config->skipframes = 0; config->palette = SRC_PAL_ANY; config->option = NULL; config->dumpframe = NULL; config->jobs = 0; config->job = NULL; /* Don't report errors. */ opterr = 0; /* Reset getopt to ensure parsing begins at the first argument. */ optind = 0; /* Parse the command line and any config files. */ while((c = fswc_getopt(&s, argc, argv)) != -1) { switch(c) { case '?': fswc_usage(); /* Command line error. */ case '!': return(-1); /* Conf file error. */ case 'c': INFO("Reading configuration from '%s'...", optarg); s.f = fopen(optarg, "rt"); if(!s.f) { ERROR("fopen: %s", strerror(errno)); return(-1); } s.line = 0; free(s.filename); s.filename = strdup(optarg); break; case OPT_VERSION: fprintf(stderr, "fswebcam %s\n", PACKAGE_VERSION); return(-1); case 'q': log_quiet(-1); log_verbose(0); break; case 'v': log_quiet(0); log_verbose(-1); break; case 'l': config->loop = atol(optarg); break; case OPT_OFFSET: config->offset = atol(optarg); break; case 'b': config->background = -1; break; case OPT_PID: if(config->pidfile) free(config->pidfile); config->pidfile = strdup(optarg); break; case 'L': if(config->logfile) free(config->logfile); config->logfile = strdup(optarg); break; case 'd': if(config->device) free(config->device); config->device = strdup(optarg); break; case 'i': if(config->input) free(config->input); config->input = strdup(optarg); break; case OPT_LIST_INPUTS: config->list |= SRC_LIST_INPUTS; break; case 't': config->tuner = atoi(optarg); break; case OPT_LIST_TUNERS: config->list |= SRC_LIST_TUNERS; break; case 'f': config->frequency = atof(optarg) * 1000; break; case 'D': config->delay = atoi(optarg); break; case 'r': config->width = argtol(optarg, "x ", 0, 0, 10); config->height = argtol(optarg, "x ", 1, 0, 10); break; case OPT_FPS: config->fps = atoi(optarg); break; case 'F': config->frames = atoi(optarg); break; case 'S': config->skipframes = atoi(optarg); break; case 's': fswc_set_option(config, optarg); break; case OPT_LIST_CONTROLS: config->list |= SRC_LIST_CONTROLS; break; case 'p': config->palette = fswc_find_palette(optarg); if(config->palette == -1) return(-1); break; case 'R': config->use_read = -1; break; case OPT_LIST_FORMATS: config->list |= SRC_LIST_FORMATS; break; case OPT_GMT: config->gmt = -1; break; case OPT_DUMPFRAME: free(config->dumpframe); config->dumpframe = strdup(optarg); break; default: /* All other options are added to the job queue. */ fswc_add_job(config, c, optarg); break; } } /* Do a sanity check on the options. */ if(config->frequency < 0) config->frequency = 0; if(config->width < 1) config->width = 1; if(config->height < 1) config->height = 1; if(config->frames < 1) config->frames = 1; if(config->frames > MAX_FRAMES) { WARN("Requested %u frames, maximum is %u. Using that.", config->frames, MAX_FRAMES); config->frames = MAX_FRAMES; } /* Correct offset if negative or out of range. */ if(config->offset && (config->offset %= (signed long) config->loop) < 0) config->offset += config->loop; /* Free the config filename if set. */ free(s.filename); return(0); }
gdImage *fx_crop(gdImage *src, char *options) { char arg[32]; int w, h, x, y; gdImage *im; if(argncpy(arg, 32, options, ", \t", 0, 0)) { WARN("Invalid area to crop: %s", arg); return(src); } w = argtol(arg, "x ", 0, 0, 10); h = argtol(arg, "x ", 1, 0, 10); if(w < 0 || h < 0) { WARN("Invalid area to crop: %s", arg); return(src); } /* Make sure crop area resolution is smaller than the source image. */ if(w > gdImageSX(src) || h > gdImageSY(src)) { WARN("Crop area is larger than the image!"); return(src); } /* Get the offset. */ x = -1; y = -1; if(!argncpy(arg, 32, options, ", \t", 1, 0)) { x = argtol(arg, "x ", 0, 0, 10); y = argtol(arg, "x ", 1, 0, 10); } if(x < 0 || y < 0) { /* By default crop the center of the image. */ x = (gdImageSX(src) - w) / 2; y = (gdImageSY(src) - h) / 2; } MSG("Cropping image from %ix%i [offset: %ix%i] -> %ix%i.", gdImageSX(src), gdImageSY(src), x, y, w, h); im = gdImageCreateTrueColor(w, h); if(!im) { WARN("Out of memory."); return(src); } gdImageCopy(im, src, 0, 0, x, y, w, h); gdImageDestroy(src); return(im); }
static NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) { #define argtos(v) if (arge > ++argp) v = *argp; else goto usage #define argtol(v) if (arge > ++argp) v = wcstol_deflt(*argp, v); else goto usage wchar_t **argp, **arge; PWSTR DebugLogFile = 0; ULONG DebugFlags = 0; PWSTR VolumePrefix = 0; PWSTR PassThrough = 0; PWSTR MountPoint = 0; HANDLE DebugLogHandle = INVALID_HANDLE_VALUE; WCHAR PassThroughBuf[MAX_PATH]; PTFS *Ptfs = 0; NTSTATUS Result; for (argp = argv + 1, arge = argv + argc; arge > argp; argp++) { if (L'-' != argp[0][0]) break; switch (argp[0][1]) { case L'?': goto usage; case L'd': argtol(DebugFlags); break; case L'D': argtos(DebugLogFile); break; case L'm': argtos(MountPoint); break; case L'p': argtos(PassThrough); break; case L'u': argtos(VolumePrefix); break; default: goto usage; } } if (arge > argp) goto usage; if (0 == PassThrough && 0 != VolumePrefix) { PWSTR P; P = wcschr(VolumePrefix, L'\\'); if (0 != P && L'\\' != P[1]) { P = wcschr(P + 1, L'\\'); if (0 != P && ( (L'A' <= P[1] && P[1] <= L'Z') || (L'a' <= P[1] && P[1] <= L'z') ) && L'$' == P[2]) { StringCbPrintf(PassThroughBuf, sizeof PassThroughBuf, L"%c:%s", P[1], P + 3); PassThrough = PassThroughBuf; } } } if (0 == PassThrough || 0 == MountPoint) goto usage; EnableBackupRestorePrivileges(); if (0 != DebugLogFile) { if (0 == wcscmp(L"-", DebugLogFile)) DebugLogHandle = GetStdHandle(STD_ERROR_HANDLE); else DebugLogHandle = CreateFileW( DebugLogFile, FILE_APPEND_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (INVALID_HANDLE_VALUE == DebugLogHandle) { fail(L"cannot open debug log file"); goto usage; } FspDebugLogSetHandle(DebugLogHandle); } Result = PtfsCreate(PassThrough, VolumePrefix, MountPoint, DebugFlags, &Ptfs); if (!NT_SUCCESS(Result)) { fail(L"cannot create file system"); goto exit; } Result = FspFileSystemStartDispatcher(Ptfs->FileSystem, 0); if (!NT_SUCCESS(Result)) { fail(L"cannot start file system"); goto exit; } MountPoint = FspFileSystemMountPoint(Ptfs->FileSystem); info(L"%s%s%s -p %s -m %s", L"" PROGNAME, 0 != VolumePrefix && L'\0' != VolumePrefix[0] ? L" -u " : L"", 0 != VolumePrefix && L'\0' != VolumePrefix[0] ? VolumePrefix : L"", PassThrough, MountPoint); Service->UserContext = Ptfs; Result = STATUS_SUCCESS; exit: if (!NT_SUCCESS(Result) && 0 != Ptfs) PtfsDelete(Ptfs); return Result; usage: static wchar_t usage[] = L"" "usage: %s OPTIONS\n" "\n" "options:\n" " -d DebugFlags [-1: enable all debug logs]\n" " -D DebugLogFile [file path; use - for stderr]\n" " -u \\Server\\Share [UNC prefix (single backslash)]\n" " -p Directory [directory to expose as pass through file system]\n" " -m MountPoint [X:|*|directory]\n"; fail(usage, L"" PROGNAME); return STATUS_UNSUCCESSFUL; #undef argtos #undef argtol }