307 decltype(&::gst_init_check) init_check{};
308 decltype(&::gst_parse_launch) parse_launch{};
309 decltype(&::gst_element_set_state) element_set_state{};
310 decltype(&::gst_element_get_state) element_get_state{};
311 decltype(&::gst_element_get_bus) element_get_bus{};
312 decltype(&::gst_element_seek_simple) element_seek_simple{};
313 decltype(&::gst_bin_get_by_name) bin_get_by_name{};
314 decltype(&::gst_element_get_static_pad) element_get_static_pad{};
315 decltype(&::gst_element_get_name) element_get_name{};
318 decltype(&::gst_pad_get_peer) pad_get_peer{};
319 decltype(&::gst_pad_get_allowed_caps) pad_get_allowed_caps{};
320 decltype(&::gst_pad_get_parent_element) pad_get_parent_element{};
323 decltype(&::gst_pad_get_current_caps) pad_get_current_caps{};
324 decltype(&::gst_caps_new_simple) caps_new_simple{};
325 decltype(&::gst_caps_from_string) caps_from_string{};
326 decltype(&::gst_caps_unref) caps_unref{};
327 decltype(&::gst_caps_get_structure) caps_get_structure{};
328 decltype(&::gst_structure_get_name) structure_get_name{};
329 decltype(&::gst_structure_get_int) structure_get_int{};
330 decltype(&::gst_structure_get_string) structure_get_string{};
333 decltype(&::gst_bus_timed_pop_filtered) bus_timed_pop_filtered{};
336 decltype(&::gst_object_unref) object_unref{};
337 decltype(&::gst_message_unref) message_unref{};
338 decltype(&::gst_mini_object_unref) mini_object_unref{};
339 decltype(&::g_free) g_free{};
340 decltype(&::g_error_free) g_error_free{};
343 decltype(&::gst_app_sink_try_pull_sample) app_sink_try_pull_sample{};
344 decltype(&::gst_app_sink_is_eos) app_sink_is_eos{};
347 decltype(&::gst_app_src_push_buffer) app_src_push_buffer{};
348 decltype(&::gst_app_src_end_of_stream) app_src_end_of_stream{};
349 decltype(&::gst_app_src_set_caps) app_src_set_caps{};
352 decltype(&::gst_sample_get_buffer) sample_get_buffer{};
353 decltype(&::gst_sample_get_caps) sample_get_caps{};
354 decltype(&::gst_buffer_new_allocate) buffer_new_allocate{};
355 decltype(&::gst_buffer_new_wrapped_full) buffer_new_wrapped_full{};
356 decltype(&::gst_buffer_map) buffer_map{};
357 decltype(&::gst_buffer_unmap) buffer_unmap{};
361 decltype(&::gst_buffer_get_video_meta) buffer_get_video_meta{};
364 decltype(&::g_object_class_list_properties) object_class_list_properties{};
365 decltype(&::g_type_class_ref) type_class_ref{};
366 decltype(&::g_type_class_unref) type_class_unref{};
367 decltype(&::g_type_is_a) type_is_a{};
368 decltype(&::g_object_set_property) object_set_property{};
369 decltype(&::g_object_get_property) object_get_property{};
370 decltype(&::g_value_init) value_init{};
371 decltype(&::g_value_unset) value_unset{};
372 decltype(&::g_value_get_int) value_get_int{};
373 decltype(&::g_value_get_uint) value_get_uint{};
374 decltype(&::g_value_get_float) value_get_float{};
375 decltype(&::g_value_get_double) value_get_double{};
376 decltype(&::g_value_get_boolean) value_get_boolean{};
377 decltype(&::g_value_get_string) value_get_string{};
378 decltype(&::g_value_get_int64) value_get_int64{};
379 decltype(&::g_value_get_uint64) value_get_uint64{};
380 decltype(&::g_value_get_long) value_get_long{};
381 decltype(&::g_value_get_ulong) value_get_ulong{};
382 decltype(&::g_value_get_enum) value_get_enum{};
383 decltype(&::g_value_set_int) value_set_int{};
384 decltype(&::g_value_set_uint) value_set_uint{};
385 decltype(&::g_value_set_float) value_set_float{};
386 decltype(&::g_value_set_double) value_set_double{};
387 decltype(&::g_value_set_boolean) value_set_boolean{};
388 decltype(&::g_value_set_string) value_set_string{};
389 decltype(&::g_value_set_int64) value_set_int64{};
390 decltype(&::g_value_set_uint64) value_set_uint64{};
391 decltype(&::g_value_set_long) value_set_long{};
392 decltype(&::g_value_set_ulong) value_set_ulong{};
393 decltype(&::g_value_set_enum) value_set_enum{};
404#if defined(__APPLE__)
407 static std::optional<ossia::dylib_loader>
408 load_apple_library(std::initializer_list<std::string_view> sonames)
410 static constexpr std::string_view prefixes[]{
411 "",
"/opt/homebrew/lib/",
"/usr/local/lib/",
"/opt/local/lib/",
412 "/Library/Frameworks/GStreamer.framework/Versions/1.0/lib/"};
414 std::vector<std::string> owned;
415 owned.reserve(sonames.size() * std::size(prefixes));
416 for(
auto prefix : prefixes)
417 for(
auto soname : sonames)
418 owned.emplace_back(std::string(prefix) + std::string(soname));
420 std::vector<std::string_view> names;
421 names.reserve(owned.size());
422 for(
auto& candidate : owned)
423 names.emplace_back(candidate);
428 static std::optional<ossia::dylib_loader> load_core_library()
432#elif defined(__APPLE__)
433 return load_apple_library({
"libgstreamer-1.0.0.dylib",
"libgstreamer-1.0.dylib"});
436 "libgstreamer-1.0.so.0",
"libgstreamer-1.0.so"});
440 static std::optional<ossia::dylib_loader> load_app_library()
444#elif defined(__APPLE__)
445 return load_apple_library({
"libgstapp-1.0.0.dylib",
"libgstapp-1.0.dylib"});
448 "libgstapp-1.0.so.0",
"libgstapp-1.0.so"});
452 static std::optional<ossia::dylib_loader> load_video_library()
456#elif defined(__APPLE__)
457 return load_apple_library({
"libgstvideo-1.0.0.dylib",
"libgstvideo-1.0.dylib"});
460 "libgstvideo-1.0.so.0",
"libgstvideo-1.0.so"});
464 static std::optional<ossia::dylib_loader> load_gobject_library()
468#elif defined(__APPLE__)
469 return load_apple_library({
"libgobject-2.0.0.dylib",
"libgobject-2.0.dylib"});
472 "libgobject-2.0.so.0",
"libgobject-2.0.so"});
476 static std::optional<ossia::dylib_loader> load_glib_library()
480#elif defined(__APPLE__)
481 return load_apple_library({
"libglib-2.0.0.dylib",
"libglib-2.0.dylib"});
484 "libglib-2.0.so.0",
"libglib-2.0.so"});
488#define GST_LOAD(lib, name) \
489 name = lib->symbol<decltype(&::gst_##name)>("gst_" #name)
493 m_core = load_core_library();
494 m_app = load_app_library();
495 m_gobject = load_gobject_library();
496 m_glib = load_glib_library();
497 m_video = load_video_library();
500 if(!m_core || !m_app || !m_gobject || !m_glib)
504 GST_LOAD(m_core, init_check);
505 GST_LOAD(m_core, parse_launch);
506 GST_LOAD(m_core, element_set_state);
507 GST_LOAD(m_core, element_get_state);
508 GST_LOAD(m_core, element_get_bus);
509 GST_LOAD(m_core, element_seek_simple);
510 GST_LOAD(m_core, bin_get_by_name);
511 GST_LOAD(m_core, element_get_static_pad);
512 GST_LOAD(m_core, element_get_name);
515 GST_LOAD(m_core, pad_get_peer);
516 GST_LOAD(m_core, pad_get_allowed_caps);
517 GST_LOAD(m_core, pad_get_parent_element);
520 GST_LOAD(m_core, pad_get_current_caps);
521 GST_LOAD(m_core, caps_new_simple);
522 GST_LOAD(m_core, caps_from_string);
523 GST_LOAD(m_core, caps_unref);
524 GST_LOAD(m_core, caps_get_structure);
525 GST_LOAD(m_core, structure_get_name);
526 GST_LOAD(m_core, structure_get_int);
527 GST_LOAD(m_core, structure_get_string);
530 GST_LOAD(m_core, bus_timed_pop_filtered);
533 GST_LOAD(m_core, object_unref);
534 GST_LOAD(m_core, message_unref);
535 GST_LOAD(m_core, mini_object_unref);
536 g_free = m_glib->symbol<
decltype(&::g_free)>(
"g_free");
537 g_error_free = m_glib->symbol<
decltype(&::g_error_free)>(
"g_error_free");
540 GST_LOAD(m_app, app_sink_try_pull_sample);
541 GST_LOAD(m_app, app_sink_is_eos);
544 GST_LOAD(m_app, app_src_push_buffer);
545 GST_LOAD(m_app, app_src_end_of_stream);
546 GST_LOAD(m_app, app_src_set_caps);
549 GST_LOAD(m_core, sample_get_buffer);
550 GST_LOAD(m_core, sample_get_caps);
551 GST_LOAD(m_core, buffer_new_allocate);
552 GST_LOAD(m_core, buffer_new_wrapped_full);
553 GST_LOAD(m_core, buffer_map);
554 GST_LOAD(m_core, buffer_unmap);
557 GST_LOAD(m_video, buffer_get_video_meta);
560#define GOBJ_LOAD(name) \
561 name = m_gobject->symbol<decltype(&::g_##name)>("g_" #name)
563 GOBJ_LOAD(object_class_list_properties);
564 GOBJ_LOAD(type_class_ref);
565 GOBJ_LOAD(type_class_unref);
566 GOBJ_LOAD(type_is_a);
567 GOBJ_LOAD(object_set_property);
568 GOBJ_LOAD(object_get_property);
569 GOBJ_LOAD(value_init);
570 GOBJ_LOAD(value_unset);
571 GOBJ_LOAD(value_get_int);
572 GOBJ_LOAD(value_get_uint);
573 GOBJ_LOAD(value_get_float);
574 GOBJ_LOAD(value_get_double);
575 GOBJ_LOAD(value_get_boolean);
576 GOBJ_LOAD(value_get_string);
577 GOBJ_LOAD(value_get_int64);
578 GOBJ_LOAD(value_get_uint64);
579 GOBJ_LOAD(value_get_long);
580 GOBJ_LOAD(value_get_ulong);
581 GOBJ_LOAD(value_get_enum);
582 GOBJ_LOAD(value_set_int);
583 GOBJ_LOAD(value_set_uint);
584 GOBJ_LOAD(value_set_float);
585 GOBJ_LOAD(value_set_double);
586 GOBJ_LOAD(value_set_boolean);
587 GOBJ_LOAD(value_set_string);
588 GOBJ_LOAD(value_set_int64);
589 GOBJ_LOAD(value_set_uint64);
590 GOBJ_LOAD(value_set_long);
591 GOBJ_LOAD(value_set_ulong);
592 GOBJ_LOAD(value_set_enum);
597 available = init_check && parse_launch && element_set_state && element_get_state
598 && bin_get_by_name && object_unref && buffer_map && buffer_unmap;
603 std::optional<ossia::dylib_loader> m_core;
604 std::optional<ossia::dylib_loader> m_app;
605 std::optional<ossia::dylib_loader> m_gobject;
606 std::optional<ossia::dylib_loader> m_glib;
607 std::optional<ossia::dylib_loader> m_video;