v4l2codecs: Remove uneeded per-codec abstract class

That subclass was not needed and was causing issues wit doc generation.
The only down side of removing it is that the decoder cast macro is no
longer type safe.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5555>
This commit is contained in:
Nicolas Dufresne 2025-01-30 23:05:58 -05:00 committed by GStreamer Marge Bot
parent 2197627336
commit 3645f050af
9 changed files with 100 additions and 182 deletions

View file

@ -232,8 +232,15 @@ gst_v4l2_codec_alpha_decode_bin_register (GstPlugin * plugin,
{ {
/* TODO check that we have compatible src format */ /* TODO check that we have compatible src format */
gst_v4l2_decoder_register (plugin, GTypeInfo type_info = {
GST_TYPE_V4L2_CODEC_ALPHA_DECODE_BIN, class_init, class_data, NULL, .class_size = sizeof (GstV4l2CodecAlphaDecodeBinClass),
element_name_tmpl, device, .class_init = class_init,
.class_data = class_data,
.instance_size = sizeof (GstV4l2CodecAlphaDecodeBin),
.instance_init = NULL,
};
gst_v4l2_decoder_register (plugin, GST_TYPE_V4L2_CODEC_ALPHA_DECODE_BIN,
&type_info, element_name_tmpl, device,
rank + GST_V4L2_CODEC_ALPHA_DECODE_BIN_RANK_OFFSET, NULL); rank + GST_V4L2_CODEC_ALPHA_DECODE_BIN_RANK_OFFSET, NULL);
} }

View file

@ -41,10 +41,7 @@
GST_DEBUG_CATEGORY_STATIC (v4l2_av1dec_debug); GST_DEBUG_CATEGORY_STATIC (v4l2_av1dec_debug);
#define GST_CAT_DEFAULT v4l2_av1dec_debug #define GST_CAT_DEFAULT v4l2_av1dec_debug
#define GST_TYPE_V4L2_CODEC_AV1_DEC \ #define GST_V4L2_CODEC_AV1_DEC(obj) ((GstV4l2CodecAV1Dec *) obj)
(gst_v4l2_codec_av1_dec_get_type())
#define GST_V4L2_CODEC_AV1_DEC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_CODEC_AV1_DEC,GstV4l2CodecAV1Dec))
/* Used to mark picture that have been outputted */ /* Used to mark picture that have been outputted */
#define FLAG_PICTURE_HOLDS_BUFFER GST_MINI_OBJECT_FLAG_LAST #define FLAG_PICTURE_HOLDS_BUFFER GST_MINI_OBJECT_FLAG_LAST
@ -117,12 +114,7 @@ struct _GstV4l2CodecAV1Dec
GstMapInfo bitstream_map; GstMapInfo bitstream_map;
}; };
static GType gst_v4l2_codec_av1_dec_get_type (void); static GstElementClass *parent_class = NULL;
G_DEFINE_ABSTRACT_TYPE (GstV4l2CodecAV1Dec, gst_v4l2_codec_av1_dec,
GST_TYPE_AV1_DECODER);
#define parent_class gst_v4l2_codec_av1_dec_parent_class
static GstFlowReturn static GstFlowReturn
gst_v4l2_codec_av1_dec_ensure_bitstream (GstV4l2CodecAV1Dec * self) gst_v4l2_codec_av1_dec_ensure_bitstream (GstV4l2CodecAV1Dec * self)
@ -1537,7 +1529,7 @@ gst_v4l2_codec_av1_dec_dispose (GObject * object)
} }
static void static void
gst_v4l2_codec_av1_dec_subclass_init (GstV4l2CodecAV1DecClass * klass, gst_v4l2_codec_av1_dec_class_init (GstV4l2CodecAV1DecClass * klass,
GstV4l2CodecDevice * device) GstV4l2CodecDevice * device)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
@ -1555,6 +1547,8 @@ gst_v4l2_codec_av1_dec_subclass_init (GstV4l2CodecAV1DecClass * klass,
"A V4L2 based AV1 video decoder", "A V4L2 based AV1 video decoder",
"Daniel Almeida <daniel.almeida@collabora.com>"); "Daniel Almeida <daniel.almeida@collabora.com>");
parent_class = g_type_class_peek_parent (klass);
gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_add_pad_template (element_class, gst_element_class_add_pad_template (element_class,
gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
@ -1596,7 +1590,7 @@ gst_v4l2_codec_av1_dec_subclass_init (GstV4l2CodecAV1DecClass * klass,
} }
static void static void
gst_v4l2_codec_av1_dec_subinit (GstV4l2CodecAV1Dec * self, gst_v4l2_codec_av1_dec_init (GstV4l2CodecAV1Dec * self,
GstV4l2CodecAV1DecClass * klass) GstV4l2CodecAV1DecClass * klass)
{ {
self->decoder = gst_v4l2_decoder_new (klass->device); self->decoder = gst_v4l2_decoder_new (klass->device);
@ -1605,20 +1599,17 @@ gst_v4l2_codec_av1_dec_subinit (GstV4l2CodecAV1Dec * self,
g_array_new (FALSE, TRUE, sizeof (struct v4l2_ctrl_av1_tile_group_entry)); g_array_new (FALSE, TRUE, sizeof (struct v4l2_ctrl_av1_tile_group_entry));
} }
static void
gst_v4l2_codec_av1_dec_class_init (GstV4l2CodecAV1DecClass * klass)
{
}
static void
gst_v4l2_codec_av1_dec_init (GstV4l2CodecAV1Dec * self)
{
}
void void
gst_v4l2_codec_av1_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder, gst_v4l2_codec_av1_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
GstV4l2CodecDevice * device, guint rank) GstV4l2CodecDevice * device, guint rank)
{ {
GTypeInfo type_info = {
.class_size = sizeof (GstV4l2CodecAV1DecClass),
.class_init = (GClassInitFunc) gst_v4l2_codec_av1_dec_class_init,
.class_data = gst_mini_object_ref (GST_MINI_OBJECT (device)),
.instance_size = sizeof (GstV4l2CodecAV1Dec),
.instance_init = (GInstanceInitFunc) gst_v4l2_codec_av1_dec_init,
};
GstCaps *src_caps = NULL; GstCaps *src_caps = NULL;
guint version; guint version;
@ -1659,10 +1650,7 @@ gst_v4l2_codec_av1_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
} }
register_element: register_element:
gst_v4l2_decoder_register (plugin, GST_TYPE_V4L2_CODEC_AV1_DEC, gst_v4l2_decoder_register (plugin, GST_TYPE_AV1_DECODER, &type_info,
(GClassInitFunc) gst_v4l2_codec_av1_dec_subclass_init,
gst_mini_object_ref (GST_MINI_OBJECT (device)),
(GInstanceInitFunc) gst_v4l2_codec_av1_dec_subinit,
"v4l2sl%sav1dec", device, rank, NULL); "v4l2sl%sav1dec", device, rank, NULL);
done: done:

