gstinfo.[ch], cothreads.c: added initial support for -finstrument_functions gstbin.c: removed a reference to config.h...

Original commit message from CVS:
gstinfo.[ch], cothreads.c: added initial support for -finstrument_functions
gstbin.c: removed a reference to config.h
gstbuffer.[ch]: added gst_buffer_is_span_fast(), used it in gst_buffer_span
elements/gstfilesrc.c: initial work fleshing out the event handling code

everywhere else: wrapped XML stuff in #ifndef's
This commit is contained in:
Erik Walthinsen 2001-09-10 19:46:01 +00:00
parent 8703d88ce7
commit c6a04366a3
20 changed files with 221 additions and 69 deletions

View file

@ -244,6 +244,7 @@ cothread_stub (void)
*
* Returns: the current cothread id
*/
int cothread_getcurrent(void) __attribute__ ((no_instrument_function));
int cothread_getcurrent(void) {
cothread_context *ctx = pthread_getspecific(_cothread_key);
if (!ctx) return -1;

View file

@ -329,7 +329,7 @@ gst_aggregator_chain (GstPad *pad, GstBuffer *buf)
g_return_if_fail (buf != NULL);
aggregator = GST_AGGREGATOR (gst_pad_get_parent (pad));
gst_trace_add_entry (NULL, 0, buf, "aggregator buffer");
// gst_trace_add_entry (NULL, 0, buf, "aggregator buffer");
gst_aggregator_push (aggregator, pad, buf, "chain");
}

View file

