test-filter.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "test-filter.h"
  2. const char *test_getname(const char *locale)
  3. {
  4. return "Test";
  5. }
  6. struct test_filter *test_create(const char *settings, obs_source_t source)
  7. {
  8. struct test_filter *tf = bmalloc(sizeof(struct test_filter));
  9. char *effect_file;
  10. memset(tf, 0, sizeof(struct test_filter));
  11. gs_entercontext(obs_graphics());
  12. effect_file = obs_find_plugin_file("test-input/test.effect");
  13. tf->source = source;
  14. tf->whatever = gs_create_effect_from_file(effect_file, NULL);
  15. bfree(effect_file);
  16. if (!tf->whatever) {
  17. test_destroy(tf);
  18. return NULL;
  19. }
  20. tf->texrender = texrender_create(GS_RGBA, GS_ZS_NONE);
  21. gs_leavecontext();
  22. return tf;
  23. }
  24. void test_destroy(struct test_filter *tf)
  25. {
  26. if (tf) {
  27. gs_entercontext(obs_graphics());
  28. effect_destroy(tf->whatever);
  29. texrender_destroy(tf->texrender);
  30. bfree(tf);
  31. gs_leavecontext();
  32. }
  33. }
  34. uint32_t test_get_output_flags(struct test_filter *tf)
  35. {
  36. return SOURCE_VIDEO;
  37. }
  38. void test_video_tick(struct test_filter *tf, float seconds)
  39. {
  40. texrender_reset(tf->texrender);
  41. }
  42. void test_video_render(struct test_filter *tf)
  43. {
  44. obs_source_t filter_target = obs_filter_gettarget(tf->source);
  45. int cx = obs_source_getwidth(filter_target);
  46. int cy = obs_source_getheight(filter_target);
  47. float fcx = (float)cx;
  48. float fcy = (float)cy;
  49. technique_t tech;
  50. texture_t tex;
  51. if (texrender_begin(tf->texrender, cx, cy)) {
  52. gs_ortho(0.0f, fcx, 0.0f, fcy, -100.0f, 100.0f);
  53. obs_source_video_render(filter_target);
  54. texrender_end(tf->texrender);
  55. }
  56. /* --------------------------- */
  57. tex = texrender_gettexture(tf->texrender);
  58. tech = effect_gettechnique(tf->whatever, "Default");
  59. effect_settexture(tf->whatever, effect_getparambyidx(tf->whatever, 1),
  60. tex);
  61. technique_begin(tech);
  62. technique_beginpass(tech, 0);
  63. gs_draw_sprite(tex, 0, 0, 0);
  64. technique_endpass(tech);
  65. technique_end(tech);
  66. }