+map<unsigned, unsigned> parse_mjpeg_export_cards(char *optarg)
+{
+ map<unsigned, unsigned> ret;
+ if (optarg[0] == '\0') {
+ return ret;
+ }
+
+ unsigned stream_idx = 0;
+ char *start = optarg;
+ for ( ;; ) {
+ char *end = strchr(start, ',');
+ if (end != nullptr) {
+ *end = '\0';
+ }
+
+ unsigned range_begin, range_end;
+ if (sscanf(start, "%u-%u", &range_begin, &range_end) != 2) {
+ range_begin = range_end = atoi(start);
+ }
+ if (range_end < range_begin) {
+ fprintf(stderr, "ERROR: Invalid range %u-%u in --mjpeg-export-cards=\n", range_begin, range_end);
+ exit(1);
+ }
+ if (range_end >= unsigned(global_flags.max_num_cards)) {
+ // There are situations where we could possibly want to
+ // include FFmpeg inputs (CEF inputs are unlikely),
+ // but they're not necessarily in 4:2:2 Y'CbCr, so it would
+ // require more functionality the the JPEG encoder.
+ fprintf(stderr, "ERROR: Asked for (zero-indexed) card %u in --mjpeg-export-cards=, but there are only %u cards\n",
+ range_end, global_flags.max_num_cards);
+ exit(1);
+ }
+ for (unsigned card_idx = range_begin; card_idx <= range_end; ++card_idx) {
+ if (ret.count(card_idx)) {
+ fprintf(stderr, "ERROR: Card %u was given twice in --mjpeg-export-cards=\n", card_idx);
+ exit(1);
+ }
+ ret[card_idx] = stream_idx++;
+ }
+ if (end == nullptr) {
+ break;
+ } else {
+ start = end + 1;
+ }
+ }
+ return ret;
+}
+