Added TI patches, generated from commit 04f9d72 of the following tree:
[ubuntu-omap:gst-plugins-bad1-0.git] / debian / patches / 0033-03-12-drmbufferpool-make-it-possible-to-subclass.patch
1 From d0a334ac2027c4e00407242d17299d8bed1b7184 Mon Sep 17 00:00:00 2001
2 From: Rob Clark <rob@ti.com>
3 Date: Thu, 14 Jun 2012 11:01:37 -0500
4 Subject: [PATCH 033/100] [03/12] drmbufferpool: make it possible to subclass
5
6 ---
7  gst-libs/gst/drm/Makefile.am        |    1 +
8  gst-libs/gst/drm/drmbufferpool.h    |  120 -----------------------------------
9  gst-libs/gst/drm/gstdrmbufferpool.c |   84 +++++++++++++++---------
10  gst-libs/gst/drm/gstdrmbufferpool.h |   95 +++++++++++++++++++++++++++
11  4 files changed, 150 insertions(+), 150 deletions(-)
12  delete mode 100644 gst-libs/gst/drm/drmbufferpool.h
13
14 diff --git a/gst-libs/gst/drm/Makefile.am b/gst-libs/gst/drm/Makefile.am
15 index ccce728..ea1c290 100644
16 --- a/gst-libs/gst/drm/Makefile.am
17 +++ b/gst-libs/gst/drm/Makefile.am
18 @@ -21,6 +21,7 @@ libgstdrm_@GST_MAJORMINOR@_la_CFLAGS = \
19  
20  libgstdrm_@GST_MAJORMINOR@_la_LIBADD = \
21         $(DRM_LIBS) \
22 +       -lgstdmabuf-$(GST_MAJORMINOR) \
23         $(GST_PLUGINS_BASE_LIBS) \
24         $(GST_BASE_LIBS) \
25         $(GST_LIBS) \
26 diff --git a/gst-libs/gst/drm/drmbufferpool.h b/gst-libs/gst/drm/drmbufferpool.h
27 deleted file mode 100644
28 index a5bf842..0000000
29 --- a/gst-libs/gst/drm/drmbufferpool.h
30 +++ /dev/null
31 @@ -1,120 +0,0 @@
32 -/*
33 - * GStreamer
34 - *
35 - * Copyright (C) 2012 Texas Instruments 
36 - * Copyright (C) 2012 Collabora Ltd
37 - *
38 - * Authors:
39 - *  Alessandro Decina <alessandro.decina@collabora.co.uk>
40 - *  Rob Clark <rob.clark@linaro.org>
41 - *
42 - * This library is free software; you can redistribute it and/or
43 - * modify it under the terms of the GNU Lesser General Public
44 - * License as published by the Free Software Foundation
45 - * version 2.1 of the License.
46 - *
47 - * This library is distributed in the hope that it will be useful,
48 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
49 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
50 - * Lesser General Public License for more details.
51 - *
52 - * You should have received a copy of the GNU Lesser General Public
53 - * License along with this library; if not, write to the Free Software
54 - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
55 - */
56 -
57 -#ifndef __DRMBUFFERPOOL_H__
58 -#define __DRMBUFFERPOOL_H__
59 -
60 -/*
61 - * private header for gstdrmbufferpool
62 - */
63 -
64 -#include <string.h>
65 -#include <stdint.h>
66 -#include <errno.h>
67 -#include <string.h>
68 -
69 -#include <gst/gst.h>
70 -#include <gst/dmabuf/dmabuf.h>
71 -
72 -/* TODO replace dependency on libdrm_omap w/ libdrm.. the only thing
73 - * missing is way to allocate buffers, but this should probably be
74 - * done via libdrm?
75 - */
76 -#include <omap_drm.h>
77 -#include <omap_drmif.h>
78 -
79 -G_BEGIN_DECLS
80 -
81 -/*
82 - * GstDRMBuffer:
83 - */
84 -
85 -#define GST_TYPE_DRM_BUFFER (gst_drm_buffer_get_type())
86 -#define GST_IS_DRM_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DRM_BUFFER))
87 -#define GST_DRM_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DRM_BUFFER, GstDRMBuffer))
88 -
89 -typedef struct _GstDRMBuffer GstDRMBuffer;
90 -typedef struct _GstDRMBufferClass GstDRMBufferClass;
91 -
92 -/* forward declaration */
93 -struct _GstDRMBufferPool;
94 -
95 -struct _GstDRMBuffer {
96 -  GstBuffer parent;
97 -
98 -  struct omap_bo *bo;
99 -
100 -  struct _GstDRMBufferPool *pool; /* buffer-pool that this buffer belongs to */
101 -  GstDRMBuffer *next;             /* next in freelist, if not in use */
102 -  gboolean remove_from_pool;
103 -};
104 -
105 -struct _GstDRMBufferClass {
106 -  GstBufferClass klass;
107 -};
108 -
109 -GType gst_drm_buffer_get_type (void);
110 -GstDRMBuffer * gst_drm_buffer_new (struct _GstDRMBufferPool * pool);
111 -void gst_drm_buffer_set_pool (GstDRMBuffer * self, struct _GstDRMBufferPool * pool);
112 -
113 -/*
114 - * GstDRMBufferPool:
115 - */
116 -
117 -/* TODO do we want GstDRMBufferPool to be subclassed.. if so, move this
118 - * back to public header.. for now I'm just keeping the implementation
119 - * entirely opaque
120 - */
121 -struct _GstDRMBufferPool
122 -{
123 -  GstMiniObject parent;
124 -
125 -  int fd;
126 -  struct omap_device *dev;
127 -
128 -  /* output (padded) size including any codec padding: */
129 -  gint width, height;
130 -
131 -  gboolean         strided;  /* 2d buffers? */
132 -  GstCaps         *caps;
133 -  GMutex          *lock;
134 -  gboolean         running;  /* with lock */
135 -  GstElement      *element;  /* the element that owns us.. */
136 -  GstDRMBuffer    *head; /* list of available buffers */
137 -  GstDRMBuffer    *tail;
138 -  guint size;
139 -};
140 -
141 -struct _GstDRMBufferPoolClass
142 -{
143 -  GstMiniObjectClass klass;
144 -};
145 -
146 -gboolean gst_drm_buffer_pool_put (GstDRMBufferPool * self, GstDRMBuffer * buf);
147 -
148 -
149 -G_END_DECLS
150 -
151 -#endif /* __DRMBUFFERPOOL_H__ */
152 diff --git a/gst-libs/gst/drm/gstdrmbufferpool.c b/gst-libs/gst/drm/gstdrmbufferpool.c
153 index 58fbb11..4382fc9 100644
154 --- a/gst-libs/gst/drm/gstdrmbufferpool.c
155 +++ b/gst-libs/gst/drm/gstdrmbufferpool.c
156 @@ -27,26 +27,27 @@
157  #include "config.h"
158  #endif
159  
160 +#include <string.h>
161 +
162 +#include <gst/dmabuf/dmabuf.h>
163 +
164  #include "gstdrmbufferpool.h"
165 -#include "drmbufferpool.h"
166 +
167 +static GstDRMBuffer * gst_drm_buffer_new (GstDRMBufferPool * pool);
168 +static void gst_drm_buffer_set_pool (GstDRMBuffer * self,
169 +    GstDRMBufferPool * pool);
170  
171  /*
172   * GstDRMBufferPool:
173   */
174  
175 -typedef GstDRMBufferPool GstDRMDRMBufferPool;
176 -typedef GstDRMBufferPoolClass GstDRMDRMBufferPoolClass;
177 -
178 -G_DEFINE_TYPE (GstDRMDRMBufferPool, gst_drm_buffer_pool,
179 +G_DEFINE_TYPE (GstDRMBufferPool, gst_drm_buffer_pool,
180      GST_TYPE_MINI_OBJECT);
181  
182 -GstDRMBufferPool *
183 -gst_drm_buffer_pool_new (GstElement * element,
184 -    int fd, GstCaps * caps, guint size)
185 +void
186 +gst_drm_buffer_pool_initialize (GstDRMBufferPool * self,
187 +    GstElement * element, int fd, GstCaps * caps, guint size)
188  {
189 -  GstDRMBufferPool *self = (GstDRMBufferPool *)
190 -      gst_mini_object_new (GST_TYPE_DRM_BUFFER_POOL);
191 -
192    self->element = gst_object_ref (element);
193    self->fd   = fd;
194    self->dev  = omap_device_new (fd);
195 @@ -57,6 +58,16 @@ gst_drm_buffer_pool_new (GstElement * element,
196    self->tail = NULL;
197    self->lock = g_mutex_new ();
198    self->running = TRUE;
199 +}
200 +
201 +GstDRMBufferPool *
202 +gst_drm_buffer_pool_new (GstElement * element,
203 +    int fd, GstCaps * caps, guint size)
204 +{
205 +  GstDRMBufferPool *self = (GstDRMBufferPool *)
206 +      gst_mini_object_new (GST_TYPE_DRM_BUFFER_POOL);
207 +
208 +  gst_drm_buffer_pool_initialize (self, element, fd, caps, size);
209  
210    return self;
211  }
212 @@ -80,6 +91,7 @@ gst_drm_buffer_pool_set_caps (GstDRMBufferPool * self, GstCaps * caps)
213  
214      gst_structure_get_int (s, "width", &self->width);
215      gst_structure_get_int (s, "height", &self->height);
216 +    gst_structure_get_fourcc (s, "format", &self->fourcc);
217    } else {
218      self->width = 0;
219      self->height = 0;
220 @@ -151,7 +163,7 @@ gst_drm_buffer_pool_get (GstDRMBufferPool * self, gboolean force_alloc)
221        if (self->head == NULL)
222          self->tail = NULL;
223      } else {
224 -      buf = gst_drm_buffer_new (self);
225 +      buf = GST_DRM_BUFFER_POOL_GET_CLASS (self)->buffer_alloc (self);
226      }
227      if (self->caps)
228        gst_buffer_set_caps (GST_BUFFER (buf), self->caps);
229 @@ -163,7 +175,7 @@ gst_drm_buffer_pool_get (GstDRMBufferPool * self, gboolean force_alloc)
230    return GST_BUFFER (buf);
231  }
232  
233 -gboolean
234 +static gboolean
235  gst_drm_buffer_pool_put (GstDRMBufferPool * self, GstDRMBuffer * buf)
236  {
237    gboolean reuse = FALSE;
238 @@ -209,7 +221,8 @@ static void
239  gst_drm_buffer_pool_class_init (GstDRMBufferPoolClass * klass)
240  {
241    GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (klass);
242 -
243 +  klass->buffer_alloc =
244 +      GST_DEBUG_FUNCPTR (gst_drm_buffer_new);
245    mini_object_class->finalize = (GstMiniObjectFinalizeFunction)
246        GST_DEBUG_FUNCPTR (gst_drm_buffer_pool_finalize);
247  }
248 @@ -223,13 +236,28 @@ gst_drm_buffer_pool_init (GstDRMBufferPool * self)
249   * GstDRMBuffer:
250   */
251  
252 +G_DEFINE_TYPE (GstDRMBuffer, gst_drm_buffer, GST_TYPE_BUFFER);
253  
254 -typedef GstDRMBuffer GstDRMDRMBuffer;
255 -typedef GstDRMBufferClass GstDRMDRMBufferClass;
256 +void
257 +gst_drm_buffer_initialize (GstDRMBuffer * self,
258 +    GstDRMBufferPool * pool, struct omap_bo * bo)
259 +{
260 +  self->bo = bo;
261  
262 -G_DEFINE_TYPE (GstDRMDRMBuffer, gst_drm_buffer, GST_TYPE_BUFFER);
263 +  GST_BUFFER_DATA (self) = omap_bo_map (self->bo);
264 +  GST_BUFFER_SIZE (self) = pool->size;
265 +
266 +  /* attach dmabuf handle to buffer so that elements from other
267 +   * plugins can access for zero copy hw accel:
268 +   */
269 +  // XXX buffer doesn't take ownership of the GstDmaBuf...
270 +  gst_buffer_set_dma_buf (GST_BUFFER (self),
271 +      gst_dma_buf_new (omap_bo_dmabuf (self->bo)));
272 +
273 +  gst_drm_buffer_set_pool (self, pool);
274 +}
275  
276 -GstDRMBuffer *
277 +static GstDRMBuffer *
278  gst_drm_buffer_new (GstDRMBufferPool * pool)
279  {
280    GstDRMBuffer *self = (GstDRMBuffer *)
281 @@ -240,23 +268,14 @@ gst_drm_buffer_new (GstDRMBufferPool * pool)
282     * otherwise we might want some support for various different
283     * drm drivers here:
284     */
285 -  self->bo = omap_bo_new (pool->dev, pool->size, OMAP_BO_WC);
286 -
287 -  GST_BUFFER_DATA (self) = omap_bo_map (self->bo);
288 -  GST_BUFFER_SIZE (self) = pool->size;
289 -
290 -  /* attach dmabuf handle to buffer so that elements from other
291 -   * plugins can access for zero copy hw accel:
292 -   */
293 -  gst_buffer_set_dma_buf (GST_BUFFER (self),
294 -      gst_dma_buf_new (omap_bo_dmabuf (self->bo)));
295 +  struct omap_bo *bo = omap_bo_new (pool->dev, pool->size, OMAP_BO_WC);
296  
297 -  gst_drm_buffer_set_pool (self, pool);
298 +  gst_drm_buffer_initialize (self, pool, bo);
299  
300    return self;
301  }
302  
303 -void
304 +static void
305  gst_drm_buffer_set_pool (GstDRMBuffer * self, GstDRMBufferPool * pool)
306  {
307  
308 @@ -282,6 +301,11 @@ gst_drm_buffer_finalize (GstDRMBuffer * self)
309    if (resuscitated)
310      return;
311  
312 +  if (GST_DRM_BUFFER_POOL_GET_CLASS (self->pool)->buffer_cleanup) {
313 +    GST_DRM_BUFFER_POOL_GET_CLASS (self->pool)->buffer_cleanup (
314 +        self->pool, self);
315 +  }
316 +
317    GST_BUFFER_DATA (self) = NULL;
318    omap_bo_del (self->bo);
319  
320 diff --git a/gst-libs/gst/drm/gstdrmbufferpool.h b/gst-libs/gst/drm/gstdrmbufferpool.h
321 index b7d09ed..4d4707c 100644
322 --- a/gst-libs/gst/drm/gstdrmbufferpool.h
323 +++ b/gst-libs/gst/drm/gstdrmbufferpool.h
324 @@ -30,9 +30,23 @@
325  
326  G_BEGIN_DECLS
327  
328 +/* TODO replace dependency on libdrm_omap w/ libdrm.. the only thing
329 + * missing is way to allocate buffers, but this should probably be
330 + * done via libdrm?
331 + *
332 + * NOTE: this dependency is only for those who want to subclass us,
333 + * so we could perhaps move the struct definitions into a separate
334 + * header or split out private ptr and move that into the .c file..
335 + */
336 +#include <stdint.h>
337 +#include <omap_drm.h>
338 +#include <omap_drmif.h>
339 +
340  #define GST_TYPE_DRM_BUFFER_POOL (gst_drm_buffer_pool_get_type())
341  #define GST_IS_DRM_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DRM_BUFFER_POOL))
342  #define GST_DRM_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DRM_BUFFER_POOL, GstDRMBufferPool))
343 +#define GST_DRM_BUFFER_POOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DRM_BUFFER_POOL, GstDRMBufferPoolClass))
344 +#define GST_DRM_BUFFER_POOL_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DRM_BUFFER_POOL, GstDRMBufferPoolClass))
345  
346  #define GST_DRM_BUFFER_POOL_LOCK(self)     g_mutex_lock ((self)->lock)
347  #define GST_DRM_BUFFER_POOL_UNLOCK(self)   g_mutex_unlock ((self)->lock)
348 @@ -40,7 +54,61 @@ G_BEGIN_DECLS
349  typedef struct _GstDRMBufferPool GstDRMBufferPool;
350  typedef struct _GstDRMBufferPoolClass GstDRMBufferPoolClass;
351  
352 +#define GST_TYPE_DRM_BUFFER (gst_drm_buffer_get_type())
353 +#define GST_IS_DRM_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DRM_BUFFER))
354 +#define GST_DRM_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DRM_BUFFER, GstDRMBuffer))
355 +
356 +typedef struct _GstDRMBuffer GstDRMBuffer;
357 +typedef struct _GstDRMBufferClass GstDRMBufferClass;
358 +
359 +/*
360 + * GstDRMBufferPool:
361 + */
362 +
363 +struct _GstDRMBufferPool {
364 +  GstMiniObject parent;
365 +
366 +  int fd;
367 +  struct omap_device *dev;
368 +
369 +  /* output (padded) size including any codec padding: */
370 +  gint width, height;
371 +  guint32 fourcc;
372 +
373 +  gboolean         strided;  /* 2d buffers? */
374 +  GstCaps         *caps;
375 +  GMutex          *lock;
376 +  gboolean         running;  /* with lock */
377 +  GstElement      *element;  /* the element that owns us.. */
378 +  GstDRMBuffer    *head; /* list of available buffers */
379 +  GstDRMBuffer    *tail;
380 +  guint size;
381 +
382 +  /* TODO add reserved */
383 +};
384 +
385 +struct _GstDRMBufferPoolClass {
386 +  GstMiniObjectClass klass;
387 +
388 +  /* allow the subclass to allocate it's own buffers that extend
389 +   * GstDRMBuffer:
390 +   */
391 +  GstDRMBuffer * (*buffer_alloc)(GstDRMBufferPool * pool);
392 +
393 +  /* The a buffer subclass should not override finalize, as that
394 +   * would interfere with reviving the buffer and returning to the
395 +   * pool.  Instead you can implement this vmethod to cleanup a
396 +   * buffer.
397 +   */
398 +  void (*buffer_cleanup)(GstDRMBufferPool * pool, GstDRMBuffer *buf);
399 +
400 +  /* TODO add reserved */
401 +};
402 +
403  GType gst_drm_buffer_pool_get_type (void);
404 +
405 +void gst_drm_buffer_pool_initialize (GstDRMBufferPool * self,
406 +    GstElement * element, int fd, GstCaps * caps, guint size);
407  GstDRMBufferPool * gst_drm_buffer_pool_new (GstElement * element,
408      int fd, GstCaps * caps, guint size);
409  void gst_drm_buffer_pool_destroy (GstDRMBufferPool * self);
410 @@ -51,6 +119,33 @@ gboolean gst_drm_buffer_pool_check_caps (GstDRMBufferPool * self,
411  GstBuffer * gst_drm_buffer_pool_get (GstDRMBufferPool * self,
412      gboolean force_alloc);
413  
414 +
415 +/*
416 + * GstDRMBuffer:
417 + */
418 +
419 +struct _GstDRMBuffer {
420 +  GstBuffer parent;
421 +
422 +  struct omap_bo *bo;
423 +
424 +  GstDRMBufferPool *pool;    /* buffer-pool that this buffer belongs to */
425 +  GstDRMBuffer *next;        /* next in freelist, if not in use */
426 +  gboolean remove_from_pool;
427 +
428 +  /* TODO add reserved */
429 +};
430 +
431 +struct _GstDRMBufferClass {
432 +  GstBufferClass klass;
433 +  /* TODO add reserved */
434 +};
435 +
436 +GType gst_drm_buffer_get_type (void);
437 +
438 +void gst_drm_buffer_initialize (GstDRMBuffer * self,
439 +    GstDRMBufferPool * pool, struct omap_bo * bo);
440 +
441  G_END_DECLS
442  
443  #endif /* __GSTDRMBUFFERPOOL_H__ */
444 -- 
445 1.7.9.5
446