View file

@ -39,10 +39,7 @@
GST_DEBUG_CATEGORY_STATIC (v4l2_h264dec_debug); GST_DEBUG_CATEGORY_STATIC (v4l2_h264dec_debug);
#define GST_CAT_DEFAULT v4l2_h264dec_debug #define GST_CAT_DEFAULT v4l2_h264dec_debug
#define GST_TYPE_V4L2_CODEC_H264_DEC \ #define GST_V4L2_CODEC_H264_DEC(obj) ((GstV4l2CodecH264Dec *) obj);
(gst_v4l2_codec_h264_dec_get_type())
#define GST_V4L2_CODEC_H264_DEC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_CODEC_H264_DEC,GstV4l2CodecH264Dec))
enum enum
{ {
@ -117,12 +114,7 @@ struct _GstV4l2CodecH264Dec
GstMapInfo bitstream_map; GstMapInfo bitstream_map;
}; };
static GType gst_v4l2_codec_h264_dec_get_type (void); static GstElementClass *parent_class = NULL;
G_DEFINE_ABSTRACT_TYPE (GstV4l2CodecH264Dec, gst_v4l2_codec_h264_dec,
GST_TYPE_H264_DECODER);
#define parent_class gst_v4l2_codec_h264_dec_parent_class
static gboolean static gboolean
is_frame_based (GstV4l2CodecH264Dec * self) is_frame_based (GstV4l2CodecH264Dec * self)
@ -1520,12 +1512,7 @@ gst_v4l2_codec_h264_dec_get_property (GObject * object, guint prop_id,
} }
static void static void
gst_v4l2_codec_h264_dec_init (GstV4l2CodecH264Dec * self) gst_v4l2_codec_h264_dec_init (GstV4l2CodecH264Dec * self,
{
}
static void
gst_v4l2_codec_h264_dec_subinit (GstV4l2CodecH264Dec * self,
GstV4l2CodecH264DecClass * klass) GstV4l2CodecH264DecClass * klass)
{ {
self->decoder = gst_v4l2_decoder_new (klass->device); self->decoder = gst_v4l2_decoder_new (klass->device);
@ -1547,12 +1534,7 @@ gst_v4l2_codec_h264_dec_dispose (GObject * object)
} }
static void static void
gst_v4l2_codec_h264_dec_class_init (GstV4l2CodecH264DecClass * klass) gst_v4l2_codec_h264_dec_class_init (GstV4l2CodecH264DecClass * klass,
{
}
static void
gst_v4l2_codec_h264_dec_subclass_init (GstV4l2CodecH264DecClass * klass,
GstV4l2CodecDevice * device) GstV4l2CodecDevice * device)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
@ -1570,6 +1552,8 @@ gst_v4l2_codec_h264_dec_subclass_init (GstV4l2CodecH264DecClass * klass,
"A V4L2 based H.264 video decoder", "A V4L2 based H.264 video decoder",
"Nicolas Dufresne <nicolas.dufresne@collabora.com>"); "Nicolas Dufresne <nicolas.dufresne@collabora.com>");
parent_class = g_type_class_peek_parent (klass);
gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_add_pad_template (element_class, gst_element_class_add_pad_template (element_class,
gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
@ -1612,6 +1596,13 @@ void
gst_v4l2_codec_h264_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder, gst_v4l2_codec_h264_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
GstV4l2CodecDevice * device, guint rank) GstV4l2CodecDevice * device, guint rank)
{ {
GTypeInfo type_info = {
.class_size = sizeof (GstV4l2CodecH264DecClass),
.class_init = (GClassInitFunc) gst_v4l2_codec_h264_dec_class_init,
.class_data = gst_mini_object_ref (GST_MINI_OBJECT (device)),
.instance_size = sizeof (GstV4l2CodecH264Dec),
.instance_init = (GInstanceInitFunc) gst_v4l2_codec_h264_dec_init,
};
GstCaps *src_caps = NULL; GstCaps *src_caps = NULL;
guint version; guint version;
@ -1652,11 +1643,7 @@ gst_v4l2_codec_h264_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
} }
register_element: register_element:
gst_v4l2_decoder_register (plugin, gst_v4l2_decoder_register (plugin, GST_TYPE_H264_DECODER, &type_info,
GST_TYPE_V4L2_CODEC_H264_DEC,
(GClassInitFunc) gst_v4l2_codec_h264_dec_subclass_init,
gst_mini_object_ref (GST_MINI_OBJECT (device)),
(GInstanceInitFunc) gst_v4l2_codec_h264_dec_subinit,
"v4l2sl%sh264dec", device, rank, NULL); "v4l2sl%sh264dec", device, rank, NULL);
done: done:

