mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 03:56:16 +00:00
gstvdpvideosrcpad: add "template-caps" property
The property limits the available output caps
This commit is contained in:
parent
65bc7c87b2
commit
a71cf4dfb2
3 changed files with 57 additions and 24 deletions
|
@ -1085,7 +1085,7 @@ gst_vdp_mpeg_dec_base_init (gpointer gclass)
|
||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
gst_static_pad_template_get (&sink_template));
|
gst_static_pad_template_get (&sink_template));
|
||||||
|
|
||||||
src_caps = gst_vdp_video_src_pad_get_template_caps ();
|
src_caps = gst_vdp_video_buffer_get_caps (TRUE, VDP_CHROMA_TYPE_420);
|
||||||
src_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
|
src_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
|
||||||
src_caps);
|
src_caps);
|
||||||
|
|
||||||
|
@ -1133,7 +1133,15 @@ gst_vdp_mpeg_dec_init_info (VdpPictureInfoMPEG1Or2 * vdp_info)
|
||||||
static void
|
static void
|
||||||
gst_vdp_mpeg_dec_init (GstVdpMpegDec * mpeg_dec, GstVdpMpegDecClass * gclass)
|
gst_vdp_mpeg_dec_init (GstVdpMpegDec * mpeg_dec, GstVdpMpegDecClass * gclass)
|
||||||
{
|
{
|
||||||
mpeg_dec->src = GST_PAD (gst_vdp_video_src_pad_new ());
|
GstPadTemplate *src_template;
|
||||||
|
|
||||||
|
/* SRC PAD */
|
||||||
|
src_template =
|
||||||
|
gst_element_class_get_pad_template (GST_ELEMENT_CLASS (gclass), "src");
|
||||||
|
mpeg_dec->src =
|
||||||
|
GST_PAD (gst_vdp_video_src_pad_new (gst_pad_template_get_caps
|
||||||
|
(src_template)));
|
||||||
|
|
||||||
gst_pad_set_event_function (mpeg_dec->src,
|
gst_pad_set_event_function (mpeg_dec->src,
|
||||||
GST_DEBUG_FUNCPTR (gst_vdp_mpeg_dec_src_event));
|
GST_DEBUG_FUNCPTR (gst_vdp_mpeg_dec_src_event));
|
||||||
gst_pad_set_query_function (mpeg_dec->src,
|
gst_pad_set_query_function (mpeg_dec->src,
|
||||||
|
|
|
@ -28,7 +28,8 @@ GST_DEBUG_CATEGORY_STATIC (gst_vdp_video_src_pad_debug);
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_DISPLAY
|
PROP_DISPLAY,
|
||||||
|
PROP_TEMPL_CAPS
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEBUG_INIT(bla) \
|
#define DEBUG_INIT(bla) \
|
||||||
|
@ -73,8 +74,10 @@ gst_vdp_video_src_pad_push (GstVdpVideoSrcPad * vdp_pad,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gst_caps_is_equal_fixed (caps, GST_BUFFER_CAPS (out_buf))) {
|
if (!gst_caps_is_equal_fixed (caps, GST_BUFFER_CAPS (out_buf))) {
|
||||||
GST_ERROR_OBJECT (vdp_pad, "Couldn't calculate buffer size for caps");
|
GST_ERROR_OBJECT (vdp_pad,
|
||||||
|
"Sink element allocated buffer with different caps");
|
||||||
gst_buffer_unref (GST_BUFFER_CAST (video_buf));
|
gst_buffer_unref (GST_BUFFER_CAST (video_buf));
|
||||||
|
gst_buffer_unref (out_buf);
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,7 +86,8 @@ gst_vdp_video_src_pad_push (GstVdpVideoSrcPad * vdp_pad,
|
||||||
GST_ERROR_OBJECT (vdp_pad,
|
GST_ERROR_OBJECT (vdp_pad,
|
||||||
"Couldn't convert from GstVdpVideoBuffer to the requested format");
|
"Couldn't convert from GstVdpVideoBuffer to the requested format");
|
||||||
gst_buffer_unref (GST_BUFFER_CAST (video_buf));
|
gst_buffer_unref (GST_BUFFER_CAST (video_buf));
|
||||||
gst_buffer_unref (GST_BUFFER_CAST (out_buf));
|
gst_buffer_unref (out_buf);
|
||||||
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_buffer_copy_metadata (out_buf, (const GstBuffer *) video_buf,
|
gst_buffer_copy_metadata (out_buf, (const GstBuffer *) video_buf,
|
||||||
|
@ -100,17 +104,21 @@ gst_vdp_video_src_pad_push (GstVdpVideoSrcPad * vdp_pad,
|
||||||
static void
|
static void
|
||||||
gst_vdp_video_src_pad_update_caps (GstVdpVideoSrcPad * vdp_pad)
|
gst_vdp_video_src_pad_update_caps (GstVdpVideoSrcPad * vdp_pad)
|
||||||
{
|
{
|
||||||
GstCaps *yuv_caps, *video_caps, *caps;
|
GstCaps *yuv_caps, *video_caps;
|
||||||
|
|
||||||
video_caps = gst_vdp_video_buffer_get_allowed_video_caps (vdp_pad->device);
|
video_caps = gst_vdp_video_buffer_get_allowed_video_caps (vdp_pad->device);
|
||||||
yuv_caps = gst_vdp_video_buffer_get_allowed_yuv_caps (vdp_pad->device);
|
yuv_caps = gst_vdp_video_buffer_get_allowed_yuv_caps (vdp_pad->device);
|
||||||
gst_caps_append (video_caps, yuv_caps);
|
gst_caps_append (video_caps, yuv_caps);
|
||||||
caps = gst_caps_intersect (video_caps, vdp_pad->caps);
|
|
||||||
|
|
||||||
gst_caps_unref (video_caps);
|
|
||||||
|
|
||||||
gst_caps_unref (vdp_pad->caps);
|
if (vdp_pad->caps)
|
||||||
vdp_pad->caps = caps;
|
gst_caps_unref (vdp_pad->caps);
|
||||||
|
|
||||||
|
if (vdp_pad->templ_caps) {
|
||||||
|
vdp_pad->caps = gst_caps_intersect (video_caps, vdp_pad->templ_caps);
|
||||||
|
gst_caps_unref (video_caps);
|
||||||
|
} else
|
||||||
|
vdp_pad->caps = video_caps;
|
||||||
}
|
}
|
||||||
|
|
||||||
GstFlowReturn
|
GstFlowReturn
|
||||||
|
@ -219,18 +227,17 @@ gst_vdp_video_src_pad_get_device (GstVdpVideoSrcPad * vdp_pad)
|
||||||
return vdp_pad->device;
|
return vdp_pad->device;
|
||||||
}
|
}
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_vdp_video_src_pad_get_template_caps ()
|
|
||||||
{
|
|
||||||
return gst_vdp_video_buffer_get_caps (TRUE, VDP_CHROMA_TYPE_420);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_vdp_video_src_pad_getcaps (GstPad * pad)
|
gst_vdp_video_src_pad_getcaps (GstPad * pad)
|
||||||
{
|
{
|
||||||
GstVdpVideoSrcPad *vdp_pad = (GstVdpVideoSrcPad *) pad;
|
GstVdpVideoSrcPad *vdp_pad = (GstVdpVideoSrcPad *) pad;
|
||||||
|
|
||||||
return gst_caps_ref (vdp_pad->caps);
|
if (vdp_pad->caps)
|
||||||
|
return gst_caps_ref (vdp_pad->caps);
|
||||||
|
else if (vdp_pad->templ_caps)
|
||||||
|
return gst_caps_ref (vdp_pad->templ_caps);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -243,18 +250,19 @@ gst_vdp_video_src_pad_activate_push (GstPad * pad, gboolean active)
|
||||||
g_object_unref (vdp_pad->device);
|
g_object_unref (vdp_pad->device);
|
||||||
vdp_pad->device = NULL;
|
vdp_pad->device = NULL;
|
||||||
|
|
||||||
gst_caps_unref (vdp_pad->caps);
|
if (vdp_pad->caps)
|
||||||
vdp_pad->caps = gst_vdp_video_buffer_get_caps (TRUE, VDP_CHROMA_TYPE_420);
|
gst_caps_unref (vdp_pad->caps);
|
||||||
|
vdp_pad->caps = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
GstVdpVideoSrcPad *
|
GstVdpVideoSrcPad *
|
||||||
gst_vdp_video_src_pad_new ()
|
gst_vdp_video_src_pad_new (GstCaps * templ_caps)
|
||||||
{
|
{
|
||||||
return g_object_new (GST_TYPE_VDP_VIDEO_SRC_PAD, "direction", GST_PAD_SRC,
|
return g_object_new (GST_TYPE_VDP_VIDEO_SRC_PAD, "direction", GST_PAD_SRC,
|
||||||
NULL);
|
"template-caps", templ_caps, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -267,6 +275,9 @@ gst_vdp_video_src_pad_get_property (GObject * object, guint prop_id,
|
||||||
case PROP_DISPLAY:
|
case PROP_DISPLAY:
|
||||||
g_value_set_string (value, vdp_pad->display);
|
g_value_set_string (value, vdp_pad->display);
|
||||||
break;
|
break;
|
||||||
|
case PROP_TEMPL_CAPS:
|
||||||
|
gst_value_set_caps (value, vdp_pad->templ_caps);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -283,6 +294,11 @@ gst_vdp_video_src_pad_set_property (GObject * object, guint prop_id,
|
||||||
case PROP_DISPLAY:
|
case PROP_DISPLAY:
|
||||||
vdp_pad->display = g_value_dup_string (value);
|
vdp_pad->display = g_value_dup_string (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_TEMPL_CAPS:
|
||||||
|
if (vdp_pad->templ_caps)
|
||||||
|
gst_caps_unref (vdp_pad->templ_caps);
|
||||||
|
vdp_pad->templ_caps = gst_caps_copy (gst_value_get_caps (value));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -295,6 +311,8 @@ gst_vdp_video_src_pad_finalize (GObject * object)
|
||||||
GstVdpVideoSrcPad *vdp_pad = (GstVdpVideoSrcPad *) object;
|
GstVdpVideoSrcPad *vdp_pad = (GstVdpVideoSrcPad *) object;
|
||||||
|
|
||||||
g_free (vdp_pad->display);
|
g_free (vdp_pad->display);
|
||||||
|
if (vdp_pad->templ_caps)
|
||||||
|
gst_caps_unref (vdp_pad->templ_caps);
|
||||||
|
|
||||||
G_OBJECT_CLASS (gst_vdp_video_src_pad_parent_class)->finalize (object);
|
G_OBJECT_CLASS (gst_vdp_video_src_pad_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
@ -305,9 +323,10 @@ gst_vdp_video_src_pad_init (GstVdpVideoSrcPad * vdp_pad)
|
||||||
GstPad *pad = GST_PAD (vdp_pad);
|
GstPad *pad = GST_PAD (vdp_pad);
|
||||||
|
|
||||||
vdp_pad->device = NULL;
|
vdp_pad->device = NULL;
|
||||||
vdp_pad->display = NULL;
|
vdp_pad->caps = NULL;
|
||||||
|
|
||||||
vdp_pad->caps = gst_vdp_video_buffer_get_caps (TRUE, VDP_CHROMA_TYPE_420);
|
vdp_pad->display = NULL;
|
||||||
|
vdp_pad->templ_caps = NULL;
|
||||||
|
|
||||||
gst_pad_set_getcaps_function (pad,
|
gst_pad_set_getcaps_function (pad,
|
||||||
GST_DEBUG_FUNCPTR (gst_vdp_video_src_pad_getcaps));
|
GST_DEBUG_FUNCPTR (gst_vdp_video_src_pad_getcaps));
|
||||||
|
@ -328,4 +347,9 @@ gst_vdp_video_src_pad_class_init (GstVdpVideoSrcPadClass * klass)
|
||||||
g_param_spec_string ("display", "Display", "X Display name",
|
g_param_spec_string ("display", "Display", "X Display name",
|
||||||
NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
|
NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
|
||||||
|
|
||||||
|
g_object_class_install_property (object_class, PROP_TEMPL_CAPS,
|
||||||
|
g_param_spec_boxed ("template-caps", "Template caps",
|
||||||
|
"Template caps", GST_TYPE_CAPS,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,7 @@ struct _GstVdpVideoSrcPad
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
gchar *display;
|
gchar *display;
|
||||||
|
GstCaps *templ_caps;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstVdpVideoSrcPadClass
|
struct _GstVdpVideoSrcPadClass
|
||||||
|
@ -67,7 +68,7 @@ gboolean gst_vdp_video_src_pad_set_caps (GstVdpVideoSrcPad *vdp_pad, GstCaps *ca
|
||||||
|
|
||||||
GstCaps *gst_vdp_video_src_pad_get_template_caps ();
|
GstCaps *gst_vdp_video_src_pad_get_template_caps ();
|
||||||
|
|
||||||
GstVdpVideoSrcPad *gst_vdp_video_src_pad_new ();
|
GstVdpVideoSrcPad *gst_vdp_video_src_pad_new (GstCaps *templ_caps);
|
||||||
GType gst_vdp_video_src_pad_get_type (void) G_GNUC_CONST;
|
GType gst_vdp_video_src_pad_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
Loading…
Reference in a new issue