@ -145,6 +145,7 @@ static void gst_filesrc_set_property (GObject *object, guint prop_id, const GVa
static void gst_filesrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
static GstBuffer * gst_filesrc_get (GstPad *pad);
static gboolean gst_filesrc_srcpad_event (GstPad *pad, GstEventType event, gint64 location, guint32 data);
static GstElementStateReturn gst_filesrc_change_state (GstElement *element);
@ -227,6 +228,7 @@ gst_filesrc_init (GstFileSrc *src)
{
src->srcpad = gst_pad_new ("src", GST_PAD_SRC);
gst_pad_set_get_function (src->srcpad,gst_filesrc_get);
gst_pad_set_event_function (src->srcpad,gst_filesrc_srcpad_event);
gst_element_add_pad (GST_ELEMENT (src), src->srcpad);
src->pagesize = getpagesize();
@ -279,7 +281,10 @@ gst_filesrc_set_property (GObject *object, guint prop_id, const GValue *value, G
src->curoffset = g_value_get_ulong (value);
break;
case ARG_MAPSIZE:
src->mapsize = g_value_get_ulong (value);
if ((src->mapsize % src->pagesize) == 0)
src->mapsize = g_value_get_ulong (value);
else
GST_INFO(0, "invalid mapsize, must a multiple of pagesize, which is %d\n",src->pagesize);
break;
default:
break;
@ -345,8 +350,9 @@ static GstBuffer *
gst_filesrc_map_region (GstFileSrc *src, off_t offset, off_t size)
{
GstBuffer *buf;
gint retval;
fprintf(stderr,"mapping region %d+%d from file into memory\n",offset,size);
// fprintf(stderr,"mapping region %d+%d from file into memory\n",offset,size);
// time to allocate a new mapbuf
buf = gst_buffer_new();
@ -354,9 +360,11 @@ gst_filesrc_map_region (GstFileSrc *src, off_t offset, off_t size)
GST_BUFFER_DATA(buf) = mmap (NULL, size, PROT_READ, MAP_SHARED, src->fd, offset);
if (GST_BUFFER_DATA(buf) == NULL) {
fprintf(stderr, "ERROR: gstfilesrc couldn't map file!\n");
} else if (GST_BUFFER_DATA(buf) == -1) {
} else if (GST_BUFFER_DATA(buf) == (void *)-1) {
perror("gstfilesrc:mmap()");
}
// madvise to tell the kernel what to do with it
retval = madvise(GST_BUFFER_DATA(buf),GST_BUFFER_SIZE(buf),MADV_SEQUENTIAL);
// fill in the rest of the fields
GST_BUFFER_FLAGS(buf) = GST_BUFFER_READONLY | GST_BUFFER_ORIGINAL;
GST_BUFFER_SIZE(buf) = size;
@ -423,7 +431,8 @@ gst_filesrc_get (GstPad *pad)
{
GstFileSrc *src;
GstBuffer *buf = NULL, *map;
off_t readend,mapstart,mapend;
off_t readend,readsize,mapstart,mapend;
gboolean eof = FALSE;
GstFileSrcRegion region;
int i;
@ -431,26 +440,34 @@ gst_filesrc_get (GstPad *pad)
src = GST_FILESRC (gst_pad_get_parent (pad));
g_return_val_if_fail (GST_FLAG_IS_SET (src, GST_FILESRC_OPEN), NULL);
// calculate end poiters so we don't have to do so repeatedly later
// calculate end pointers so we don't have to do so repeatedly later
readsize = src->block_size;
readend = src->curoffset + src->block_size; // note this is the byte *after* the read
mapstart = GST_BUFFER_OFFSET(src->mapbuf);
mapend = mapstart + GST_BUFFER_SIZE(src->mapbuf); // note this is the byte *after* the map
// check to see if we're going to overflow the end of the file
if (readend > src->filelen) {
readsize = src->filelen - src->curoffset;
readend = src->curoffset;
eof = TRUE;
}
// if the start is past the mapstart
if (src->curoffset >= mapstart) {
// if the end is before the mapend, the buffer is in current mmap region...
// ('cause by definition if readend is in the buffer, so's readstart)
if (readend <= mapend) {
// printf("read buf %d+%d lives in current mapbuf %d+%d, creating subbuffer of mapbuf\n",
// src->curoffset,src->block_size,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
// src->curoffset,readsize,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
buf = gst_buffer_create_sub (src->mapbuf, src->curoffset - GST_BUFFER_OFFSET(src->mapbuf),
src->block_size);
readsize);
// if the start actually is within the current mmap region, map an overlap buffer
} else if (src->curoffset < mapend) {
// printf("read buf %d+%d starts in mapbuf %d+%d but ends outside, creating new mmap\n",
// src->curoffset,src->block_size,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
buf = gst_filesrc_map_small_region (src, src->curoffset, src->block_size);
// src->curoffset,readsize,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
buf = gst_filesrc_map_small_region (src, src->curoffset, readsize);
}
// the only other option is that buffer is totally outside, which means we search for it
@ -462,42 +479,42 @@ gst_filesrc_get (GstPad *pad)
// or the read buffer fully contains the current mmap region
// either way, it's really not relevant, we just create a new region anyway
// printf("read buf %d+%d starts before mapbuf %d+%d, but overlaps it\n",
// src->curoffset,src->block_size,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
buf = gst_filesrc_map_small_region (src, src->curoffset, src->block_size);
// src->curoffset,readsize,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
buf = gst_filesrc_map_small_region (src, src->curoffset, readsize);
}
// then deal with the case where the read buffer is totally outside
if (buf == NULL) {
// first check to see if there's a map that covers the right region already
// printf("searching for mapbuf to cover %d+%d\n",src->curoffset,src->block_size);
// printf("searching for mapbuf to cover %d+%d\n",src->curoffset,readsize);
region.offset = src->curoffset;
region.size = src->block_size;
region.size = readsize;
map = g_tree_search(src->map_regions,gst_filesrc_search_region_match,&region);
// if we found an exact match, subbuffer it
if (map != NULL) {
// printf("found mapbuf at %d+%d, creating subbuffer\n",GST_BUFFER_OFFSET(map),GST_BUFFER_SIZE(map));
buf = gst_buffer_create_sub (map, src->curoffset - GST_BUFFER_OFFSET(map), src->block_size);
buf = gst_buffer_create_sub (map, src->curoffset - GST_BUFFER_OFFSET(map), readsize);
// otherwise we need to create something out of thin air
} else {
// if the read buffer crosses a mmap region boundary, create a one-off region
if ((src->curoffset / src->mapsize) != ((src->curoffset + src->block_size) / src->mapsize)) {
if ((src->curoffset / src->mapsize) != (readend / src->mapsize)) {
// printf("read buf %d+%d crosses a %d-byte boundary, creating a one-off\n",
// src->curoffset,src->block_size,src->mapsize);
buf = gst_filesrc_map_small_region (src, src->curoffset, src->block_size);
// src->curoffset,readsize,src->mapsize);
buf = gst_filesrc_map_small_region (src, src->curoffset, readsize);
// otherwise we will create a new mmap region and set it to the default
} else {
off_t nextmap = src->curoffset - (src->curoffset % src->mapsize);
// printf("read buf %d+%d in new mapbuf at %d+%d, mapping and subbuffering\n",
// src->curoffset,src->block_size,nextmap,src->mapsize);
// src->curoffset,readsize,nextmap,src->mapsize);
// first, we're done with the old mapbuf
gst_buffer_unref(src->mapbuf);
// create a new one
src->mapbuf = gst_filesrc_map_region (src, nextmap, src->mapsize);
// subbuffer it
buf = gst_buffer_create_sub (src->mapbuf, src->curoffset - GST_BUFFER_OFFSET(src->mapbuf), src->block_size);
buf = gst_buffer_create_sub (src->mapbuf, src->curoffset - GST_BUFFER_OFFSET(src->mapbuf), readsize);
}
}
}
@ -508,6 +525,8 @@ gst_filesrc_get (GstPad *pad)
*(GST_BUFFER_DATA(buf)+i) = *(GST_BUFFER_DATA(buf)+i);
}
// if we hit EOF,
/* we're done, return the buffer */
src->curoffset += GST_BUFFER_SIZE(buf);
return buf;
@ -580,3 +599,23 @@ gst_filesrc_change_state (GstElement *element)
return GST_STATE_SUCCESS;
}
static gboolean
gst_filesrc_srcpad_event(GstPad *pad, GstEventType event, gint64 location, guint32 data)
{
GstFileSrc *src = GST_FILESRC(GST_PAD_PARENT(pad));
if (event == GST_EVENT_SEEK) {
if (data == SEEK_SET) {
src->curoffset = (guint64)location;
} else if (data == SEEK_CUR) {
src->curoffset += (gint64)location;
} else if (data == SEEK_END) {
src->curoffset = src->filelen - (guint64)location;
}
// push a discontinuous event?
return TRUE;
}
return FALSE;
}

View file

@ -213,7 +213,7 @@ gst_tee_chain (GstPad *pad, GstBuffer *buf)
g_return_if_fail (buf != NULL);
tee = GST_TEE (gst_pad_get_parent (pad));
gst_trace_add_entry (NULL, 0, buf, "tee buffer");
// gst_trace_add_entry (NULL, 0, buf, "tee buffer");
for (i=0; i<tee->numsrcpads-1; i++)
gst_buffer_ref (buf);

View file

@ -91,7 +91,9 @@ gst_init (int *argc, char **argv[])
gst_elementfactory_get_type ();
gst_typefactory_get_type ();
#ifndef GST_DISABLE_AUTOPLUG
gst_autoplugfactory_get_type ();
#endif
_gst_cpu_initialize ();
_gst_props_initialize ();

View file

@ -21,7 +21,6 @@
*/
//#define GST_DEBUG_ENABLED
#include "config.h"
#include "gst_private.h"
#include "gstbin.h"

View file

@ -380,6 +380,22 @@ gst_buffer_copy (GstBuffer *buffer)
return newbuf;
}
/*
* gst_buffer_is_span_fast
* @buf1: first source buffer
* @buf2: second source buffer
*
* Determines whether a gst_buffer_span is free, or requires a memcpy.
*
* Returns: TRUE if the buffers are contiguous, FALSE if a copy would be required.
*/
gboolean
gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2)
{
return ((buf1->parent == buf2->parent) &&
((buf1->data + buf1->size) == buf2->data));
}
/**
* gst_buffer_span:
@ -413,8 +429,9 @@ gst_buffer_span (GstBuffer *buf1, guint32 offset, GstBuffer *buf2, guint32 len)
}
// if the two buffers have the same parent and are adjacent
if ((buf1->parent == buf2->parent) &&
((buf1->data + buf1->size) == buf2->data)) {
// if ((buf1->parent == buf2->parent) &&
// ((buf1->data + buf1->size) == buf2->data)) {
if (gst_buffer_is_span_fast(buf1,buf2)) {
// we simply create a subbuffer of the common parent
return gst_buffer_create_sub(buf1->parent, buf1->data - (buf1->parent->data) + offset, len);
}

View file

@ -156,6 +156,8 @@ GstBuffer* gst_buffer_merge (GstBuffer *buf1, GstBuffer *buf2);
GstBuffer* gst_buffer_span (GstBuffer *buf1,guint32 offset,GstBuffer *buf2,guint32 len);
GstBuffer* gst_buffer_append (GstBuffer *buf, GstBuffer *buf2);
gboolean gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View file

@ -545,6 +545,7 @@ gst_caps_check_compatibility (GstCaps *fromcaps, GstCaps *tocaps)
return FALSE;
}
#if (! (defined(GST_DISABLE_LOADSAVE) && defined(GST_DISABLE_REGISTRY)) )
/**
* gst_caps_save_thyself:
* @caps: a capabilty to save
@ -627,3 +628,5 @@ gst_caps_load_thyself (xmlNodePtr parent)
return result;
}
#endif /* (! (defined(GST_DISABLE_LOADSAVE) && defined(GST_DISABLE_REGISTRY)) ) */

View file

@ -28,8 +28,10 @@
static void gst_elementfactory_class_init (GstElementFactoryClass *klass);
static void gst_elementfactory_init (GstElementFactory *factory);
#ifndef GST_DISABLE_REGISTRY
static void gst_elementfactory_restore_thyself (GstObject *object, xmlNodePtr parent);
static xmlNodePtr gst_elementfactory_save_thyself (GstObject *object, xmlNodePtr parent);
#endif /* GST_DISABLE_REGISTRY */
static void gst_elementfactory_unload_thyself (GstPluginFeature *feature);
@ -75,8 +77,10 @@ gst_elementfactory_class_init (GstElementFactoryClass *klass)
parent_class = g_type_class_ref (GST_TYPE_PLUGIN_FEATURE);
#ifndef GST_DISABLE_REGISTRY
gstobject_class->save_thyself = GST_DEBUG_FUNCPTR (gst_elementfactory_save_thyself);
gstobject_class->restore_thyself = GST_DEBUG_FUNCPTR (gst_elementfactory_restore_thyself);
#endif /* GST_DISABLE_REGISTRY */
gstpluginfeature_class->unload_thyself = GST_DEBUG_FUNCPTR (gst_elementfactory_unload_thyself);
@ -363,6 +367,7 @@ gst_elementfactory_unload_thyself (GstPluginFeature *feature)
factory->type = 0;
}
#ifndef GST_DISABLE_REGISTRY
static xmlNodePtr
gst_elementfactory_save_thyself (GstObject *object,
xmlNodePtr parent)
@ -442,3 +447,4 @@ gst_elementfactory_restore_thyself (GstObject *object, xmlNodePtr parent)
children = children->next;
}
}
#endif /* GST_DISABLE_REGISTRY */

View file

@ -35,6 +35,7 @@ typedef enum {
GST_EVENT_EOS,
GST_EVENT_FLUSH,
GST_EVENT_EMPTY,
GST_EVENT_SEEK,
} GstEventType;
typedef struct _GstEvent GstEvent;

View file

@ -58,6 +58,8 @@ static gchar *_gst_info_category_strings[] = {
"REFCOUNTING",
"EVENT",
"PARAMS",
[30] = "CALL_TRACE",
};
/**
@ -113,7 +115,7 @@ const gchar *_gst_category_colors[32] = {
[GST_CAT_EVENT] = "01;37;41", // !!
[GST_CAT_PARAMS] = "00;30;43", // !!
[31] = "",
[GST_CAT_CALL_TRACE] = "",
};
/* colorization hash - DEPRACATED in favor of above */
@ -146,6 +148,13 @@ guint32 _gst_debug_categories = 0x00000000;
* DEBUG(pid:cid):gst_function:542(args): [elementname] something neat happened
*/
void
gst_default_debug_handler (gint category, gboolean incore,
const gchar *file, const gchar *function,
gint line, const gchar *debug_string,
void *element, gchar *string)
__attribute__ ((no_instrument_function));
void
gst_default_debug_handler (gint category, gboolean incore,
const gchar *file, const gchar *function,
gint line, const gchar *debug_string,
@ -451,14 +460,15 @@ gst_default_error_handler (gchar *file, gchar *function,
/***** DEBUG system *****/
GHashTable *__gst_function_pointers = NULL;
gchar *_gst_debug_nameof_funcptr (void *ptr) __attribute__ ((no_instrument_function));
gchar *
_gst_debug_nameof_funcptr (void *ptr)
{
gchar *ptrname;
Dl_info dlinfo;
if (__gst_function_pointers) {
if ((ptrname = g_hash_table_lookup(__gst_function_pointers,ptr)))
return g_strdup(ptrname);
if (__gst_function_pointers && (ptrname = g_hash_table_lookup(__gst_function_pointers,ptr))) {
return g_strdup(ptrname);
} else if (dladdr(ptr,&dlinfo) && dlinfo.dli_sname) {
return g_strdup(dlinfo.dli_sname);
} else {
@ -466,3 +476,18 @@ _gst_debug_nameof_funcptr (void *ptr)
}
return NULL;
}
#ifdef GST_ENABLE_FUNC_INSTRUMENTATION
void __cyg_profile_func_enter(void *this_fn,void *call_site) __attribute__ ((no_instrument_function));
void __cyg_profile_func_enter(void *this_fn,void *call_site) {
GST_DEBUG(GST_CAT_CALL_TRACE, "entering function %s\n", _gst_debug_nameof_funcptr (this_fn));
}
void __cyg_profile_func_exit(void *this_fn,void *call_site) __attribute__ ((no_instrument_function));
void __cyg_profile_func_exit(void *this_fn,void *call_site) {
GST_DEBUG(GST_CAT_CALL_TRACE, "leavinging function %s\n", _gst_debug_nameof_funcptr (this_fn));
}
#endif /* GST_ENABLE_FUNC_INTSTRUMENTATION */

View file

@ -90,7 +90,9 @@ enum {
GST_CAT_REFCOUNTING, // Ref Counting stuff
GST_CAT_EVENT, // Event system
GST_CAT_PARAMS, // Dynamic parameters
GST_CAT_CALL_TRACE = 30, // Call tracing
GST_CAT_MAX_CATEGORY = 31
};

View file

@ -1702,6 +1702,7 @@ gst_padtemplate_get_caps (GstPadTemplate *templ)
return GST_PADTEMPLATE_CAPS (templ);
}
#ifndef GST_DISABLE_LOADSAVE
/**
* gst_padtemplate_save_thyself:
* @templ: the padtemplate to save
@ -1803,6 +1804,7 @@ gst_padtemplate_load_thyself (xmlNodePtr parent)
return factory;
}
#endif /* !GST_DISABLE_LOADSAVE */
/**

View file

@ -27,8 +27,10 @@
static void gst_plugin_feature_class_init (GstPluginFeatureClass *klass);
static void gst_plugin_feature_init (GstPluginFeature *feature);
#ifndef GST_DISABLE_REGISTRY
static xmlNodePtr gst_plugin_feature_save_thyself (GstObject *object, xmlNodePtr parent);
static void gst_plugin_feature_restore_thyself (GstObject *object, xmlNodePtr parent);
#endif /* GST_DISABLE_REGISTRY */
static GstObjectClass *parent_class = NULL;
//static guint gst_plugin_feature_signals[LAST_SIGNAL] = { 0 };
@ -67,8 +69,10 @@ gst_plugin_feature_class_init (GstPluginFeatureClass *klass)
parent_class = g_type_class_ref (GST_TYPE_OBJECT);
#ifndef GST_DISABLE_REGISTRY
gstobject_class->save_thyself = GST_DEBUG_FUNCPTR (gst_plugin_feature_save_thyself);
gstobject_class->restore_thyself = GST_DEBUG_FUNCPTR (gst_plugin_feature_restore_thyself);
#endif /* GST_DISABLE_REGISTRY */
}
static void
@ -77,6 +81,7 @@ gst_plugin_feature_init (GstPluginFeature *feature)
feature->manager = NULL;
}
#ifndef GST_DISABLE_REGISTRY
static xmlNodePtr
gst_plugin_feature_save_thyself (GstObject *object, xmlNodePtr parent)
{
@ -102,6 +107,7 @@ gst_plugin_feature_restore_thyself (GstObject *object, xmlNodePtr parent)
field = field->next;
}
}
#endif /* GST_DISABLE_REGISTRY */
void
gst_plugin_feature_ensure_loaded (GstPluginFeature *feature)

View file

@ -986,6 +986,7 @@ end:
return compatible;
}
#if (! (defined(GST_DISABLE_LOADSAVE) && defined(GST_DISABLE_REGISTRY)) )
static xmlNodePtr
gst_props_save_thyself_func (GstPropsEntry *entry, xmlNodePtr parent)
{
@ -1240,3 +1241,5 @@ gst_props_load_thyself (xmlNodePtr parent)
return props;
}
#endif /* (! (defined(GST_DISABLE_LOADSAVE) && defined(GST_DISABLE_REGISTRY)) ) */

View file

@ -43,8 +43,10 @@ static void gst_typefactory_init (GstTypeFactory *factory);
static GstCaps* gst_type_typefind_dummy (GstBuffer *buffer, gpointer priv);
#ifndef GST_DISABLE_REGISTRY
static xmlNodePtr gst_typefactory_save_thyself (GstObject *object, xmlNodePtr parent);
static void gst_typefactory_restore_thyself (GstObject *object, xmlNodePtr parent);
#endif /* GST_DISABLE_REGISTRY */
static void gst_typefactory_unload_thyself (GstPluginFeature *feature);
@ -87,8 +89,10 @@ gst_typefactory_class_init (GstTypeFactoryClass *klass)
parent_class = g_type_class_ref (GST_TYPE_PLUGIN_FEATURE);
#ifndef GST_DISABLE_REGISTRY
gstobject_class->save_thyself = GST_DEBUG_FUNCPTR (gst_typefactory_save_thyself);
gstobject_class->restore_thyself = GST_DEBUG_FUNCPTR (gst_typefactory_restore_thyself);
#endif /* GST_DISABLE_REGISTRY */
gstpluginfeature_class->unload_thyself = GST_DEBUG_FUNCPTR (gst_typefactory_unload_thyself);
@ -314,6 +318,25 @@ gst_typefactory_unload_thyself (GstPluginFeature *feature)
factory->typefindfunc = gst_type_typefind_dummy;
}
static GstCaps*
gst_type_typefind_dummy (GstBuffer *buffer, gpointer priv)
{
GstTypeFactory *factory = (GstTypeFactory *)priv;
GST_DEBUG (GST_CAT_TYPES,"gsttype: need to load typefind function for %s\n", factory->mime);
gst_plugin_feature_ensure_loaded (GST_PLUGIN_FEATURE (factory));
if (factory->typefindfunc) {
GstCaps *res = factory->typefindfunc (buffer, factory);
if (res)
return res;
}
return NULL;
}
#ifndef GST_DISABLE_REGISTRY
static xmlNodePtr
gst_typefactory_save_thyself (GstObject *object, xmlNodePtr parent)
{
@ -338,24 +361,6 @@ gst_typefactory_save_thyself (GstObject *object, xmlNodePtr parent)
return parent;
}
static GstCaps*
gst_type_typefind_dummy (GstBuffer *buffer, gpointer priv)
{
GstTypeFactory *factory = (GstTypeFactory *)priv;
GST_DEBUG (GST_CAT_TYPES,"gsttype: need to load typefind function for %s\n", factory->mime);
gst_plugin_feature_ensure_loaded (GST_PLUGIN_FEATURE (factory));
if (factory->typefindfunc) {
GstCaps *res = factory->typefindfunc (buffer, factory);
if (res)
return res;
}
return NULL;
}
/**
* gst_typefactory_restore_thyself:
* @parent: the parent node to load from
@ -390,4 +395,4 @@ gst_typefactory_restore_thyself (GstObject *object, xmlNodePtr parent)
gst_type_register (factory);
}
#endif /* GST_DISABLE_REGISTRY */

