+
+#ifdef HAVE_SRT
+ // Same, for SRT inputs.
+ // TODO: On disconnect and reconnect, we might want to use the stream ID
+ for (SRTSOCKET sock : hotplugged_srt_cards_copy) {
+ char name[256];
+ int namelen = sizeof(name);
+ srt_getsockopt(sock, /*ignored=*/0, SRTO_STREAMID, name, &namelen);
+ string stream_id(name, namelen);
+
+ // Look for a fake capture card where we can stick this in.
+ // Prioritize ones that previously held SRT streams with the
+ // same stream ID, if any exist -- and it multiple exist,
+ // take the one that disconnected the last.
+ int first_free_card_index = -1, last_matching_free_card_index = -1;
+ for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
+ CaptureCard *card = &cards[card_index];
+ if (!card->is_fake_capture) {
+ continue;
+ }
+ if (first_free_card_index == -1) {
+ first_free_card_index = card_index;
+ }
+ if (card->last_srt_stream_id == stream_id &&
+ (last_matching_free_card_index == -1 ||
+ card->fake_capture_counter >
+ cards[last_matching_free_card_index].fake_capture_counter)) {
+ last_matching_free_card_index = card_index;
+ }
+ }
+
+ const int free_card_index = (last_matching_free_card_index != -1)
+ ? last_matching_free_card_index : first_free_card_index;
+ if (free_card_index == -1) {
+ if (stream_id.empty()) {
+ stream_id = "no name";
+ }
+ fprintf(stderr, "New SRT stream connected (%s), but no free slots -- ignoring.\n", stream_id.c_str());
+ srt_close(sock);
+ } else {
+ // FFmpegCapture takes ownership.
+ if (stream_id.empty()) {
+ fprintf(stderr, "New unnamed SRT stream connected, choosing slot %d.\n", free_card_index);
+ } else {
+ fprintf(stderr, "New SRT stream connected (%s), choosing slot %d.\n", stream_id.c_str(), free_card_index);
+ }
+ CaptureCard *card = &cards[free_card_index];
+ FFmpegCapture *capture = new FFmpegCapture(sock, stream_id);
+ capture->set_card_index(free_card_index);
+ configure_card(free_card_index, capture, CardType::FFMPEG_INPUT, /*output=*/nullptr, /*override_card_as_live=*/true);
+ card->last_srt_stream_id = stream_id;
+ card->queue_length_policy.reset(free_card_index);
+ capture->set_card_disconnected_callback(bind(&Mixer::bm_hotplug_remove, this, free_card_index));
+ capture->start_bm_capture();
+ }
+ }
+#endif