dri2videosink: refcount dri2window
[gstreamer-omap:gst-plugins-bad.git] / sys / dri2 / gstdri2util.h
1 /*
2  * GStreamer
3  *
4  * Copyright (C) 2012 Texas Instruments
5  *
6  * Authors:
7  *  Rob Clark <rob.clark@linaro.org>
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation
12  * version 2.1 of the License.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22  */
23
24 #ifndef __GSTDRI2UTIL_H__
25 #define __GSTDRI2UTIL_H__
26
27 #include <gst/gst.h>
28 #include <gst/video/video.h>
29 #include <gst/drm/gstdrmbufferpool.h>
30
31 #include <string.h>
32 #include <math.h>
33 #include <fcntl.h>
34 #include <omap_drm.h>
35 #include <omap_drmif.h>
36 #include <xf86drmMode.h>
37 #include <xf86drm.h>
38 #include <drm.h>
39 #include <X11/Xlib.h>
40 #include <X11/Xmd.h>
41 #include <X11/Xutil.h>
42 #include <X11/extensions/dri2proto.h>
43 #include <X11/extensions/dri2.h>
44
45
46 GST_DEBUG_CATEGORY_EXTERN (gst_debug_dri2);
47 #define GST_CAT_DEFAULT gst_debug_dri2
48
49
50 typedef struct _GstDRI2Context GstDRI2Context;
51 typedef struct _GstDRI2Window GstDRI2Window;
52
53
54 /*
55  * GstDRI2DrawContext
56  */
57
58 struct _GstDRI2Context
59 {
60   GstElement *elem;
61
62   /* TODO: to handle par properly, we need a way to get physical
63    * dimensions from display.. and way to post a buffer specifying
64    * dst coords as well as src coords..
65    */
66   GValue *par;
67
68   GMutex *x_lock;
69   Display *x_display;
70   gint screen_num;
71   gulong black;
72   char *driver;
73   char *device;
74
75   int drm_fd;
76   struct omap_device *dev;
77 };
78
79
80 GstDRI2Context * gst_dri2context_new (GstElement * elem);
81 void gst_dri2context_delete (GstDRI2Context *dcontext);
82
83 /*
84  * GstDRI2Window
85  */
86
87 GType gst_dri2window_get_type (void);
88 #define GST_TYPE_DRI2WINDOW (gst_dri2window_get_type())
89 #define GST_IS_DRI2WINDOW(obj) \
90   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DRI2WINDOW))
91 #define GST_DRI2WINDOW(obj) \
92   (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DRI2WINDOW, \
93                                GstDRI2Window))
94
95 struct _GstDRI2Window
96 {
97   GstMiniObject parent;
98
99   GstDRI2Context *dcontext;
100
101   Window window;
102   gint width, height;
103   gboolean internal;
104   GC gc;
105
106   /* The bufferpool is associated to the drawable because the
107    * attachment points are associated with the drawable.. if
108    * the app changes the drawable, we need to re-allocate the
109    * buffers:
110    */
111   GMutex *pool_lock;
112   GstDRMBufferPool *buffer_pool;
113   gboolean pool_valid;
114
115   /* we could be a bit more clever and dynamically size the table:
116    */
117   DRI2Buffer *dri2bufs[50];
118 };
119
120 GstDRI2Window * gst_dri2window_new_from_handle (GstDRI2Context *dcontext, XID xwindow_id);
121 GstDRI2Window * gst_dri2window_new (GstDRI2Context *dcontext, gint width, gint height);
122 void gst_dri2window_delete (GstDRI2Window * xwindow);
123 void gst_dri2window_update_geometry (GstDRI2Window * xwindow);
124 void gst_dri2window_set_pool_valid (GstDRI2Window * xwindow, gboolean valid);
125 void gst_dri2window_check_caps (GstDRI2Window * xwindow, GstCaps * caps);
126 GstFlowReturn gst_dri2window_buffer_show (GstDRI2Window * xwindow, GstBuffer * buf);
127 GstBuffer * gst_dri2window_buffer_prepare (GstDRI2Window * xwindow, GstBuffer * buf);
128 GstFlowReturn gst_dri2window_buffer_alloc (GstDRI2Window * xwindow, guint size, GstCaps * caps, GstBuffer ** buf);
129
130 /* used by GstDRI2BufferPool: */
131 DRI2Buffer * gst_dri2window_get_dri2buffer (GstDRI2Window * xwindow, gint width, gint height, guint32 format);
132 void gst_dri2window_free_dri2buffer (GstDRI2Window * xwindow, DRI2Buffer * dri2buf);
133
134 #endif /* __GSTDRI2UTIL_H__ */