View file

@ -40,10 +40,7 @@
GST_DEBUG_CATEGORY_STATIC (v4l2_h265dec_debug); GST_DEBUG_CATEGORY_STATIC (v4l2_h265dec_debug);
#define GST_CAT_DEFAULT v4l2_h265dec_debug #define GST_CAT_DEFAULT v4l2_h265dec_debug
#define GST_TYPE_V4L2_CODEC_H265_DEC \ #define GST_V4L2_CODEC_H265_DEC(obj) ((GstV4l2CodecH265Dec *) obj)
(gst_v4l2_codec_h265_dec_get_type())
#define GST_V4L2_CODEC_H265_DEC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_CODEC_H265_DEC,GstV4l2CodecH265Dec))
enum enum
{ {
@ -125,12 +122,7 @@ struct _GstV4l2CodecH265Dec
gint crop_rect_x, crop_rect_y; gint crop_rect_x, crop_rect_y;
}; };
static GType gst_v4l2_codec_h265_dec_get_type (void); static GstElementClass *parent_class = NULL;
G_DEFINE_ABSTRACT_TYPE (GstV4l2CodecH265Dec, gst_v4l2_codec_h265_dec,
GST_TYPE_H265_DECODER);
#define parent_class gst_v4l2_codec_h265_dec_parent_class
static gboolean static gboolean
is_frame_based (GstV4l2CodecH265Dec * self) is_frame_based (GstV4l2CodecH265Dec * self)
@ -1650,12 +1642,7 @@ gst_v4l2_codec_h265_dec_get_property (GObject * object, guint prop_id,
} }
static void static void
gst_v4l2_codec_h265_dec_init (GstV4l2CodecH265Dec * self) gst_v4l2_codec_h265_dec_init (GstV4l2CodecH265Dec * self,
{
}
static void
gst_v4l2_codec_h265_dec_subinit (GstV4l2CodecH265Dec * self,
GstV4l2CodecH265DecClass * klass) GstV4l2CodecH265DecClass * klass)
{ {
self->decoder = gst_v4l2_decoder_new (klass->device); self->decoder = gst_v4l2_decoder_new (klass->device);
@ -1680,12 +1667,7 @@ gst_v4l2_codec_h265_dec_dispose (GObject * object)
} }
static void static void
gst_v4l2_codec_h265_dec_class_init (GstV4l2CodecH265DecClass * klass) gst_v4l2_codec_h265_dec_class_init (GstV4l2CodecH265DecClass * klass,
{
}
static void
gst_v4l2_codec_h265_dec_subclass_init (GstV4l2CodecH265DecClass * klass,
GstV4l2CodecDevice * device) GstV4l2CodecDevice * device)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
@ -1703,6 +1685,8 @@ gst_v4l2_codec_h265_dec_subclass_init (GstV4l2CodecH265DecClass * klass,
"A V4L2 based H.265 video decoder", "A V4L2 based H.265 video decoder",
"Nicolas Dufresne <nicolas.dufresne@collabora.com>"); "Nicolas Dufresne <nicolas.dufresne@collabora.com>");
parent_class = g_type_class_peek_parent (klass);
gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_add_pad_template (element_class, gst_element_class_add_pad_template (element_class,
gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
@ -1743,6 +1727,13 @@ void
gst_v4l2_codec_h265_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder, gst_v4l2_codec_h265_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
GstV4l2CodecDevice * device, guint rank) GstV4l2CodecDevice * device, guint rank)
{ {
GTypeInfo type_info = {
.class_size = sizeof (GstV4l2CodecH265DecClass),
.class_init = (GClassInitFunc) gst_v4l2_codec_h265_dec_class_init,
.class_data = gst_mini_object_ref (GST_MINI_OBJECT (device)),
.instance_size = sizeof (GstV4l2CodecH265Dec),
.instance_init = (GInstanceInitFunc) gst_v4l2_codec_h265_dec_init,
};
GstCaps *src_caps = NULL; GstCaps *src_caps = NULL;
guint version; guint version;
@ -1783,10 +1774,7 @@ gst_v4l2_codec_h265_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
} }
register_element: register_element:
gst_v4l2_decoder_register (plugin, GST_TYPE_V4L2_CODEC_H265_DEC, gst_v4l2_decoder_register (plugin, GST_TYPE_H265_DECODER, &type_info,
(GClassInitFunc) gst_v4l2_codec_h265_dec_subclass_init,
gst_mini_object_ref (GST_MINI_OBJECT (device)),
(GInstanceInitFunc) gst_v4l2_codec_h265_dec_subinit,
"v4l2sl%sh265dec", device, rank, NULL); "v4l2sl%sh265dec", device, rank, NULL);
done: done:

