mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-22 22:16:22 +00:00
- Added first attempt at general caching mechanism (GstTimeCache renamed to GstCache)
Original commit message from CVS: - Added first attempt at general caching mechanism (GstTimeCache renamed to GstCache) - Some more clocking checks and updates (waiting on GST_CLOCK_TIME_NONE returns immediatly instead of blocking forever) - Moved clock get/set functions to element class instead of instance. - Added cache methods on elements. - Renamed GST_PROPS_BOOL_TYPE to GST_PROPS_BOOLEAN_TYPE to make it more consistent with gst_props_get/set_boolean and GST_PROPS_BOOLEAN. - Give short stats about plugins in gst-inspect.
This commit is contained in:
parent
86376a2402
commit
a48bce0ad6
16 changed files with 761 additions and 42 deletions
2
common
2
common
|
@ -1 +1 @@
|
||||||
Subproject commit 1ca7d9a20180cab830f4383cde5ba932338e50b1
|
Subproject commit f2d9b99515c73da09bfe307d273d320f79a226da
|
|
@ -56,6 +56,7 @@ libgstreamer_la_SOURCES = \
|
||||||
gstbin.c \
|
gstbin.c \
|
||||||
gstbuffer.c \
|
gstbuffer.c \
|
||||||
gstbufferpool-default.c \
|
gstbufferpool-default.c \
|
||||||
|
gstcache.c \
|
||||||
gstcaps.c \
|
gstcaps.c \
|
||||||
gstclock.c \
|
gstclock.c \
|
||||||
gstcpu.c \
|
gstcpu.c \
|
||||||
|
@ -83,7 +84,6 @@ libgstreamer_la_SOURCES = \
|
||||||
$(GST_TYPEFIND_SRC) \
|
$(GST_TYPEFIND_SRC) \
|
||||||
gstutils.c \
|
gstutils.c \
|
||||||
gstregistry.c \
|
gstregistry.c \
|
||||||
gsttimecache.c \
|
|
||||||
$(GST_PARSE_SRC) \
|
$(GST_PARSE_SRC) \
|
||||||
$(GSTARCH_SRCS) \
|
$(GSTARCH_SRCS) \
|
||||||
$(GST_LOADSAVE_SRC)
|
$(GST_LOADSAVE_SRC)
|
||||||
|
@ -103,6 +103,7 @@ gst_headers = \
|
||||||
gstbin.h \
|
gstbin.h \
|
||||||
gstbuffer.h \
|
gstbuffer.h \
|
||||||
gstbufferpool-default.h \
|
gstbufferpool-default.h \
|
||||||
|
gstcache.h \
|
||||||
gstcaps.h \
|
gstcaps.h \
|
||||||
gstclock.h \
|
gstclock.h \
|
||||||
gstcpu.h \
|
gstcpu.h \
|
||||||
|
@ -129,7 +130,6 @@ gst_headers = \
|
||||||
gsttypefind.h \
|
gsttypefind.h \
|
||||||
gstutils.h \
|
gstutils.h \
|
||||||
gstregistry.h \
|
gstregistry.h \
|
||||||
gsttimecache.h \
|
|
||||||
gstparse.h \
|
gstparse.h \
|
||||||
gstxml.h
|
gstxml.h
|
||||||
|
|
||||||
|
|
|
@ -134,6 +134,7 @@ gst_fakesink_class_init (GstFakeSinkClass *klass)
|
||||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_fakesink_get_property);
|
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_fakesink_get_property);
|
||||||
|
|
||||||
gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_fakesink_request_new_pad);
|
gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_fakesink_request_new_pad);
|
||||||
|
gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_fakesink_set_clock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -150,8 +151,6 @@ gst_fakesink_init (GstFakeSink *fakesink)
|
||||||
fakesink->sync = FALSE;
|
fakesink->sync = FALSE;
|
||||||
fakesink->last_message = NULL;
|
fakesink->last_message = NULL;
|
||||||
|
|
||||||
GST_ELEMENT (fakesink)->setclockfunc = gst_fakesink_set_clock;
|
|
||||||
|
|
||||||
GST_FLAG_SET (fakesink, GST_ELEMENT_EVENT_AWARE);
|
GST_FLAG_SET (fakesink, GST_ELEMENT_EVENT_AWARE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <gst/gstpad.h>
|
#include <gst/gstpad.h>
|
||||||
#include <gst/gstbuffer.h>
|
#include <gst/gstbuffer.h>
|
||||||
#include <gst/gstbufferpool-default.h>
|
#include <gst/gstbufferpool-default.h>
|
||||||
|
#include <gst/gstcache.h>
|
||||||
#include <gst/gstcpu.h>
|
#include <gst/gstcpu.h>
|
||||||
#include <gst/gstelement.h>
|
#include <gst/gstelement.h>
|
||||||
#include <gst/gstbin.h>
|
#include <gst/gstbin.h>
|
||||||
|
@ -49,7 +50,6 @@
|
||||||
#include <gst/gsttrace.h>
|
#include <gst/gsttrace.h>
|
||||||
#include <gst/gstxml.h>
|
#include <gst/gstxml.h>
|
||||||
#include <gst/gstscheduler.h>
|
#include <gst/gstscheduler.h>
|
||||||
#include <gst/gsttimecache.h>
|
|
||||||
#include <gst/gstevent.h>
|
#include <gst/gstevent.h>
|
||||||
#include <gst/gstclock.h>
|
#include <gst/gstclock.h>
|
||||||
#include <gst/gstsystemclock.h>
|
#include <gst/gstsystemclock.h>
|
||||||
|
|
407
gst/gstcache.c
Normal file
407
gst/gstcache.c
Normal file
|
@ -0,0 +1,407 @@
|
||||||
|
/* GStreamer
|
||||||
|
* Copyright (C) 2001 RidgeRun (http://www.ridgerun.com/)
|
||||||
|
* Written by Erik Walthinsen <omega@ridgerun.com>
|
||||||
|
*
|
||||||
|
* gstcache.c: Cache for mappings and other data
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gstlog.h"
|
||||||
|
#include "gst_private.h"
|
||||||
|
|
||||||
|
#include "gstcache.h"
|
||||||
|
|
||||||
|
/* Cache signals and args */
|
||||||
|
enum {
|
||||||
|
ENTRY_ADDED,
|
||||||
|
LAST_SIGNAL
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
ARG_0,
|
||||||
|
/* FILL ME */
|
||||||
|
};
|
||||||
|
|
||||||
|
static void gst_cache_class_init (GstCacheClass *klass);
|
||||||
|
static void gst_cache_init (GstCache *tc);
|
||||||
|
|
||||||
|
#define CLASS(cache) GST_CACHE_CLASS (G_OBJECT_GET_CLASS (cache))
|
||||||
|
|
||||||
|
static GstObject *parent_class = NULL;
|
||||||
|
static guint gst_cache_signals[LAST_SIGNAL] = { 0 };
|
||||||
|
|
||||||
|
GType
|
||||||
|
gst_cache_get_type(void) {
|
||||||
|
static GType tc_type = 0;
|
||||||
|
|
||||||
|
if (!tc_type) {
|
||||||
|
static const GTypeInfo tc_info = {
|
||||||
|
sizeof(GstCacheClass),
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
(GClassInitFunc)gst_cache_class_init,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
sizeof(GstCache),
|
||||||
|
1,
|
||||||
|
(GInstanceInitFunc)gst_cache_init,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
tc_type = g_type_register_static(GST_TYPE_OBJECT, "GstCache", &tc_info, 0);
|
||||||
|
}
|
||||||
|
return tc_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_cache_class_init (GstCacheClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *gobject_class;
|
||||||
|
GstElementClass *gstelement_class;
|
||||||
|
|
||||||
|
gobject_class = (GObjectClass*)klass;
|
||||||
|
gstelement_class = (GstElementClass*)klass;
|
||||||
|
|
||||||
|
parent_class = g_type_class_ref(GST_TYPE_OBJECT);
|
||||||
|
|
||||||
|
gst_cache_signals[ENTRY_ADDED] =
|
||||||
|
g_signal_new ("entry_added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
|
||||||
|
G_STRUCT_OFFSET (GstCacheClass, entry_added), NULL, NULL,
|
||||||
|
gst_marshal_VOID__POINTER, G_TYPE_NONE, 1,
|
||||||
|
G_TYPE_POINTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GstCacheGroup *
|
||||||
|
gst_cache_group_new(guint groupnum)
|
||||||
|
{
|
||||||
|
GstCacheGroup *tcgroup = g_new(GstCacheGroup,1);
|
||||||
|
|
||||||
|
tcgroup->groupnum = groupnum;
|
||||||
|
tcgroup->entries = NULL;
|
||||||
|
tcgroup->certainty = GST_CACHE_UNKNOWN;
|
||||||
|
tcgroup->peergroup = -1;
|
||||||
|
|
||||||
|
GST_DEBUG(0, "created new cache group %d",groupnum);
|
||||||
|
|
||||||
|
return tcgroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_cache_init (GstCache *tc)
|
||||||
|
{
|
||||||
|
tc->curgroup = gst_cache_group_new(0);
|
||||||
|
tc->maxgroup = 0;
|
||||||
|
tc->groups = g_list_prepend(NULL, tc->curgroup);
|
||||||
|
|
||||||
|
tc->writers = g_hash_table_new (NULL, NULL);
|
||||||
|
tc->last_id = 0;
|
||||||
|
|
||||||
|
GST_DEBUG(0, "created new cache");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_cache_new:
|
||||||
|
*
|
||||||
|
* Create a new tilecache object
|
||||||
|
*
|
||||||
|
* Returns: a new cache object
|
||||||
|
*/
|
||||||
|
GstCache *
|
||||||
|
gst_cache_new()
|
||||||
|
{
|
||||||
|
GstCache *tc;
|
||||||
|
|
||||||
|
tc = g_object_new (gst_cache_get_type (), NULL);
|
||||||
|
|
||||||
|
return tc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_cache_get_group:
|
||||||
|
* @tc: the cache to get the current group from
|
||||||
|
*
|
||||||
|
* Get the id of the current group.
|
||||||
|
*
|
||||||
|
* Returns: the id of the current group.
|
||||||
|
*/
|
||||||
|
gint
|
||||||
|
gst_cache_get_group(GstCache *tc)
|
||||||
|
{
|
||||||
|
return tc->curgroup->groupnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_cache_new_group:
|
||||||
|
* @tc: the cache to create the new group in
|
||||||
|
*
|
||||||
|
* Create a new group for the given cache. It will be
|
||||||
|
* set as the current group.
|
||||||
|
*
|
||||||
|
* Returns: the id of the newly created group.
|
||||||
|
*/
|
||||||
|
gint
|
||||||
|
gst_cache_new_group(GstCache *tc)
|
||||||
|
{
|
||||||
|
tc->curgroup = gst_cache_group_new(++tc->maxgroup);
|
||||||
|
tc->groups = g_list_append(tc->groups,tc->curgroup);
|
||||||
|
GST_DEBUG(0, "created new group %d in cache",tc->maxgroup);
|
||||||
|
return tc->maxgroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_cache_set_group:
|
||||||
|
* @tc: the cache to set the new group in
|
||||||
|
* @groupnum: the groupnumber to set
|
||||||
|
*
|
||||||
|
* Set the current groupnumber to the given argument.
|
||||||
|
*
|
||||||
|
* Returns: TRUE if the operation succeeded, FALSE if the group
|
||||||
|
* did not exist.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_cache_set_group(GstCache *tc, gint groupnum)
|
||||||
|
{
|
||||||
|
GList *list;
|
||||||
|
GstCacheGroup *tcgroup;
|
||||||
|
|
||||||
|
/* first check for null change */
|
||||||
|
if (groupnum == tc->curgroup->groupnum)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* else search for the proper group */
|
||||||
|
list = tc->groups;
|
||||||
|
while (list) {
|
||||||
|
tcgroup = (GstCacheGroup *)(list->data);
|
||||||
|
list = g_list_next(list);
|
||||||
|
if (tcgroup->groupnum == groupnum) {
|
||||||
|
tc->curgroup = tcgroup;
|
||||||
|
GST_DEBUG(0, "switched to cache group %d", tcgroup->groupnum);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* couldn't find the group in question */
|
||||||
|
GST_DEBUG(0, "couldn't find cache group %d",groupnum);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_cache_set_certainty:
|
||||||
|
* @tc: the cache to set the certainty on
|
||||||
|
* @certainty: the certainty to set
|
||||||
|
*
|
||||||
|
* Set the certainty of the given cache.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_cache_set_certainty(GstCache *tc, GstCacheCertainty certainty)
|
||||||
|
{
|
||||||
|
tc->curgroup->certainty = certainty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_cache_get_certainty:
|
||||||
|
* @tc: the cache to get the certainty of
|
||||||
|
*
|
||||||
|
* Get the certainty of the given cache.
|
||||||
|
*
|
||||||
|
* Returns: the certainty of the cache.
|
||||||
|
*/
|
||||||
|
GstCacheCertainty
|
||||||
|
gst_cache_get_certainty(GstCache *tc)
|
||||||
|
{
|
||||||
|
return tc->curgroup->certainty;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_cache_add_format:
|
||||||
|
* @tc: the cache to add the entry to
|
||||||
|
* @id: the id of the cache writer
|
||||||
|
* @format: the format to add to the cache
|
||||||
|
*
|
||||||
|
* Adds a format entry into the cache. This function is
|
||||||
|
* used to map dynamic GstFormat ids to their original
|
||||||
|
* format key.
|
||||||
|
*
|
||||||
|
* Returns: a pointer to the newly added entry in the cache.
|
||||||
|
*/
|
||||||
|
GstCacheEntry*
|
||||||
|
gst_cache_add_format (GstCache *tc, gint id, GstFormat format)
|
||||||
|
{
|
||||||
|
GstCacheEntry *entry;
|
||||||
|
const GstFormatDefinition* def;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_CACHE (tc), NULL);
|
||||||
|
g_return_val_if_fail (format != 0, NULL);
|
||||||
|
|
||||||
|
entry = g_new0 (GstCacheEntry, 1);
|
||||||
|
entry->type = GST_CACHE_ENTRY_FORMAT;
|
||||||
|
entry->id = id;
|
||||||
|
entry->data.format.format = format;
|
||||||
|
def = gst_format_get_details (format);
|
||||||
|
entry->data.format.key = def->nick;
|
||||||
|
|
||||||
|
g_signal_emit (G_OBJECT (tc), gst_cache_signals[ENTRY_ADDED], 0, entry);
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_cache_add_id:
|
||||||
|
* @tc: the cache to add the entry to
|
||||||
|
* @id: the id of the cache writer
|
||||||
|
* @description: the description of the cache writer
|
||||||
|
*
|
||||||
|
* Returns: a pointer to the newly added entry in the cache.
|
||||||
|
*/
|
||||||
|
GstCacheEntry*
|
||||||
|
gst_cache_add_id (GstCache *tc, gint id, gchar *description)
|
||||||
|
{
|
||||||
|
GstCacheEntry *entry;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_CACHE (tc), NULL);
|
||||||
|
g_return_val_if_fail (description != NULL, NULL);
|
||||||
|
|
||||||
|
entry = g_new0 (GstCacheEntry, 1);
|
||||||
|
entry->type = GST_CACHE_ENTRY_ID;
|
||||||
|
entry->id = id;
|
||||||
|
entry->data.id.description = description;
|
||||||
|
|
||||||
|
g_signal_emit (G_OBJECT (tc), gst_cache_signals[ENTRY_ADDED], 0, entry);
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_cache_get_writer_id:
|
||||||
|
* @tc: the cache to get a unique write id for
|
||||||
|
* @writer: the GstObject to allocate an id for
|
||||||
|
* @id: a pointer to a gint to hold the id
|
||||||
|
*
|
||||||
|
* Before entries can be added to the cache, a writer
|
||||||
|
* should obtain a unique id. The methods to add new entries
|
||||||
|
* to the cache require this id as an argument.
|
||||||
|
*
|
||||||
|
* The application or a GstCache subclass can implement
|
||||||
|
* custom functions to map the writer object to an id.
|
||||||
|
*
|
||||||
|
* Returns: TRUE if the writer would be mapped to an id.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_cache_get_writer_id (GstCache *tc, GstObject *writer, gint *id)
|
||||||
|
{
|
||||||
|
gchar *writer_string = NULL;
|
||||||
|
gboolean success = FALSE;
|
||||||
|
GstCacheEntry *entry;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_CACHE (tc), FALSE);
|
||||||
|
g_return_val_if_fail (GST_IS_OBJECT (writer), FALSE);
|
||||||
|
g_return_val_if_fail (id, FALSE);
|
||||||
|
|
||||||
|
*id = -1;
|
||||||
|
|
||||||
|
entry = g_hash_table_lookup (tc->writers, writer);
|
||||||
|
if (entry == NULL) {
|
||||||
|
*id = tc->last_id;
|
||||||
|
|
||||||
|
writer_string = gst_object_get_path_string (writer);
|
||||||
|
|
||||||
|
gst_cache_add_id (tc, *id, writer_string);
|
||||||
|
tc->last_id++;
|
||||||
|
g_hash_table_insert (tc->writers, writer, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CLASS (tc)->resolve_writer) {
|
||||||
|
success = CLASS (tc)->resolve_writer (tc, writer, id, &writer_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tc->resolver) {
|
||||||
|
success = tc->resolver (tc, writer, id, &writer_string, tc->user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_cache_add_association:
|
||||||
|
* @tc: the cache to add the entry to
|
||||||
|
* @id: the id of the cache writer
|
||||||
|
* @format: the format of the value
|
||||||
|
* @value: the value
|
||||||
|
* @...: other format/value pairs or 0 to end the list
|
||||||
|
*
|
||||||
|
* Associate given format/value pairs with eachother.
|
||||||
|
*
|
||||||
|
* Returns: a pointer to the newly added entry in the cache.
|
||||||
|
*/
|
||||||
|
GstCacheEntry*
|
||||||
|
gst_cache_add_association (GstCache *tc, gint id, GstAssocFlags flags,
|
||||||
|
GstFormat format, gint64 value, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
GstCacheAssociation *assoc;
|
||||||
|
GstCacheEntry *entry;
|
||||||
|
gulong size;
|
||||||
|
gint nassocs = 0;
|
||||||
|
GstFormat cur_format;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_CACHE (tc), NULL);
|
||||||
|
g_return_val_if_fail (format != 0, NULL);
|
||||||
|
|
||||||
|
va_start (args, value);
|
||||||
|
|
||||||
|
cur_format = format;
|
||||||
|
|
||||||
|
while (cur_format) {
|
||||||
|
nassocs++;
|
||||||
|
cur_format = va_arg (args, GstFormat);
|
||||||
|
if (cur_format)
|
||||||
|
va_arg (args, gint64);
|
||||||
|
}
|
||||||
|
va_end (args);
|
||||||
|
|
||||||
|
/* make room for two assoc */
|
||||||
|
size = sizeof (GstCacheEntry) + (sizeof (GstCacheAssociation) * nassocs);
|
||||||
|
|
||||||
|
entry = g_malloc (size);
|
||||||
|
|
||||||
|
entry->type = GST_CACHE_ENTRY_ASSOCIATION;
|
||||||
|
entry->id = id;
|
||||||
|
entry->data.assoc.flags = flags;
|
||||||
|
assoc = (GstCacheAssociation *) (((guint8 *) entry) + sizeof (GstCacheEntry));
|
||||||
|
entry->data.assoc.assocs = assoc;
|
||||||
|
entry->data.assoc.nassocs = nassocs;
|
||||||
|
|
||||||
|
va_start (args, value);
|
||||||
|
while (format) {
|
||||||
|
assoc->format = format;
|
||||||
|
assoc->value = value;
|
||||||
|
|
||||||
|
assoc++;
|
||||||
|
|
||||||
|
format = va_arg (args, GstFormat);
|
||||||
|
if (format)
|
||||||
|
value = va_arg (args, gint64);
|
||||||
|
}
|
||||||
|
va_end (args);
|
||||||
|
|
||||||
|
if (CLASS (tc)->add_entry)
|
||||||
|
CLASS (tc)->add_entry (tc, entry);
|
||||||
|
|
||||||
|
g_signal_emit (G_OBJECT (tc), gst_cache_signals[ENTRY_ADDED], 0, entry);
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
182
gst/gstcache.h
Normal file
182
gst/gstcache.h
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
/* GStreamer
|
||||||
|
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||||
|
* 2000 Wim Taymans <wim.taymans@chello.be>
|
||||||
|
*
|
||||||
|
* gstcache.h: Header for GstCache
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GST_CACHE_H__
|
||||||
|
#define __GST_CACHE_H__
|
||||||
|
|
||||||
|
#include <gst/gstobject.h>
|
||||||
|
#include <gst/gstformat.h>
|
||||||
|
#include <gst/gstcaps.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define GST_TYPE_CACHE (gst_cache_get_type ())
|
||||||
|
#define GST_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CACHE, GstCache))
|
||||||
|
#define GST_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CACHE, GstCacheClass))
|
||||||
|
#define GST_IS_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CACHE))
|
||||||
|
#define GST_IS_CACHE_CLASS(obj) (GST_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CACHE))
|
||||||
|
|
||||||
|
typedef struct _GstCacheEntry GstCacheEntry;
|
||||||
|
typedef struct _GstCacheGroup GstCacheGroup;
|
||||||
|
typedef struct _GstCache GstCache;
|
||||||
|
typedef struct _GstCacheClass GstCacheClass;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GST_CACHE_UNKNOWN,
|
||||||
|
GST_CACHE_CERTAIN,
|
||||||
|
GST_CACHE_FUZZY
|
||||||
|
} GstCacheCertainty;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GST_CACHE_ENTRY_ID,
|
||||||
|
GST_CACHE_ENTRY_ASSOCIATION,
|
||||||
|
GST_CACHE_ENTRY_OBJECT,
|
||||||
|
GST_CACHE_ENTRY_FORMAT,
|
||||||
|
} GstCacheEntryType;
|
||||||
|
|
||||||
|
#define GST_CACHE_NASSOCS(entry) ((entry)->data.assoc.nassocs)
|
||||||
|
#define GST_CACHE_ASSOC_FLAGS(entry) ((entry)->data.assoc.flags)
|
||||||
|
#define GST_CACHE_ASSOC_FORMAT(entry,i) ((entry)->data.assoc.assocs[(i)].format)
|
||||||
|
#define GST_CACHE_ASSOC_VALUE(entry,i) ((entry)->data.assoc.assocs[(i)].value)
|
||||||
|
|
||||||
|
typedef struct _GstCacheAssociation GstCacheAssociation;
|
||||||
|
|
||||||
|
struct _GstCacheAssociation {
|
||||||
|
GstFormat format;
|
||||||
|
gint64 value;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GST_ACCOCIATION_FLAG_NONE = 0,
|
||||||
|
GST_ACCOCIATION_FLAG_KEY_UNIT = (1 << 0),
|
||||||
|
} GstAssocFlags;
|
||||||
|
|
||||||
|
#define GST_CACHE_FORMAT_FORMAT(entry) ((entry)->data.format.format)
|
||||||
|
#define GST_CACHE_FORMAT_KEY(entry) ((entry)->data.format.key)
|
||||||
|
|
||||||
|
#define GST_CACHE_ID_DESCRIPTION(entry) ((entry)->data.id.description)
|
||||||
|
|
||||||
|
struct _GstCacheEntry {
|
||||||
|
GstCacheEntryType type;
|
||||||
|
gint id;
|
||||||
|
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
gchar *description;
|
||||||
|
} id;
|
||||||
|
struct {
|
||||||
|
gint nassocs;
|
||||||
|
GstCacheAssociation
|
||||||
|
*assocs;
|
||||||
|
GstAssocFlags flags;
|
||||||
|
} assoc;
|
||||||
|
struct {
|
||||||
|
gchar *key;
|
||||||
|
GType type;
|
||||||
|
gpointer object;
|
||||||
|
} object;
|
||||||
|
struct {
|
||||||
|
GstFormat format;
|
||||||
|
gchar *key;
|
||||||
|
} format;
|
||||||
|
} data;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _GstCacheGroup {
|
||||||
|
/* unique ID of group in cache */
|
||||||
|
gint groupnum;
|
||||||
|
|
||||||
|
/* list of entries */
|
||||||
|
GList *entries;
|
||||||
|
|
||||||
|
/* the certainty level of the group */
|
||||||
|
GstCacheCertainty certainty;
|
||||||
|
|
||||||
|
/* peer group that contains more certain entries */
|
||||||
|
gint peergroup;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef gboolean (*GstCacheWriterResolver) (GstCache *cache,
|
||||||
|
GstObject *writer,
|
||||||
|
gint *writer_id,
|
||||||
|
gchar **writer_string,
|
||||||
|
gpointer user_data);
|
||||||
|
struct _GstCache {
|
||||||
|
GstObject object;
|
||||||
|
|
||||||
|
GList *groups;
|
||||||
|
GstCacheGroup *curgroup;
|
||||||
|
gint maxgroup;
|
||||||
|
|
||||||
|
GstCacheWriterResolver resolver;
|
||||||
|
gpointer user_data;
|
||||||
|
|
||||||
|
GHashTable *writers;
|
||||||
|
gint last_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _GstCacheClass {
|
||||||
|
GstObjectClass parent_class;
|
||||||
|
|
||||||
|
gboolean (*resolve_writer) (GstCache *cache, GstObject *writer,
|
||||||
|
gint *writer_id, gchar **writer_string);
|
||||||
|
|
||||||
|
/* abstract methods */
|
||||||
|
void (*add_entry) (GstCache *cache, GstCacheEntry *entry);
|
||||||
|
void (*remove_entry) (GstCache *cache, GstCacheEntry *entry);
|
||||||
|
void (*modify_entry) (GstCache *cache, GstCacheEntry *oldentry,
|
||||||
|
GstCacheEntry *new_entry);
|
||||||
|
|
||||||
|
GstCacheEntry* (*get_entry) (GstCache *cache);
|
||||||
|
|
||||||
|
/* signals */
|
||||||
|
void (*entry_added) (GstCache *cache, GstCacheEntry *entry);
|
||||||
|
void (*entry_removed) (GstCache *cache, GstCacheEntry *entry);
|
||||||
|
void (*entry_modified) (GstCache *cache, GstCacheEntry *oldentry,
|
||||||
|
GstCacheEntry *new_entry);
|
||||||
|
};
|
||||||
|
|
||||||
|
GType gst_cache_get_type (void);
|
||||||
|
GstCache* gst_cache_new (void);
|
||||||
|
|
||||||
|
gint gst_cache_get_group (GstCache *cache);
|
||||||
|
gint gst_cache_new_group (GstCache *cache);
|
||||||
|
gboolean gst_cache_set_group (GstCache *cache, gint groupnum);
|
||||||
|
|
||||||
|
void gst_cache_set_certainty (GstCache *cache,
|
||||||
|
GstCacheCertainty certainty);
|
||||||
|
GstCacheCertainty gst_cache_get_certainty (GstCache *cache);
|
||||||
|
|
||||||
|
gboolean gst_cache_get_writer_id (GstCache *cache, GstObject *writer, gint *id);
|
||||||
|
|
||||||
|
GstCacheEntry* gst_cache_add_format (GstCache *cache, gint id, GstFormat format);
|
||||||
|
GstCacheEntry* gst_cache_add_association (GstCache *cache, gint id, GstAssocFlags flags,
|
||||||
|
GstFormat format, gint64 value, ...);
|
||||||
|
GstCacheEntry* gst_cache_add_object (GstCache *cache, gint id, gchar *key,
|
||||||
|
GType type, gpointer object);
|
||||||
|
GstCacheEntry* gst_cache_add_id (GstCache *cache, gint id,
|
||||||
|
gchar *description);
|
||||||
|
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __GST_CACHE_H__ */
|
|
@ -83,6 +83,8 @@ gst_clock_entry_new (GstClock *clock, GstClockTime time,
|
||||||
GstClockID
|
GstClockID
|
||||||
gst_clock_new_single_shot_id (GstClock *clock, GstClockTime time)
|
gst_clock_new_single_shot_id (GstClock *clock, GstClockTime time)
|
||||||
{
|
{
|
||||||
|
g_return_val_if_fail (GST_IS_CLOCK (clock), NULL);
|
||||||
|
|
||||||
return gst_clock_entry_new (clock,
|
return gst_clock_entry_new (clock,
|
||||||
time,
|
time,
|
||||||
GST_CLOCK_TIME_NONE,
|
GST_CLOCK_TIME_NONE,
|
||||||
|
@ -105,6 +107,10 @@ GstClockID
|
||||||
gst_clock_new_periodic_id (GstClock *clock, GstClockTime start_time,
|
gst_clock_new_periodic_id (GstClock *clock, GstClockTime start_time,
|
||||||
GstClockTime interval)
|
GstClockTime interval)
|
||||||
{
|
{
|
||||||
|
g_return_val_if_fail (GST_IS_CLOCK (clock), NULL);
|
||||||
|
g_return_val_if_fail (start_time != GST_CLOCK_TIME_NONE, NULL);
|
||||||
|
g_return_val_if_fail (interval != 0, NULL);
|
||||||
|
|
||||||
return gst_clock_entry_new (clock,
|
return gst_clock_entry_new (clock,
|
||||||
start_time,
|
start_time,
|
||||||
interval,
|
interval,
|
||||||
|
@ -149,8 +155,14 @@ gst_clock_id_wait (GstClockID id, GstClockTimeDiff *jitter)
|
||||||
g_return_val_if_fail (id != NULL, GST_CLOCK_ERROR);
|
g_return_val_if_fail (id != NULL, GST_CLOCK_ERROR);
|
||||||
|
|
||||||
entry = (GstClockEntry *) id;
|
entry = (GstClockEntry *) id;
|
||||||
clock = GST_CLOCK_ENTRY_CLOCK (entry);
|
|
||||||
requested = GST_CLOCK_ENTRY_TIME (entry);
|
requested = GST_CLOCK_ENTRY_TIME (entry);
|
||||||
|
|
||||||
|
if (requested == GST_CLOCK_TIME_NONE) {
|
||||||
|
res = GST_CLOCK_TIMEOUT;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
clock = GST_CLOCK_ENTRY_CLOCK (entry);
|
||||||
|
|
||||||
if (CLASS (clock)->wait) {
|
if (CLASS (clock)->wait) {
|
||||||
GstClockTime now;
|
GstClockTime now;
|
||||||
|
@ -170,6 +182,7 @@ gst_clock_id_wait (GstClockID id, GstClockTimeDiff *jitter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
if (entry->type == GST_CLOCK_ENTRY_SINGLE) {
|
if (entry->type == GST_CLOCK_ENTRY_SINGLE) {
|
||||||
gst_clock_id_free (id);
|
gst_clock_id_free (id);
|
||||||
}
|
}
|
||||||
|
@ -188,7 +201,7 @@ gst_clock_id_wait (GstClockID id, GstClockTimeDiff *jitter)
|
||||||
* when the clock has reached the given time. A ClockID is returned
|
* when the clock has reached the given time. A ClockID is returned
|
||||||
* that can be used to cancel the request.
|
* that can be used to cancel the request.
|
||||||
*
|
*
|
||||||
* Returns: the clock id or NULL when async notification is not supported.
|
* Returns: the result of the non blocking wait.
|
||||||
*/
|
*/
|
||||||
GstClockReturn
|
GstClockReturn
|
||||||
gst_clock_id_wait_async (GstClockID id,
|
gst_clock_id_wait_async (GstClockID id,
|
||||||
|
@ -199,10 +212,16 @@ gst_clock_id_wait_async (GstClockID id,
|
||||||
GstClockReturn res = GST_CLOCK_UNSUPPORTED;
|
GstClockReturn res = GST_CLOCK_UNSUPPORTED;
|
||||||
|
|
||||||
g_return_val_if_fail (id != NULL, GST_CLOCK_ERROR);
|
g_return_val_if_fail (id != NULL, GST_CLOCK_ERROR);
|
||||||
|
g_return_val_if_fail (func != NULL, GST_CLOCK_ERROR);
|
||||||
|
|
||||||
entry = (GstClockEntry *) id;
|
entry = (GstClockEntry *) id;
|
||||||
clock = entry->clock;
|
clock = entry->clock;
|
||||||
|
|
||||||
|
if (GST_CLOCK_ENTRY_TIME (entry) == GST_CLOCK_TIME_NONE) {
|
||||||
|
(func) (clock, GST_CLOCK_TIME_NONE, id, user_data);
|
||||||
|
return GST_CLOCK_TIMEOUT;
|
||||||
|
}
|
||||||
|
|
||||||
if (CLASS (clock)->wait_async) {
|
if (CLASS (clock)->wait_async) {
|
||||||
res = CLASS (clock)->wait_async (clock, entry, func, user_data);
|
res = CLASS (clock)->wait_async (clock, entry, func, user_data);
|
||||||
}
|
}
|
||||||
|
@ -243,6 +262,8 @@ gst_clock_id_unschedule (GstClockID id)
|
||||||
void
|
void
|
||||||
gst_clock_id_free (GstClockID id)
|
gst_clock_id_free (GstClockID id)
|
||||||
{
|
{
|
||||||
|
g_return_if_fail (id != NULL);
|
||||||
|
|
||||||
gst_mem_chunk_free (_gst_clock_entries_chunk, id);
|
gst_mem_chunk_free (_gst_clock_entries_chunk, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,6 +410,7 @@ guint64
|
||||||
gst_clock_set_resolution (GstClock *clock, guint64 resolution)
|
gst_clock_set_resolution (GstClock *clock, guint64 resolution)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (GST_IS_CLOCK (clock), 0LL);
|
g_return_val_if_fail (GST_IS_CLOCK (clock), 0LL);
|
||||||
|
g_return_val_if_fail (resolution != 0, 0LL);
|
||||||
|
|
||||||
if (CLASS (clock)->change_resolution)
|
if (CLASS (clock)->change_resolution)
|
||||||
clock->resolution = CLASS (clock)->change_resolution (clock, clock->resolution, resolution);
|
clock->resolution = CLASS (clock)->change_resolution (clock, clock->resolution, resolution);
|
||||||
|
@ -510,6 +532,9 @@ gst_clock_handle_discont (GstClock *clock, guint64 time)
|
||||||
|
|
||||||
GST_DEBUG (GST_CAT_CLOCK, "clock discont %llu %llu %d", time, clock->start_time, clock->accept_discont);
|
GST_DEBUG (GST_CAT_CLOCK, "clock discont %llu %llu %d", time, clock->start_time, clock->accept_discont);
|
||||||
|
|
||||||
|
if (time == GST_CLOCK_TIME_NONE)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
GST_LOCK (clock);
|
GST_LOCK (clock);
|
||||||
if (clock->accept_discont) {
|
if (clock->accept_discont) {
|
||||||
if (CLASS (clock)->get_internal_time) {
|
if (CLASS (clock)->get_internal_time) {
|
||||||
|
@ -585,6 +610,8 @@ gst_clock_get_next_id (GstClock *clock)
|
||||||
{
|
{
|
||||||
GstClockEntry *entry = NULL;
|
GstClockEntry *entry = NULL;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_CLOCK (clock), NULL);
|
||||||
|
|
||||||
GST_LOCK (clock);
|
GST_LOCK (clock);
|
||||||
if (clock->entries)
|
if (clock->entries)
|
||||||
entry = GST_CLOCK_ENTRY (clock->entries->data);
|
entry = GST_CLOCK_ENTRY (clock->entries->data);
|
||||||
|
|
|
@ -741,6 +741,38 @@ gst_element_get_parent (GstElement *element)
|
||||||
return GST_OBJECT_PARENT (element);
|
return GST_OBJECT_PARENT (element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_element_requires_clock:
|
||||||
|
* @element: a #GstElement to query
|
||||||
|
*
|
||||||
|
* Query if the element requiresd a clock
|
||||||
|
*
|
||||||
|
* Returns: TRUE if the element requires a clock
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_element_requires_clock (GstElement *element)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
|
||||||
|
|
||||||
|
return (CLASS (element)->set_clock != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_element_provides_clock:
|
||||||
|
* @element: a #GstElement to query
|
||||||
|
*
|
||||||
|
* Query if the element provides a clock
|
||||||
|
*
|
||||||
|
* Returns: TRUE if the element provides a clock
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_element_provides_clock (GstElement *element)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
|
||||||
|
|
||||||
|
return (CLASS (element)->get_clock != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_element_set_clock:
|
* gst_element_set_clock:
|
||||||
* @element: a #GstElement to set the clock for.
|
* @element: a #GstElement to set the clock for.
|
||||||
|
@ -751,11 +783,10 @@ gst_element_get_parent (GstElement *element)
|
||||||
void
|
void
|
||||||
gst_element_set_clock (GstElement *element, GstClock *clock)
|
gst_element_set_clock (GstElement *element, GstClock *clock)
|
||||||
{
|
{
|
||||||
g_return_if_fail (element != NULL);
|
|
||||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||||
|
|
||||||
if (element->setclockfunc)
|
if (CLASS (element)->set_clock)
|
||||||
element->setclockfunc (element, clock);
|
CLASS (element)->set_clock (element, clock);
|
||||||
|
|
||||||
element->clock = clock;
|
element->clock = clock;
|
||||||
}
|
}
|
||||||
|
@ -774,8 +805,8 @@ gst_element_get_clock (GstElement *element)
|
||||||
g_return_val_if_fail (element != NULL, NULL);
|
g_return_val_if_fail (element != NULL, NULL);
|
||||||
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
||||||
|
|
||||||
if (element->getclockfunc)
|
if (CLASS (element)->get_clock)
|
||||||
return element->getclockfunc (element);
|
return CLASS (element)->get_clock (element);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -796,7 +827,6 @@ gst_element_clock_wait (GstElement *element, GstClock *clock, GstClockTime time,
|
||||||
{
|
{
|
||||||
GstClockReturn res;
|
GstClockReturn res;
|
||||||
|
|
||||||
g_return_val_if_fail (element != NULL, GST_CLOCK_ERROR);
|
|
||||||
g_return_val_if_fail (GST_IS_ELEMENT (element), GST_CLOCK_ERROR);
|
g_return_val_if_fail (GST_IS_ELEMENT (element), GST_CLOCK_ERROR);
|
||||||
|
|
||||||
if (GST_ELEMENT_SCHED (element)) {
|
if (GST_ELEMENT_SCHED (element)) {
|
||||||
|
@ -808,6 +838,35 @@ gst_element_clock_wait (GstElement *element, GstClock *clock, GstClockTime time,
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gst_element_is_cachable (GstElement *element)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
|
||||||
|
|
||||||
|
return (CLASS (element)->set_cache != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_element_set_cache (GstElement *element, GstCache *cache)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||||
|
g_return_if_fail (GST_IS_CACHE (cache));
|
||||||
|
|
||||||
|
if (CLASS (element)->set_cache)
|
||||||
|
CLASS (element)->set_cache (element, cache);
|
||||||
|
}
|
||||||
|
|
||||||
|
GstCache*
|
||||||
|
gst_element_get_cache (GstElement *element)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
|
||||||
|
|
||||||
|
if (CLASS (element)->get_cache)
|
||||||
|
return CLASS (element)->get_cache (element);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_element_release_locks:
|
* gst_element_release_locks:
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <gst/gstpad.h>
|
#include <gst/gstpad.h>
|
||||||
#include <gst/gstclock.h>
|
#include <gst/gstclock.h>
|
||||||
#include <gst/gstpluginfeature.h>
|
#include <gst/gstpluginfeature.h>
|
||||||
|
#include <gst/gstcache.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
@ -109,8 +110,6 @@ typedef struct _GstElementFactory GstElementFactory;
|
||||||
typedef struct _GstElementFactoryClass GstElementFactoryClass;
|
typedef struct _GstElementFactoryClass GstElementFactoryClass;
|
||||||
|
|
||||||
typedef void (*GstElementLoopFunction) (GstElement *element);
|
typedef void (*GstElementLoopFunction) (GstElement *element);
|
||||||
typedef void (*GstElementSetClockFunction) (GstElement *element, GstClock *clock);
|
|
||||||
typedef GstClock* (*GstElementGetClockFunction) (GstElement *element);
|
|
||||||
typedef void (*GstElementPreRunFunction) (GstElement *element);
|
typedef void (*GstElementPreRunFunction) (GstElement *element);
|
||||||
typedef void (*GstElementPostRunFunction) (GstElement *element);
|
typedef void (*GstElementPostRunFunction) (GstElement *element);
|
||||||
|
|
||||||
|
@ -125,8 +124,6 @@ struct _GstElement {
|
||||||
|
|
||||||
GstScheduler *sched;
|
GstScheduler *sched;
|
||||||
gpointer sched_private;
|
gpointer sched_private;
|
||||||
GstElementSetClockFunction setclockfunc;
|
|
||||||
GstElementGetClockFunction getclockfunc;
|
|
||||||
GstClock *clock;
|
GstClock *clock;
|
||||||
GstClockTime base_time;
|
GstClockTime base_time;
|
||||||
|
|
||||||
|
@ -176,6 +173,12 @@ struct _GstElementClass {
|
||||||
/* request a new pad */
|
/* request a new pad */
|
||||||
GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ, const gchar* name);
|
GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ, const gchar* name);
|
||||||
void (*release_pad) (GstElement *element, GstPad *pad);
|
void (*release_pad) (GstElement *element, GstPad *pad);
|
||||||
|
/* set/get clocks */
|
||||||
|
GstClock* (*get_clock) (GstElement *element);
|
||||||
|
void (*set_clock) (GstElement *element, GstClock *clock);
|
||||||
|
/* cache */
|
||||||
|
GstCache* (*get_cache) (GstElement *element);
|
||||||
|
void (*set_cache) (GstElement *element, GstCache *cache);
|
||||||
};
|
};
|
||||||
|
|
||||||
void gst_element_class_add_pad_template (GstElementClass *klass, GstPadTemplate *templ);
|
void gst_element_class_add_pad_template (GstElementClass *klass, GstPadTemplate *templ);
|
||||||
|
@ -214,10 +217,18 @@ const gchar* gst_element_get_name (GstElement *element);
|
||||||
void gst_element_set_parent (GstElement *element, GstObject *parent);
|
void gst_element_set_parent (GstElement *element, GstObject *parent);
|
||||||
GstObject* gst_element_get_parent (GstElement *element);
|
GstObject* gst_element_get_parent (GstElement *element);
|
||||||
|
|
||||||
|
/* clocking */
|
||||||
|
gboolean gst_element_requires_clock (GstElement *element);
|
||||||
|
gboolean gst_element_provides_clock (GstElement *element);
|
||||||
GstClock* gst_element_get_clock (GstElement *element);
|
GstClock* gst_element_get_clock (GstElement *element);
|
||||||
void gst_element_set_clock (GstElement *element, GstClock *clock);
|
void gst_element_set_clock (GstElement *element, GstClock *clock);
|
||||||
GstClockReturn gst_element_clock_wait (GstElement *element, GstClock *clock,
|
GstClockReturn gst_element_clock_wait (GstElement *element, GstClock *clock,
|
||||||
GstClockTime time, GstClockTimeDiff *jitter);
|
GstClockTime time, GstClockTimeDiff *jitter);
|
||||||
|
/* caches */
|
||||||
|
gboolean gst_element_is_cachable (GstElement *element);
|
||||||
|
void gst_element_set_cache (GstElement *element, GstCache *cache);
|
||||||
|
GstCache* gst_element_get_cache (GstElement *element);
|
||||||
|
|
||||||
|
|
||||||
gboolean gst_element_release_locks (GstElement *element);
|
gboolean gst_element_release_locks (GstElement *element);
|
||||||
|
|
||||||
|
|
|
@ -92,6 +92,10 @@ transform_func (const GValue *src_value,
|
||||||
case GST_PROPS_FOURCC_TYPE:
|
case GST_PROPS_FOURCC_TYPE:
|
||||||
g_string_append_printf (result, "%s=(fourcc) '%4.4s'", name, (gchar *)&entry->data.fourcc_data);
|
g_string_append_printf (result, "%s=(fourcc) '%4.4s'", name, (gchar *)&entry->data.fourcc_data);
|
||||||
break;
|
break;
|
||||||
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
|
g_string_append_printf (result, "%s=(boolean) %s", name,
|
||||||
|
(entry->data.bool_data ? "TRUE" : "FALSE"));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -147,7 +151,7 @@ gst_props_debug_entry (GstPropsEntry *entry)
|
||||||
(entry->data.fourcc_data>>16)&0xff,
|
(entry->data.fourcc_data>>16)&0xff,
|
||||||
(entry->data.fourcc_data>>24)&0xff);
|
(entry->data.fourcc_data>>24)&0xff);
|
||||||
break;
|
break;
|
||||||
case GST_PROPS_BOOL_TYPE:
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
GST_DEBUG (GST_CAT_PROPERTIES, "%s: bool %d", name, entry->data.bool_data);
|
GST_DEBUG (GST_CAT_PROPERTIES, "%s: bool %d", name, entry->data.bool_data);
|
||||||
break;
|
break;
|
||||||
case GST_PROPS_STRING_TYPE:
|
case GST_PROPS_STRING_TYPE:
|
||||||
|
@ -223,7 +227,7 @@ G_STMT_START { \
|
||||||
case GST_PROPS_FOURCC_TYPE: \
|
case GST_PROPS_FOURCC_TYPE: \
|
||||||
entry->data.fourcc_data = va_arg (var_args, gulong); \
|
entry->data.fourcc_data = va_arg (var_args, gulong); \
|
||||||
break; \
|
break; \
|
||||||
case GST_PROPS_BOOL_TYPE: \
|
case GST_PROPS_BOOLEAN_TYPE: \
|
||||||
entry->data.bool_data = va_arg (var_args, gboolean); \
|
entry->data.bool_data = va_arg (var_args, gboolean); \
|
||||||
break; \
|
break; \
|
||||||
case GST_PROPS_STRING_TYPE: \
|
case GST_PROPS_STRING_TYPE: \
|
||||||
|
@ -269,7 +273,7 @@ G_STMT_START { \
|
||||||
case GST_PROPS_FOURCC_TYPE: \
|
case GST_PROPS_FOURCC_TYPE: \
|
||||||
*(va_arg (var_args, guint32*)) = entry->data.fourcc_data; \
|
*(va_arg (var_args, guint32*)) = entry->data.fourcc_data; \
|
||||||
break; \
|
break; \
|
||||||
case GST_PROPS_BOOL_TYPE: \
|
case GST_PROPS_BOOLEAN_TYPE: \
|
||||||
*(va_arg (var_args, gboolean*)) = entry->data.bool_data; \
|
*(va_arg (var_args, gboolean*)) = entry->data.bool_data; \
|
||||||
break; \
|
break; \
|
||||||
case GST_PROPS_STRING_TYPE: \
|
case GST_PROPS_STRING_TYPE: \
|
||||||
|
@ -606,7 +610,7 @@ gst_props_newv (const gchar *firstname, va_list var_args)
|
||||||
entry_type = GST_PROPS_LIST_T_FLOATS;
|
entry_type = GST_PROPS_LIST_T_FLOATS;
|
||||||
break;
|
break;
|
||||||
case GST_PROPS_FOURCC_TYPE:
|
case GST_PROPS_FOURCC_TYPE:
|
||||||
case GST_PROPS_BOOL_TYPE:
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
case GST_PROPS_STRING_TYPE:
|
case GST_PROPS_STRING_TYPE:
|
||||||
entry_type = GST_PROPS_LIST_T_MISC;
|
entry_type = GST_PROPS_LIST_T_MISC;
|
||||||
break;
|
break;
|
||||||
|
@ -1179,7 +1183,7 @@ gst_props_entry_get_fourcc_int (const GstPropsEntry *entry, guint32 *val)
|
||||||
gboolean
|
gboolean
|
||||||
gst_props_entry_get_boolean (const GstPropsEntry *entry, gboolean *val)
|
gst_props_entry_get_boolean (const GstPropsEntry *entry, gboolean *val)
|
||||||
{
|
{
|
||||||
return gst_props_entry_get_safe (entry, GST_PROPS_BOOL_TYPE, val);
|
return gst_props_entry_get_safe (entry, GST_PROPS_BOOLEAN_TYPE, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1391,10 +1395,10 @@ gst_props_entry_check_compatibility (GstPropsEntry *entry1, GstPropsEntry *entry
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GST_PROPS_BOOL_TYPE:
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
switch (entry2->propstype) {
|
switch (entry2->propstype) {
|
||||||
/* t <---> t */
|
/* t <---> t */
|
||||||
case GST_PROPS_BOOL_TYPE:
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
return (entry2->data.bool_data == entry1->data.bool_data);
|
return (entry2->data.bool_data == entry1->data.bool_data);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1669,10 +1673,10 @@ gst_props_entry_intersect (GstPropsEntry *entry1, GstPropsEntry *entry2)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GST_PROPS_BOOL_TYPE:
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
switch (entry2->propstype) {
|
switch (entry2->propstype) {
|
||||||
/* t <---> t */
|
/* t <---> t */
|
||||||
case GST_PROPS_BOOL_TYPE:
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
if (entry1->data.bool_data == entry2->data.bool_data)
|
if (entry1->data.bool_data == entry2->data.bool_data)
|
||||||
result = gst_props_entry_copy (entry1);
|
result = gst_props_entry_copy (entry1);
|
||||||
default:
|
default:
|
||||||
|
@ -1928,7 +1932,7 @@ gst_props_save_thyself_func (GstPropsEntry *entry, xmlNodePtr parent)
|
||||||
xmlNewProp (subtree, "hexvalue", str);
|
xmlNewProp (subtree, "hexvalue", str);
|
||||||
g_free(str);
|
g_free(str);
|
||||||
break;
|
break;
|
||||||
case GST_PROPS_BOOL_TYPE:
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
subtree = xmlNewChild (parent, NULL, "boolean", NULL);
|
subtree = xmlNewChild (parent, NULL, "boolean", NULL);
|
||||||
xmlNewProp (subtree, "name", g_quark_to_string (entry->propid));
|
xmlNewProp (subtree, "name", g_quark_to_string (entry->propid));
|
||||||
xmlNewProp (subtree, "value", (entry->data.bool_data ? "true" : "false"));
|
xmlNewProp (subtree, "value", (entry->data.bool_data ? "true" : "false"));
|
||||||
|
@ -2035,7 +2039,7 @@ gst_props_load_thyself_func (xmlNodePtr field)
|
||||||
g_free (prop);
|
g_free (prop);
|
||||||
}
|
}
|
||||||
else if (!strcmp(field->name, "boolean")) {
|
else if (!strcmp(field->name, "boolean")) {
|
||||||
entry->propstype = GST_PROPS_BOOL_TYPE;
|
entry->propstype = GST_PROPS_BOOLEAN_TYPE;
|
||||||
prop = xmlGetProp(field, "name");
|
prop = xmlGetProp(field, "name");
|
||||||
entry->propid = g_quark_from_string (prop);
|
entry->propid = g_quark_from_string (prop);
|
||||||
g_free (prop);
|
g_free (prop);
|
||||||
|
|
|
@ -43,7 +43,7 @@ typedef enum {
|
||||||
GST_PROPS_INT_TYPE,
|
GST_PROPS_INT_TYPE,
|
||||||
GST_PROPS_FLOAT_TYPE,
|
GST_PROPS_FLOAT_TYPE,
|
||||||
GST_PROPS_FOURCC_TYPE,
|
GST_PROPS_FOURCC_TYPE,
|
||||||
GST_PROPS_BOOL_TYPE,
|
GST_PROPS_BOOLEAN_TYPE,
|
||||||
GST_PROPS_STRING_TYPE,
|
GST_PROPS_STRING_TYPE,
|
||||||
|
|
||||||
GST_PROPS_VAR_TYPE, /* after this marker start the variable properties */
|
GST_PROPS_VAR_TYPE, /* after this marker start the variable properties */
|
||||||
|
@ -66,7 +66,7 @@ typedef enum {
|
||||||
#define GST_PROPS_FLOAT(a) GST_PROPS_FLOAT_TYPE,((float)(a))
|
#define GST_PROPS_FLOAT(a) GST_PROPS_FLOAT_TYPE,((float)(a))
|
||||||
#define GST_PROPS_FLOAT_RANGE(a,b) GST_PROPS_FLOAT_RANGE_TYPE,((float)(a)),((float)(b))
|
#define GST_PROPS_FLOAT_RANGE(a,b) GST_PROPS_FLOAT_RANGE_TYPE,((float)(a)),((float)(b))
|
||||||
#define GST_PROPS_FOURCC(a) GST_PROPS_FOURCC_TYPE,(a)
|
#define GST_PROPS_FOURCC(a) GST_PROPS_FOURCC_TYPE,(a)
|
||||||
#define GST_PROPS_BOOLEAN(a) GST_PROPS_BOOL_TYPE,(a)
|
#define GST_PROPS_BOOLEAN(a) GST_PROPS_BOOLEAN_TYPE,(a)
|
||||||
#define GST_PROPS_STRING(a) GST_PROPS_STRING_TYPE,(a)
|
#define GST_PROPS_STRING(a) GST_PROPS_STRING_TYPE,(a)
|
||||||
|
|
||||||
#define GST_PROPS_INT_POSITIVE GST_PROPS_INT_RANGE(0,G_MAXINT)
|
#define GST_PROPS_INT_POSITIVE GST_PROPS_INT_RANGE(0,G_MAXINT)
|
||||||
|
|
|
@ -212,11 +212,11 @@ gst_scheduler_add_element (GstScheduler *sched, GstElement *element)
|
||||||
/* if it's not inside this scheduler, it has to be NULL */
|
/* if it's not inside this scheduler, it has to be NULL */
|
||||||
g_assert (GST_ELEMENT_SCHED (element) == NULL);
|
g_assert (GST_ELEMENT_SCHED (element) == NULL);
|
||||||
|
|
||||||
if (element->getclockfunc) {
|
if (gst_element_provides_clock (element)) {
|
||||||
sched->clock_providers = g_list_prepend (sched->clock_providers, element);
|
sched->clock_providers = g_list_prepend (sched->clock_providers, element);
|
||||||
GST_DEBUG (GST_CAT_CLOCK, "added clock provider %s", GST_ELEMENT_NAME (element));
|
GST_DEBUG (GST_CAT_CLOCK, "added clock provider %s", GST_ELEMENT_NAME (element));
|
||||||
}
|
}
|
||||||
if (element->setclockfunc) {
|
if (gst_element_requires_clock (element)) {
|
||||||
sched->clock_receivers = g_list_prepend (sched->clock_receivers, element);
|
sched->clock_receivers = g_list_prepend (sched->clock_receivers, element);
|
||||||
GST_DEBUG (GST_CAT_CLOCK, "added clock receiver %s", GST_ELEMENT_NAME (element));
|
GST_DEBUG (GST_CAT_CLOCK, "added clock receiver %s", GST_ELEMENT_NAME (element));
|
||||||
}
|
}
|
||||||
|
|
|
@ -506,7 +506,7 @@ gst_print_props (GString *buf, gint indent, GList *props, gboolean showname)
|
||||||
g_string_append_printf (buf, "%f - %f (float)\n", min, max);
|
g_string_append_printf (buf, "%f - %f (float)\n", min, max);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GST_PROPS_BOOL_TYPE:
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
{
|
{
|
||||||
gboolean val;
|
gboolean val;
|
||||||
gst_props_entry_get_boolean (prop, &val);
|
gst_props_entry_get_boolean (prop, &val);
|
||||||
|
|
|
@ -1233,7 +1233,7 @@ gst_xml_registry_save_props_func (GstPropsEntry *entry,
|
||||||
CLASS (xmlregistry)->save_func (xmlregistry, "<fourcc name=\"%s\" hexvalue=\"%08x\"/>\n", name, fourcc);
|
CLASS (xmlregistry)->save_func (xmlregistry, "<fourcc name=\"%s\" hexvalue=\"%08x\"/>\n", name, fourcc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GST_PROPS_BOOL_TYPE:
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
{
|
{
|
||||||
gboolean value;
|
gboolean value;
|
||||||
gst_props_entry_get_boolean (entry, &value);
|
gst_props_entry_get_boolean (entry, &value);
|
||||||
|
|
|
@ -134,6 +134,7 @@ gst_fakesink_class_init (GstFakeSinkClass *klass)
|
||||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_fakesink_get_property);
|
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_fakesink_get_property);
|
||||||
|
|
||||||
gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_fakesink_request_new_pad);
|
gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_fakesink_request_new_pad);
|
||||||
|
gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_fakesink_set_clock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -150,8 +151,6 @@ gst_fakesink_init (GstFakeSink *fakesink)
|
||||||
fakesink->sync = FALSE;
|
fakesink->sync = FALSE;
|
||||||
fakesink->last_message = NULL;
|
fakesink->last_message = NULL;
|
||||||
|
|
||||||
GST_ELEMENT (fakesink)->setclockfunc = gst_fakesink_set_clock;
|
|
||||||
|
|
||||||
GST_FLAG_SET (fakesink, GST_ELEMENT_EVENT_AWARE);
|
GST_FLAG_SET (fakesink, GST_ELEMENT_EVENT_AWARE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ print_prop (GstPropsEntry *prop, gboolean showname, const gchar *pfx)
|
||||||
g_print("Float range: %f - %f\n", min, max);
|
g_print("Float range: %f - %f\n", min, max);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GST_PROPS_BOOL_TYPE:
|
case GST_PROPS_BOOLEAN_TYPE:
|
||||||
{
|
{
|
||||||
gboolean val;
|
gboolean val;
|
||||||
gst_props_entry_get_boolean (prop, &val);
|
gst_props_entry_get_boolean (prop, &val);
|
||||||
|
@ -571,22 +571,31 @@ print_element_info (GstElementFactory *factory)
|
||||||
have_flags = FALSE;
|
have_flags = FALSE;
|
||||||
|
|
||||||
g_print ("\nClocking Interaction:\n");
|
g_print ("\nClocking Interaction:\n");
|
||||||
if (element->setclockfunc) {
|
if (gst_element_requires_clock (element)) {
|
||||||
g_print (" element requires a clock\n");
|
g_print (" element requires a clock\n");
|
||||||
have_flags = TRUE;
|
have_flags = TRUE;
|
||||||
}
|
}
|
||||||
if (element->getclockfunc) {
|
if (gst_element_provides_clock (element)) {
|
||||||
GstClock *clock;
|
GstClock *clock;
|
||||||
|
|
||||||
clock = gst_element_get_clock (element);
|
clock = gst_element_get_clock (element);
|
||||||
if (clock)
|
if (clock)
|
||||||
g_print (" element provides a clock: %s\n", GST_OBJECT_NAME(clock));
|
g_print (" element provides a clock: %s\n", GST_OBJECT_NAME(clock));
|
||||||
|
else
|
||||||
|
g_print (" element is supposed to provide a clock but returned NULL\n");
|
||||||
have_flags = TRUE;
|
have_flags = TRUE;
|
||||||
}
|
}
|
||||||
if (!have_flags) {
|
if (!have_flags) {
|
||||||
g_print (" none\n");
|
g_print (" none\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_print ("\nCaching capabilities:\n");
|
||||||
|
if (gst_element_is_cachable (element)) {
|
||||||
|
g_print (" element can do caching\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
g_print (" none\n");
|
||||||
|
}
|
||||||
|
|
||||||
g_print ("\nPads:\n");
|
g_print ("\nPads:\n");
|
||||||
if (element->numpads) {
|
if (element->numpads) {
|
||||||
|
@ -841,6 +850,12 @@ static void
|
||||||
print_plugin_info (GstPlugin *plugin)
|
print_plugin_info (GstPlugin *plugin)
|
||||||
{
|
{
|
||||||
GList *features;
|
GList *features;
|
||||||
|
gint num_features = 0;
|
||||||
|
gint num_elements = 0;
|
||||||
|
gint num_autoplug = 0;
|
||||||
|
gint num_types = 0;
|
||||||
|
gint num_schedulers = 0;
|
||||||
|
gint num_other = 0;
|
||||||
|
|
||||||
g_print ("Plugin Details:\n");
|
g_print ("Plugin Details:\n");
|
||||||
g_print (" Name:\t\t%s\n", plugin->name);
|
g_print (" Name:\t\t%s\n", plugin->name);
|
||||||
|
@ -861,12 +876,14 @@ print_plugin_info (GstPlugin *plugin)
|
||||||
factory = GST_ELEMENT_FACTORY (feature);
|
factory = GST_ELEMENT_FACTORY (feature);
|
||||||
g_print (" %s: %s\n", GST_OBJECT_NAME (factory),
|
g_print (" %s: %s\n", GST_OBJECT_NAME (factory),
|
||||||
factory->details->longname);
|
factory->details->longname);
|
||||||
|
num_elements++;
|
||||||
}
|
}
|
||||||
else if (GST_IS_AUTOPLUG_FACTORY (feature)) {
|
else if (GST_IS_AUTOPLUG_FACTORY (feature)) {
|
||||||
GstAutoplugFactory *factory;
|
GstAutoplugFactory *factory;
|
||||||
|
|
||||||
factory = GST_AUTOPLUG_FACTORY (feature);
|
factory = GST_AUTOPLUG_FACTORY (feature);
|
||||||
g_print (" %s: %s\n", GST_OBJECT_NAME (factory), factory->longdesc);
|
g_print (" %s: %s\n", GST_OBJECT_NAME (factory), factory->longdesc);
|
||||||
|
num_autoplug++;
|
||||||
}
|
}
|
||||||
else if (GST_IS_TYPE_FACTORY (feature)) {
|
else if (GST_IS_TYPE_FACTORY (feature)) {
|
||||||
GstTypeFactory *factory;
|
GstTypeFactory *factory;
|
||||||
|
@ -877,21 +894,35 @@ print_plugin_info (GstPlugin *plugin)
|
||||||
if (factory->typefindfunc)
|
if (factory->typefindfunc)
|
||||||
g_print (" Has typefind function: %s\n",
|
g_print (" Has typefind function: %s\n",
|
||||||
GST_DEBUG_FUNCPTR_NAME (factory->typefindfunc));
|
GST_DEBUG_FUNCPTR_NAME (factory->typefindfunc));
|
||||||
|
num_types++;
|
||||||
}
|
}
|
||||||
else if (GST_IS_SCHEDULER_FACTORY (feature)) {
|
else if (GST_IS_SCHEDULER_FACTORY (feature)) {
|
||||||
GstSchedulerFactory *factory;
|
GstSchedulerFactory *factory;
|
||||||
|
|
||||||
factory = GST_SCHEDULER_FACTORY (feature);
|
factory = GST_SCHEDULER_FACTORY (feature);
|
||||||
g_print (" %s: %s\n", GST_OBJECT_NAME (factory), factory->longdesc);
|
g_print (" %s: %s\n", GST_OBJECT_NAME (factory), factory->longdesc);
|
||||||
|
num_schedulers++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
g_print (" %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)),
|
g_print (" %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)),
|
||||||
g_type_name (G_OBJECT_TYPE (feature)));
|
g_type_name (G_OBJECT_TYPE (feature)));
|
||||||
|
num_other++;
|
||||||
}
|
}
|
||||||
|
num_features++;
|
||||||
|
|
||||||
features = g_list_next (features);
|
features = g_list_next (features);
|
||||||
}
|
}
|
||||||
|
g_print ("\n %d features:\n", num_features);
|
||||||
|
if (num_elements > 0)
|
||||||
|
g_print (" +-- %d elements\n", num_elements);
|
||||||
|
if (num_autoplug > 0)
|
||||||
|
g_print (" +-- %d autopluggers\n", num_autoplug);
|
||||||
|
if (num_types > 0)
|
||||||
|
g_print (" +-- %d types\n", num_types);
|
||||||
|
if (num_schedulers > 0)
|
||||||
|
g_print (" +-- %d schedulers\n", num_schedulers);
|
||||||
|
if (num_other > 0)
|
||||||
|
g_print (" +-- %d other objects\n", num_other);
|
||||||
|
|
||||||
g_print ("\n");
|
g_print ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue