Update theme submodule
[platform/upstream/gstreamer.git] / examples / tutorials / basic-tutorial-15.c
1 #include <clutter-gst/clutter-gst.h>
2
3 /* Setup the video texture once its size is known */
4 void size_change (ClutterActor *texture, gint width, gint height, gpointer user_data) {
5   ClutterActor *stage;
6   gfloat new_x, new_y, new_width, new_height;
7   gfloat stage_width, stage_height;
8   ClutterAnimation *animation = NULL;
9
10   stage = clutter_actor_get_stage (texture);
11   if (stage == NULL)
12     return;
13
14   clutter_actor_get_size (stage, &stage_width, &stage_height);
15
16   /* Center video on window and calculate new size preserving aspect ratio */
17   new_height = (height * stage_width) / width;
18   if (new_height <= stage_height) {
19     new_width = stage_width;
20
21     new_x = 0;
22     new_y = (stage_height - new_height) / 2;
23   } else {
24     new_width  = (width * stage_height) / height;
25     new_height = stage_height;
26
27     new_x = (stage_width - new_width) / 2;
28     new_y = 0;
29   }
30   clutter_actor_set_position (texture, new_x, new_y);
31   clutter_actor_set_size (texture, new_width, new_height);
32   clutter_actor_set_rotation (texture, CLUTTER_Y_AXIS, 0.0, stage_width / 2, 0, 0);
33   /* Animate it */
34   animation = clutter_actor_animate (texture, CLUTTER_LINEAR, 10000, "rotation-angle-y", 360.0, NULL);
35   clutter_animation_set_loop (animation, TRUE);
36 }
37
38 int main(int argc, char *argv[]) {
39   GstElement *pipeline, *sink;
40   ClutterTimeline *timeline;
41   ClutterActor *stage, *texture;
42
43   /* clutter-gst takes care of initializing Clutter and GStreamer */
44   if (clutter_gst_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) {
45     g_error ("Failed to initialize clutter\n");
46     return -1;
47   }
48
49   stage = clutter_stage_get_default ();
50
51   /* Make a timeline */
52   timeline = clutter_timeline_new (1000);
53   g_object_set(timeline, "loop", TRUE, NULL);
54
55   /* Create new texture and disable slicing so the video is properly mapped onto it */
56   texture = CLUTTER_ACTOR (g_object_new (CLUTTER_TYPE_TEXTURE, "disable-slicing", TRUE, NULL));
57   g_signal_connect (texture, "size-change", G_CALLBACK (size_change), NULL);
58
59   /* Build the GStreamer pipeline */
60   pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
61
62   /* Instantiate the Clutter sink */
63   sink = gst_element_factory_make ("autocluttersink", NULL);
64   if (sink == NULL) {
65     /* Revert to the older cluttersink, in case autocluttersink was not found */
66     sink = gst_element_factory_make ("cluttersink", NULL);
67   }
68   if (sink == NULL) {
69     g_printerr ("Unable to find a Clutter sink.\n");
70     return -1;
71   }
72
73   /* Link GStreamer with Clutter by passing the Clutter texture to the Clutter sink*/
74   g_object_set (sink, "texture", texture, NULL);
75
76   /* Add the Clutter sink to the pipeline */
77   g_object_set (pipeline, "video-sink", sink, NULL);
78
79   /* Start playing */
80   gst_element_set_state (pipeline, GST_STATE_PLAYING);
81
82   /* start the timeline */
83   clutter_timeline_start (timeline);
84
85   /* Add texture to the stage, and show it */
86   clutter_group_add (CLUTTER_GROUP (stage), texture);
87   clutter_actor_show_all (stage);
88
89   clutter_main();
90
91   /* Free resources */
92   gst_element_set_state (pipeline, GST_STATE_NULL);
93   gst_object_unref (pipeline);
94   return 0;
95 }