mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 19:51:11 +00:00
Added 1337 macros to create padtemplates and capstemplates.
Original commit message from CVS: Added 1337 macros to create padtemplates and capstemplates. Added some code for bufferpools
This commit is contained in:
parent
d74fc2e0fa
commit
6118b074bc
7 changed files with 188 additions and 17 deletions
|
@ -60,6 +60,8 @@ extern "C" {
|
|||
#define GST_BUFFER_OFFSET(buf) (GST_BUFFER(buf)->offset)
|
||||
#define GST_BUFFER_MAXSIZE(buf) (GST_BUFFER(buf)->maxsize)
|
||||
#define GST_BUFFER_TIMESTAMP(buf) (GST_BUFFER(buf)->timestamp)
|
||||
#define GST_BUFFER_BUFFERPOOL(buf) (GST_BUFFER(buf)->pool)
|
||||
#define GST_BUFFER_POOL_PRIVATE(buf) (GST_BUFFER(buf)->pool_private)
|
||||
|
||||
|
||||
#define GST_BUFFER_LOCK(buf) (g_mutex_lock(GST_BUFFER(buf)->lock))
|
||||
|
@ -118,6 +120,7 @@ struct _GstBuffer {
|
|||
|
||||
/* this is a pointer to the buffer pool (if any) */
|
||||
GstBufferPool *pool;
|
||||
gpointer pool_private;
|
||||
};
|
||||
|
||||
/* initialisation */
|
||||
|
|
|
@ -119,26 +119,32 @@ gst_caps_destroy (GstCaps *caps)
|
|||
*
|
||||
* Decrease the refcount of this caps structure,
|
||||
* destroying it when the refcount is 0
|
||||
*
|
||||
* Retruns: caps or NULL if the refcount reached 0
|
||||
*/
|
||||
void
|
||||
GstCaps*
|
||||
gst_caps_unref (GstCaps *caps)
|
||||
{
|
||||
gboolean zero;
|
||||
GstCaps *next;
|
||||
GstCaps **next;
|
||||
|
||||
g_return_if_fail (caps != NULL);
|
||||
g_return_val_if_fail (caps != NULL, NULL);
|
||||
g_return_val_if_fail (caps->refcount > 0, NULL);
|
||||
|
||||
GST_CAPS_LOCK (caps);
|
||||
caps->refcount--;
|
||||
zero = (caps->refcount == 0);
|
||||
next = caps->next;
|
||||
next = &caps->next;
|
||||
GST_CAPS_UNLOCK (caps);
|
||||
|
||||
if (next)
|
||||
gst_caps_unref (next);
|
||||
if (*next)
|
||||
*next = gst_caps_unref (*next);
|
||||
|
||||
if (zero)
|
||||
if (zero) {
|
||||
gst_caps_destroy (caps);
|
||||
caps = NULL;
|
||||
}
|
||||
return caps;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -146,15 +152,19 @@ gst_caps_unref (GstCaps *caps)
|
|||
* @caps: the caps to ref
|
||||
*
|
||||
* Increase the refcount of this caps structure
|
||||
*
|
||||
* Returnns: the caps with the refcount incremented
|
||||
*/
|
||||
void
|
||||
GstCaps*
|
||||
gst_caps_ref (GstCaps *caps)
|
||||
{
|
||||
g_return_if_fail (caps != NULL);
|
||||
g_return_val_if_fail (caps != NULL, NULL);
|
||||
|
||||
GST_CAPS_LOCK (caps);
|
||||
caps->refcount++;
|
||||
GST_CAPS_UNLOCK (caps);
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -352,6 +362,36 @@ gst_caps_get_props (GstCaps *caps)
|
|||
return caps->properties;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_chain:
|
||||
* @caps: a capabilty
|
||||
* @...: more capabilities
|
||||
*
|
||||
* chains the given capabilities
|
||||
*
|
||||
* Returns: the new capability
|
||||
*/
|
||||
GstCaps*
|
||||
gst_caps_chain (GstCaps *caps, ...)
|
||||
{
|
||||
GstCaps *orig = caps;
|
||||
va_list var_args;
|
||||
|
||||
va_start (var_args, caps);
|
||||
|
||||
while (caps) {
|
||||
GstCaps *toadd;
|
||||
|
||||
toadd = va_arg (var_args, GstCaps*);
|
||||
gst_caps_append (caps, toadd);
|
||||
|
||||
caps = toadd;
|
||||
}
|
||||
va_end (var_args);
|
||||
|
||||
return orig;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_append:
|
||||
* @caps: a capabilty
|
||||
|
|
|
@ -56,13 +56,35 @@ struct _GstCaps {
|
|||
GstCaps *next;
|
||||
};
|
||||
|
||||
#define GST_CAPS_NEW(name, type, a...) \
|
||||
gst_caps_new ( \
|
||||
name, \
|
||||
type, \
|
||||
gst_props_new ( \
|
||||
##a, \
|
||||
NULL))
|
||||
|
||||
#define GST_CAPS_FACTORY(factoryname, a...) \
|
||||
static GstCaps* \
|
||||
factoryname (void) \
|
||||
{ \
|
||||
static GstCaps *caps = NULL; \
|
||||
if (!caps) { \
|
||||
caps = gst_caps_chain (##a, NULL); \
|
||||
} \
|
||||
return caps; \
|
||||
}
|
||||
|
||||
#define GST_CAPS_GET(fact) (fact)()
|
||||
|
||||
|
||||
/* initialize the subsystem */
|
||||
void _gst_caps_initialize (void);
|
||||
|
||||
GstCaps* gst_caps_new (const gchar *name, const gchar *mime, GstProps *props);
|
||||
|
||||
void gst_caps_unref (GstCaps *caps);
|
||||
void gst_caps_ref (GstCaps *caps);
|
||||
GstCaps* gst_caps_unref (GstCaps *caps);
|
||||
GstCaps* gst_caps_ref (GstCaps *caps);
|
||||
void gst_caps_destroy (GstCaps *caps);
|
||||
|
||||
GstCaps* gst_caps_copy (GstCaps *caps);
|
||||
|
@ -89,6 +111,7 @@ GstProps* gst_caps_get_props (GstCaps *caps);
|
|||
|
||||
GstCaps* gst_caps_get_by_name (GstCaps *caps, const gchar *name);
|
||||
|
||||
GstCaps* gst_caps_chain (GstCaps *caps, ...);
|
||||
GstCaps* gst_caps_append (GstCaps *caps, GstCaps *capstoadd);
|
||||
GstCaps* gst_caps_prepend (GstCaps *caps, GstCaps *capstoadd);
|
||||
|
||||
|
|
58
gst/gstpad.c
58
gst/gstpad.c
|
@ -173,6 +173,7 @@ gst_real_pad_init (GstRealPad *pad)
|
|||
pad->pullfunc = NULL;
|
||||
pad->pullregionfunc = NULL;
|
||||
|
||||
pad->bufferpoolfunc = NULL;
|
||||
pad->ghostpads = NULL;
|
||||
pad->caps = NULL;
|
||||
}
|
||||
|
@ -448,7 +449,24 @@ gst_pad_set_newcaps_function (GstPad *pad,
|
|||
GST_DEBUG_PAD_NAME(pad),pad,&GST_RPAD_NEWCAPSFUNC(pad),newcaps);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_pad_set_bufferpool_function:
|
||||
* @pad: the pad to set the bufferpool function for
|
||||
* @newcaps: the bufferpool function
|
||||
*
|
||||
* Set the given bufferpool function for the pad.
|
||||
*/
|
||||
void
|
||||
gst_pad_set_bufferpool_function (GstPad *pad,
|
||||
GstPadBufferPoolFunction bufpool)
|
||||
{
|
||||
g_return_if_fail (pad != NULL);
|
||||
g_return_if_fail (GST_IS_REAL_PAD (pad));
|
||||
|
||||
GST_RPAD_BUFFERPOOLFUNC (pad) = bufpool;
|
||||
GST_DEBUG (0,"bufferpoolfunc for %s:%s(@%p) at %p is set to %p\n",
|
||||
GST_DEBUG_PAD_NAME (pad), pad, &GST_RPAD_BUFFERPOOLFUNC (pad), bufpool);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_pad_push_func(GstPad *pad, GstBuffer *buf)
|
||||
|
@ -755,22 +773,29 @@ gboolean
|
|||
gst_pad_set_caps (GstPad *pad,
|
||||
GstCaps *caps)
|
||||
{
|
||||
GstCaps *oldcaps;
|
||||
|
||||
g_return_val_if_fail (pad != NULL, FALSE);
|
||||
g_return_val_if_fail (GST_IS_REAL_PAD (pad), FALSE); // NOTE this restriction
|
||||
|
||||
GST_INFO (GST_CAT_CAPS, "setting caps %p on pad %s:%s",
|
||||
caps, GST_DEBUG_PAD_NAME(pad));
|
||||
|
||||
if (!gst_caps_check_compatibility (caps, gst_pad_get_padtemplate_caps (pad))) {
|
||||
g_warning ("pad %s:%s tried to set caps incompatible with its padtemplate\n",
|
||||
GST_DEBUG_PAD_NAME (pad));
|
||||
//return FALSE;
|
||||
}
|
||||
|
||||
if (GST_PAD_CAPS (pad))
|
||||
gst_caps_unref (GST_PAD_CAPS (pad));
|
||||
oldcaps = GST_PAD_CAPS (pad);
|
||||
|
||||
if (caps)
|
||||
gst_caps_ref (caps);
|
||||
GST_PAD_CAPS(pad) = caps;
|
||||
|
||||
if (oldcaps)
|
||||
gst_caps_unref (oldcaps);
|
||||
|
||||
return gst_pad_renegotiate (pad);
|
||||
}
|
||||
|
||||
|
@ -891,6 +916,31 @@ gst_pad_get_peer (GstPad *pad)
|
|||
return GST_PAD(GST_PAD_PEER(pad));
|
||||
}
|
||||
|
||||
GstBufferPool*
|
||||
gst_pad_get_bufferpool (GstPad *pad)
|
||||
{
|
||||
GstRealPad *peer;
|
||||
|
||||
g_return_val_if_fail (pad != NULL, NULL);
|
||||
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
||||
|
||||
peer = GST_RPAD_PEER(pad);
|
||||
|
||||
g_return_val_if_fail (peer != NULL, NULL);
|
||||
|
||||
GST_DEBUG_ENTER("(%s:%s)",GST_DEBUG_PAD_NAME(pad));
|
||||
|
||||
if (peer->bufferpoolfunc) {
|
||||
GST_DEBUG (0,"calling bufferpoolfunc &%s (@%p) of peer pad %s:%s\n",
|
||||
GST_DEBUG_FUNCPTR_NAME(peer->bufferpoolfunc),&peer->bufferpoolfunc,GST_DEBUG_PAD_NAME(((GstPad*)peer)));
|
||||
return (peer->bufferpoolfunc)(((GstPad*)peer));
|
||||
} else {
|
||||
GST_DEBUG (0,"no bufferpoolfunc for peer pad %s:%s at %p\n",GST_DEBUG_PAD_NAME(((GstPad*)peer)),&peer->bufferpoolfunc);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// FIXME this needs to be rethought soon
|
||||
static void
|
||||
gst_real_pad_destroy (GtkObject *object)
|
||||
|
@ -1115,11 +1165,11 @@ gst_pad_renegotiate (GstPad *pad)
|
|||
GST_DEBUG (GST_CAT_NEGOTIATION, "pads aggreed on caps :)\n");
|
||||
|
||||
/* here we have some sort of aggreement of the caps */
|
||||
GST_PAD_CAPS (currentpad) = newcaps;
|
||||
GST_PAD_CAPS (currentpad) = gst_caps_ref (newcaps);
|
||||
if (GST_RPAD_NEWCAPSFUNC (currentpad))
|
||||
GST_RPAD_NEWCAPSFUNC (currentpad) (GST_PAD (currentpad), newcaps);
|
||||
|
||||
GST_PAD_CAPS (otherpad) = newcaps;
|
||||
GST_PAD_CAPS (otherpad) = gst_caps_ref (newcaps);
|
||||
if (GST_RPAD_NEWCAPSFUNC (otherpad))
|
||||
GST_RPAD_NEWCAPSFUNC (otherpad) (GST_PAD (otherpad), newcaps);
|
||||
}
|
||||
|
|
31
gst/gstpad.h
31
gst/gstpad.h
|
@ -100,6 +100,7 @@ typedef GstBuffer* (*GstPadPullRegionFunction) (GstPad *pad, GstRegionType type
|
|||
typedef gboolean (*GstPadEOSFunction) (GstPad *pad);
|
||||
typedef GstPadNegotiateReturn (*GstPadNegotiateFunction) (GstPad *pad, GstCaps **caps, gpointer *data);
|
||||
typedef void (*GstPadNewCapsFunction) (GstPad *pad, GstCaps *caps);
|
||||
typedef GstBufferPool* (*GstPadBufferPoolFunction) (GstPad *pad);
|
||||
|
||||
typedef enum {
|
||||
GST_PAD_UNKNOWN,
|
||||
|
@ -153,6 +154,7 @@ struct _GstRealPad {
|
|||
|
||||
GstPadNegotiateFunction negotiatefunc;
|
||||
GstPadNewCapsFunction newcapsfunc;
|
||||
GstPadBufferPoolFunction bufferpoolfunc;
|
||||
|
||||
GList *ghostpads;
|
||||
};
|
||||
|
@ -199,6 +201,7 @@ struct _GstGhostPadClass {
|
|||
#define GST_RPAD_EOSFUNC(pad) (((GstRealPad *)(pad))->eosfunc)
|
||||
#define GST_RPAD_NEGOTIATEFUNC(pad) (((GstRealPad *)(pad))->negotiatefunc)
|
||||
#define GST_RPAD_NEWCAPSFUNC(pad) (((GstRealPad *)(pad))->newcapsfunc)
|
||||
#define GST_RPAD_BUFFERPOOLFUNC(pad) (((GstRealPad *)(pad))->bufferpoolfunc)
|
||||
|
||||
#define GST_RPAD_REGIONTYPE(pad) (((GstRealPad *)(pad))->regiontype)
|
||||
#define GST_RPAD_OFFSET(pad) (((GstRealPad *)(pad))->offset)
|
||||
|
@ -252,6 +255,31 @@ struct _GstPadTemplateClass {
|
|||
void (*pad_created) (GstPadTemplate *templ, GstPad *pad);
|
||||
};
|
||||
|
||||
#define GST_PADTEMPLATE_NEW(padname, dir, pres, a...) \
|
||||
gst_padtemplate_new ( \
|
||||
padname, \
|
||||
dir, \
|
||||
pres, \
|
||||
##a, \
|
||||
NULL)
|
||||
|
||||
#define GST_PADTEMPLATE_FACTORY(name, padname, dir, pres, a...) \
|
||||
static GstPadTemplate* \
|
||||
name (void) \
|
||||
{ \
|
||||
static GstPadTemplate *templ = NULL; \
|
||||
if (!templ) { \
|
||||
templ = GST_PADTEMPLATE_NEW ( \
|
||||
padname, \
|
||||
dir, \
|
||||
pres, \
|
||||
##a); \
|
||||
} \
|
||||
return templ; \
|
||||
}
|
||||
|
||||
#define GST_PADTEMPLATE_GET(fact) (fact)()
|
||||
|
||||
|
||||
GtkType gst_pad_get_type (void);
|
||||
GtkType gst_real_pad_get_type (void);
|
||||
|
@ -270,6 +298,7 @@ void gst_pad_set_qos_function (GstPad *pad, GstPadQoSFunction qos);
|
|||
void gst_pad_set_eos_function (GstPad *pad, GstPadEOSFunction eos);
|
||||
void gst_pad_set_negotiate_function (GstPad *pad, GstPadNegotiateFunction nego);
|
||||
void gst_pad_set_newcaps_function (GstPad *pad, GstPadNewCapsFunction newcaps);
|
||||
void gst_pad_set_bufferpool_function (GstPad *pad, GstPadBufferPoolFunction bufpool);
|
||||
|
||||
gboolean gst_pad_set_caps (GstPad *pad, GstCaps *caps);
|
||||
GstCaps* gst_pad_get_caps (GstPad *pad);
|
||||
|
@ -294,6 +323,8 @@ GstPadTemplate* gst_pad_get_padtemplate (GstPad *pad);
|
|||
|
||||
GstPad* gst_pad_get_peer (GstPad *pad);
|
||||
|
||||
GstBufferPool* gst_pad_get_bufferpool (GstPad *pad);
|
||||
|
||||
gboolean gst_pad_connect (GstPad *srcpad, GstPad *sinkpad);
|
||||
void gst_pad_disconnect (GstPad *srcpad, GstPad *sinkpad);
|
||||
|
||||
|
|
|
@ -70,7 +70,8 @@ static GstPadNegotiateReturn gst_queue_handle_negotiate_src (GstPad *pad, GstCa
|
|||
static GstPadNegotiateReturn gst_queue_handle_negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data);
|
||||
static void gst_queue_chain (GstPad *pad, GstBuffer *buf);
|
||||
static GstBuffer * gst_queue_get (GstPad *pad);
|
||||
|
||||
static GstBufferPool* gst_queue_get_bufferpool (GstPad *pad);
|
||||
|
||||
static void gst_queue_flush (GstQueue *queue);
|
||||
|
||||
static GstElementStateReturn gst_queue_change_state (GstElement *element);
|
||||
|
@ -134,6 +135,7 @@ gst_queue_init (GstQueue *queue)
|
|||
gst_element_add_pad (GST_ELEMENT (queue), queue->sinkpad);
|
||||
gst_pad_set_eos_function (queue->sinkpad, gst_queue_handle_eos);
|
||||
gst_pad_set_negotiate_function (queue->sinkpad, gst_queue_handle_negotiate_sink);
|
||||
gst_pad_set_bufferpool_function (queue->sinkpad, gst_queue_get_bufferpool);
|
||||
|
||||
queue->srcpad = gst_pad_new ("src", GST_PAD_SRC);
|
||||
gst_pad_set_get_function (queue->srcpad, GST_DEBUG_FUNCPTR(gst_queue_get));
|
||||
|
@ -152,6 +154,16 @@ gst_queue_init (GstQueue *queue)
|
|||
queue->fullcond = g_cond_new ();
|
||||
}
|
||||
|
||||
static GstBufferPool*
|
||||
gst_queue_get_bufferpool (GstPad *pad)
|
||||
{
|
||||
GstQueue *queue;
|
||||
|
||||
queue = GST_QUEUE (GST_OBJECT_PARENT (pad));
|
||||
|
||||
return gst_pad_get_bufferpool (queue->srcpad);
|
||||
}
|
||||
|
||||
static GstPadNegotiateReturn
|
||||
gst_queue_handle_negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
|
||||
{
|
||||
|
|
|
@ -70,7 +70,8 @@ static GstPadNegotiateReturn gst_queue_handle_negotiate_src (GstPad *pad, GstCa
|
|||
static GstPadNegotiateReturn gst_queue_handle_negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data);
|
||||
static void gst_queue_chain (GstPad *pad, GstBuffer *buf);
|
||||
static GstBuffer * gst_queue_get (GstPad *pad);
|
||||
|
||||
static GstBufferPool* gst_queue_get_bufferpool (GstPad *pad);
|
||||
|
||||
static void gst_queue_flush (GstQueue *queue);
|
||||
|
||||
static GstElementStateReturn gst_queue_change_state (GstElement *element);
|
||||
|
@ -134,6 +135,7 @@ gst_queue_init (GstQueue *queue)
|
|||
gst_element_add_pad (GST_ELEMENT (queue), queue->sinkpad);
|
||||
gst_pad_set_eos_function (queue->sinkpad, gst_queue_handle_eos);
|
||||
gst_pad_set_negotiate_function (queue->sinkpad, gst_queue_handle_negotiate_sink);
|
||||
gst_pad_set_bufferpool_function (queue->sinkpad, gst_queue_get_bufferpool);
|
||||
|
||||
queue->srcpad = gst_pad_new ("src", GST_PAD_SRC);
|
||||
gst_pad_set_get_function (queue->srcpad, GST_DEBUG_FUNCPTR(gst_queue_get));
|
||||
|
@ -152,6 +154,16 @@ gst_queue_init (GstQueue *queue)
|
|||
queue->fullcond = g_cond_new ();
|
||||
}
|
||||
|
||||
static GstBufferPool*
|
||||
gst_queue_get_bufferpool (GstPad *pad)
|
||||
{
|
||||
GstQueue *queue;
|
||||
|
||||
queue = GST_QUEUE (GST_OBJECT_PARENT (pad));
|
||||
|
||||
return gst_pad_get_bufferpool (queue->srcpad);
|
||||
}
|
||||
|
||||
static GstPadNegotiateReturn
|
||||
gst_queue_handle_negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue