/** * Parse the incoming command line and put resulting parameters in to the state * * @param argc Number of arguments in command line * @param argv Array of pointers to strings from command line * @param state Pointer to state structure to assign any discovered parameters to * @return non-0 if failed for some reason, 0 otherwise */ static int parse_cmdline(int argc, const char **argv, RASPISTILLYUV_STATE *state) { // Parse the command line arguments. // We are looking for --<something> or -<abreviation of something> int valid = 1; // set 0 if we have a bad parameter int i; for (i = 1; i < argc && valid; i++) { int command_id, num_parameters; if (!argv[i]) continue; if (argv[i][0] != '-') { valid = 0; continue; } // Assume parameter is valid until proven otherwise valid = 1; command_id = raspicli_get_command_id(cmdline_commands, cmdline_commands_size, &argv[i][1], &num_parameters); // If we found a command but are missing a parameter, continue (and we will drop out of the loop) if (command_id != -1 && num_parameters > 0 && (i + 1 >= argc) ) continue; // We are now dealing with a command line option switch (command_id) { case CommandHelp: display_valid_parameters(basename(argv[0])); return -1; case CommandWidth: // Width > 0 if (sscanf(argv[i + 1], "%u", &state->width) != 1) valid = 0; else i++; break; case CommandHeight: // Height > 0 if (sscanf(argv[i + 1], "%u", &state->height) != 1) valid = 0; else i++; break; case CommandOutput: // output filename { int len = strlen(argv[i + 1]); if (len) { state->filename = malloc(len + 10); // leave enough space for any timelapse generated changes to filename vcos_assert(state->filename); if (state->filename) strncpy(state->filename, argv[i + 1], len+1); i++; } else valid = 0; break; } case CommandLink : { int len = strlen(argv[i+1]); if (len) { state->linkname = malloc(len + 10); vcos_assert(state->linkname); if (state->linkname) strncpy(state->linkname, argv[i + 1], len+1); i++; } else valid = 0; break; } case CommandVerbose: // display lots of data during run state->verbose = 1; break; case CommandTimeout: // Time to run viewfinder for before taking picture, in seconds { if (sscanf(argv[i + 1], "%u", &state->timeout) == 1) { // Ensure that if previously selected CommandKeypress we don't overwrite it if (state->timeout == 0 && state->frameNextMethod == FRAME_NEXT_SINGLE) state->frameNextMethod = FRAME_NEXT_FOREVER; i++; } else valid = 0; break; } case CommandTimelapse: if (sscanf(argv[i + 1], "%u", &state->timelapse) != 1) valid = 0; else { if (state->timelapse) state->frameNextMethod = FRAME_NEXT_TIMELAPSE; else state->frameNextMethod = FRAME_NEXT_IMMEDIATELY; i++; } break; case CommandUseRGB: // display lots of data during run state->useRGB = 1; break; case CommandCamSelect: //Select camera input port { if (sscanf(argv[i + 1], "%u", &state->cameraNum) == 1) { i++; } else valid = 0; break; } case CommandFullResPreview: state->fullResPreview = 1; break; case CommandKeypress: // Set keypress between capture mode state->frameNextMethod = FRAME_NEXT_KEYPRESS; break; case CommandSignal: // Set SIGUSR1 between capture mode state->frameNextMethod = FRAME_NEXT_SIGNAL; // Reenable the signal signal(SIGUSR1, signal_handler); break; case CommandSettings: state->settings = 1; break; case CommandBurstMode: state->burstCaptureMode=1; break; default: { // Try parsing for any image specific parameters // result indicates how many parameters were used up, 0,1,2 // but we adjust by -1 as we have used one already const char *second_arg = (i + 1 < argc) ? argv[i + 1] : NULL; int parms_used = (raspicamcontrol_parse_cmdline(&state->camera_parameters, &argv[i][1], second_arg)); // Still unused, try preview options if (!parms_used) parms_used = raspipreview_parse_cmdline(&state->preview_parameters, &argv[i][1], second_arg); // If no parms were used, this must be a bad parameters if (!parms_used) valid = 0; else i += parms_used - 1; break; } } } if (!valid) { fprintf(stderr, "Invalid command line option (%s)\n", argv[i-1]); return 1; } return 0; }
/** * Parse the incoming command line and put resulting parameters in to the state * * @param argc Number of arguments in command line * @param argv Array of pointers to strings from command line * @param state Pointer to state structure to assign any discovered parameters to * @return 0 if failed for some reason, non-0 otherwise */ static int parse_cmdline(int argc, const char **argv, RASPISTILLYUV_STATE *state) { // Parse the command line arguments. // We are looking for --<something> or -<abreviation of something> int valid = 1; // set 0 if we have a bad parameter int i; for (i = 1; i < argc && valid; i++) { int command_id, num_parameters; if (!argv[i]) continue; if (argv[i][0] != '-') { valid = 0; continue; } // Assume parameter is valid until proven otherwise valid = 1; command_id = raspicli_get_command_id(cmdline_commands, cmdline_commands_size, &argv[i][1], &num_parameters); // If we found a command but are missing a parameter, continue (and we will drop out of the loop) if (command_id != -1 && num_parameters > 0 && (i + 1 >= argc) ) continue; // We are now dealing with a command line option switch (command_id) { case CommandHelp: display_valid_parameters(); break; case CommandWidth: // Width > 0 if (sscanf(argv[i + 1], "%u", &state->width) != 1) valid = 0; else i++; break; case CommandHeight: // Height > 0 if (sscanf(argv[i + 1], "%u", &state->height) != 1) valid = 0; else i++; break; case CommandOutput: // output filename { int len = strlen(argv[i + 1]); if (len) { state->filename = malloc(len + 1); vcos_assert(state->filename); if (state->filename) strncpy(state->filename, argv[i + 1], len); i++; } else valid = 0; break; } case CommandVerbose: // display lots of data during run state->verbose = 1; break; case CommandTimeout: // Time to run viewfinder for before taking picture, in seconds { if (sscanf(argv[i + 1], "%u", &state->timeout) == 1) { // TODO : What limits do we need for timeout? i++; } else valid = 0; break; } default: { // Try parsing for any image specific parameters // result indicates how many parameters were used up, 0,1,2 // but we adjust by -1 as we have used one already const char *second_arg = (i + 1 < argc) ? argv[i + 1] : NULL; int parms_used = (raspicamcontrol_parse_cmdline(&state->camera_parameters, &argv[i][1], second_arg)); // Still unused, try preview options if (!parms_used) parms_used = raspipreview_parse_cmdline(&state->preview_parameters, &argv[i][1], second_arg); // If no parms were used, this must be a bad parameters if (!parms_used) valid = 0; else i += parms_used - 1; break; } } } if (!valid) { printf("Invalid command line option (%s)\n", argv[i]); return 1; } return 0; }
/** * Parse the incoming command line and put resulting parameters in to the state * * @param argc Number of arguments in command line * @param argv Array of pointers to strings from command line * @param state Pointer to state structure to assign any discovered parameters to * @return non-0 if failed for some reason, 0 otherwise */ static int parse_cmdline(int argc, const char **argv, RASPISTILL_STATE *state) { // Parse the command line arguments. // We are looking for --<something> or -<abreviation of something> int valid = 1; int i; for (i = 1; i < argc && valid; i++) { int command_id, num_parameters; if (!argv[i]) continue; if (argv[i][0] != '-') { valid = 0; continue; } // Assume parameter is valid until proven otherwise valid = 1; command_id = raspicli_get_command_id(cmdline_commands, cmdline_commands_size, &argv[i][1], &num_parameters); // If we found a command but are missing a parameter, continue (and we will drop out of the loop) if (command_id != -1 && num_parameters > 0 && (i + 1 >= argc) ) continue; // We are now dealing with a command line option switch (command_id) { case CommandHelp: display_valid_parameters(basename(argv[0])); // exit straight away if help requested return -1; case CommandWidth: // Width > 0 if (sscanf(argv[i + 1], "%u", &state->width) != 1) valid = 0; else i++; break; case CommandHeight: // Height > 0 if (sscanf(argv[i + 1], "%u", &state->height) != 1) valid = 0; else i++; break; case CommandQuality: // Quality = 1-100 if (sscanf(argv[i + 1], "%u", &state->quality) == 1) { if (state->quality > 100) { fprintf(stderr, "Setting max quality = 100\n"); state->quality = 100; } i++; } else valid = 0; break; case CommandRaw: // Add raw bayer data in metadata state->wantRAW = 1; break; case CommandOutput: // output filename { int len = strlen(argv[i + 1]); if (len) { state->filename = malloc(len + 10); // leave enough space for any timelapse generated changes to filename vcos_assert(state->filename); if (state->filename) strncpy(state->filename, argv[i + 1], len); i++; } else valid = 0; break; } case CommandLink : { int len = strlen(argv[i+1]); if (len) { state->linkname = malloc(len + 10); vcos_assert(state->linkname); if (state->linkname) strncpy(state->linkname, argv[i + 1], len); i++; } else valid = 0; break; } case CommandVerbose: // display lots of data during run state->verbose = 1; break; case CommandTimeout: // Time to run viewfinder for before taking picture, in seconds { if (sscanf(argv[i + 1], "%u", &state->timeout) == 1) { // TODO : What limits do we need for timeout? i++; } else valid = 0; break; } case CommandThumbnail : // thumbnail parameters - needs string "x:y:quality" sscanf(argv[i + 1], "%d:%d:%d", &state->thumbnailConfig.width,&state->thumbnailConfig.height, &state->thumbnailConfig.quality); i++; break; case CommandDemoMode: // Run in demo mode - no capture { // Demo mode might have a timing parameter // so check if a) we have another parameter, b) its not the start of the next option if (i + 1 < argc && argv[i+1][0] != '-') { if (sscanf(argv[i + 1], "%u", &state->demoInterval) == 1) { // TODO : What limits do we need for timeout? state->demoMode = 1; i++; } else valid = 0; } else { state->demoMode = 1; } break; } case CommandEncoding : { int len = strlen(argv[i + 1]); valid = 0; if (len) { int j; for (j=0;j<encoding_xref_size;j++) { if (strcmp(encoding_xref[j].format, argv[i+1]) == 0) { state->encoding = encoding_xref[j].encoding; valid = 1; i++; break; } } } break; } case CommandExifTag: store_exif_tag(state, argv[i+1]); i++; break; case CommandTimelapse: if (sscanf(argv[i + 1], "%u", &state->timelapse) != 1) valid = 0; else i++; break; case CommandFullResPreview: state->fullResPreview = 1; break; default: { // Try parsing for any image specific parameters // result indicates how many parameters were used up, 0,1,2 // but we adjust by -1 as we have used one already const char *second_arg = (i + 1 < argc) ? argv[i + 1] : NULL; int parms_used = raspicamcontrol_parse_cmdline(&state->camera_parameters, &argv[i][1], second_arg); // Still unused, try preview options if (!parms_used) parms_used = raspipreview_parse_cmdline(&state->preview_parameters, &argv[i][1], second_arg); // If no parms were used, this must be a bad parameters if (!parms_used) valid = 0; else i += parms_used - 1; break; } } } if (!valid) { fprintf(stderr, "Invalid command line option (%s)\n", argv[i]); return 1; } return 0; }
/** * Parse the incoming command line and put resulting parameters in to the state * * @param argc Number of arguments in command line * @param argv Array of pointers to strings from command line * @param state Pointer to state structure to assign any discovered parameters to * @return Non-0 if failed for some reason, 0 otherwise */ static int parse_cmdline(int argc, const char **argv, RASPIVID_STATE *state) { // Parse the command line arguments. // We are looking for --<something> or -<abreviation of something> int valid = 1; int i; for (i = 1; i < argc && valid; i++) { int command_id, num_parameters; if (!argv[i]) continue; if (argv[i][0] != '-') { valid = 0; continue; } // Assume parameter is valid until proven otherwise valid = 1; command_id = raspicli_get_command_id(cmdline_commands, cmdline_commands_size, &argv[i][1], &num_parameters); // If we found a command but are missing a parameter, continue (and we will drop out of the loop) if (command_id != -1 && num_parameters > 0 && (i + 1 >= argc) ) continue; // We are now dealing with a command line option switch (command_id) { case CommandHelp: display_valid_parameters(basename(argv[0])); return -1; case CommandWidth: // Width > 0 if (sscanf(argv[i + 1], "%u", &state->width) != 1) valid = 0; else i++; break; case CommandHeight: // Height > 0 if (sscanf(argv[i + 1], "%u", &state->height) != 1) valid = 0; else i++; break; case CommandBitrate: // 1-100 if (sscanf(argv[i + 1], "%u", &state->bitrate) == 1) { if (state->bitrate > MAX_BITRATE) { state->bitrate = MAX_BITRATE; } i++; } else valid = 0; break; case CommandOutput: // output filename { int len = strlen(argv[i + 1]); if (len) { state->filename = malloc(len + 1); vcos_assert(state->filename); if (state->filename) strncpy(state->filename, argv[i + 1], len); i++; } else valid = 0; break; } case CommandVerbose: // display lots of data during run state->verbose = 1; break; case CommandTimeout: // Time to run viewfinder/capture { if (sscanf(argv[i + 1], "%u", &state->timeout) == 1) { // TODO : What limits do we need for timeout? i++; } else valid = 0; break; } case CommandDemoMode: // Run in demo mode - no capture { // Demo mode might have a timing parameter // so check if a) we have another parameter, b) its not the start of the next option if (i + 1 < argc && argv[i+1][0] != '-') { if (sscanf(argv[i + 1], "%u", &state->demoInterval) == 1) { // TODO : What limits do we need for timeout? if (state->demoInterval == 0) state->demoInterval = 250; // ms state->demoMode = 1; i++; } else valid = 0; } else { state->demoMode = 1; } break; } case CommandFramerate: // fps to record { if (sscanf(argv[i + 1], "%u", &state->framerate) == 1) { // TODO : What limits do we need for fps 1 - 30 - 120?? i++; } else valid = 0; break; } case CommandPreviewEnc: state->immutableInput = 0; break; case CommandIntraPeriod: // key frame rate { if (sscanf(argv[i + 1], "%u", &state->intraperiod) == 1) i++; else valid = 0; break; } default: { // Try parsing for any image specific parameters // result indicates how many parameters were used up, 0,1,2 // but we adjust by -1 as we have used one already const char *second_arg = (i + 1 < argc) ? argv[i + 1] : NULL; int parms_used = (raspicamcontrol_parse_cmdline(&state->camera_parameters, &argv[i][1], second_arg)); // Still unused, try preview options if (!parms_used) parms_used = raspipreview_parse_cmdline(&state->preview_parameters, &argv[i][1], second_arg); // If no parms were used, this must be a bad parameters if (!parms_used) valid = 0; else i += parms_used - 1; break; } } } if (!valid) { fprintf(stderr, "Invalid command line option (%s)\n", argv[i]); return 1; } // Always disable verbose if output going to stdout if (state->filename && state->filename[0] == '-') { state->verbose = 0; } return 0; }