View file

@ -43,10 +43,7 @@
GST_DEBUG_CATEGORY_STATIC (v4l2_mpeg2dec_debug); GST_DEBUG_CATEGORY_STATIC (v4l2_mpeg2dec_debug);
#define GST_CAT_DEFAULT v4l2_mpeg2dec_debug #define GST_CAT_DEFAULT v4l2_mpeg2dec_debug
#define GST_TYPE_V4L2_CODEC_MPEG2_DEC \ #define GST_V4L2_CODEC_MPEG2_DEC(obj) ((GstV4l2CodecMpeg2Dec *) obj)
(gst_v4l2_codec_mpeg2_dec_get_type())
#define GST_V4L2_CODEC_MPEG2_DEC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_CODEC_MPEG2_DEC,GstV4l2CodecMpeg2Dec))
enum enum
{ {
@ -116,12 +113,7 @@ struct _GstV4l2CodecMpeg2Dec
gboolean copy_frames; gboolean copy_frames;
}; };
static GType gst_v4l2_codec_mpeg2_dec_get_type (void); static GstElementClass *parent_class = NULL;
G_DEFINE_ABSTRACT_TYPE (GstV4l2CodecMpeg2Dec, gst_v4l2_codec_mpeg2_dec,
GST_TYPE_MPEG2_DECODER);
#define parent_class gst_v4l2_codec_mpeg2_dec_parent_class
static guint static guint
gst_v4l2_codec_mpeg2_dec_get_preferred_output_delay (GstMpeg2Decoder * decoder, gst_v4l2_codec_mpeg2_dec_get_preferred_output_delay (GstMpeg2Decoder * decoder,
@ -1045,12 +1037,7 @@ gst_v4l2_codec_mpeg2_dec_get_property (GObject * object, guint prop_id,
} }
static void static void
gst_v4l2_codec_mpeg2_dec_init (GstV4l2CodecMpeg2Dec * self) gst_v4l2_codec_mpeg2_dec_init (GstV4l2CodecMpeg2Dec * self,
{
}
static void
gst_v4l2_codec_mpeg2_dec_subinit (GstV4l2CodecMpeg2Dec * self,
GstV4l2CodecMpeg2DecClass * klass) GstV4l2CodecMpeg2DecClass * klass)
{ {
self->decoder = gst_v4l2_decoder_new (klass->device); self->decoder = gst_v4l2_decoder_new (klass->device);
@ -1068,12 +1055,7 @@ gst_v4l2_codec_mpeg2_dec_dispose (GObject * object)
} }
static void static void
gst_v4l2_codec_mpeg2_dec_class_init (GstV4l2CodecMpeg2DecClass * klass) gst_v4l2_codec_mpeg2_dec_class_init (GstV4l2CodecMpeg2DecClass * klass,
{
}
static void
gst_v4l2_codec_mpeg2_dec_subclass_init (GstV4l2CodecMpeg2DecClass * klass,
GstV4l2CodecDevice * device) GstV4l2CodecDevice * device)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
@ -1091,6 +1073,8 @@ gst_v4l2_codec_mpeg2_dec_subclass_init (GstV4l2CodecMpeg2DecClass * klass,
"A V4L2 based Mpeg2 video decoder", "A V4L2 based Mpeg2 video decoder",
"Daniel Almeida <daniel.almeida@collabora.com>"); "Daniel Almeida <daniel.almeida@collabora.com>");
parent_class = g_type_class_peek_parent (klass);
gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_add_pad_template (element_class, gst_element_class_add_pad_template (element_class,
gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
@ -1131,6 +1115,13 @@ void
gst_v4l2_codec_mpeg2_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder, gst_v4l2_codec_mpeg2_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
GstV4l2CodecDevice * device, guint rank) GstV4l2CodecDevice * device, guint rank)
{ {
GTypeInfo type_info = {
.class_size = sizeof (GstV4l2CodecMpeg2DecClass),
.class_init = (GClassInitFunc) gst_v4l2_codec_mpeg2_dec_class_init,
.class_data = gst_mini_object_ref (GST_MINI_OBJECT (device)),
.instance_size = sizeof (GstV4l2CodecMpeg2Dec),
.instance_init = (GInstanceInitFunc) gst_v4l2_codec_mpeg2_dec_init,
};
GstCaps *src_caps = NULL; GstCaps *src_caps = NULL;
GST_DEBUG_CATEGORY_INIT (v4l2_mpeg2dec_debug, "v4l2codecs-mpeg2dec", 0, GST_DEBUG_CATEGORY_INIT (v4l2_mpeg2dec_debug, "v4l2codecs-mpeg2dec", 0,
@ -1159,10 +1150,7 @@ gst_v4l2_codec_mpeg2_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
gst_v4l2_decoder_enum_all_src_formats (decoder, &static_src_caps); gst_v4l2_decoder_enum_all_src_formats (decoder, &static_src_caps);
register_element: register_element:
gst_v4l2_decoder_register (plugin, GST_TYPE_V4L2_CODEC_MPEG2_DEC, gst_v4l2_decoder_register (plugin, GST_TYPE_MPEG2_DECODER, &type_info,
(GClassInitFunc) gst_v4l2_codec_mpeg2_dec_subclass_init,
gst_mini_object_ref (GST_MINI_OBJECT (device)),
(GInstanceInitFunc) gst_v4l2_codec_mpeg2_dec_subinit,
"v4l2sl%smpeg2dec", device, rank, NULL); "v4l2sl%smpeg2dec", device, rank, NULL);
done: done:

View file

@ -39,10 +39,7 @@
GST_DEBUG_CATEGORY_STATIC (v4l2_vp8dec_debug); GST_DEBUG_CATEGORY_STATIC (v4l2_vp8dec_debug);
#define GST_CAT_DEFAULT v4l2_vp8dec_debug #define GST_CAT_DEFAULT v4l2_vp8dec_debug
#define GST_TYPE_V4L2_CODEC_VP8_DEC \ #define GST_V4L2_CODEC_VP8_DEC(obj) ((GstV4l2CodecVp8Dec *) obj)
(gst_v4l2_codec_vp8_dec_get_type())
#define GST_V4L2_CODEC_VP8_DEC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_CODEC_VP8_DEC,GstV4l2CodecVp8Dec))
enum enum
{ {
@ -104,12 +101,7 @@ struct _GstV4l2CodecVp8Dec
GstMapInfo bitstream_map; GstMapInfo bitstream_map;
}; };
static GType gst_v4l2_codec_vp8_dec_get_type (void); static GstElementClass *parent_class = NULL;
G_DEFINE_ABSTRACT_TYPE (GstV4l2CodecVp8Dec, gst_v4l2_codec_vp8_dec,
GST_TYPE_VP8_DECODER);
#define parent_class gst_v4l2_codec_vp8_dec_parent_class
static guint static guint
gst_v4l2_codec_vp8_dec_get_preferred_output_delay (GstVp8Decoder * decoder, gst_v4l2_codec_vp8_dec_get_preferred_output_delay (GstVp8Decoder * decoder,
@ -903,12 +895,7 @@ gst_v4l2_codec_vp8_dec_get_property (GObject * object, guint prop_id,
} }
static void static void
gst_v4l2_codec_vp8_dec_init (GstV4l2CodecVp8Dec * self) gst_v4l2_codec_vp8_dec_init (GstV4l2CodecVp8Dec * self,
{
}
static void
gst_v4l2_codec_vp8_dec_subinit (GstV4l2CodecVp8Dec * self,
GstV4l2CodecVp8DecClass * klass) GstV4l2CodecVp8DecClass * klass)
{ {
self->decoder = gst_v4l2_decoder_new (klass->device); self->decoder = gst_v4l2_decoder_new (klass->device);
@ -926,12 +913,7 @@ gst_v4l2_codec_vp8_dec_dispose (GObject * object)
} }
static void static void
gst_v4l2_codec_vp8_dec_class_init (GstV4l2CodecVp8DecClass * klass) gst_v4l2_codec_vp8_dec_class_init (GstV4l2CodecVp8DecClass * klass,
{
}
static void
gst_v4l2_codec_vp8_dec_subclass_init (GstV4l2CodecVp8DecClass * klass,
GstV4l2CodecDevice * device) GstV4l2CodecDevice * device)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
@ -949,6 +931,8 @@ gst_v4l2_codec_vp8_dec_subclass_init (GstV4l2CodecVp8DecClass * klass,
"A V4L2 based VP8 video decoder", "A V4L2 based VP8 video decoder",
"Nicolas Dufresne <nicolas.dufresne@collabora.com>"); "Nicolas Dufresne <nicolas.dufresne@collabora.com>");
parent_class = g_type_class_peek_parent (klass);
gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_add_pad_template (element_class, gst_element_class_add_pad_template (element_class,
gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
@ -1005,6 +989,13 @@ void
gst_v4l2_codec_vp8_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder, gst_v4l2_codec_vp8_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
GstV4l2CodecDevice * device, guint rank) GstV4l2CodecDevice * device, guint rank)
{ {
GTypeInfo type_info = {
.class_size = sizeof (GstV4l2CodecVp8DecClass),
.class_init = (GClassInitFunc) gst_v4l2_codec_vp8_dec_class_init,
.class_data = gst_mini_object_ref (GST_MINI_OBJECT (device)),
.instance_size = sizeof (GstV4l2CodecVp8Dec),
.instance_init = (GInstanceInitFunc) gst_v4l2_codec_vp8_dec_init,
};
gchar *element_name; gchar *element_name;
GstCaps *src_caps = NULL, *alpha_caps; GstCaps *src_caps = NULL, *alpha_caps;
@ -1034,10 +1025,7 @@ gst_v4l2_codec_vp8_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
gst_v4l2_decoder_enum_all_src_formats (decoder, &static_src_caps); gst_v4l2_decoder_enum_all_src_formats (decoder, &static_src_caps);
register_element: register_element:
gst_v4l2_decoder_register (plugin, GST_TYPE_V4L2_CODEC_VP8_DEC, gst_v4l2_decoder_register (plugin, GST_TYPE_VP8_DECODER, &type_info,
(GClassInitFunc) gst_v4l2_codec_vp8_dec_subclass_init,
gst_mini_object_ref (GST_MINI_OBJECT (device)),
(GInstanceInitFunc) gst_v4l2_codec_vp8_dec_subinit,
"v4l2sl%svp8dec", device, rank, &element_name); "v4l2sl%svp8dec", device, rank, &element_name);
if (!element_name) if (!element_name)

View file

@ -36,10 +36,7 @@
GST_DEBUG_CATEGORY_STATIC (v4l2_vp9dec_debug); GST_DEBUG_CATEGORY_STATIC (v4l2_vp9dec_debug);
#define GST_CAT_DEFAULT v4l2_vp9dec_debug #define GST_CAT_DEFAULT v4l2_vp9dec_debug
#define GST_TYPE_V4L2_CODEC_VP9_DEC \ #define GST_V4L2_CODEC_VP9_DEC(obj) ((GstV4l2CodecVp9Dec *) obj)
(gst_v4l2_codec_vp9_dec_get_type())
#define GST_V4L2_CODEC_VP9_DEC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_CODEC_VP9_DEC,GstV4l2CodecVp9Dec))
/* Used to mark picture that have been outputed */ /* Used to mark picture that have been outputed */
#define FLAG_PICTURE_HOLDS_BUFFER GST_MINI_OBJECT_FLAG_LAST #define FLAG_PICTURE_HOLDS_BUFFER GST_MINI_OBJECT_FLAG_LAST
@ -115,12 +112,7 @@ struct _GstV4l2CodecVp9Dec
guint subsampling_y; guint subsampling_y;
}; };
static GType gst_v4l2_codec_vp9_dec_get_type (void); static GstElementClass *parent_class = NULL;
G_DEFINE_ABSTRACT_TYPE (GstV4l2CodecVp9Dec, gst_v4l2_codec_vp9_dec,
GST_TYPE_VP9_DECODER);
#define parent_class gst_v4l2_codec_vp9_dec_parent_class
static guint static guint
gst_v4l2_codec_vp9_dec_get_preferred_output_delay (GstVp9Decoder * decoder, gst_v4l2_codec_vp9_dec_get_preferred_output_delay (GstVp9Decoder * decoder,
@ -1179,13 +1171,7 @@ gst_v4l2_codec_vp9_dec_get_property (GObject * object, guint prop_id,
} }
static void static void
gst_v4l2_codec_vp9_dec_init (GstV4l2CodecVp9Dec * self) gst_v4l2_codec_vp9_dec_init (GstV4l2CodecVp9Dec * self,
{
self->need_negotiation = TRUE;
}
static void
gst_v4l2_codec_vp9_dec_subinit (GstV4l2CodecVp9Dec * self,
GstV4l2CodecVp9DecClass * klass) GstV4l2CodecVp9DecClass * klass)
{ {
self->decoder = gst_v4l2_decoder_new (klass->device); self->decoder = gst_v4l2_decoder_new (klass->device);
@ -1203,12 +1189,7 @@ gst_v4l2_codec_vp9_dec_dispose (GObject * object)
} }
static void static void
gst_v4l2_codec_vp9_dec_class_init (GstV4l2CodecVp9DecClass * klass) gst_v4l2_codec_vp9_dec_class_init (GstV4l2CodecVp9DecClass * klass,
{
}
static void
gst_v4l2_codec_vp9_dec_subclass_init (GstV4l2CodecVp9DecClass * klass,
GstV4l2CodecDevice * device) GstV4l2CodecDevice * device)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
@ -1226,6 +1207,8 @@ gst_v4l2_codec_vp9_dec_subclass_init (GstV4l2CodecVp9DecClass * klass,
"A V4L2 based VP9 video decoder", "A V4L2 based VP9 video decoder",
"Daniel Almeida <daniel.almeida@collabora.com>"); "Daniel Almeida <daniel.almeida@collabora.com>");
parent_class = g_type_class_peek_parent (klass);
gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_add_pad_template (element_class, gst_element_class_add_pad_template (element_class,
gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
@ -1286,6 +1269,13 @@ void
gst_v4l2_codec_vp9_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder, gst_v4l2_codec_vp9_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
GstV4l2CodecDevice * device, guint rank) GstV4l2CodecDevice * device, guint rank)
{ {
GTypeInfo type_info = {
.class_size = sizeof (GstV4l2CodecVp9DecClass),
.class_init = (GClassInitFunc) gst_v4l2_codec_vp9_dec_class_init,
.class_data = gst_mini_object_ref (GST_MINI_OBJECT (device)),
.instance_size = sizeof (GstV4l2CodecVp9Dec),
.instance_init = (GInstanceInitFunc) gst_v4l2_codec_vp9_dec_init,
};
gchar *element_name; gchar *element_name;
GstCaps *src_caps = NULL, *alpha_caps; GstCaps *src_caps = NULL, *alpha_caps;
@ -1315,10 +1305,7 @@ gst_v4l2_codec_vp9_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder,
gst_v4l2_decoder_enum_all_src_formats (decoder, &static_src_caps); gst_v4l2_decoder_enum_all_src_formats (decoder, &static_src_caps);
register_element: register_element:
gst_v4l2_decoder_register (plugin, GST_TYPE_V4L2_CODEC_VP9_DEC, gst_v4l2_decoder_register (plugin, GST_TYPE_VP9_DECODER, &type_info,
(GClassInitFunc) gst_v4l2_codec_vp9_dec_subclass_init,
gst_mini_object_ref (GST_MINI_OBJECT (device)),
(GInstanceInitFunc) gst_v4l2_codec_vp9_dec_subinit,
"v4l2sl%svp9dec", device, rank, &element_name); "v4l2sl%svp9dec", device, rank, &element_name);
if (!element_name) if (!element_name)

View file

@ -1164,13 +1164,11 @@ gst_v4l2_decoder_get_property (GObject * object, guint prop_id,
/** /**
* gst_v4l2_decoder_register: * gst_v4l2_decoder_register:
* @plugin: a #GstPlugin * @plugin: a #GstPlugin
* @dec_type: A #GType for the codec * @dec_type: Base #GType for the codec
* @class_init: The #GClassInitFunc for #dec_type * @type_info: a #GTypeInfo for the codec
* @instance_init: The #GInstanceInitFunc for #dec_type
* @element_name_tmpl: A string to use for the first codec found and as a template for the next ones. * @element_name_tmpl: A string to use for the first codec found and as a template for the next ones.
* @device: (transfer full) A #GstV4l2CodecDevice * @device: (transfer full) A #GstV4l2CodecDevice
* @rank: The rank to use for the element * @rank: The rank to use for the element
* @class_data: (nullable) (transfer full) A #gpointer to pass as class_data, set to @device if null
* @element_name (nullable) (out) Sets the pointer to the new element name * @element_name (nullable) (out) Sets the pointer to the new element name
* *
* Registers a decoder element as a subtype of @dec_type for @plugin. * Registers a decoder element as a subtype of @dec_type for @plugin.
@ -1179,24 +1177,13 @@ gst_v4l2_decoder_get_property (GObject * object, guint prop_id,
*/ */
void void
gst_v4l2_decoder_register (GstPlugin * plugin, gst_v4l2_decoder_register (GstPlugin * plugin,
GType dec_type, GClassInitFunc class_init, gconstpointer class_data, GType dec_type, GTypeInfo * type_info, const gchar * element_name_tmpl,
GInstanceInitFunc instance_init, const gchar * element_name_tmpl,
GstV4l2CodecDevice * device, guint rank, gchar ** element_name) GstV4l2CodecDevice * device, guint rank, gchar ** element_name)
{ {
GTypeQuery type_query;
GTypeInfo type_info = { 0, };
GType subtype; GType subtype;
gchar *type_name; gchar *type_name;
g_type_query (dec_type, &type_query); if (type_info->class_data == device)
memset (&type_info, 0, sizeof (type_info));
type_info.class_size = type_query.class_size;
type_info.instance_size = type_query.instance_size;
type_info.class_init = class_init;
type_info.class_data = class_data;
type_info.instance_init = instance_init;
if (class_data == device)
GST_MINI_OBJECT_FLAG_SET (device, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); GST_MINI_OBJECT_FLAG_SET (device, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED);
/* The first decoder to be registered should use a constant name, like /* The first decoder to be registered should use a constant name, like
@ -1213,7 +1200,7 @@ gst_v4l2_decoder_register (GstPlugin * plugin,
g_free (basename); g_free (basename);
} }
subtype = g_type_register_static (dec_type, type_name, &type_info, 0); subtype = g_type_register_static (dec_type, type_name, type_info, 0);
if (!gst_element_register (plugin, type_name, rank, subtype)) { if (!gst_element_register (plugin, type_name, rank, subtype)) {
GST_WARNING ("Failed to register plugin '%s'", type_name); GST_WARNING ("Failed to register plugin '%s'", type_name);

View file

@ -128,9 +128,7 @@ void gst_v4l2_decoder_get_property (GObject * object, guint prop_id
void gst_v4l2_decoder_register (GstPlugin * plugin, void gst_v4l2_decoder_register (GstPlugin * plugin,
GType dec_type, GType dec_type,
GClassInitFunc class_init, GTypeInfo * type_info,
gconstpointer class_data,
GInstanceInitFunc instance_init,
const gchar *element_name_tmpl, const gchar *element_name_tmpl,
GstV4l2CodecDevice * device, GstV4l2CodecDevice * device,
guint rank, guint rank,