v4l: use buffer private data for extra buffer info
Since we can't subclass anymore, use the owber_priv pointer for storing extra info for the buffer.
This commit is contained in:
parent
e78903e662
commit
fc06cf80c9
@ -616,78 +616,25 @@ gst_v4lsrc_get_fps_list (GstV4lSrc * v4lsrc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GST_TYPE_V4LSRC_BUFFER (gst_v4lsrc_buffer_get_type())
|
#define GET_V4LSRC_DATA(buf) ((GstV4lSrcData *) (GST_BUFFER_CAST(buf)->owner_priv))
|
||||||
#define GST_IS_V4LSRC_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4LSRC_BUFFER))
|
|
||||||
#define GST_V4LSRC_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4LSRC_BUFFER, GstV4lSrcBuffer))
|
|
||||||
|
|
||||||
typedef struct _GstV4lSrcBuffer
|
typedef struct _GstV4lSrcData
|
||||||
{
|
{
|
||||||
GstBuffer buffer;
|
|
||||||
|
|
||||||
GstV4lSrc *v4lsrc;
|
GstV4lSrc *v4lsrc;
|
||||||
|
|
||||||
gint num;
|
gint num;
|
||||||
} GstV4lSrcBuffer;
|
} GstV4lSrcData;
|
||||||
|
|
||||||
static void gst_v4lsrc_buffer_class_init (gpointer g_class,
|
|
||||||
gpointer class_data);
|
|
||||||
static void gst_v4lsrc_buffer_init (GTypeInstance * instance, gpointer g_class);
|
|
||||||
static void gst_v4lsrc_buffer_finalize (GstV4lSrcBuffer * v4lsrc_buffer);
|
|
||||||
|
|
||||||
static GstBufferClass *v4lbuffer_parent_class = NULL;
|
|
||||||
|
|
||||||
static GType
|
|
||||||
gst_v4lsrc_buffer_get_type (void)
|
|
||||||
{
|
|
||||||
static GType _gst_v4lsrc_buffer_type;
|
|
||||||
|
|
||||||
if (G_UNLIKELY (_gst_v4lsrc_buffer_type == 0)) {
|
|
||||||
static const GTypeInfo v4lsrc_buffer_info = {
|
|
||||||
sizeof (GstBufferClass),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
gst_v4lsrc_buffer_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof (GstV4lSrcBuffer),
|
|
||||||
0,
|
|
||||||
gst_v4lsrc_buffer_init,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
_gst_v4lsrc_buffer_type = g_type_register_static (GST_TYPE_BUFFER,
|
|
||||||
"GstV4lSrcBuffer", &v4lsrc_buffer_info, 0);
|
|
||||||
}
|
|
||||||
return _gst_v4lsrc_buffer_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_v4lsrc_buffer_class_init (gpointer g_class, gpointer class_data)
|
gst_v4lsrc_buffer_dispose (GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class);
|
GstV4lSrcData *data = GET_V4LSRC_DATA (buffer);
|
||||||
|
|
||||||
v4lbuffer_parent_class = g_type_class_peek_parent (g_class);
|
|
||||||
|
|
||||||
mini_object_class->finalize = (GstMiniObjectFinalizeFunction)
|
|
||||||
gst_v4lsrc_buffer_finalize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_v4lsrc_buffer_init (GTypeInstance * instance, gpointer g_class)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_v4lsrc_buffer_finalize (GstV4lSrcBuffer * v4lsrc_buffer)
|
|
||||||
{
|
|
||||||
GstMiniObjectClass *miniobject_class;
|
|
||||||
GstV4lSrc *v4lsrc;
|
GstV4lSrc *v4lsrc;
|
||||||
gint num;
|
gint num;
|
||||||
|
|
||||||
v4lsrc = v4lsrc_buffer->v4lsrc;
|
v4lsrc = data->v4lsrc;
|
||||||
num = v4lsrc_buffer->num;
|
num = data->num;
|
||||||
|
|
||||||
GST_LOG_OBJECT (v4lsrc, "freeing buffer %p for frame %d", v4lsrc_buffer, num);
|
GST_LOG_OBJECT (v4lsrc, "freeing buffer %p for frame %d", buffer, num);
|
||||||
|
|
||||||
/* only requeue if we still have an mmap buffer */
|
/* only requeue if we still have an mmap buffer */
|
||||||
if (GST_V4LELEMENT (v4lsrc)->buffer) {
|
if (GST_V4LELEMENT (v4lsrc)->buffer) {
|
||||||
@ -695,16 +642,17 @@ gst_v4lsrc_buffer_finalize (GstV4lSrcBuffer * v4lsrc_buffer)
|
|||||||
gst_v4lsrc_requeue_frame (v4lsrc, num);
|
gst_v4lsrc_requeue_frame (v4lsrc, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* free data */
|
||||||
gst_object_unref (v4lsrc);
|
gst_object_unref (v4lsrc);
|
||||||
|
g_slice_free (GstV4lSrcData, data);
|
||||||
miniobject_class = (GstMiniObjectClass *) v4lbuffer_parent_class;
|
buffer->owner_priv = NULL;
|
||||||
miniobject_class->finalize (GST_MINI_OBJECT_CAST (v4lsrc_buffer));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a V4lSrc buffer from our mmap'd data area */
|
/* Create a V4lSrc buffer from our mmap'd data area */
|
||||||
GstBuffer *
|
GstBuffer *
|
||||||
gst_v4lsrc_buffer_new (GstV4lSrc * v4lsrc, gint num)
|
gst_v4lsrc_buffer_new (GstV4lSrc * v4lsrc, gint num)
|
||||||
{
|
{
|
||||||
|
GstV4lSrcData *data;
|
||||||
GstClockTime duration, timestamp, latency;
|
GstClockTime duration, timestamp, latency;
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
GstClock *clock;
|
GstClock *clock;
|
||||||
@ -715,10 +663,14 @@ gst_v4lsrc_buffer_new (GstV4lSrc * v4lsrc, gint num)
|
|||||||
if (!(gst_v4lsrc_get_fps (v4lsrc, &fps_n, &fps_d)))
|
if (!(gst_v4lsrc_get_fps (v4lsrc, &fps_n, &fps_d)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
buf = (GstBuffer *) gst_mini_object_new (GST_TYPE_V4LSRC_BUFFER);
|
buf = gst_buffer_new ();
|
||||||
|
data = g_slice_new (GstV4lSrcData);
|
||||||
|
buf->owner_priv = data;
|
||||||
|
GST_MINI_OBJECT_CAST (buf)->dispose =
|
||||||
|
(GstMiniObjectDisposeFunction) gst_v4lsrc_buffer_dispose;
|
||||||
|
|
||||||
GST_V4LSRC_BUFFER (buf)->num = num;
|
data->num = num;
|
||||||
GST_V4LSRC_BUFFER (buf)->v4lsrc = gst_object_ref (v4lsrc);
|
data->v4lsrc = gst_object_ref (v4lsrc);
|
||||||
|
|
||||||
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_READONLY);
|
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_READONLY);
|
||||||
GST_BUFFER_DATA (buf) = gst_v4lsrc_get_buffer (v4lsrc, num);
|
GST_BUFFER_DATA (buf) = gst_v4lsrc_get_buffer (v4lsrc, num);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user