miniobject: port rsndvd
This commit is contained in:
parent
cbb7fa5701
commit
c6859960fa
@ -123,13 +123,16 @@ static GstFlowReturn
|
|||||||
rsn_parsetter_chain (GstPad * pad, GstBuffer * buf)
|
rsn_parsetter_chain (GstPad * pad, GstBuffer * buf)
|
||||||
{
|
{
|
||||||
RsnParSetter *parset = RSN_PARSETTER (GST_OBJECT_PARENT (pad));
|
RsnParSetter *parset = RSN_PARSETTER (GST_OBJECT_PARENT (pad));
|
||||||
|
RsnMetaWrapped *meta;
|
||||||
|
|
||||||
|
meta = RSN_META_WRAPPED_GET (buf, FALSE);
|
||||||
|
|
||||||
/* If this is a buffer we wrapped up earlier, unwrap it now */
|
/* If this is a buffer we wrapped up earlier, unwrap it now */
|
||||||
if (RSN_IS_WRAPPEDBUFFER (buf)) {
|
if (meta != NULL) {
|
||||||
RsnWrappedBuffer *wrap_buf = RSN_WRAPPEDBUFFER (buf);
|
GstBuffer *wrap_buf = buf;
|
||||||
|
|
||||||
if (wrap_buf->owner == GST_ELEMENT (parset)) {
|
if (meta->owner == GST_ELEMENT (parset)) {
|
||||||
buf = rsn_wrappedbuffer_unwrap_and_unref (wrap_buf);
|
buf = rsn_meta_wrapped_unwrap_and_unref (wrap_buf, meta);
|
||||||
GST_DEBUG_OBJECT (parset, "Unwrapping %p yields buffer %p with caps %"
|
GST_DEBUG_OBJECT (parset, "Unwrapping %p yields buffer %p with caps %"
|
||||||
GST_PTR_FORMAT, wrap_buf, buf, GST_BUFFER_CAPS (buf));
|
GST_PTR_FORMAT, wrap_buf, buf, GST_BUFFER_CAPS (buf));
|
||||||
}
|
}
|
||||||
@ -378,15 +381,12 @@ rsn_parsetter_sink_bufferalloc (GstPad * pad, guint64 offset, guint size,
|
|||||||
if (ret != GST_FLOW_OK)
|
if (ret != GST_FLOW_OK)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
outbuf = (GstBuffer *) rsn_wrapped_buffer_new (orig_buf);
|
outbuf = rsn_wrapped_buffer_new (orig_buf, GST_ELEMENT_CAST (parset));
|
||||||
if (!outbuf) {
|
if (!outbuf) {
|
||||||
/* FIXME: Throw error */
|
/* FIXME: Throw error */
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
rsn_wrapped_buffer_set_owner (RSN_WRAPPEDBUFFER (outbuf),
|
|
||||||
GST_ELEMENT (parset));
|
|
||||||
|
|
||||||
gst_buffer_set_caps (outbuf, caps);
|
gst_buffer_set_caps (outbuf, caps);
|
||||||
|
|
||||||
GST_LOG_OBJECT (parset,
|
GST_LOG_OBJECT (parset,
|
||||||
|
@ -26,53 +26,19 @@
|
|||||||
|
|
||||||
#include "rsnwrappedbuffer.h"
|
#include "rsnwrappedbuffer.h"
|
||||||
|
|
||||||
G_DEFINE_TYPE (RsnWrappedBuffer, rsn_wrappedbuffer, GST_TYPE_BUFFER);
|
GstBuffer *
|
||||||
|
rsn_wrapped_buffer_new (GstBuffer * buf_to_wrap, GstElement * owner)
|
||||||
static gboolean
|
|
||||||
rsn_wrapped_buffer_default_release (GstElement * owner, RsnWrappedBuffer * buf);
|
|
||||||
|
|
||||||
static void rsn_wrapped_buffer_finalize (RsnWrappedBuffer * wrap_buf);
|
|
||||||
|
|
||||||
static void
|
|
||||||
rsn_wrappedbuffer_class_init (RsnWrappedBufferClass * klass)
|
|
||||||
{
|
{
|
||||||
GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (klass);
|
GstBuffer *buf;
|
||||||
|
RsnMetaWrapped *meta;
|
||||||
|
|
||||||
mini_object_class->finalize = (GstMiniObjectFinalizeFunction)
|
|
||||||
rsn_wrapped_buffer_finalize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
rsn_wrappedbuffer_init (RsnWrappedBuffer * self)
|
|
||||||
{
|
|
||||||
self->release = rsn_wrapped_buffer_default_release;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
rsn_wrapped_buffer_finalize (RsnWrappedBuffer * wrap_buf)
|
|
||||||
{
|
|
||||||
if (wrap_buf->release) {
|
|
||||||
/* Release might increment the refcount to recycle and return TRUE,
|
|
||||||
* in which case, exit without chaining up */
|
|
||||||
if (wrap_buf->release (wrap_buf->owner, wrap_buf))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_MINI_OBJECT_CLASS (rsn_wrappedbuffer_parent_class)->finalize
|
|
||||||
(GST_MINI_OBJECT (wrap_buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
RsnWrappedBuffer *
|
|
||||||
rsn_wrapped_buffer_new (GstBuffer * buf_to_wrap)
|
|
||||||
{
|
|
||||||
RsnWrappedBuffer *buf;
|
|
||||||
g_return_val_if_fail (buf_to_wrap, NULL);
|
g_return_val_if_fail (buf_to_wrap, NULL);
|
||||||
|
|
||||||
buf = (RsnWrappedBuffer *) gst_mini_object_new (RSN_TYPE_WRAPPEDBUFFER);
|
buf = gst_buffer_new ();
|
||||||
if (buf == NULL)
|
meta = RSN_META_WRAPPED_GET (buf, TRUE);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
buf->wrapped_buffer = buf_to_wrap;
|
meta->wrapped_buffer = buf_to_wrap;
|
||||||
|
meta->owner = gst_object_ref (owner);
|
||||||
|
|
||||||
GST_BUFFER_DATA (buf) = GST_BUFFER_DATA (buf_to_wrap);
|
GST_BUFFER_DATA (buf) = GST_BUFFER_DATA (buf_to_wrap);
|
||||||
GST_BUFFER_SIZE (buf) = GST_BUFFER_SIZE (buf_to_wrap);
|
GST_BUFFER_SIZE (buf) = GST_BUFFER_SIZE (buf_to_wrap);
|
||||||
@ -86,52 +52,29 @@ rsn_wrapped_buffer_new (GstBuffer * buf_to_wrap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rsn_wrapped_buffer_set_owner (RsnWrappedBuffer * wrapped_buf,
|
rsn_meta_wrapped_set_owner (RsnMetaWrapped * meta, GstElement * owner)
|
||||||
GstElement * owner)
|
|
||||||
{
|
{
|
||||||
g_return_if_fail (wrapped_buf != NULL);
|
g_return_if_fail (meta != NULL);
|
||||||
|
|
||||||
if (wrapped_buf->owner)
|
if (meta->owner)
|
||||||
gst_object_unref (wrapped_buf->owner);
|
gst_object_unref (meta->owner);
|
||||||
|
|
||||||
if (owner)
|
if (owner)
|
||||||
wrapped_buf->owner = gst_object_ref (owner);
|
gst_object_ref (owner);
|
||||||
else
|
|
||||||
wrapped_buf->owner = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
meta->owner = owner;
|
||||||
rsn_wrapped_buffer_set_releasefunc (RsnWrappedBuffer * wrapped_buf,
|
|
||||||
RsnWrappedBufferReleaseFunc release_func)
|
|
||||||
{
|
|
||||||
g_return_if_fail (wrapped_buf != NULL);
|
|
||||||
|
|
||||||
wrapped_buf->release = release_func;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
rsn_wrapped_buffer_default_release (GstElement * owner, RsnWrappedBuffer * buf)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (buf != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (buf->wrapped_buffer != NULL, FALSE);
|
|
||||||
|
|
||||||
gst_buffer_unref (buf->wrapped_buffer);
|
|
||||||
if (buf->owner)
|
|
||||||
gst_object_unref (buf->owner);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GstBuffer *
|
GstBuffer *
|
||||||
rsn_wrappedbuffer_unwrap_and_unref (RsnWrappedBuffer * wrap_buf)
|
rsn_meta_wrapped_unwrap_and_unref (GstBuffer * wrap_buf, RsnMetaWrapped * meta)
|
||||||
{
|
{
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
gboolean is_readonly;
|
gboolean is_readonly;
|
||||||
|
|
||||||
g_return_val_if_fail (wrap_buf != NULL, NULL);
|
g_return_val_if_fail (wrap_buf != NULL, NULL);
|
||||||
g_return_val_if_fail (wrap_buf->wrapped_buffer != NULL, NULL);
|
g_return_val_if_fail (meta->wrapped_buffer != NULL, NULL);
|
||||||
|
|
||||||
buf = gst_buffer_ref (wrap_buf->wrapped_buffer);
|
buf = gst_buffer_ref (meta->wrapped_buffer);
|
||||||
|
|
||||||
/* Copy changed metadata back to the wrapped buffer from the wrapper,
|
/* Copy changed metadata back to the wrapped buffer from the wrapper,
|
||||||
* except the the read-only flag and the caps. */
|
* except the the read-only flag and the caps. */
|
||||||
@ -141,7 +84,38 @@ rsn_wrappedbuffer_unwrap_and_unref (RsnWrappedBuffer * wrap_buf)
|
|||||||
if (!is_readonly)
|
if (!is_readonly)
|
||||||
GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_READONLY);
|
GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_READONLY);
|
||||||
|
|
||||||
gst_buffer_unref (GST_BUFFER (wrap_buf));
|
gst_buffer_unref (wrap_buf);
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rsn_meta_wrapped_init (RsnMetaWrapped * meta, GstBuffer * buffer)
|
||||||
|
{
|
||||||
|
meta->owner = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rsn_meta_wrapped_free (RsnMetaWrapped * meta, GstBuffer * buffer)
|
||||||
|
{
|
||||||
|
gst_buffer_unref (meta->wrapped_buffer);
|
||||||
|
if (meta->owner)
|
||||||
|
gst_object_unref (meta->owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
const GstMetaInfo *
|
||||||
|
rsn_meta_wrapped_get_info (void)
|
||||||
|
{
|
||||||
|
static const GstMetaInfo *meta_info = NULL;
|
||||||
|
|
||||||
|
if (meta_info == NULL) {
|
||||||
|
meta_info = gst_meta_register ("RsnMetaWrapped", "RsnMetaWrapped",
|
||||||
|
sizeof (RsnMetaWrapped),
|
||||||
|
(GstMetaInitFunction) rsn_meta_wrapped_init,
|
||||||
|
(GstMetaFreeFunction) rsn_meta_wrapped_free,
|
||||||
|
(GstMetaCopyFunction) NULL,
|
||||||
|
(GstMetaSubFunction) NULL,
|
||||||
|
(GstMetaSerializeFunction) NULL, (GstMetaDeserializeFunction) NULL);
|
||||||
|
}
|
||||||
|
return meta_info;
|
||||||
|
}
|
||||||
|
@ -24,45 +24,24 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define RSN_TYPE_WRAPPEDBUFFER (rsn_wrappedbuffer_get_type())
|
typedef struct _RsnMetaWrapped RsnMetaWrapped;
|
||||||
#define RSN_WRAPPEDBUFFER(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST((obj), RSN_TYPE_WRAPPEDBUFFER, \
|
|
||||||
RsnWrappedBuffer))
|
|
||||||
#define RSN_WRAPPEDBUFFER_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST((klass), RSN_TYPE_WRAPPEDBUFFER, \
|
|
||||||
RsnWrappedBufferClass))
|
|
||||||
#define RSN_IS_WRAPPEDBUFFER(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj), RSN_TYPE_WRAPPEDBUFFER))
|
|
||||||
#define RSN_IS_WRAPPEDBUFFER_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass), RSN_TYPE_WRAPPEDBUFFER))
|
|
||||||
|
|
||||||
typedef struct _RsnWrappedBuffer RsnWrappedBuffer;
|
struct _RsnMetaWrapped {
|
||||||
typedef struct _RsnWrappedBufferClass RsnWrappedBufferClass;
|
GstMeta meta;
|
||||||
|
|
||||||
typedef gboolean (*RsnWrappedBufferReleaseFunc)(GstElement *owner,
|
|
||||||
RsnWrappedBuffer *buf);
|
|
||||||
|
|
||||||
struct _RsnWrappedBuffer {
|
|
||||||
GstBuffer buffer;
|
|
||||||
GstBuffer *wrapped_buffer;
|
GstBuffer *wrapped_buffer;
|
||||||
|
|
||||||
GstElement *owner;
|
GstElement *owner;
|
||||||
RsnWrappedBufferReleaseFunc release;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _RsnWrappedBufferClass
|
GstBuffer *rsn_wrapped_buffer_new (GstBuffer *buf_to_wrap, GstElement *owner);
|
||||||
{
|
|
||||||
GstBufferClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
RsnWrappedBuffer *rsn_wrapped_buffer_new (GstBuffer *buf_to_wrap);
|
GstBuffer *rsn_meta_wrapped_unwrap_and_unref (GstBuffer *wrap_buf, RsnMetaWrapped *meta);
|
||||||
GstBuffer *rsn_wrappedbuffer_unwrap_and_unref (RsnWrappedBuffer *wrap_buf);
|
|
||||||
void rsn_wrapped_buffer_set_owner (RsnWrappedBuffer *wrapped_buf,
|
|
||||||
GstElement *owner);
|
|
||||||
void rsn_wrapped_buffer_set_releasefunc (RsnWrappedBuffer *wrapped_buf,
|
|
||||||
RsnWrappedBufferReleaseFunc release_func);
|
|
||||||
|
|
||||||
GType rsn_wrappedbuffer_get_type (void);
|
void rsn_meta_wrapped_set_owner (RsnMetaWrapped *meta, GstElement *owner);
|
||||||
|
|
||||||
|
const GstMetaInfo * rsn_meta_wrapped_get_info (void);
|
||||||
|
|
||||||
|
#define RSN_META_WRAPPED_GET(buf,create) ((RsnMetaWrapped *)gst_buffer_get_meta(buf,rsn_meta_wrapped_get_info(),create))
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user