test-filter.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <obs-module.h>
  2. struct test_filter {
  3. obs_source_t *source;
  4. gs_effect_t *whatever;
  5. };
  6. static const char *filter_getname(void *unused)
  7. {
  8. UNUSED_PARAMETER(unused);
  9. return "Test";
  10. }
  11. static void filter_destroy(void *data)
  12. {
  13. struct test_filter *tf = data;
  14. if (tf) {
  15. obs_enter_graphics();
  16. gs_effect_destroy(tf->whatever);
  17. bfree(tf);
  18. obs_leave_graphics();
  19. }
  20. }
  21. static void *filter_create(obs_data_t *settings, obs_source_t *source)
  22. {
  23. struct test_filter *tf = bzalloc(sizeof(struct test_filter));
  24. char *effect_file;
  25. obs_enter_graphics();
  26. effect_file = obs_module_file("test.effect");
  27. tf->source = source;
  28. tf->whatever = gs_effect_create_from_file(effect_file, NULL);
  29. bfree(effect_file);
  30. if (!tf->whatever) {
  31. filter_destroy(tf);
  32. tf = NULL;
  33. }
  34. obs_leave_graphics();
  35. UNUSED_PARAMETER(settings);
  36. return tf;
  37. }
  38. static void filter_render(void *data, gs_effect_t *effect)
  39. {
  40. struct test_filter *tf = data;
  41. if (!obs_source_process_filter_begin(tf->source, GS_RGBA, OBS_ALLOW_DIRECT_RENDERING))
  42. return;
  43. obs_source_process_filter_end(tf->source, tf->whatever, 0, 0);
  44. UNUSED_PARAMETER(effect);
  45. }
  46. struct obs_source_info test_filter = {
  47. .id = "test_filter",
  48. .type = OBS_SOURCE_TYPE_FILTER,
  49. .output_flags = OBS_SOURCE_VIDEO,
  50. .get_name = filter_getname,
  51. .create = filter_create,
  52. .destroy = filter_destroy,
  53. .video_render = filter_render,
  54. };