Remove autotools build
[platform/upstream/gstreamer.git] / tests / output.c
1 /*
2  *  output.c - Video output helpers
3  *
4  *  Copyright (C) 2012-2013 Intel Corporation
5  *    Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
6  *
7  *  This library is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU Lesser General Public License
9  *  as published by the Free Software Foundation; either version 2.1
10  *  of the License, or (at your option) any later version.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Lesser General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Lesser General Public
18  *  License along with this library; if not, write to the Free
19  *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  *  Boston, MA 02110-1301 USA
21  */
22
23 #include "gst/vaapi/sysdeps.h"
24 #include <gst/gst.h>
25 #if USE_DRM
26 # include <gst/vaapi/gstvaapidisplay_drm.h>
27 # include <gst/vaapi/gstvaapiwindow_drm.h>
28 #endif
29 #if USE_X11
30 # include <gst/vaapi/gstvaapidisplay_x11.h>
31 # include <gst/vaapi/gstvaapiwindow_x11.h>
32 # include <gst/vaapi/gstvaapipixmap_x11.h>
33 #endif
34 #if USE_GLX
35 # include <gst/vaapi/gstvaapidisplay_glx.h>
36 # include <gst/vaapi/gstvaapiwindow_glx.h>
37 #endif
38 #if USE_EGL
39 # include <gst/vaapi/gstvaapidisplay_egl.h>
40 # include <gst/vaapi/gstvaapiwindow_egl.h>
41 #endif
42 #if USE_WAYLAND
43 # include <gst/vaapi/gstvaapidisplay_wayland.h>
44 # include <gst/vaapi/gstvaapiwindow_wayland.h>
45 #endif
46 #include "output.h"
47
48 static const VideoOutputInfo *g_video_output;
49 static const VideoOutputInfo g_video_outputs[] = {
50   /* Video outputs are sorted in test order for automatic characterisation */
51 #if USE_WAYLAND
52   {"wayland",
53         gst_vaapi_display_wayland_new,
54       gst_vaapi_window_wayland_new},
55 #endif
56 #if USE_X11
57   {"x11",
58         gst_vaapi_display_x11_new,
59         gst_vaapi_window_x11_new,
60       gst_vaapi_pixmap_x11_new},
61 #endif
62 #if USE_GLX
63   {"glx",
64         gst_vaapi_display_glx_new,
65         gst_vaapi_window_glx_new,
66       gst_vaapi_pixmap_x11_new},
67 #endif
68 #if USE_DRM
69   {"drm",
70         gst_vaapi_display_drm_new,
71       gst_vaapi_window_drm_new},
72 #endif
73   {NULL,}
74 };
75
76 static gchar *g_output_name;
77 static gboolean g_list_outputs = FALSE;
78 static gboolean g_fullscreen = FALSE;
79
80 static gboolean g_egl_mode = FALSE;
81 static guint g_gles_version;
82
83 static GOptionEntry g_options[] = {
84   {"list-outputs", 0,
85         0,
86         G_OPTION_ARG_NONE, &g_list_outputs,
87       "list video outputs", NULL},
88   {"output", 'o',
89         0,
90         G_OPTION_ARG_STRING, &g_output_name,
91       "video output name", NULL},
92   {"fullscreen", 'f',
93         0,
94         G_OPTION_ARG_NONE, &g_fullscreen,
95       "fullscreen mode", NULL},
96   {"egl", 0,
97         0,
98         G_OPTION_ARG_NONE, &g_egl_mode,
99       "enable EGL rendering", NULL},
100   {"gles-version", 0,
101         0,
102         G_OPTION_ARG_INT, &g_gles_version,
103       "OpenGL|ES version (in --egl mode)", NULL},
104   {NULL,}
105 };
106
107 static void
108 list_outputs (void)
109 {
110   const VideoOutputInfo *o;
111
112   g_print ("Video outputs:");
113   for (o = g_video_outputs; o->name != NULL; o++)
114     g_print (" %s", o->name);
115   g_print ("\n");
116 }
117
118 gboolean
119 video_output_init (int *argc, char *argv[], GOptionEntry * options)
120 {
121   GOptionContext *ctx;
122   gboolean success;
123
124   ctx = g_option_context_new ("- test options");
125   if (!ctx)
126     return FALSE;
127
128   g_option_context_add_group (ctx, gst_init_get_option_group ());
129   g_option_context_add_main_entries (ctx, g_options, NULL);
130   if (options)
131     g_option_context_add_main_entries (ctx, options, NULL);
132   success = g_option_context_parse (ctx, argc, &argv, NULL);
133   g_option_context_free (ctx);
134
135   if (g_list_outputs) {
136     list_outputs ();
137     exit (0);
138   }
139   return success;
140 }
141
142 void
143 video_output_exit (void)
144 {
145   g_free (g_output_name);
146   gst_deinit ();
147 }
148
149 const VideoOutputInfo *
150 video_output_lookup (const gchar * output_name)
151 {
152   const VideoOutputInfo *o;
153
154   if (!output_name)
155     return NULL;
156
157   for (o = g_video_outputs; o->name != NULL; o++) {
158     if (g_ascii_strcasecmp (o->name, output_name) == 0)
159       return o;
160   }
161   return NULL;
162 }
163
164 GstVaapiDisplay *
165 video_output_create_display (const gchar * display_name)
166 {
167   const VideoOutputInfo *o = g_video_output;
168   GstVaapiDisplay *egl_display, *display = NULL;
169
170   if (!o) {
171     if (g_output_name)
172       o = video_output_lookup (g_output_name);
173     else {
174       for (o = g_video_outputs; o->name != NULL; o++) {
175         display = o->create_display (display_name);
176         if (display) {
177           if (gst_vaapi_display_get_display (display))
178             break;
179           gst_object_unref (display);
180           display = NULL;
181         }
182       }
183     }
184     if (!o || !o->name)
185       return NULL;
186     g_print ("Using %s video output\n", o->name);
187     g_video_output = o;
188   }
189
190   if (!display)
191     display = o->create_display (display_name);
192
193   if (g_egl_mode) {
194 #if USE_EGL
195     egl_display = gst_vaapi_display_egl_new (display, g_gles_version);
196 #else
197     egl_display = NULL;
198     g_print ("error: unsupported EGL renderering mode\n");
199 #endif
200     gst_object_unref (display);
201     if (!egl_display)
202       return NULL;
203     display = egl_display;
204   }
205   return display;
206 }
207
208 GstVaapiWindow *
209 video_output_create_window (GstVaapiDisplay * display, guint width,
210     guint height)
211 {
212   GstVaapiWindow *window;
213
214   if (!g_video_output)
215     return NULL;
216
217 #if USE_EGL
218   if (g_egl_mode)
219     window = gst_vaapi_window_egl_new (display, width, height);
220   else
221 #endif
222     window = g_video_output->create_window (display, width, height);
223   if (!window)
224     return NULL;
225
226   /* Force fullscreen mode, should this be requested by the user */
227   if (g_fullscreen)
228     gst_vaapi_window_set_fullscreen (window, TRUE);
229   return window;
230 }
231
232 GstVaapiPixmap *
233 video_output_create_pixmap (GstVaapiDisplay * display, GstVideoFormat format,
234     guint width, guint height)
235 {
236   if (!g_video_output || !g_video_output->create_pixmap)
237     return NULL;
238   return g_video_output->create_pixmap (display, format, width, height);
239 }