luma-key-filter.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include <obs-module.h>
  2. #define SETTING_LUMA_MAX "luma_max"
  3. #define SETTING_LUMA_MIN "luma_min"
  4. #define SETTING_LUMA_MAX_SMOOTH "luma_max_smooth"
  5. #define SETTING_LUMA_MIN_SMOOTH "luma_min_smooth"
  6. #define TEXT_LUMA_MAX obs_module_text("Luma.LumaMax")
  7. #define TEXT_LUMA_MIN obs_module_text("Luma.LumaMin")
  8. #define TEXT_LUMA_MAX_SMOOTH obs_module_text("Luma.LumaMaxSmooth")
  9. #define TEXT_LUMA_MIN_SMOOTH obs_module_text("Luma.LumaMinSmooth")
  10. struct luma_key_filter_data {
  11. obs_source_t *context;
  12. gs_effect_t *effect;
  13. gs_eparam_t *luma_max_param;
  14. gs_eparam_t *luma_min_param;
  15. gs_eparam_t *luma_max_smooth_param;
  16. gs_eparam_t *luma_min_smooth_param;
  17. float luma_max;
  18. float luma_min;
  19. float luma_max_smooth;
  20. float luma_min_smooth;
  21. };
  22. static const char *luma_key_name(void *unused)
  23. {
  24. UNUSED_PARAMETER(unused);
  25. return obs_module_text("LumaKeyFilter");
  26. }
  27. static void luma_key_update(void *data, obs_data_t *settings)
  28. {
  29. struct luma_key_filter_data *filter = data;
  30. double lumaMax = obs_data_get_double(settings, SETTING_LUMA_MAX);
  31. double lumaMin = obs_data_get_double(settings, SETTING_LUMA_MIN);
  32. double lumaMaxSmooth = obs_data_get_double(settings, SETTING_LUMA_MAX_SMOOTH);
  33. double lumaMinSmooth = obs_data_get_double(settings, SETTING_LUMA_MIN_SMOOTH);
  34. filter->luma_max = (float)lumaMax;
  35. filter->luma_min = (float)lumaMin;
  36. filter->luma_max_smooth = (float)lumaMaxSmooth;
  37. filter->luma_min_smooth = (float)lumaMinSmooth;
  38. }
  39. static void luma_key_destroy(void *data)
  40. {
  41. struct luma_key_filter_data *filter = data;
  42. if (filter->effect) {
  43. obs_enter_graphics();
  44. gs_effect_destroy(filter->effect);
  45. obs_leave_graphics();
  46. }
  47. bfree(data);
  48. }
  49. static void *luma_key_create(obs_data_t *settings, obs_source_t *context)
  50. {
  51. struct luma_key_filter_data *filter =
  52. bzalloc(sizeof(struct luma_key_filter_data));
  53. char *effect_path = obs_module_file("luma_key_filter.effect");
  54. filter->context = context;
  55. obs_enter_graphics();
  56. filter->effect = gs_effect_create_from_file(effect_path, NULL);
  57. if (filter->effect) {
  58. filter->luma_max_param = gs_effect_get_param_by_name(
  59. filter->effect, "lumaMax");
  60. filter->luma_min_param = gs_effect_get_param_by_name(
  61. filter->effect, "lumaMin");
  62. filter->luma_max_smooth_param = gs_effect_get_param_by_name(
  63. filter->effect, "lumaMaxSmooth");
  64. filter->luma_min_smooth_param = gs_effect_get_param_by_name(
  65. filter->effect, "lumaMinSmooth");
  66. }
  67. obs_leave_graphics();
  68. bfree(effect_path);
  69. if (!filter->effect) {
  70. luma_key_destroy(filter);
  71. return NULL;
  72. }
  73. luma_key_update(filter, settings);
  74. return filter;
  75. }
  76. static void luma_key_render(void *data, gs_effect_t *effect)
  77. {
  78. struct luma_key_filter_data *filter = data;
  79. if (!obs_source_process_filter_begin(filter->context, GS_RGBA,
  80. OBS_ALLOW_DIRECT_RENDERING))
  81. return;
  82. gs_effect_set_float(filter->luma_max_param, filter->luma_max);
  83. gs_effect_set_float(filter->luma_min_param, filter->luma_min);
  84. gs_effect_set_float(filter->luma_max_smooth_param, filter->luma_max_smooth);
  85. gs_effect_set_float(filter->luma_min_smooth_param, filter->luma_min_smooth);
  86. obs_source_process_filter_end(filter->context, filter->effect, 0, 0);
  87. UNUSED_PARAMETER(effect);
  88. }
  89. static obs_properties_t *luma_key_properties(void *data)
  90. {
  91. obs_properties_t *props = obs_properties_create();
  92. obs_properties_add_float_slider(props, SETTING_LUMA_MAX,
  93. TEXT_LUMA_MAX, 0, 1, 0.01);
  94. obs_properties_add_float_slider(props, SETTING_LUMA_MAX_SMOOTH,
  95. TEXT_LUMA_MAX_SMOOTH, 0, 1, 0.01);
  96. obs_properties_add_float_slider(props, SETTING_LUMA_MIN,
  97. TEXT_LUMA_MIN, 0, 1, 0.01);
  98. obs_properties_add_float_slider(props, SETTING_LUMA_MIN_SMOOTH,
  99. TEXT_LUMA_MIN_SMOOTH, 0, 1, 0.01);
  100. UNUSED_PARAMETER(data);
  101. return props;
  102. }
  103. static void luma_key_defaults(obs_data_t *settings)
  104. {
  105. obs_data_set_default_double(settings, SETTING_LUMA_MAX, 1.0);
  106. obs_data_set_default_double(settings, SETTING_LUMA_MIN, 0.0);
  107. obs_data_set_default_double(settings, SETTING_LUMA_MAX_SMOOTH, 0.0);
  108. obs_data_set_default_double(settings, SETTING_LUMA_MIN_SMOOTH, 0.0);
  109. }
  110. struct obs_source_info luma_key_filter = {
  111. .id = "luma_key_filter",
  112. .type = OBS_SOURCE_TYPE_FILTER,
  113. .output_flags = OBS_SOURCE_VIDEO,
  114. .get_name = luma_key_name,
  115. .create = luma_key_create,
  116. .destroy = luma_key_destroy,
  117. .video_render = luma_key_render,
  118. .update = luma_key_update,
  119. .get_properties = luma_key_properties,
  120. .get_defaults = luma_key_defaults
  121. };