summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>2010-07-30 14:07:22 +0200
committerCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>2010-07-30 14:07:22 +0200
commit726290de21c99e75c6c8b826820371068c99d08c (patch)
treedbc109d44335eb32bd08bfcca7a7957c9c0a2ba8
parentac8dfbea826251094a9be6bda699afd0a3a227b9 (diff)
vdpau: GstVdpOutputSrcPad use gst_pad_alloc when outputting video/x-raw-rgb
we implement "acceptcaps" to prevent us from getting a buffer with different width and height from what we requested.
-rw-r--r--sys/vdpau/gstvdp/gstvdpoutputsrcpad.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/sys/vdpau/gstvdp/gstvdpoutputsrcpad.c b/sys/vdpau/gstvdp/gstvdpoutputsrcpad.c
index 078f325e6..7fc9094fa 100644
--- a/sys/vdpau/gstvdp/gstvdpoutputsrcpad.c
+++ b/sys/vdpau/gstvdp/gstvdpoutputsrcpad.c
@@ -53,6 +53,7 @@ struct _GstVdpOutputSrcPad
53 gint width, height; 53 gint width, height;
54 54
55 GstVdpBufferPool *bpool; 55 GstVdpBufferPool *bpool;
56 gboolean lock_caps;
56 57
57 /* properties */ 58 /* properties */
58 GstVdpDevice *device; 59 GstVdpDevice *device;
@@ -87,14 +88,20 @@ gst_vdp_output_src_pad_push (GstVdpOutputSrcPad * vdp_pad,
87 switch (vdp_pad->output_format) { 88 switch (vdp_pad->output_format) {
88 case GST_VDP_OUTPUT_SRC_PAD_FORMAT_RGB: 89 case GST_VDP_OUTPUT_SRC_PAD_FORMAT_RGB:
89 { 90 {
91 GstFlowReturn ret;
90 guint size; 92 guint size;
91 93
92 gst_vdp_output_buffer_calculate_size (output_buf, &size); 94 gst_vdp_output_buffer_calculate_size (output_buf, &size);
93 95
94 /* FIXME: we don't do pad_alloc here since we really want a buffer of 96 vdp_pad->lock_caps = TRUE;
95 * the specified size */ 97 ret = gst_pad_alloc_buffer (pad, 0, size, GST_PAD_CAPS (vdp_pad),
96 outbuf = gst_buffer_new_and_alloc (size); 98 &outbuf);
97 gst_buffer_set_caps (outbuf, GST_PAD_CAPS (vdp_pad)); 99 vdp_pad->lock_caps = FALSE;
100
101 if (ret != GST_FLOW_OK) {
102 gst_buffer_unref (GST_BUFFER_CAST (output_buf));
103 return ret;
104 }
98 105
99 if (!gst_vdp_output_buffer_download (output_buf, outbuf, error)) { 106 if (!gst_vdp_output_buffer_download (output_buf, outbuf, error)) {
100 gst_buffer_unref (GST_BUFFER_CAST (output_buf)); 107 gst_buffer_unref (GST_BUFFER_CAST (output_buf));
@@ -211,6 +218,17 @@ gst_vdp_output_src_pad_alloc_buffer (GstVdpOutputSrcPad * vdp_pad,
211} 218}
212 219
213static gboolean 220static gboolean
221gst_vdp_output_src_pad_acceptcaps (GstPad * pad, GstCaps * caps)
222{
223 GstVdpOutputSrcPad *vdp_pad = GST_VDP_OUTPUT_SRC_PAD (pad);
224
225 if (!vdp_pad->lock_caps)
226 return TRUE;
227
228 return gst_caps_is_equal_fixed (caps, GST_PAD_CAPS (pad));
229}
230
231static gboolean
214gst_vdp_output_src_pad_setcaps (GstPad * pad, GstCaps * caps) 232gst_vdp_output_src_pad_setcaps (GstPad * pad, GstCaps * caps)
215{ 233{
216 GstVdpOutputSrcPad *vdp_pad = GST_VDP_OUTPUT_SRC_PAD (pad); 234 GstVdpOutputSrcPad *vdp_pad = GST_VDP_OUTPUT_SRC_PAD (pad);
@@ -373,10 +391,15 @@ gst_vdp_output_src_pad_init (GstVdpOutputSrcPad * vdp_pad)
373 vdp_pad->bpool = NULL; 391 vdp_pad->bpool = NULL;
374 vdp_pad->device = NULL; 392 vdp_pad->device = NULL;
375 393
394 vdp_pad->lock_caps = FALSE;
395
376 gst_pad_set_getcaps_function (pad, 396 gst_pad_set_getcaps_function (pad,
377 GST_DEBUG_FUNCPTR (gst_vdp_output_src_pad_getcaps)); 397 GST_DEBUG_FUNCPTR (gst_vdp_output_src_pad_getcaps));
378 gst_pad_set_setcaps_function (pad, 398 gst_pad_set_setcaps_function (pad,
379 GST_DEBUG_FUNCPTR (gst_vdp_output_src_pad_setcaps)); 399 GST_DEBUG_FUNCPTR (gst_vdp_output_src_pad_setcaps));
400 gst_pad_set_acceptcaps_function (pad,
401 GST_DEBUG_FUNCPTR (gst_vdp_output_src_pad_acceptcaps));
402
380 gst_pad_set_activatepush_function (pad, 403 gst_pad_set_activatepush_function (pad,
381 GST_DEBUG_FUNCPTR (gst_vdp_output_src_pad_activate_push)); 404 GST_DEBUG_FUNCPTR (gst_vdp_output_src_pad_activate_push));
382} 405}