/** * Convert string to the MMAL parameter for exposure metering mode * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_STEREOSCOPIC_MODE_T stereo_mode_from_string(const char *str) { int i = raspicli_map_xref(str, stereo_mode_map, stereo_mode_map_size); if( i != -1) return (MMAL_STEREOSCOPIC_MODE_T)i; vcos_log_error("Unknown metering mode: %s", str); return MMAL_STEREOSCOPIC_MODE_NONE; }
/** * Convert string to the MMAL parameter for DRC level * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_PARAMETER_DRC_STRENGTH_T drc_mode_from_string(const char *str) { int i = raspicli_map_xref(str, drc_mode_map, drc_mode_map_size); if( i != -1) return (MMAL_PARAMETER_DRC_STRENGTH_T)i; vcos_log_error("Unknown DRC level: %s", str); return MMAL_PARAMETER_DRC_STRENGTH_OFF; }
/** * Convert string to the MMAL parameter for exposure metering mode * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_PARAM_EXPOSUREMETERINGMODE_T metering_mode_from_string(const char *str) { int i = raspicli_map_xref(str, metering_mode_map, metering_mode_map_size); if( i != -1) return (MMAL_PARAM_EXPOSUREMETERINGMODE_T)i; vcos_log_error("Unknown metering mode: %s", str); return MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE; }
/** * Convert string to the MMAL parameter for image effects mode * @param str Incoming string to match * @return MMAL parameter matching the strong, or the AUTO option if no match found */ MMAL_PARAM_IMAGEFX_T imagefx_mode_from_string(const char *str) { int i = raspicli_map_xref(str, imagefx_map, imagefx_map_size); if( i != -1) return (MMAL_PARAM_IMAGEFX_T)i; vcos_log_error("Unknown image fx: %s", str); return MMAL_PARAM_IMAGEFX_NONE; }
/** * Convert string to the MMAL parameter for AWB mode * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_PARAM_AWBMODE_T awb_mode_from_string(const char *str) { int i = raspicli_map_xref(str, awb_map, awb_map_size); if( i != -1) return (MMAL_PARAM_AWBMODE_T)i; vcos_log_error("Unknown awb mode: %s", str); return MMAL_PARAM_AWBMODE_AUTO; }
/** * Convert string to the MMAL parameter for exposure mode * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_PARAM_EXPOSUREMODE_T exposure_mode_from_string(const char *str) { int i = raspicli_map_xref(str, exposure_map, exposure_map_size); if( i != -1) return (MMAL_PARAM_EXPOSUREMODE_T)i; vcos_log_error("Unknown exposure mode: %s", str); return MMAL_PARAM_EXPOSUREMODE_AUTO; }
/** * 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; } case CommandProfile: // H264 profile { state->profile = raspicli_map_xref(argv[i + 1], profile_map, profile_map_size); if( state->profile == -1) state->profile = MMAL_VIDEO_PROFILE_H264_HIGH; i++; 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; }