[gst-cvs] gst-plugins-bad: vdpau: don't put the GstVdpDevice in the caps
Jan Schmidt
thaytan at kemper.freedesktop.org
Wed Sep 16 17:39:09 PDT 2009
Module: gst-plugins-bad
Branch: master
Commit: 58c8198f4d04b22979b62204a9e487e8eb3f7fe1
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=58c8198f4d04b22979b62204a9e487e8eb3f7fe1
Author: Carl-Anton Ingmarsson <ca.ingmarsson at gmail.com>
Date: Wed Jun 24 11:36:28 2009 +0200
vdpau: don't put the GstVdpDevice in the caps
---
sys/vdpau/gstvdpmpegdec.c | 56 +++++++++++++++++++++++++++----------------
sys/vdpau/gstvdputils.c | 11 +--------
sys/vdpau/gstvdputils.h | 4 +-
sys/vdpau/gstvdpvideoyuv.c | 3 +-
sys/vdpau/gstvdpyuvvideo.c | 31 ++++++++++++++++++++++-
sys/vdpau/gstvdpyuvvideo.h | 2 +
6 files changed, 71 insertions(+), 36 deletions(-)
diff --git a/sys/vdpau/gstvdpmpegdec.c b/sys/vdpau/gstvdpmpegdec.c
index 3789b82..9ea5688 100644
--- a/sys/vdpau/gstvdpmpegdec.c
+++ b/sys/vdpau/gstvdpmpegdec.c
@@ -41,6 +41,7 @@
#include <string.h>
#include "mpegutil.h"
+#include "gstvdputils.h"
#include "gstvdpmpegdec.h"
GST_DEBUG_CATEGORY_STATIC (gst_vdp_mpeg_dec_debug);
@@ -55,8 +56,7 @@ enum
enum
{
- PROP_0,
- PROP_DISPLAY
+ PROP_0
};
/* the capabilities of the inputs and outputs.
@@ -315,6 +315,38 @@ gst_vdp_mpeg_dec_push_video_buffer (GstVdpMpegDec * mpeg_dec,
}
static GstFlowReturn
+gst_vdp_mpeg_dec_alloc_buffer (GstVdpMpegDec * mpeg_dec, GstBuffer ** outbuf)
+{
+ GstFlowReturn ret;
+
+ ret = gst_pad_alloc_buffer_and_set_caps (mpeg_dec->src, 0, 0,
+ GST_PAD_CAPS (mpeg_dec->src), outbuf);
+ if (ret != GST_FLOW_OK)
+ return ret;
+
+ if (!mpeg_dec->device) {
+ GstVdpDevice *device;
+ VdpStatus status;
+
+ GST_WARNING ("ASDASD");
+ device = mpeg_dec->device =
+ g_object_ref (GST_VDP_VIDEO_BUFFER (*outbuf)->device);
+
+ status = device->vdp_decoder_create (device->device, mpeg_dec->profile,
+ mpeg_dec->width, mpeg_dec->height, 2, &mpeg_dec->decoder);
+ if (status != VDP_STATUS_OK) {
+ GST_ELEMENT_ERROR (mpeg_dec, RESOURCE, READ,
+ ("Could not create vdpau decoder"),
+ ("Error returned from vdpau was: %s",
+ device->vdp_get_error_string (status)));
+ ret = GST_FLOW_ERROR;
+ }
+ }
+
+ return ret;
+}
+
+static GstFlowReturn
gst_vdp_mpeg_dec_decode (GstVdpMpegDec * mpeg_dec,
GstClockTime timestamp, gint64 size)
{
@@ -346,26 +378,12 @@ gst_vdp_mpeg_dec_decode (GstVdpMpegDec * mpeg_dec,
info->backward_reference = VDP_INVALID_HANDLE;
}
- if (gst_pad_alloc_buffer_and_set_caps (mpeg_dec->src, 0, 0,
- GST_PAD_CAPS (mpeg_dec->src), &outbuf) != GST_FLOW_OK) {
+ if (gst_vdp_mpeg_dec_alloc_buffer (mpeg_dec, &outbuf) != GST_FLOW_OK) {
gst_adapter_clear (mpeg_dec->adapter);
return GST_FLOW_ERROR;
}
device = GST_VDP_VIDEO_BUFFER (outbuf)->device;
- if (mpeg_dec->decoder == VDP_INVALID_HANDLE) {
- status = device->vdp_decoder_create (device->device, mpeg_dec->profile,
- mpeg_dec->width, mpeg_dec->height, 2, &mpeg_dec->decoder);
- if (status != VDP_STATUS_OK) {
- GST_ELEMENT_ERROR (mpeg_dec, RESOURCE, READ,
- ("Could not create vdpau decoder"),
- ("Error returned from vdpau was: %s",
- device->vdp_get_error_string (status)));
- gst_buffer_unref (outbuf);
- return GST_FLOW_ERROR;
- }
- mpeg_dec->device = g_object_ref (device);
- }
if (info->forward_reference != VDP_INVALID_HANDLE &&
info->picture_coding_type != I_FRAME)
@@ -1036,10 +1054,6 @@ gst_vdp_mpeg_dec_class_init (GstVdpMpegDecClass * klass)
gobject_class->finalize = gst_vdp_mpeg_dec_finalize;
- g_object_class_install_property (gobject_class, PROP_DISPLAY,
- g_param_spec_string ("display", "Display", "X Display name",
- NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
gstelement_class->change_state = gst_vdp_mpeg_dec_change_state;
}
diff --git a/sys/vdpau/gstvdputils.c b/sys/vdpau/gstvdputils.c
index fc8d46e..973990d 100644
--- a/sys/vdpau/gstvdputils.c
+++ b/sys/vdpau/gstvdputils.c
@@ -81,13 +81,11 @@ error:
}
GstCaps *
-gst_vdp_video_to_yuv_caps (GstCaps * caps)
+gst_vdp_video_to_yuv_caps (GstCaps * caps, GstVdpDevice * device)
{
GstCaps *new_caps, *allowed_caps, *result;
gint i;
GstStructure *structure;
- const GValue *value;
- GstVdpDevice *device = NULL;
new_caps = gst_caps_new_empty ();
@@ -115,7 +113,6 @@ gst_vdp_video_to_yuv_caps (GstCaps * caps)
gst_structure_set_name (new_struct, "video/x-raw-yuv");
gst_structure_remove_field (new_struct, "chroma-type");
- gst_structure_remove_field (new_struct, "device");
gst_structure_set (new_struct, "format", GST_TYPE_FOURCC,
GPOINTER_TO_INT (iter->data), NULL);
@@ -126,10 +123,6 @@ gst_vdp_video_to_yuv_caps (GstCaps * caps)
}
structure = gst_caps_get_structure (caps, 0);
- value = gst_structure_get_value (structure, "device");
- if (value)
- device = g_value_get_object (value);
-
if (device) {
allowed_caps = gst_vdp_get_allowed_yuv_caps (device);
result = gst_caps_intersect (new_caps, allowed_caps);
@@ -211,8 +204,6 @@ gst_vdp_yuv_to_video_caps (GstCaps * caps, GstVdpDevice * device)
NULL);
gst_structure_set_name (structure, "video/x-vdpau-video");
- if (device)
- gst_structure_set (structure, "device", G_TYPE_OBJECT, device, NULL);
}
if (device) {
diff --git a/sys/vdpau/gstvdputils.h b/sys/vdpau/gstvdputils.h
index 3713db3..825477c 100644
--- a/sys/vdpau/gstvdputils.h
+++ b/sys/vdpau/gstvdputils.h
@@ -76,7 +76,7 @@ static const VdpauFormats formats[N_FORMATS] = {
},
};
-GstCaps *gst_vdp_video_to_yuv_caps (GstCaps *caps);
-GstCaps *gst_vdp_yuv_to_video_caps (GstCaps *caps, GstVdpDevice *device);
+GstCaps *gst_vdp_video_to_yuv_caps (GstCaps *caps, GstVdpDevice *device);
+GstCaps *gst_vdp_yuv_to_video_caps (GstCaps *caps, GstVdpDevice *device);
#endif /* _GST_VDP_UTILS_H_ */
\ No newline at end of file
diff --git a/sys/vdpau/gstvdpvideoyuv.c b/sys/vdpau/gstvdpvideoyuv.c
index a272f72..165f4fe 100644
--- a/sys/vdpau/gstvdpvideoyuv.c
+++ b/sys/vdpau/gstvdpvideoyuv.c
@@ -325,7 +325,7 @@ gst_vdp_video_yuv_transform_caps (GstBaseTransform * trans,
GstCaps *result;
if (direction == GST_PAD_SINK)
- result = gst_vdp_video_to_yuv_caps (caps);
+ result = gst_vdp_video_to_yuv_caps (caps, video_yuv->device);
else if (direction == GST_PAD_SRC)
result = gst_vdp_yuv_to_video_caps (caps, video_yuv->device);
@@ -461,6 +461,7 @@ static void
gst_vdp_video_yuv_class_init (GstVdpVideoYUVClass * klass)
{
GObjectClass *gobject_class;
+ GstElementClass *element_class;
GstBaseTransformClass *trans_class;
gobject_class = (GObjectClass *) klass;
diff --git a/sys/vdpau/gstvdpyuvvideo.c b/sys/vdpau/gstvdpyuvvideo.c
index b82e31c..be350c7 100644
--- a/sys/vdpau/gstvdpyuvvideo.c
+++ b/sys/vdpau/gstvdpyuvvideo.c
@@ -83,6 +83,9 @@ gst_vdp_yuv_video_transform (GstBaseTransform * trans, GstBuffer * inbuf,
VdpVideoSurface surface;
device = GST_VDP_VIDEO_BUFFER (outbuf)->device;
+ if (!yuv_video->device)
+ yuv_video->device = g_object_ref (device);
+
surface = GST_VDP_VIDEO_BUFFER (outbuf)->surface;
switch (yuv_video->format) {
@@ -258,12 +261,13 @@ static GstCaps *
gst_vdp_yuv_video_transform_caps (GstBaseTransform * trans,
GstPadDirection direction, GstCaps * caps)
{
+ GstVdpYUVVideo *yuv_video = GST_VDP_YUV_VIDEO (trans);
GstCaps *result;
if (direction == GST_PAD_SINK) {
- result = gst_vdp_yuv_to_video_caps (caps, NULL);
+ result = gst_vdp_yuv_to_video_caps (caps, yuv_video->device);
} else if (direction == GST_PAD_SRC) {
- result = gst_vdp_video_to_yuv_caps (caps);
+ result = gst_vdp_video_to_yuv_caps (caps, yuv_video->device);
}
GST_LOG ("transformed %" GST_PTR_FORMAT " to %" GST_PTR_FORMAT, caps, result);
@@ -271,6 +275,27 @@ gst_vdp_yuv_video_transform_caps (GstBaseTransform * trans,
return result;
}
+static gboolean
+gst_vdp_yuv_video_start (GstBaseTransform * trans)
+{
+ GstVdpYUVVideo *yuv_video = GST_VDP_YUV_VIDEO (trans);
+
+ yuv_video->device = NULL;
+
+ return TRUE;
+}
+
+static gboolean
+gst_vdp_yuv_video_stop (GstBaseTransform * trans)
+{
+ GstVdpYUVVideo *yuv_video = GST_VDP_YUV_VIDEO (trans);
+
+ if (yuv_video->device)
+ g_object_unref (yuv_video->device);
+
+ return TRUE;
+}
+
/* GObject vmethod implementations */
static void
@@ -299,6 +324,8 @@ gst_vdp_yuv_video_class_init (GstVdpYUVVideoClass * klass)
gobject_class = (GObjectClass *) klass;
trans_class = (GstBaseTransformClass *) klass;
+ trans_class->start = gst_vdp_yuv_video_start;
+ trans_class->stop = gst_vdp_yuv_video_stop;
trans_class->transform_caps = gst_vdp_yuv_video_transform_caps;
trans_class->transform_size = gst_vdp_yuv_video_transform_size;
trans_class->set_caps = gst_vdp_yuv_video_set_caps;
diff --git a/sys/vdpau/gstvdpyuvvideo.h b/sys/vdpau/gstvdpyuvvideo.h
index 57fa4bb..e1fd31f 100644
--- a/sys/vdpau/gstvdpyuvvideo.h
+++ b/sys/vdpau/gstvdpyuvvideo.h
@@ -41,6 +41,8 @@ typedef struct _GstVdpYUVVideoClass GstVdpYUVVideoClass;
struct _GstVdpYUVVideo {
GstBaseTransform trans;
+ GstVdpDevice *device;
+
guint32 format;
gint width, height;
};
More information about the Gstreamer-commits
mailing list