2 * gstvaapipluginutil.h - VA-API plugin helpers
4 * Copyright (C) 2011 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 "gstvaapipluginutil.h"
33 #include <gst/vaapi/gstvaapidisplay_glx.h>
35 #include <gst/vaapi/gstvaapidisplay_x11.h>
39 static const char *display_types[] = {
48 gst_vaapi_ensure_display (gpointer element, GstVaapiDisplay **display)
50 GstVideoContext *context;
52 g_return_val_if_fail (GST_IS_VIDEO_CONTEXT (element), FALSE);
53 g_return_val_if_fail (display != NULL, FALSE);
59 context = GST_VIDEO_CONTEXT (element);
60 gst_video_context_prepare (context, display_types);
62 /* If no neighboor, or application not interested, use system default */
65 *display = gst_vaapi_display_glx_new (NULL);
67 *display = gst_vaapi_display_x11_new (NULL);
70 /* FIXME allocator should return NULL in case of failure */
71 if (*display && !gst_vaapi_display_get_display(*display)) {
72 g_object_unref (*display);
76 return (*display != NULL);
80 gst_vaapi_set_display (const gchar *type,
82 GstVaapiDisplay **display)
84 GstVaapiDisplay *dpy = NULL;
86 if (!strcmp (type, "x11-display-name")) {
87 g_return_if_fail (G_VALUE_HOLDS_STRING (value));
89 dpy = gst_vaapi_display_glx_new (g_value_get_string (value));
91 dpy = gst_vaapi_display_x11_new (g_value_get_string (value));
93 } else if (!strcmp (type, "x11-display")) {
94 g_return_if_fail (G_VALUE_HOLDS_POINTER (value));
96 dpy = gst_vaapi_display_glx_new_with_display (g_value_get_pointer (value));
98 dpy = gst_vaapi_display_x11_new_with_display (g_value_get_pointer (value));
100 } else if (!strcmp (type, "vaapi-display")) {
101 g_return_if_fail (G_VALUE_HOLDS_POINTER (value));
102 dpy = gst_vaapi_display_new_with_display (g_value_get_pointer (value));
103 } else if (!strcmp (type, "gst-vaapi-display")) {
104 g_return_if_fail (G_VALUE_HOLDS_OBJECT (value));
105 dpy = g_value_dup_object (value);
110 g_object_unref (*display);
116 gst_vaapi_reply_to_query (GstQuery *query, GstVaapiDisplay *display)
121 gboolean res = FALSE;
126 types = gst_video_context_query_get_supported_types (query);
131 for (i = 0; types[i]; i++) {
134 if (!strcmp (type, "gst-vaapi-display")) {
135 gst_video_context_query_set_object (query, type, G_OBJECT (display));
137 } else if (!strcmp (type, "vaapi-display")) {
138 VADisplay vadpy = gst_vaapi_display_get_display(display);
139 gst_video_context_query_set_pointer (query, type, vadpy);
141 } else if (!strcmp (type, "x11-display") &&
142 GST_VAAPI_IS_DISPLAY_X11(display)) {
143 GstVaapiDisplayX11 *xvadpy = GST_VAAPI_DISPLAY_X11 (display);
144 Display *x11dpy = gst_vaapi_display_x11_get_display (xvadpy);
145 gst_video_context_query_set_pointer (query, type, x11dpy);
147 } else if (!strcmp (type, "x11-display-name") &&
148 GST_VAAPI_IS_DISPLAY_X11(display)) {
149 GstVaapiDisplayX11 *xvadpy = GST_VAAPI_DISPLAY_X11 (display);
150 Display *x11dpy = gst_vaapi_display_x11_get_display (xvadpy);
151 gst_video_context_query_set_string (query, type, DisplayString(x11dpy));
165 gst_vaapi_append_surface_caps (GstCaps *out_caps, GstCaps *in_caps)
167 GstStructure *structure;
168 const GValue *v_width, *v_height, *v_framerate, *v_par;
169 guint i, n_structures;
171 structure = gst_caps_get_structure (in_caps, 0);
172 v_width = gst_structure_get_value (structure, "width");
173 v_height = gst_structure_get_value (structure, "height");
174 v_framerate = gst_structure_get_value (structure, "framerate");
175 v_par = gst_structure_get_value (structure, "pixel-aspect-ratio");
176 if (!v_width || !v_height)
179 n_structures = gst_caps_get_size (out_caps);
180 for (i = 0; i < n_structures; i++) {
181 structure = gst_caps_get_structure (out_caps, i);
182 gst_structure_set_value (structure, "width", v_width);
183 gst_structure_set_value (structure, "height", v_height);
185 gst_structure_set_value (structure, "framerate", v_framerate);
187 gst_structure_set_value (structure, "pixel-aspect-ratio", v_par);