|
|
|
|
@@ -109,8 +109,8 @@ enum _OPT_VALUES {
|
|
|
|
|
_O_PERF,
|
|
|
|
|
_O_VERBOSE,
|
|
|
|
|
_O_DEBUG,
|
|
|
|
|
_O_FORCE_COLORS,
|
|
|
|
|
_O_NO_COLORS,
|
|
|
|
|
_O_FORCE_LOG_COLORS,
|
|
|
|
|
_O_NO_LOG_COLORS,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct option _LONG_OPTS[] = {
|
|
|
|
|
@@ -172,8 +172,8 @@ static const struct option _LONG_OPTS[] = {
|
|
|
|
|
{"perf", no_argument, NULL, _O_PERF},
|
|
|
|
|
{"verbose", no_argument, NULL, _O_VERBOSE},
|
|
|
|
|
{"debug", no_argument, NULL, _O_DEBUG},
|
|
|
|
|
{"force-colors", no_argument, NULL, _O_FORCE_COLORS},
|
|
|
|
|
{"no-colors", no_argument, NULL, _O_NO_COLORS},
|
|
|
|
|
{"force-log-colors", no_argument, NULL, _O_FORCE_LOG_COLORS},
|
|
|
|
|
{"no-log-colors", no_argument, NULL, _O_NO_LOG_COLORS},
|
|
|
|
|
|
|
|
|
|
{"help", no_argument, NULL, _O_HELP},
|
|
|
|
|
{"version", no_argument, NULL, _O_VERSION},
|
|
|
|
|
@@ -233,9 +233,9 @@ int parse_options(int argc, char *argv[], struct device_t *dev, struct encoder_t
|
|
|
|
|
}
|
|
|
|
|
# endif
|
|
|
|
|
|
|
|
|
|
# define OPT_PARSE(_name, _dest, _func, _invalid) { \
|
|
|
|
|
# define OPT_PARSE(_name, _dest, _func, _invalid, _available) { \
|
|
|
|
|
if ((_dest = _func(optarg)) == _invalid) { \
|
|
|
|
|
printf("Unknown " _name ": %s\n", optarg); \
|
|
|
|
|
printf("Unknown " _name ": %s; available: %s\n", optarg, _available); \
|
|
|
|
|
return -1; \
|
|
|
|
|
} \
|
|
|
|
|
break; \
|
|
|
|
|
@@ -263,10 +263,10 @@ int parse_options(int argc, char *argv[], struct device_t *dev, struct encoder_t
|
|
|
|
|
if (isalpha(_LONG_OPTS[opt_index].val)) {
|
|
|
|
|
short_opts[short_index] = _LONG_OPTS[opt_index].val;
|
|
|
|
|
++short_index;
|
|
|
|
|
}
|
|
|
|
|
if (_LONG_OPTS[opt_index].has_arg == required_argument) {
|
|
|
|
|
short_opts[short_index] = ':';
|
|
|
|
|
++short_index;
|
|
|
|
|
if (_LONG_OPTS[opt_index].has_arg == required_argument) {
|
|
|
|
|
short_opts[short_index] = ':';
|
|
|
|
|
++short_index;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -277,9 +277,9 @@ int parse_options(int argc, char *argv[], struct device_t *dev, struct encoder_t
|
|
|
|
|
case _O_RESOLUTION: OPT_RESOLUTION("--resolution", dev->width, dev->height, true);
|
|
|
|
|
# pragma GCC diagnostic ignored "-Wsign-compare"
|
|
|
|
|
# pragma GCC diagnostic push
|
|
|
|
|
case _O_FORMAT: OPT_PARSE("pixel format", dev->format, device_parse_format, FORMAT_UNKNOWN);
|
|
|
|
|
case _O_FORMAT: OPT_PARSE("pixel format", dev->format, device_parse_format, FORMAT_UNKNOWN, FORMATS_STR);
|
|
|
|
|
# pragma GCC diagnostic pop
|
|
|
|
|
case _O_TV_STANDARD: OPT_PARSE("TV standard", dev->standard, device_parse_standard, STANDARD_UNKNOWN);
|
|
|
|
|
case _O_TV_STANDARD: OPT_PARSE("TV standard", dev->standard, device_parse_standard, STANDARD_UNKNOWN, STANDARDS_STR);
|
|
|
|
|
case _O_DESIRED_FPS: OPT_NUMBER("--desired-fps", dev->desired_fps, 0, VIDEO_MAX_FPS, 0);
|
|
|
|
|
case _O_MIN_FRAME_SIZE: OPT_NUMBER("--min-frame-size", dev->min_frame_size, 0, 8192, 0);
|
|
|
|
|
case _O_PERSISTENT: OPT_SET(dev->persistent, true);
|
|
|
|
|
@@ -287,7 +287,7 @@ int parse_options(int argc, char *argv[], struct device_t *dev, struct encoder_t
|
|
|
|
|
case _O_BUFFERS: OPT_NUMBER("--buffers", dev->n_buffers, 1, 32, 0);
|
|
|
|
|
case _O_WORKERS: OPT_NUMBER("--workers", dev->n_workers, 1, 32, 0);
|
|
|
|
|
case _O_QUALITY: OPT_NUMBER("--quality", encoder->quality, 1, 100, 0);
|
|
|
|
|
case _O_ENCODER: OPT_PARSE("encoder type", encoder->type, encoder_parse_type, ENCODER_TYPE_UNKNOWN);
|
|
|
|
|
case _O_ENCODER: OPT_PARSE("encoder type", encoder->type, encoder_parse_type, ENCODER_TYPE_UNKNOWN, ENCODER_TYPES_STR);
|
|
|
|
|
# ifdef WITH_OMX
|
|
|
|
|
case _O_GLITCHED_RESOLUTIONS: OPT_GLITCHED_RESOLUTIONS;
|
|
|
|
|
# endif
|
|
|
|
|
@@ -329,12 +329,12 @@ int parse_options(int argc, char *argv[], struct device_t *dev, struct encoder_t
|
|
|
|
|
case _O_GPIO_WORKERS_BUSY_AT: OPT_NUMBER("--gpio-workers-busy-at", gpio_pin_workers_busy_at, 0, 256, 0);
|
|
|
|
|
# endif
|
|
|
|
|
|
|
|
|
|
case _O_LOG_LEVEL: OPT_NUMBER("--log-level", log_level, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, 0);
|
|
|
|
|
case _O_PERF: OPT_SET(log_level, LOG_LEVEL_PERF);
|
|
|
|
|
case _O_VERBOSE: OPT_SET(log_level, LOG_LEVEL_VERBOSE);
|
|
|
|
|
case _O_DEBUG: OPT_SET(log_level, LOG_LEVEL_DEBUG);
|
|
|
|
|
case _O_FORCE_COLORS: OPT_SET(log_colored, true);
|
|
|
|
|
case _O_NO_COLORS: OPT_SET(log_colored, false);
|
|
|
|
|
case _O_LOG_LEVEL: OPT_NUMBER("--log-level", log_level, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, 0);
|
|
|
|
|
case _O_PERF: OPT_SET(log_level, LOG_LEVEL_PERF);
|
|
|
|
|
case _O_VERBOSE: OPT_SET(log_level, LOG_LEVEL_VERBOSE);
|
|
|
|
|
case _O_DEBUG: OPT_SET(log_level, LOG_LEVEL_DEBUG);
|
|
|
|
|
case _O_FORCE_LOG_COLORS: OPT_SET(log_colored, true);
|
|
|
|
|
case _O_NO_LOG_COLORS: OPT_SET(log_colored, false);
|
|
|
|
|
|
|
|
|
|
case _O_HELP: _help(dev, encoder, server); return 1;
|
|
|
|
|
case _O_VERSION: _version(true); return 1;
|
|
|
|
|
@@ -466,13 +466,23 @@ static void _help(struct device_t *dev, struct encoder_t *encoder, struct http_s
|
|
|
|
|
printf(" Default: %u (the number of CPU cores (but not more than 4) + 1).\n\n", dev->n_buffers);
|
|
|
|
|
printf(" -w|--workers <N> ──────────────────── The number of worker threads but not more than buffers.\n");
|
|
|
|
|
printf(" Default: %u (the number of CPU cores (but not more than 4)).\n\n", dev->n_workers);
|
|
|
|
|
printf(" -q|--quality <N> ──────────────────── Set quality of JPEG encoding from 1 to 100 (best). Default: %u.\n\n", encoder->quality);
|
|
|
|
|
printf(" -c|--encoder <type> ───────────────── Use specified encoder. It may affect the number of workers.\n\n");
|
|
|
|
|
printf(" -q|--quality <N> ──────────────────── Set quality of JPEG encoding from 1 to 100 (best). Default: %u.\n", encoder->quality);
|
|
|
|
|
printf(" Note: If HW encoding is used (JPEG source format selected),\n");
|
|
|
|
|
printf(" this parameter attempts to configure the camera\n");
|
|
|
|
|
printf(" or capture device hardware's internal encoder.\n");
|
|
|
|
|
printf(" It does not re-encode MJPG to MJPG to change the quality level\n");
|
|
|
|
|
printf(" for sources that already output MJPG.\n\n");
|
|
|
|
|
printf(" -c|--encoder <type> ───────────────── Use specified encoder. It may affect the number of workers.\n");
|
|
|
|
|
printf(" Available:\n");
|
|
|
|
|
printf(" * CPU ─ Software MJPG encoding (default);\n");
|
|
|
|
|
# ifdef WITH_OMX
|
|
|
|
|
printf(" * OMX ─ GPU hardware accelerated MJPG encoding with OpenMax;\n");
|
|
|
|
|
# endif
|
|
|
|
|
printf(" * HW ── Use pre-encoded MJPG frames directly from camera hardware.\n\n");
|
|
|
|
|
# ifdef WITH_OMX
|
|
|
|
|
printf(" -g|--glitched-resolutions <WxH,...> ─ Comma-separated list of resolutions that require forced\n");
|
|
|
|
|
printf(" encoding on CPU instead of OMX. Default: disabled.\n\n");
|
|
|
|
|
# endif
|
|
|
|
|
printf(" encoding on CPU instead of OMX. Default: disabled.\n");
|
|
|
|
|
printf(" Available: %s; default: CPU.\n\n", ENCODER_TYPES_STR);
|
|
|
|
|
printf(" --device-timeout <seconds> ────────── Timeout for device querying. Default: %u.\n\n", dev->timeout);
|
|
|
|
|
printf(" --device-error-delay <seconds> ────── Delay before trying to connect to the device again\n");
|
|
|
|
|
printf(" after an error (timeout for example). Default: %u.\n\n", dev->error_delay);
|
|
|
|
|
@@ -523,15 +533,15 @@ static void _help(struct device_t *dev, struct encoder_t *encoder, struct http_s
|
|
|
|
|
#endif
|
|
|
|
|
printf("Logging options:\n");
|
|
|
|
|
printf("════════════════\n");
|
|
|
|
|
printf(" --log-level <N> ─ Verbosity level of messages from 0 (info) to 3 (debug).\n");
|
|
|
|
|
printf(" Enabling debugging messages can slow down the program.\n");
|
|
|
|
|
printf(" Available levels: 0 (info), 1 (performance), 2 (verbose), 3 (debug).\n");
|
|
|
|
|
printf(" Default: %u.\n\n", log_level);
|
|
|
|
|
printf(" --perf ────────── Enable performance messages (same as --log-level=1). Default: disabled.\n\n");
|
|
|
|
|
printf(" --verbose ─────── Enable verbose messages and lower (same as --log-level=2). Default: disabled.\n\n");
|
|
|
|
|
printf(" --debug ───────── Enable debug messages and lower (same as --log-level=3). Default: disabled.\n\n");
|
|
|
|
|
printf(" --force-colors ── Force color logging. Default: colored if stdout is a TTY.\n\n");
|
|
|
|
|
printf(" --no-colors ───── Disable color logging. Default: ditto.\n\n");
|
|
|
|
|
printf(" --log-level <N> ──── Verbosity level of messages from 0 (info) to 3 (debug).\n");
|
|
|
|
|
printf(" Enabling debugging messages can slow down the program.\n");
|
|
|
|
|
printf(" Available levels: 0 (info), 1 (performance), 2 (verbose), 3 (debug).\n");
|
|
|
|
|
printf(" Default: %u.\n\n", log_level);
|
|
|
|
|
printf(" --perf ───────────── Enable performance messages (same as --log-level=1). Default: disabled.\n\n");
|
|
|
|
|
printf(" --verbose ────────── Enable verbose messages and lower (same as --log-level=2). Default: disabled.\n\n");
|
|
|
|
|
printf(" --debug ──────────── Enable debug messages and lower (same as --log-level=3). Default: disabled.\n\n");
|
|
|
|
|
printf(" --force-log-colors ─ Force color logging. Default: colored if stdout is a TTY.\n\n");
|
|
|
|
|
printf(" --no-log-colors ──── Disable color logging. Default: ditto.\n\n");
|
|
|
|
|
printf("Help options:\n");
|
|
|
|
|
printf("═════════════\n");
|
|
|
|
|
printf(" -h|--help ─────── Print this text and exit.\n\n");
|
|
|
|
|
|