pipewire-capture.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /* pipewire-capture.c
  2. *
  3. * Copyright 2020 Georges Basile Stavracas Neto <[email protected]>
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. *
  18. * SPDX-License-Identifier: GPL-2.0-or-later
  19. */
  20. #include "pipewire.h"
  21. /* obs_source_info methods */
  22. static const char *pipewire_desktop_capture_get_name(void *data)
  23. {
  24. UNUSED_PARAMETER(data);
  25. return obs_module_text("PipeWireDesktopCapture");
  26. }
  27. static const char *pipewire_window_capture_get_name(void *data)
  28. {
  29. UNUSED_PARAMETER(data);
  30. return obs_module_text("PipeWireWindowCapture");
  31. }
  32. static void *pipewire_desktop_capture_create(obs_data_t *settings,
  33. obs_source_t *source)
  34. {
  35. return obs_pipewire_create(DESKTOP_CAPTURE, settings, source);
  36. }
  37. static void *pipewire_window_capture_create(obs_data_t *settings,
  38. obs_source_t *source)
  39. {
  40. return obs_pipewire_create(WINDOW_CAPTURE, settings, source);
  41. }
  42. static void pipewire_capture_destroy(void *data)
  43. {
  44. obs_pipewire_destroy(data);
  45. }
  46. static void pipewire_capture_get_defaults(obs_data_t *settings)
  47. {
  48. obs_pipewire_get_defaults(settings);
  49. }
  50. static obs_properties_t *pipewire_capture_get_properties(void *data)
  51. {
  52. enum obs_pw_capture_type capture_type;
  53. obs_pipewire_data *obs_pw = data;
  54. capture_type = obs_pipewire_get_capture_type(obs_pw);
  55. switch (capture_type) {
  56. case DESKTOP_CAPTURE:
  57. return obs_pipewire_get_properties(data,
  58. "PipeWireSelectMonitor");
  59. case WINDOW_CAPTURE:
  60. return obs_pipewire_get_properties(data,
  61. "PipeWireSelectWindow");
  62. default:
  63. return NULL;
  64. }
  65. }
  66. static void pipewire_capture_update(void *data, obs_data_t *settings)
  67. {
  68. obs_pipewire_update(data, settings);
  69. }
  70. static void pipewire_capture_show(void *data)
  71. {
  72. obs_pipewire_show(data);
  73. }
  74. static void pipewire_capture_hide(void *data)
  75. {
  76. obs_pipewire_hide(data);
  77. }
  78. static uint32_t pipewire_capture_get_width(void *data)
  79. {
  80. return obs_pipewire_get_width(data);
  81. }
  82. static uint32_t pipewire_capture_get_height(void *data)
  83. {
  84. return obs_pipewire_get_height(data);
  85. }
  86. static void pipewire_capture_video_render(void *data, gs_effect_t *effect)
  87. {
  88. obs_pipewire_video_render(data, effect);
  89. }
  90. void pipewire_capture_load(void)
  91. {
  92. // Desktop capture
  93. const struct obs_source_info pipewire_desktop_capture_info = {
  94. .id = "pipewire-desktop-capture-source",
  95. .type = OBS_SOURCE_TYPE_INPUT,
  96. .output_flags = OBS_SOURCE_VIDEO,
  97. .get_name = pipewire_desktop_capture_get_name,
  98. .create = pipewire_desktop_capture_create,
  99. .destroy = pipewire_capture_destroy,
  100. .get_defaults = pipewire_capture_get_defaults,
  101. .get_properties = pipewire_capture_get_properties,
  102. .update = pipewire_capture_update,
  103. .show = pipewire_capture_show,
  104. .hide = pipewire_capture_hide,
  105. .get_width = pipewire_capture_get_width,
  106. .get_height = pipewire_capture_get_height,
  107. .video_render = pipewire_capture_video_render,
  108. .icon_type = OBS_ICON_TYPE_DESKTOP_CAPTURE,
  109. };
  110. obs_register_source(&pipewire_desktop_capture_info);
  111. // Window capture
  112. const struct obs_source_info pipewire_window_capture_info = {
  113. .id = "pipewire-window-capture-source",
  114. .type = OBS_SOURCE_TYPE_INPUT,
  115. .output_flags = OBS_SOURCE_VIDEO,
  116. .get_name = pipewire_window_capture_get_name,
  117. .create = pipewire_window_capture_create,
  118. .destroy = pipewire_capture_destroy,
  119. .get_defaults = pipewire_capture_get_defaults,
  120. .get_properties = pipewire_capture_get_properties,
  121. .update = pipewire_capture_update,
  122. .show = pipewire_capture_show,
  123. .hide = pipewire_capture_hide,
  124. .get_width = pipewire_capture_get_width,
  125. .get_height = pipewire_capture_get_height,
  126. .video_render = pipewire_capture_video_render,
  127. .icon_type = OBS_ICON_TYPE_WINDOW_CAPTURE,
  128. };
  129. obs_register_source(&pipewire_window_capture_info);
  130. pw_init(NULL, NULL);
  131. }
  132. void pipewire_capture_unload(void)
  133. {
  134. pw_deinit();
  135. }