| 1324 | static video_t *(*obs_encoder_parent_video_wrapper)(const obs_encoder_t *encoder) = nullptr; |
| 1325 | |
| 1326 | void OBSBasicSettings::LoadOutputStats(std::vector<video_t *> *oldVideos) |
| 1327 | { |
| 1328 | if (!obs_encoder_parent_video_loaded) { |
| 1329 | #ifdef _WIN32 |
| 1330 | void *dl = os_dlopen("obs"); |
| 1331 | #else |
| 1332 | void *dl = dlopen(nullptr, RTLD_LAZY); |
| 1333 | #endif |
| 1334 | if (dl) { |
| 1335 | auto sym = os_dlsym(dl, "obs_encoder_parent_video"); |
| 1336 | if (sym) |
| 1337 | obs_encoder_parent_video_wrapper = (video_t * (*)(const obs_encoder_t *encoder)) sym; |
| 1338 | os_dlclose(dl); |
| 1339 | } |
| 1340 | obs_encoder_parent_video_loaded = true; |
| 1341 | } |
| 1342 | std::vector<std::tuple<video_t *, obs_encoder_t *, obs_output_t *>> refs; |
| 1343 | obs_enum_outputs( |
| 1344 | [](void *param, obs_output_t *output) { |
| 1345 | auto refs2 = (std::vector<std::tuple<video_t *, obs_encoder_t *, obs_output_t *>> *)param; |
| 1346 | auto ec = 0; |
| 1347 | for (size_t i = 0; i < MAX_OUTPUT_VIDEO_ENCODERS; i++) { |
| 1348 | auto venc = obs_output_get_video_encoder2(output, i); |
| 1349 | if (!venc) |
| 1350 | continue; |
| 1351 | ec++; |
| 1352 | video_t *video = obs_encoder_parent_video_wrapper ? obs_encoder_parent_video_wrapper(venc) |
| 1353 | : obs_encoder_video(venc); |
| 1354 | if (!video) |
| 1355 | video = obs_output_video(output); |
| 1356 | refs2->push_back(std::tuple<video_t *, obs_encoder_t *, obs_output_t *>(video, venc, output)); |
| 1357 | } |
| 1358 | if (!ec) { |
| 1359 | refs2->push_back(std::tuple<video_t *, obs_encoder_t *, obs_output_t *>(obs_output_video(output), |
| 1360 | nullptr, output)); |
| 1361 | } |
| 1362 | return true; |
| 1363 | }, |
| 1364 | &refs); |
| 1365 | std::sort(refs.begin(), refs.end(), |
| 1366 | [](std::tuple<video_t *, obs_encoder_t *, obs_output_t *> const &a, |
| 1367 | std::tuple<video_t *, obs_encoder_t *, obs_output_t *> const &b) { |
| 1368 | video_t *va; |
| 1369 | video_t *vb; |
| 1370 | obs_encoder_t *ea; |
| 1371 | obs_encoder_t *eb; |
| 1372 | obs_output_t *oa; |
| 1373 | obs_output_t *ob; |
| 1374 | std::tie(va, ea, oa) = a; |
| 1375 | std::tie(vb, eb, ob) = b; |
| 1376 | if (va == vb) { |
| 1377 | if (ea == eb) { |
| 1378 | return oa < ob; |
| 1379 | } |
| 1380 | return va < vb; |
| 1381 | } |
| 1382 | return va < vb; |
| 1383 | }); |
no test coverage detected