vlc-video-plugin.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #ifdef _WIN32
  2. #include <windows.h>
  3. #endif
  4. #include <util/platform.h>
  5. #include "vlc-video-plugin.h"
  6. OBS_DECLARE_MODULE()
  7. OBS_MODULE_USE_DEFAULT_LOCALE("vlc-video", "en-US")
  8. /* libvlc core */
  9. LIBVLC_NEW libvlc_new_;
  10. LIBVLC_RELEASE libvlc_release_;
  11. LIBVLC_CLOCK libvlc_clock_;
  12. LIBVLC_EVENT_ATTACH libvlc_event_attach_;
  13. /* libvlc media */
  14. LIBVLC_MEDIA_NEW_PATH libvlc_media_new_path_;
  15. LIBVLC_MEDIA_NEW_LOCATION libvlc_media_new_location_;
  16. LIBVLC_MEDIA_ADD_OPTION libvlc_media_add_option_;
  17. LIBVLC_MEDIA_RELEASE libvlc_media_release_;
  18. LIBVLC_MEDIA_RELEASE libvlc_media_retain_;
  19. /* libvlc media player */
  20. LIBVLC_MEDIA_PLAYER_NEW libvlc_media_player_new_;
  21. LIBVLC_MEDIA_PLAYER_NEW_FROM_MEDIA libvlc_media_player_new_from_media_;
  22. LIBVLC_MEDIA_PLAYER_RELEASE libvlc_media_player_release_;
  23. LIBVLC_VIDEO_SET_CALLBACKS libvlc_video_set_callbacks_;
  24. LIBVLC_VIDEO_SET_FORMAT_CALLBACKS libvlc_video_set_format_callbacks_;
  25. LIBVLC_AUDIO_SET_CALLBACKS libvlc_audio_set_callbacks_;
  26. LIBVLC_AUDIO_SET_FORMAT_CALLBACKS libvlc_audio_set_format_callbacks_;
  27. LIBVLC_MEDIA_PLAYER_PLAY libvlc_media_player_play_;
  28. LIBVLC_MEDIA_PLAYER_STOP libvlc_media_player_stop_;
  29. LIBVLC_MEDIA_PLAYER_GET_TIME libvlc_media_player_get_time_;
  30. LIBVLC_VIDEO_GET_SIZE libvlc_video_get_size_;
  31. LIBVLC_MEDIA_PLAYER_EVENT_MANAGER libvlc_media_player_event_manager_;
  32. /* libvlc media list */
  33. LIBVLC_MEDIA_LIST_NEW libvlc_media_list_new_;
  34. LIBVLC_MEDIA_LIST_RELEASE libvlc_media_list_release_;
  35. LIBVLC_MEDIA_LIST_ADD_MEDIA libvlc_media_list_add_media_;
  36. LIBVLC_MEDIA_LIST_LOCK libvlc_media_list_lock_;
  37. LIBVLC_MEDIA_LIST_UNLOCK libvlc_media_list_unlock_;
  38. LIBVLC_MEDIA_LIST_EVENT_MANAGER libvlc_media_list_event_manager_;
  39. /* libvlc media list player */
  40. LIBVLC_MEDIA_LIST_PLAYER_NEW libvlc_media_list_player_new_;
  41. LIBVLC_MEDIA_LIST_PLAYER_RELEASE libvlc_media_list_player_release_;
  42. LIBVLC_MEDIA_LIST_PLAYER_PLAY libvlc_media_list_player_play_;
  43. LIBVLC_MEDIA_LIST_PLAYER_PAUSE libvlc_media_list_player_pause_;
  44. LIBVLC_MEDIA_LIST_PLAYER_STOP libvlc_media_list_player_stop_;
  45. LIBVLC_MEDIA_LIST_PLAYER_SET_MEDIA_PLAYER libvlc_media_list_player_set_media_player_;
  46. LIBVLC_MEDIA_LIST_PLAYER_SET_MEDIA_LIST libvlc_media_list_player_set_media_list_;
  47. LIBVLC_MEDIA_LIST_PLAYER_EVENT_MANAGER libvlc_media_list_player_event_manager_;
  48. LIBVLC_MEDIA_LIST_PLAYER_SET_PLAYBACK_MODE libvlc_media_list_player_set_playback_mode_;
  49. void *libvlc_module = NULL;
  50. libvlc_instance_t *libvlc = NULL;
  51. uint64_t time_start = 0;
  52. static bool load_vlc_funcs(void)
  53. {
  54. #define LOAD_VLC_FUNC(func) \
  55. do { \
  56. func ## _ = os_dlsym(libvlc_module, #func); \
  57. if (!func ## _) { \
  58. blog(LOG_WARNING, "Could not func VLC function %s, " \
  59. "VLC loading failed", #func); \
  60. return false; \
  61. } \
  62. } while (false)
  63. /* libvlc core */
  64. LOAD_VLC_FUNC(libvlc_new);
  65. LOAD_VLC_FUNC(libvlc_release);
  66. LOAD_VLC_FUNC(libvlc_clock);
  67. LOAD_VLC_FUNC(libvlc_event_attach);
  68. /* libvlc media */
  69. LOAD_VLC_FUNC(libvlc_media_new_path);
  70. LOAD_VLC_FUNC(libvlc_media_new_location);
  71. LOAD_VLC_FUNC(libvlc_media_add_option);
  72. LOAD_VLC_FUNC(libvlc_media_release);
  73. LOAD_VLC_FUNC(libvlc_media_retain);
  74. /* libvlc media player */
  75. LOAD_VLC_FUNC(libvlc_media_player_new);
  76. LOAD_VLC_FUNC(libvlc_media_player_new_from_media);
  77. LOAD_VLC_FUNC(libvlc_media_player_release);
  78. LOAD_VLC_FUNC(libvlc_video_set_callbacks);
  79. LOAD_VLC_FUNC(libvlc_video_set_format_callbacks);
  80. LOAD_VLC_FUNC(libvlc_audio_set_callbacks);
  81. LOAD_VLC_FUNC(libvlc_audio_set_format_callbacks);
  82. LOAD_VLC_FUNC(libvlc_media_player_play);
  83. LOAD_VLC_FUNC(libvlc_media_player_stop);
  84. LOAD_VLC_FUNC(libvlc_media_player_get_time);
  85. LOAD_VLC_FUNC(libvlc_video_get_size);
  86. LOAD_VLC_FUNC(libvlc_media_player_event_manager);
  87. /* libvlc media list */
  88. LOAD_VLC_FUNC(libvlc_media_list_new);
  89. LOAD_VLC_FUNC(libvlc_media_list_release);
  90. LOAD_VLC_FUNC(libvlc_media_list_add_media);
  91. LOAD_VLC_FUNC(libvlc_media_list_lock);
  92. LOAD_VLC_FUNC(libvlc_media_list_unlock);
  93. LOAD_VLC_FUNC(libvlc_media_list_event_manager);
  94. /* libvlc media list player */
  95. LOAD_VLC_FUNC(libvlc_media_list_player_new);
  96. LOAD_VLC_FUNC(libvlc_media_list_player_release);
  97. LOAD_VLC_FUNC(libvlc_media_list_player_play);
  98. LOAD_VLC_FUNC(libvlc_media_list_player_pause);
  99. LOAD_VLC_FUNC(libvlc_media_list_player_stop);
  100. LOAD_VLC_FUNC(libvlc_media_list_player_set_media_player);
  101. LOAD_VLC_FUNC(libvlc_media_list_player_set_media_list);
  102. LOAD_VLC_FUNC(libvlc_media_list_player_event_manager);
  103. LOAD_VLC_FUNC(libvlc_media_list_player_set_playback_mode);
  104. return true;
  105. }
  106. static bool load_libvlc_module(void)
  107. {
  108. #ifdef _WIN32
  109. char *path_utf8 = NULL;
  110. wchar_t path[1024];
  111. LSTATUS status;
  112. DWORD size;
  113. HKEY key;
  114. memset(path, 0, 1024 * sizeof(wchar_t));
  115. status = RegOpenKeyW(HKEY_LOCAL_MACHINE,
  116. L"SOFTWARE\\VideoLAN\\VLC",
  117. &key);
  118. if (status != ERROR_SUCCESS)
  119. return false;
  120. size = 1024;
  121. status = RegQueryValueExW(key, L"InstallDir", NULL, NULL,
  122. (LPBYTE)path, &size);
  123. if (status == ERROR_SUCCESS) {
  124. wcscat(path, L"\\libvlc.dll");
  125. os_wcs_to_utf8_ptr(path, 0, &path_utf8);
  126. libvlc_module = os_dlopen(path_utf8);
  127. bfree(path_utf8);
  128. }
  129. RegCloseKey(key);
  130. #else
  131. #ifdef __APPLE__
  132. #define LIBVLC_DIR "/Applications/VLC.app/Contents/MacOS/"
  133. #define LIBVLC_FILE LIBVLC_DIR "lib/libvlc.5.dylib"
  134. setenv("VLC_PLUGIN_PATH", LIBVLC_DIR "plugins", false);
  135. #else
  136. #define LIBVLC_FILE "libvlc.so.5"
  137. #endif
  138. libvlc_module = os_dlopen(LIBVLC_FILE);
  139. #endif
  140. return libvlc_module != NULL;
  141. }
  142. extern struct obs_source_info vlc_source_info;
  143. bool load_libvlc(void)
  144. {
  145. if (libvlc)
  146. return true;
  147. libvlc = libvlc_new_(0, 0);
  148. if (!libvlc) {
  149. blog(LOG_INFO, "Couldn't create libvlc instance");
  150. return false;
  151. }
  152. time_start = (uint64_t)libvlc_clock_() * 1000ULL;
  153. return true;
  154. }
  155. bool obs_module_load(void)
  156. {
  157. if (!load_libvlc_module()) {
  158. blog(LOG_INFO, "Couldn't find VLC installation, VLC video "
  159. "source disabled");
  160. return true;
  161. }
  162. if (!load_vlc_funcs())
  163. return true;
  164. blog(LOG_INFO, "VLC found, VLC video source enabled");
  165. obs_register_source(&vlc_source_info);
  166. return true;
  167. }
  168. void obs_module_unload(void)
  169. {
  170. if (libvlc)
  171. libvlc_release_(libvlc);
  172. if (libvlc_module)
  173. os_dlclose(libvlc_module);
  174. }