View file

@ -329,7 +329,7 @@ gst_aggregator_chain (GstPad *pad, GstBuffer *buf)
g_return_if_fail (buf != NULL);
aggregator = GST_AGGREGATOR (gst_pad_get_parent (pad));
gst_trace_add_entry (NULL, 0, buf, "aggregator buffer");
// gst_trace_add_entry (NULL, 0, buf, "aggregator buffer");
gst_aggregator_push (aggregator, pad, buf, "chain");
}

View file

@ -145,6 +145,7 @@ static void gst_filesrc_set_property (GObject *object, guint prop_id, const GVa
static void gst_filesrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
static GstBuffer * gst_filesrc_get (GstPad *pad);
static gboolean gst_filesrc_srcpad_event (GstPad *pad, GstEventType event, gint64 location, guint32 data);
static GstElementStateReturn gst_filesrc_change_state (GstElement *element);
@ -227,6 +228,7 @@ gst_filesrc_init (GstFileSrc *src)
{
src->srcpad = gst_pad_new ("src", GST_PAD_SRC);
gst_pad_set_get_function (src->srcpad,gst_filesrc_get);
gst_pad_set_event_function (src->srcpad,gst_filesrc_srcpad_event);
gst_element_add_pad (GST_ELEMENT (src), src->srcpad);
src->pagesize = getpagesize();
@ -279,7 +281,10 @@ gst_filesrc_set_property (GObject *object, guint prop_id, const GValue *value, G
src->curoffset = g_value_get_ulong (value);
break;
case ARG_MAPSIZE:
src->mapsize = g_value_get_ulong (value);
if ((src->mapsize % src->pagesize) == 0)
src->mapsize = g_value_get_ulong (value);
else
GST_INFO(0, "invalid mapsize, must a multiple of pagesize, which is %d\n",src->pagesize);
break;
default:
break;
@ -345,8 +350,9 @@ static GstBuffer *
gst_filesrc_map_region (GstFileSrc *src, off_t offset, off_t size)
{
GstBuffer *buf;
gint retval;
fprintf(stderr,"mapping region %d+%d from file into memory\n",offset,size);
// fprintf(stderr,"mapping region %d+%d from file into memory\n",offset,size);
// time to allocate a new mapbuf
buf = gst_buffer_new();
@ -354,9 +360,11 @@ gst_filesrc_map_region (GstFileSrc *src, off_t offset, off_t size)
GST_BUFFER_DATA(buf) = mmap (NULL, size, PROT_READ, MAP_SHARED, src->fd, offset);
if (GST_BUFFER_DATA(buf) == NULL) {
fprintf(stderr, "ERROR: gstfilesrc couldn't map file!\n");
} else if (GST_BUFFER_DATA(buf) == -1) {
} else if (GST_BUFFER_DATA(buf) == (void *)-1) {
perror("gstfilesrc:mmap()");
}
// madvise to tell the kernel what to do with it
retval = madvise(GST_BUFFER_DATA(buf),GST_BUFFER_SIZE(buf),MADV_SEQUENTIAL);
// fill in the rest of the fields
GST_BUFFER_FLAGS(buf) = GST_BUFFER_READONLY | GST_BUFFER_ORIGINAL;
GST_BUFFER_SIZE(buf) = size;
@ -423,7 +431,8 @@ gst_filesrc_get (GstPad *pad)
{
GstFileSrc *src;
GstBuffer *buf = NULL, *map;
off_t readend,mapstart,mapend;
off_t readend,readsize,mapstart,mapend;
gboolean eof = FALSE;
GstFileSrcRegion region;
int i;
@ -431,26 +440,34 @@ gst_filesrc_get (GstPad *pad)
src = GST_FILESRC (gst_pad_get_parent (pad));
g_return_val_if_fail (GST_FLAG_IS_SET (src, GST_FILESRC_OPEN), NULL);
// calculate end poiters so we don't have to do so repeatedly later
// calculate end pointers so we don't have to do so repeatedly later
readsize = src->block_size;
readend = src->curoffset + src->block_size; // note this is the byte *after* the read
mapstart = GST_BUFFER_OFFSET(src->mapbuf);
mapend = mapstart + GST_BUFFER_SIZE(src->mapbuf); // note this is the byte *after* the map
// check to see if we're going to overflow the end of the file
if (readend > src->filelen) {
readsize = src->filelen - src->curoffset;
readend = src->curoffset;
eof = TRUE;
}
// if the start is past the mapstart
if (src->curoffset >= mapstart) {
// if the end is before the mapend, the buffer is in current mmap region...
// ('cause by definition if readend is in the buffer, so's readstart)
if (readend <= mapend) {
// printf("read buf %d+%d lives in current mapbuf %d+%d, creating subbuffer of mapbuf\n",
// src->curoffset,src->block_size,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
// src->curoffset,readsize,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
buf = gst_buffer_create_sub (src->mapbuf, src->curoffset - GST_BUFFER_OFFSET(src->mapbuf),
src->block_size);
readsize);
// if the start actually is within the current mmap region, map an overlap buffer
} else if (src->curoffset < mapend) {
// printf("read buf %d+%d starts in mapbuf %d+%d but ends outside, creating new mmap\n",
// src->curoffset,src->block_size,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
buf = gst_filesrc_map_small_region (src, src->curoffset, src->block_size);
// src->curoffset,readsize,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
buf = gst_filesrc_map_small_region (src, src->curoffset, readsize);
}
// the only other option is that buffer is totally outside, which means we search for it
@ -462,42 +479,42 @@ gst_filesrc_get (GstPad *pad)
// or the read buffer fully contains the current mmap region
// either way, it's really not relevant, we just create a new region anyway
// printf("read buf %d+%d starts before mapbuf %d+%d, but overlaps it\n",
// src->curoffset,src->block_size,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
buf = gst_filesrc_map_small_region (src, src->curoffset, src->block_size);
// src->curoffset,readsize,GST_BUFFER_OFFSET(src->mapbuf),GST_BUFFER_SIZE(src->mapbuf));
buf = gst_filesrc_map_small_region (src, src->curoffset, readsize);
}
// then deal with the case where the read buffer is totally outside
if (buf == NULL) {
// first check to see if there's a map that covers the right region already
// printf("searching for mapbuf to cover %d+%d\n",src->curoffset,src->block_size);
// printf("searching for mapbuf to cover %d+%d\n",src->curoffset,readsize);
region.offset = src->curoffset;
region.size = src->block_size;
region.size = readsize;
map = g_tree_search(src->map_regions,gst_filesrc_search_region_match,&region);
// if we found an exact match, subbuffer it
if (map != NULL) {
// printf("found mapbuf at %d+%d, creating subbuffer\n",GST_BUFFER_OFFSET(map),GST_BUFFER_SIZE(map));
buf = gst_buffer_create_sub (map, src->curoffset - GST_BUFFER_OFFSET(map), src->block_size);
buf = gst_buffer_create_sub (map, src->curoffset - GST_BUFFER_OFFSET(map), readsize);
// otherwise we need to create something out of thin air
} else {
// if the read buffer crosses a mmap region boundary, create a one-off region
if ((src->curoffset / src->mapsize) != ((src->curoffset + src->block_size) / src->mapsize)) {
if ((src->curoffset / src->mapsize) != (readend / src->mapsize)) {
// printf("read buf %d+%d crosses a %d-byte boundary, creating a one-off\n",
// src->curoffset,src->block_size,src->mapsize);
buf = gst_filesrc_map_small_region (src, src->curoffset, src->block_size);
// src->curoffset,readsize,src->mapsize);
buf = gst_filesrc_map_small_region (src, src->curoffset, readsize);
// otherwise we will create a new mmap region and set it to the default
} else {
off_t nextmap = src->curoffset - (src->curoffset % src->mapsize);
// printf("read buf %d+%d in new mapbuf at %d+%d, mapping and subbuffering\n",
// src->curoffset,src->block_size,nextmap,src->mapsize);
// src->curoffset,readsize,nextmap,src->mapsize);
// first, we're done with the old mapbuf
gst_buffer_unref(src->mapbuf);
// create a new one
src->mapbuf = gst_filesrc_map_region (src, nextmap, src->mapsize);
// subbuffer it
buf = gst_buffer_create_sub (src->mapbuf, src->curoffset - GST_BUFFER_OFFSET(src->mapbuf), src->block_size);
buf = gst_buffer_create_sub (src->mapbuf, src->curoffset - GST_BUFFER_OFFSET(src->mapbuf), readsize);
}
}
}
@ -508,6 +525,8 @@ gst_filesrc_get (GstPad *pad)
*(GST_BUFFER_DATA(buf)+i) = *(GST_BUFFER_DATA(buf)+i);
}
// if we hit EOF,
/* we're done, return the buffer */
src->curoffset += GST_BUFFER_SIZE(buf);
return buf;
@ -580,3 +599,23 @@ gst_filesrc_change_state (GstElement *element)
return GST_STATE_SUCCESS;
}
static gboolean
gst_filesrc_srcpad_event(GstPad *pad, GstEventType event, gint64 location, guint32 data)
{
GstFileSrc *src = GST_FILESRC(GST_PAD_PARENT(pad));
if (event == GST_EVENT_SEEK) {
if (data == SEEK_SET) {
src->curoffset = (guint64)location;
} else if (data == SEEK_CUR) {
src->curoffset += (gint64)location;
} else if (data == SEEK_END) {
src->curoffset = src->filelen - (guint64)location;
}
// push a discontinuous event?
return TRUE;
}
return FALSE;
}

View file

@ -213,7 +213,7 @@ gst_tee_chain (GstPad *pad, GstBuffer *buf)
g_return_if_fail (buf != NULL);
tee = GST_TEE (gst_pad_get_parent (pad));
gst_trace_add_entry (NULL, 0, buf, "tee buffer");
// gst_trace_add_entry (NULL, 0, buf, "tee buffer");
for (i=0; i<tee->numsrcpads-1; i++)
gst_buffer_ref (buf);