/examples/filter-manager/test-video-filters.c

https://github.com/ahmedammar/skype_farsight2 · C · 357 lines · 276 code · 71 blank · 10 comment · 41 complexity · 466ef30f95d1592edbcc8729e2db4e07 MD5 · raw file

  1. #include <gst/gst.h>
  2. #include <gst/filters/fsu-multi-filter-manager.h>
  3. #include <gst/filters/fsu-videoconverter-filter.h>
  4. #include <gst/filters/fsu-resolution-filter.h>
  5. #include <gst/filters/fsu-gnome-effect-filter.h>
  6. #include <gst/filters/fsu-framerate-filter.h>
  7. #include <gst/filters/fsu-preview-filter.h>
  8. #define TIMEOUT 5000
  9. #define TWICE 1
  10. static FsuFilterId *effect_id = NULL;
  11. static FsuFilterId *framerate_id = NULL;
  12. static FsuFilterId *resolution_id = NULL;
  13. static FsuFilterId *last_converter_id = NULL;
  14. static GMainLoop *mainloop = NULL;
  15. static GstElement *pipeline = NULL;
  16. gboolean
  17. dump (gpointer data)
  18. {
  19. g_debug ("Dumping pipeline");
  20. GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (data, GST_DEBUG_GRAPH_SHOW_ALL,
  21. "test-video-filters");
  22. return TRUE;
  23. }
  24. gboolean
  25. done (gpointer data)
  26. {
  27. g_main_loop_quit (mainloop);
  28. return FALSE;
  29. }
  30. gboolean
  31. add_effects (gpointer data)
  32. {
  33. FsuFilterManager *filters = data;
  34. static gint idx = 0;
  35. static GList *effects = NULL;
  36. FsuFilter *filter = NULL;
  37. gchar *effect_name = NULL;
  38. if (effects == NULL)
  39. effects = fsu_gnome_effect_list_effects (".");
  40. filter = FSU_FILTER (fsu_gnome_effect_filter_new ((const gchar *)g_list_nth_data (effects, idx), NULL));
  41. g_object_get (filter, "name", &effect_name, NULL);
  42. g_debug ("Insert filter %s", effect_name);
  43. g_free (effect_name);
  44. fsu_filter_manager_insert_filter_before (filters, filter, last_converter_id);
  45. g_object_unref (filter);
  46. idx++;
  47. if (idx >= g_list_length (effects)) {
  48. GList *f = fsu_filter_manager_list_filters (filters);
  49. GList *i;
  50. gboolean remove = FALSE;
  51. for (i = f; i; i = i->next) {
  52. if (i->data == effect_id)
  53. remove = TRUE;
  54. if (i->data == last_converter_id)
  55. remove = FALSE;
  56. if (remove)
  57. fsu_filter_manager_remove_filter (filters, i->data);
  58. g_list_free (f);
  59. }
  60. g_list_foreach (effects, (GFunc) g_free, NULL);
  61. g_list_free (effects);
  62. g_timeout_add (TIMEOUT, done, NULL);
  63. return FALSE;
  64. }
  65. return TRUE;
  66. }
  67. gboolean
  68. change_effect (gpointer data)
  69. {
  70. FsuFilterManager *filters = data;
  71. static gint idx = 0;
  72. static GList *effects = NULL;
  73. FsuFilter *filter;
  74. gchar *effect_name = NULL;
  75. if (effects == NULL)
  76. effects = fsu_gnome_effect_list_effects (".");
  77. if (effect_id == NULL)
  78. {
  79. idx++;
  80. return TRUE;
  81. }
  82. filter = FSU_FILTER (fsu_gnome_effect_filter_new ((const gchar *)g_list_nth_data (effects, idx), NULL));
  83. g_object_get (filter, "name", &effect_name, NULL);
  84. g_debug ("Changing effect to %s", effect_name);
  85. g_free (effect_name);
  86. effect_id = fsu_filter_manager_replace_filter (filters, filter, effect_id);
  87. g_object_unref (filter);
  88. idx++;
  89. if (idx > 10) {
  90. g_timeout_add (TIMEOUT, add_effects, filters);
  91. g_list_foreach (effects, (GFunc) g_free, NULL);
  92. g_list_free (effects);
  93. effects = NULL;
  94. return FALSE;
  95. }
  96. return TRUE;
  97. }
  98. gboolean
  99. change_reso (gpointer data)
  100. {
  101. FsuFilterManager *filters = data;
  102. static gint width = 320;
  103. static gint height = 240;
  104. FsuFilter *filter = FSU_FILTER (fsu_resolution_filter_new (width, height));
  105. resolution_id = fsu_filter_manager_replace_filter (filters,
  106. filter, resolution_id);
  107. g_object_unref (filter);
  108. if (width == 1280) {
  109. return FALSE;
  110. }
  111. width /= 2;
  112. height /= 2;
  113. if (width < 80) {
  114. width = 1280;
  115. height = 960;
  116. g_timeout_add (TIMEOUT, change_effect, filters);
  117. }
  118. return TRUE;
  119. }
  120. gboolean
  121. change_fps (gpointer data)
  122. {
  123. FsuFilterManager *filters = data;
  124. static gint fps = 10;
  125. FsuFramerateFilter *filter = FSU_FRAMERATE_FILTER (
  126. fsu_filter_manager_get_filter_by_id (filters, framerate_id));
  127. if (fps == 1) {
  128. g_object_set (filter, "fps", 30, NULL);
  129. g_object_unref (filter);
  130. printf ("Setting FPS back to 30, changing resolutions now\n\n");
  131. g_timeout_add (TIMEOUT, change_reso, filters);
  132. return FALSE;
  133. }
  134. fps -= 1;
  135. if (fps <= 0)
  136. fps = 1;
  137. printf ("Setting FPS to %d\n\n", fps);
  138. g_object_set (filter, "fps", fps, NULL);
  139. g_object_unref (filter);
  140. dump (pipeline);
  141. return TRUE;
  142. }
  143. gboolean
  144. add_preview (gpointer data)
  145. {
  146. FsuFilterManager *filters = data;
  147. FsuFilter *filter = FSU_FILTER (fsu_preview_filter_new (0));
  148. g_debug ("Adding preview filter");
  149. fsu_filter_manager_append_filter (filters, filter);
  150. g_object_unref (filter);
  151. //g_timeout_add (TIMEOUT, change_fps, filters);
  152. //g_timeout_add (5000, change_reso, filters);
  153. g_timeout_add (TIMEOUT, change_effect, filters);
  154. return FALSE;
  155. }
  156. gboolean
  157. add_filters (gpointer data)
  158. {
  159. FsuFilterManager *filters = data;
  160. FsuFilter *f1 = FSU_FILTER (fsu_videoconverter_filter_new ());
  161. FsuFilter *f2 = FSU_FILTER (fsu_resolution_filter_new (640, 480));
  162. FsuFilter *f3 = FSU_FILTER (fsu_framerate_filter_new (30));
  163. FsuFilter *f4 = FSU_FILTER (fsu_gnome_effect_filter_new ("identity.effect", NULL));
  164. g_debug ("timeout triggered");
  165. resolution_id = fsu_filter_manager_append_filter (filters, f2);
  166. fsu_filter_manager_prepend_filter (filters, f1);
  167. framerate_id = fsu_filter_manager_insert_filter (filters, f3, -1);
  168. fsu_filter_manager_append_filter (filters, f1);
  169. last_converter_id = fsu_filter_manager_insert_filter (filters, f1, 10);
  170. effect_id = fsu_filter_manager_insert_filter_before (filters, f4,
  171. last_converter_id);
  172. g_object_unref (f1);
  173. g_object_unref (f2);
  174. g_object_unref (f3);
  175. g_object_unref (f4);
  176. /*
  177. FsuFilter *f3 = fsu_effectv_filter_new ("vertigotv");
  178. fsu_filter_manager_insert_filter (filters, f3, 3);
  179. g_timeout_add (1000, add_effects, filters);
  180. //g_timeout_add (1000, change_effect, filters);
  181. */
  182. //g_timeout_add (5000, change_fps, filters);
  183. g_timeout_add (TIMEOUT/2, add_preview, filters);
  184. return FALSE;
  185. }
  186. int main (int argc, char *argv[]) {
  187. GstElement *src = NULL;
  188. GstElement *sink = NULL;
  189. GstPad *out_pad = NULL;
  190. GstPad *src_pad = NULL;
  191. GstPad *sink_pad = NULL;
  192. #if TWICE
  193. GstElement *src2 = NULL;
  194. GstElement *sink2 = NULL;
  195. GstPad *out_pad2 = NULL;
  196. GstPad *src_pad2 = NULL;
  197. GstPad *sink_pad2 = NULL;
  198. #endif
  199. FsuFilterManager *filters = NULL;
  200. gst_init (&argc, &argv);
  201. mainloop = g_main_loop_new (NULL, FALSE);
  202. pipeline = gst_pipeline_new (NULL);
  203. src = gst_element_factory_make ("fsuvideosrc", NULL);
  204. sink = gst_element_factory_make ("fakesink", NULL);
  205. g_assert (src != NULL);
  206. g_assert (sink != NULL);
  207. g_object_set (src,
  208. "source-pipeline", "videotestsrc is-live=TRUE pattern=1",
  209. NULL);
  210. g_object_set (sink,
  211. "sync", FALSE,
  212. "async", FALSE,
  213. NULL);
  214. src_pad = gst_element_get_request_pad (src, "src%d");
  215. sink_pad = gst_element_get_static_pad (sink, "sink");
  216. g_assert (src_pad != NULL);
  217. g_assert (sink_pad != NULL);
  218. #if TWICE
  219. src2 = gst_element_factory_make ("fsuvideosrc", NULL);
  220. sink2 = gst_element_factory_make ("fakesink", NULL);
  221. g_assert (src2 != NULL);
  222. g_assert (sink2 != NULL);
  223. g_object_set (sink2,
  224. "sync", FALSE,
  225. "async", FALSE,
  226. NULL);
  227. src_pad2 = gst_element_get_request_pad (src2, "src%d");
  228. sink_pad2 = gst_element_get_static_pad (sink2, "sink");
  229. g_assert (src_pad2 != NULL);
  230. g_assert (sink_pad2 != NULL);
  231. #endif
  232. filters = fsu_multi_filter_manager_new ();
  233. add_filters (filters);
  234. //g_timeout_add (TIMEOUT, done, NULL);
  235. g_assert (gst_bin_add (GST_BIN (pipeline), src) == TRUE);
  236. g_assert (gst_bin_add (GST_BIN (pipeline), sink) == TRUE);
  237. out_pad = fsu_filter_manager_apply (filters, GST_BIN (pipeline), sink_pad);
  238. g_assert (out_pad != NULL);
  239. gst_object_unref (sink_pad);
  240. g_assert (gst_pad_link (src_pad, out_pad) == GST_PAD_LINK_OK);
  241. #if TWICE
  242. g_debug ("Creating second pipeline");
  243. g_assert (gst_bin_add (GST_BIN (pipeline), src2) == TRUE);
  244. g_assert (gst_bin_add (GST_BIN (pipeline), sink2) == TRUE);
  245. out_pad2 = fsu_filter_manager_apply (filters, GST_BIN (pipeline), src_pad2);
  246. g_assert (out_pad2 != NULL);
  247. gst_object_unref (src_pad2);
  248. g_assert (gst_pad_link (out_pad2, sink_pad2) == GST_PAD_LINK_OK);
  249. #endif
  250. g_timeout_add (TIMEOUT, dump, pipeline);
  251. gst_element_set_state (pipeline, GST_STATE_PLAYING);
  252. g_debug ("Running mainloop");
  253. g_main_loop_run (mainloop);
  254. g_debug ("Mainloop terminated");
  255. gst_element_set_state (pipeline, GST_STATE_NULL);
  256. g_assert (fsu_filter_manager_revert (filters, GST_BIN (pipeline),
  257. src_pad) == NULL);
  258. gst_object_unref (out_pad);
  259. out_pad = gst_pad_get_peer (src_pad);
  260. g_assert (gst_pad_unlink (src_pad, out_pad) == TRUE);
  261. gst_element_release_request_pad (src, src_pad);
  262. gst_object_unref (src_pad);
  263. gst_bin_remove (GST_BIN (pipeline), src);
  264. g_assert (fsu_filter_manager_revert (filters, GST_BIN (pipeline),
  265. out_pad) == sink_pad);
  266. gst_object_unref (sink_pad);
  267. gst_object_unref (out_pad);
  268. gst_bin_remove (GST_BIN (pipeline), sink);
  269. #if TWICE
  270. gst_object_unref (out_pad2);
  271. out_pad2 = gst_pad_get_peer (sink_pad2);
  272. g_assert (gst_pad_unlink (out_pad2, sink_pad2) == TRUE);
  273. gst_object_unref (sink_pad2);
  274. gst_bin_remove (GST_BIN (pipeline), sink2);
  275. g_assert (fsu_filter_manager_revert (filters, GST_BIN (pipeline),
  276. out_pad2) == src_pad2);
  277. gst_object_unref (out_pad2);
  278. gst_element_release_request_pad (src2, src_pad2);
  279. gst_object_unref (src_pad2);
  280. gst_bin_remove (GST_BIN (pipeline), src2);
  281. #endif
  282. g_object_unref (filters);
  283. gst_object_unref (pipeline);
  284. g_main_loop_unref (mainloop);
  285. return 0;
  286. }