You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
5.9 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. #include <stdio.h>
  2. #include <GL/freeglut.h>
  3. #include <gtk/gtk.h>
  4. #include <gdk/gdkx.h>
  5. #include <obs/obs.h>
  6. char version[256];
  7. const int window_width = 1280;
  8. const int window_height = 720;
  9. obs_display_t *display;
  10. const char* go_get_version()
  11. {
  12. sprintf(version, "Version: 0.0.1; OBS version: %s\n", obs_get_version_string());
  13. return version;
  14. }
  15. void print_version_string()
  16. {
  17. printf("%s\n", go_get_version());
  18. }
  19. static void obs_render(void *param, uint32_t cx, uint32_t cy)
  20. {
  21. obs_render_main_texture();
  22. }
  23. static bool enum_sources(void *param, obs_source_t *source)
  24. {
  25. GtkWidget *box = param;
  26. const char *source_name = obs_source_get_name(source);
  27. uint32_t flags = obs_source_get_output_flags(source);
  28. if ((flags & OBS_SOURCE_VIDEO) != 0)
  29. printf("video source!\n");
  30. printf("source: %s\n", source_name);
  31. gtk_container_add(GTK_CONTAINER(box), gtk_label_new(source_name));
  32. return true;
  33. }
  34. static void render_sources_window(GtkApplication *app, GtkWidget *parent_window)
  35. {
  36. GtkWidget *window, *box;
  37. const char *t;
  38. printf("rendering sources\n");
  39. window = gtk_application_window_new(app);
  40. gtk_window_set_title(GTK_WINDOW(window), "OBS - Sources");
  41. gtk_window_set_default_size(GTK_WINDOW(window), 500, 500);
  42. box = gtk_list_box_new();
  43. for (int i = 0; obs_enum_source_types(i, &t); ++i)
  44. {
  45. printf("source type: %s\n", t);
  46. //gtk_container_add(GTK_CONTAINER(box), gtk_label_new(t));
  47. }
  48. for (int i = 0; obs_enum_input_types(i, &t); ++i)
  49. {
  50. printf("input type: %s\n", t);
  51. //gtk_container_add(GTK_CONTAINER(box), gtk_label_new(t));
  52. }
  53. obs_enum_sources(enum_sources, box);
  54. gtk_container_add(GTK_CONTAINER(window), box);
  55. gtk_widget_show_all(box);
  56. gtk_window_present(GTK_WINDOW(window));
  57. }
  58. static void activate(GtkApplication *app, gpointer user_data)
  59. {
  60. GtkWidget *window = gtk_application_window_new(app);
  61. gtk_window_set_title(GTK_WINDOW(window), "OBS - Progrium");
  62. gtk_window_set_default_size(GTK_WINDOW(window), window_width, window_height);
  63. gtk_window_present(GTK_WINDOW(window));
  64. struct gs_init_data info = {
  65. .cx = window_width,
  66. .cy = window_height,
  67. .window.id = gdk_x11_window_get_xid(gtk_widget_get_window(window)),
  68. .window.display = gdk_window_get_display(gtk_widget_get_window(window)),
  69. .format = GS_BGRA,
  70. .zsformat = GS_ZS_NONE,
  71. };
  72. display = obs_display_create(&info, 0);
  73. if (display == NULL)
  74. {
  75. printf("error creating display!\n");
  76. }
  77. obs_display_add_draw_callback(display, obs_render, NULL);
  78. obs_data_t *settings = obs_data_create();
  79. //obs_data_set_default_int(settings, "input", -1);
  80. //obs_data_set_default_int(settings, "pixelformat", -1);
  81. //obs_data_set_default_int(settings, "standard", -1);
  82. //obs_data_set_default_int(settings, "dv_timing", -1);
  83. //obs_data_set_default_int(settings, "resolution", -1);
  84. //obs_data_set_default_int(settings, "framerate", -1);
  85. //obs_data_set_default_int(settings, "color_range", VIDEO_RANGE_DEFAULT);
  86. //obs_data_set_default_bool(settings, "buffering", true);
  87. //obs_data_set_default_bool(settings, "auto_reset", false);
  88. //obs_data_set_default_int(settings, "timeout_frames", 5);
  89. obs_data_set_string(settings, "device_id", "/dev/video2");
  90. //obs_data_set_string(settings, "format", "NV12");
  91. obs_source_t *source = obs_source_create("v4l2_input", "Source", settings, NULL);
  92. if (source == NULL)
  93. printf("couldn't create source");
  94. obs_scene_t *scene = obs_scene_create("scene1");
  95. if (scene == NULL)
  96. printf("couldn't create scene");
  97. obs_scene_add(scene, source);
  98. obs_set_output_source(0, obs_scene_get_source(scene));
  99. render_sources_window(app, window);
  100. }
  101. int main(int argc, char **argv)
  102. {
  103. GtkApplication* app;
  104. obs_module_t *module;
  105. int status, res;
  106. app = gtk_application_new("xyz.dwayne.obs", G_APPLICATION_FLAGS_NONE);
  107. g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
  108. print_version_string();
  109. if (!obs_initialized())
  110. {
  111. if (!obs_startup("en-US", NULL, NULL))
  112. {
  113. printf("Failed to start OBS...\n");
  114. return 1;
  115. }
  116. // This next line crashes the app on load
  117. //obs_load_all_modules();
  118. // This just initializes OpenGL.
  119. // The program won't run if OpenGL hasn't been initialized.
  120. glutInit(&argc, argv);
  121. res = obs_open_module(&module, "/usr/lib/x86_64-linux-gnu/obs-plugins/obs-ffmpeg.so", NULL);
  122. if (res != MODULE_SUCCESS)
  123. printf("error opening plugin\n");
  124. obs_init_module(module);
  125. res = obs_open_module(&module, "/usr/lib/x86_64-linux-gnu/obs-plugins/linux-v4l2.so", NULL);
  126. if (res != MODULE_SUCCESS)
  127. printf("error opening v4l2 plugin\n");
  128. obs_init_module(module);
  129. obs_post_load_modules();
  130. struct obs_video_info v = {
  131. .graphics_module = "libobs-opengl.so.0",
  132. .fps_num = 30000,
  133. .fps_den = 1001,
  134. .base_width = window_width,
  135. .base_height = window_height,
  136. .output_width = window_width,
  137. .output_height = window_height,
  138. .output_format = VIDEO_FORMAT_NV12,
  139. .adapter = 0,
  140. .gpu_conversion = true,
  141. .colorspace = VIDEO_CS_601,
  142. .range = VIDEO_RANGE_PARTIAL,
  143. .scale_type = OBS_SCALE_BICUBIC,
  144. };
  145. struct obs_audio_info a = {
  146. .samples_per_sec = 44100,
  147. .speakers = SPEAKERS_STEREO,
  148. };
  149. obs_reset_video(&v);
  150. obs_reset_audio(&a);
  151. }
  152. status = g_application_run(G_APPLICATION(app), argc, argv);
  153. if (display != NULL)
  154. obs_display_destroy(display);
  155. obs_shutdown();
  156. g_object_unref(app);
  157. return status;
  158. }