2 * gstvaapipluginutil.h - VA-API plugin helpers
4 * Copyright (C) 2011-2012 Intel Corporation
5 * Copyright (C) 2011 Collabora
6 * Author: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; either version 2.1
11 * of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301 USA
28 #include <gst/video/videocontext.h>
30 # include <gst/vaapi/gstvaapidisplay_x11.h>
33 # include <gst/vaapi/gstvaapidisplay_glx.h>
35 #include "gstvaapipluginutil.h"
38 static const char *display_types[] = {
47 const gchar *type_str;
48 GstVaapiDisplayType type;
49 GstVaapiDisplay * (*create_display)(const gchar *);
52 static const DisplayMap g_display_map[] = {
55 GST_VAAPI_DISPLAY_TYPE_GLX,
56 gst_vaapi_display_glx_new },
60 GST_VAAPI_DISPLAY_TYPE_X11,
61 gst_vaapi_display_x11_new },
67 gst_vaapi_ensure_display(
69 GstVaapiDisplay **display_ptr,
70 GstVaapiDisplayType *display_type_ptr
73 GstVaapiDisplayType display_type =
74 display_type_ptr ? *display_type_ptr : GST_VAAPI_DISPLAY_TYPE_AUTO;
75 GstVaapiDisplay *display;
76 GstVideoContext *context;
79 g_return_val_if_fail(GST_IS_VIDEO_CONTEXT(element), FALSE);
80 g_return_val_if_fail(display_ptr != NULL, FALSE);
83 display = *display_ptr;
87 context = GST_VIDEO_CONTEXT(element);
88 gst_video_context_prepare(context, display_types);
90 /* If no neighboor, or application not interested, use system default */
91 for (m = g_display_map; m->type_str != NULL; m++) {
92 if (display_type != GST_VAAPI_DISPLAY_TYPE_AUTO &&
93 display_type != m->type)
96 display = m->create_display(NULL);
98 /* FIXME: allocator should return NULL if an error occurred */
99 if (gst_vaapi_display_get_display(display)) {
100 display_type = m->type;
103 g_object_unref(display);
107 if (display_type != GST_VAAPI_DISPLAY_TYPE_AUTO)
112 *display_ptr = display;
113 if (display_type_ptr)
114 *display_type_ptr = display_type;
115 return display != NULL;
119 gst_vaapi_set_display(
122 GstVaapiDisplay **display
125 GstVaapiDisplay *dpy = NULL;
127 if (!strcmp(type, "x11-display-name")) {
128 g_return_if_fail(G_VALUE_HOLDS_STRING(value));
130 dpy = gst_vaapi_display_glx_new(g_value_get_string(value));
133 dpy = gst_vaapi_display_x11_new(g_value_get_string(value));
135 else if (!strcmp(type, "x11-display")) {
136 g_return_if_fail(G_VALUE_HOLDS_POINTER(value));
138 dpy = gst_vaapi_display_glx_new_with_display(g_value_get_pointer(value));
141 dpy = gst_vaapi_display_x11_new_with_display(g_value_get_pointer(value));
143 else if (!strcmp(type, "vaapi-display")) {
144 g_return_if_fail(G_VALUE_HOLDS_POINTER(value));
145 dpy = gst_vaapi_display_new_with_display(g_value_get_pointer(value));
147 else if (!strcmp(type, "gst-vaapi-display")) {
148 g_return_if_fail(G_VALUE_HOLDS_OBJECT(value));
149 dpy = g_value_dup_object(value);
154 g_object_unref(*display);
160 gst_vaapi_reply_to_query(GstQuery *query, GstVaapiDisplay *display)
165 gboolean res = FALSE;
170 types = gst_video_context_query_get_supported_types(query);
175 for (i = 0; types[i]; i++) {
178 if (!strcmp(type, "gst-vaapi-display")) {
179 gst_video_context_query_set_object(query, type, G_OBJECT(display));
181 else if (!strcmp(type, "vaapi-display")) {
182 VADisplay vadpy = gst_vaapi_display_get_display(display);
183 gst_video_context_query_set_pointer(query, type, vadpy);
185 else if (!strcmp(type, "x11-display") &&
186 GST_VAAPI_IS_DISPLAY_X11(display)) {
187 GstVaapiDisplayX11 *xvadpy = GST_VAAPI_DISPLAY_X11(display);
188 Display *x11dpy = gst_vaapi_display_x11_get_display(xvadpy);
189 gst_video_context_query_set_pointer(query, type, x11dpy);
192 else if (!strcmp(type, "x11-display-name") &&
193 GST_VAAPI_IS_DISPLAY_X11(display)) {
194 GstVaapiDisplayX11 *xvadpy = GST_VAAPI_DISPLAY_X11(display);
195 Display *x11dpy = gst_vaapi_display_x11_get_display(xvadpy);
196 gst_video_context_query_set_string(query, type, DisplayString(x11dpy));
209 gst_vaapi_append_surface_caps(GstCaps *out_caps, GstCaps *in_caps)
211 GstStructure *structure;
212 const GValue *v_width, *v_height, *v_framerate, *v_par;
213 guint i, n_structures;
215 structure = gst_caps_get_structure(in_caps, 0);
216 v_width = gst_structure_get_value(structure, "width");
217 v_height = gst_structure_get_value(structure, "height");
218 v_framerate = gst_structure_get_value(structure, "framerate");
219 v_par = gst_structure_get_value(structure, "pixel-aspect-ratio");
220 if (!v_width || !v_height)
223 n_structures = gst_caps_get_size(out_caps);
224 for (i = 0; i < n_structures; i++) {
225 structure = gst_caps_get_structure(out_caps, i);
226 gst_structure_set_value(structure, "width", v_width);
227 gst_structure_set_value(structure, "height", v_height);
229 gst_structure_set_value(structure, "framerate", v_framerate);
231 gst_structure_set_value(structure, "pixel-aspect-ratio", v_par);
237 gst_vaapi_display_type_get_type(void)
239 static GType g_type = 0;
241 static const GEnumValue display_types[] = {
242 { GST_VAAPI_DISPLAY_TYPE_AUTO,
243 "Auto detection", "auto" },
244 { GST_VAAPI_DISPLAY_TYPE_X11,
245 "VA/X11 display", "x11" },
247 { GST_VAAPI_DISPLAY_TYPE_GLX,
248 "VA/GLX display", "glx" },
254 g_type = g_enum_register_static("GstVaapiDisplayType", display_types);