Commit my pending changes.

Original commit message from CVS:
Commit my pending changes.
- revert WHERE stuff
- added fast type checking
- add preliminary stack trace functionality
- minor fixes/cleanups.
This commit is contained in:
Wim Taymans 2001-09-30 22:01:14 +00:00
parent 1058e3cf90
commit ccccda7d5d
28 changed files with 402 additions and 480 deletions

View file

@ -8,6 +8,8 @@ else
GSTARCH_SRCS = GSTARCH_SRCS =
endif endif
#GST_INSTRUMENT_FLAGS = -finstrument-functions -DGST_ENABLE_FUNC_INSTRUMENTATION
if USE_GLIB2 if USE_GLIB2
GST_OBJECT_MODEL_SRC = gstmarshal.c GST_OBJECT_MODEL_SRC = gstmarshal.c
GST_OBJECT_MODEL_HDR = gstmarshal.h GST_OBJECT_MODEL_HDR = gstmarshal.h
@ -198,7 +200,7 @@ noinst_HEADERS = \
gstarch.h \ gstarch.h \
gstpropsprivate.h gstpropsprivate.h
CFLAGS = $(LIBGST_CFLAGS) -D_GNU_SOURCE -DGST_CONFIG_DIR=\""$(GST_CONFIG_DIR)"\" CFLAGS = $(LIBGST_CFLAGS) -D_GNU_SOURCE -DGST_CONFIG_DIR=\""$(GST_CONFIG_DIR)"\" -Wall
LIBS = $(LIBGST_LIBS) LIBS = $(LIBGST_LIBS)
LDFLAGS = "" LDFLAGS = ""
libgst_la_LDFLAGS = -version-info $(GST_LIBVERSION) libgst_la_LDFLAGS = -version-info $(GST_LIBVERSION)

View file

@ -41,7 +41,7 @@ noinst_HEADERS = \
gstaggregator.h \ gstaggregator.h \
gstsinesrc.h gstsinesrc.h
CFLAGS += -O2 -Wall CFLAGS += -O2 -Wall -finstrument-functions -DGST_ENABLE_FUNC_INSTRUMENTATION
LDFLAGS += -lm LDFLAGS += -lm
libgstelements_la_LIBADD = $(GHTTP_LIBS) libgstelements_la_LIBADD = $(GHTTP_LIBS)

View file

@ -64,8 +64,8 @@ static void gst_disksrc_set_property (GObject *object, guint prop_id,
static void gst_disksrc_get_property (GObject *object, guint prop_id, static void gst_disksrc_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec); GValue *value, GParamSpec *pspec);
static GstBuffer * gst_disksrc_get (GstPad *pad); static GstBuffer* gst_disksrc_get (GstPad *pad);
static GstBuffer * gst_disksrc_get_region (GstPad *pad,GstRegionType type,guint64 offset,guint64 len); static GstBufferPool* gst_disksrc_get_bufferpool (GstPad *pad);
static GstElementStateReturn static GstElementStateReturn
gst_disksrc_change_state (GstElement *element); gst_disksrc_change_state (GstElement *element);
@ -73,7 +73,7 @@ static GstElementStateReturn
static gboolean gst_disksrc_open_file (GstDiskSrc *src); static gboolean gst_disksrc_open_file (GstDiskSrc *src);
static void gst_disksrc_close_file (GstDiskSrc *src); static void gst_disksrc_close_file (GstDiskSrc *src);
static GstElementClass *parent_class = NULL; static GstElementClass* parent_class = NULL;
//static guint gst_disksrc_signals[LAST_SIGNAL] = { 0 }; //static guint gst_disksrc_signals[LAST_SIGNAL] = { 0 };
GType GType
@ -133,8 +133,8 @@ gst_disksrc_init (GstDiskSrc *disksrc)
// GST_FLAG_SET (disksrc, GST_SRC_); // GST_FLAG_SET (disksrc, GST_SRC_);
disksrc->srcpad = gst_pad_new ("src", GST_PAD_SRC); disksrc->srcpad = gst_pad_new ("src", GST_PAD_SRC);
gst_pad_set_get_function (disksrc->srcpad,gst_disksrc_get); gst_pad_set_get_function (disksrc->srcpad, gst_disksrc_get);
gst_pad_set_getregion_function (disksrc->srcpad,gst_disksrc_get_region); gst_pad_set_bufferpool_function (disksrc->srcpad, gst_disksrc_get_bufferpool);
gst_element_add_pad (GST_ELEMENT (disksrc), disksrc->srcpad); gst_element_add_pad (GST_ELEMENT (disksrc), disksrc->srcpad);
disksrc->filename = NULL; disksrc->filename = NULL;
@ -220,6 +220,56 @@ gst_disksrc_get_property (GObject *object, guint prop_id, GValue *value, GParamS
} }
} }
static GstBuffer*
gst_disksrc_buffer_new (GstBufferPool *pool, gint64 location, gint size, gpointer user_data)
{
GstDiskSrc *src;
GstBuffer *buf;
src = GST_DISKSRC (user_data);
buf = gst_buffer_new ();
g_return_val_if_fail (buf != NULL, NULL);
/* simply set the buffer to point to the correct region of the file */
GST_BUFFER_DATA (buf) = src->map + location;
GST_BUFFER_OFFSET (buf) = location;
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
if ((location + size) > src->size)
GST_BUFFER_SIZE (buf) = src->size - location;
else
GST_BUFFER_SIZE (buf) = size;
GST_DEBUG (0,"map %p, offset %ld (%p), size %d\n", src->map, src->curoffset,
src->map + src->curoffset, GST_BUFFER_SIZE (buf));
return buf;
}
static void
gst_disksrc_buffer_free (GstBuffer *buf)
{
// FIXME do something here
}
static GstBufferPool*
gst_disksrc_get_bufferpool (GstPad *pad)
{
GstDiskSrc *src;
src = GST_DISKSRC (gst_pad_get_parent (pad));
if (!src->bufferpool) {
src->bufferpool = gst_buffer_pool_new ();
gst_buffer_pool_set_buffer_new_function (src->bufferpool, gst_disksrc_buffer_new);
gst_buffer_pool_set_buffer_free_function (src->bufferpool, gst_disksrc_buffer_free);
gst_buffer_pool_set_user_data (src->bufferpool, src);
}
return src->bufferpool;
}
/** /**
* gst_disksrc_get: * gst_disksrc_get:
* @pad: #GstPad to push a buffer from * @pad: #GstPad to push a buffer from
@ -246,28 +296,10 @@ gst_disksrc_get (GstPad *pad)
return buf; return buf;
} }
/* create the buffer */ // FIXME use a bufferpool
// FIXME: should eventually use a bufferpool for this buf = gst_disksrc_buffer_new (NULL, src->curoffset, src->bytes_per_read, src);
buf = gst_buffer_new ();
g_return_val_if_fail (buf != NULL, NULL);
/* simply set the buffer to point to the correct region of the file */
GST_BUFFER_DATA (buf) = src->map + src->curoffset;
GST_BUFFER_OFFSET (buf) = src->curoffset;
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
if ((src->curoffset + src->bytes_per_read) > src->size) {
GST_BUFFER_SIZE (buf) = src->size - src->curoffset;
// FIXME: set the buffer's EOF bit here
} else
GST_BUFFER_SIZE (buf) = src->bytes_per_read;
GST_DEBUG (0,"map %p, offset %ld (%p), size %d\n", src->map, src->curoffset,
src->map + src->curoffset, GST_BUFFER_SIZE (buf));
//gst_util_dump_mem (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); //gst_util_dump_mem (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
src->curoffset += GST_BUFFER_SIZE (buf); src->curoffset += GST_BUFFER_SIZE (buf);
if (src->new_seek) { if (src->new_seek) {
@ -280,61 +312,6 @@ gst_disksrc_get (GstPad *pad)
return buf; return buf;
} }
/**
* gst_disksrc_get_region:
* @src: #GstSrc to push a buffer from
* @offset: offset in file
* @size: number of bytes
*
* Push a new buffer from the disksrc of given size at given offset.
*/
static GstBuffer *
gst_disksrc_get_region (GstPad *pad, GstRegionType type,guint64 offset,guint64 len)
{
GstDiskSrc *src;
GstBuffer *buf;
g_return_val_if_fail (pad != NULL, NULL);
g_return_val_if_fail (type == GST_REGION_OFFSET_LEN, NULL);
src = GST_DISKSRC (gst_pad_get_parent (pad));
g_return_val_if_fail (GST_IS_DISKSRC (src), NULL);
g_return_val_if_fail (GST_FLAG_IS_SET (src, GST_DISKSRC_OPEN), NULL);
/* deal with EOF state */
if (offset >= src->size) {
gst_pad_event (pad, GST_EVENT_EOS, 0LL, 0);
GST_DEBUG (0,"map offset %lld >= size %ld --> eos\n", offset, src->size);
//FIXME
buf = gst_buffer_new();
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_EOS);
return buf;
}
/* create the buffer */
// FIXME: should eventually use a bufferpool for this
buf = gst_buffer_new ();
g_return_val_if_fail (buf != NULL, NULL);
/* simply set the buffer to point to the correct region of the file */
GST_BUFFER_DATA (buf) = src->map + offset;
GST_BUFFER_OFFSET (buf) = offset;
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
if ((offset + len) > src->size) {
GST_BUFFER_SIZE (buf) = src->size - offset;
// FIXME: set the buffer's EOF bit here
} else
GST_BUFFER_SIZE (buf) = len;
GST_DEBUG (0,"map %p, offset %lld, size %d\n", src->map, offset, GST_BUFFER_SIZE (buf));
/* we're done, return the buffer off now */
return buf;
}
/* open the file and mmap it, necessary to go to READY state */ /* open the file and mmap it, necessary to go to READY state */
static gboolean static gboolean
gst_disksrc_open_file (GstDiskSrc *src) gst_disksrc_open_file (GstDiskSrc *src)

View file

@ -64,6 +64,7 @@ struct _GstDiskSrc {
gchar *filename; gchar *filename;
/* fd */ /* fd */
gint fd; gint fd;
GstBufferPool *bufferpool;
/* mapping parameters */ /* mapping parameters */
gulong size; /* how long is the file? */ gulong size; /* how long is the file? */

View file

@ -225,6 +225,7 @@ gst_fakesink_chain (GstPad *pad, GstBuffer *buf)
if (GST_IS_EVENT(buf)) { if (GST_IS_EVENT(buf)) {
g_print("fakesink: have event!\n"); g_print("fakesink: have event!\n");
gst_element_set_state (GST_ELEMENT (fakesink), GST_STATE_PAUSED);
return; return;
} }

View file

@ -335,7 +335,8 @@ gst_fakesrc_get(GstPad *pad)
if (src->num_buffers == 0) { if (src->num_buffers == 0) {
g_print("fakesrc: sending EOS\n"); g_print("fakesrc: sending EOS\n");
return GST_BUFFER(gst_event_empty_new (GST_EVENT_EOS)); gst_element_set_state (GST_ELEMENT (src), GST_STATE_PAUSED);
return GST_BUFFER(gst_event_new (GST_EVENT_EOS));
} }
else { else {
if (src->num_buffers > 0) if (src->num_buffers > 0)
@ -345,7 +346,7 @@ gst_fakesrc_get(GstPad *pad)
if (src->eos) { if (src->eos) {
GST_INFO (0, "fakesrc is setting eos on pad"); GST_INFO (0, "fakesrc is setting eos on pad");
g_print("fakesrc: sending EOS\n"); g_print("fakesrc: sending EOS\n");
return GST_BUFFER(gst_event_empty_new (GST_EVENT_EOS)); return GST_BUFFER(gst_event_new (GST_EVENT_EOS));
} }
buf = gst_buffer_new(); buf = gst_buffer_new();
@ -397,7 +398,7 @@ gst_fakesrc_loop(GstElement *element)
if (src->eos) { if (src->eos) {
GST_INFO (0, "fakesrc is setting eos on pad"); GST_INFO (0, "fakesrc is setting eos on pad");
gst_pad_push(pad, GST_BUFFER(gst_event_empty_new (GST_EVENT_EOS))); gst_pad_push(pad, GST_BUFFER(gst_event_new (GST_EVENT_EOS)));
} }
buf = gst_buffer_new(); buf = gst_buffer_new();

View file

@ -596,6 +596,7 @@ gst_filesrc_close_file (GstFileSrc *src)
{ {
g_return_if_fail (GST_FLAG_IS_SET (src, GST_FILESRC_OPEN)); g_return_if_fail (GST_FLAG_IS_SET (src, GST_FILESRC_OPEN));
g_print ("close\n");
/* close the file */ /* close the file */
close (src->fd); close (src->fd);

View file

@ -220,7 +220,7 @@ gtk_signal_handler_pending ((GtkObject *)object,name,may_block)
gint* g_signal_list_ids (GType type, guint *n_ids); gint* g_signal_list_ids (GType type, guint *n_ids);
// lists // lists
GSList* g_slist_delete_link (GSList *list, GSList *link); GSList* g_slist_delete_link (GSList *list, GSList *link) __attribute__ ((no_instrument_function));
// arguments/parameters // arguments/parameters

View file

@ -90,7 +90,12 @@ gst_init (int *argc, char **argv[])
GST_INFO (GST_CAT_GST_INIT, "Initializing GStreamer Core Library"); GST_INFO (GST_CAT_GST_INIT, "Initializing GStreamer Core Library");
gst_object_get_type ();
gst_pad_get_type ();
gst_real_pad_get_type ();
gst_ghost_pad_get_type ();
gst_elementfactory_get_type (); gst_elementfactory_get_type ();
gst_element_get_type ();
gst_typefactory_get_type (); gst_typefactory_get_type ();
#ifndef GST_DISABLE_AUTOPLUG #ifndef GST_DISABLE_AUTOPLUG
gst_autoplugfactory_get_type (); gst_autoplugfactory_get_type ();

View file

@ -32,13 +32,6 @@ GType _gst_buffer_type;
static GMemChunk *_gst_buffer_chunk; static GMemChunk *_gst_buffer_chunk;
static GMutex *_gst_buffer_chunk_lock; static GMutex *_gst_buffer_chunk_lock;
#ifdef GST_BUFFER_WHERE
static GSList *_debug_live = 0;
# define GST_BUFFERS_COUNT (g_slist_length(_debug_live))
#else
# define GST_BUFFERS_COUNT 1
#endif
void void
_gst_buffer_initialize (void) _gst_buffer_initialize (void)
{ {
@ -74,15 +67,12 @@ _gst_buffer_initialize (void)
* Returns: new buffer * Returns: new buffer
*/ */
GstBuffer* GstBuffer*
gst_buffer_new_loc (GST_WHERE_ARGS) gst_buffer_new (void)
{ {
GstBuffer *buffer; GstBuffer *buffer;
g_mutex_lock (_gst_buffer_chunk_lock); g_mutex_lock (_gst_buffer_chunk_lock);
buffer = g_mem_chunk_alloc (_gst_buffer_chunk); buffer = g_mem_chunk_alloc (_gst_buffer_chunk);
#ifdef GST_BUFFER_WHERE
_debug_live = g_slist_prepend (_debug_live, buffer);
#endif
g_mutex_unlock (_gst_buffer_chunk_lock); g_mutex_unlock (_gst_buffer_chunk_lock);
GST_INFO (GST_CAT_BUFFER,"creating new buffer %p",buffer); GST_INFO (GST_CAT_BUFFER,"creating new buffer %p",buffer);
@ -105,11 +95,6 @@ gst_buffer_new_loc (GST_WHERE_ARGS)
buffer->pool_private = NULL; buffer->pool_private = NULL;
buffer->free = NULL; buffer->free = NULL;
buffer->copy = NULL; buffer->copy = NULL;
#ifdef GST_BUFFER_WHERE
buffer->file = where_file;
buffer->line = where_line;
#endif
return buffer; return buffer;
} }
@ -152,10 +137,9 @@ gst_buffer_new_from_pool (GstBufferPool *pool, guint32 offset, guint32 size)
* Returns: new buffer * Returns: new buffer
*/ */
GstBuffer* GstBuffer*
gst_buffer_create_sub_loc (GST_WHERE_ARGS_ gst_buffer_create_sub (GstBuffer *parent,
GstBuffer *parent, guint32 offset,
guint32 offset, guint32 size)
guint32 size)
{ {
GstBuffer *buffer; GstBuffer *buffer;
@ -166,9 +150,6 @@ gst_buffer_create_sub_loc (GST_WHERE_ARGS_
g_mutex_lock (_gst_buffer_chunk_lock); g_mutex_lock (_gst_buffer_chunk_lock);
buffer = g_mem_chunk_alloc (_gst_buffer_chunk); buffer = g_mem_chunk_alloc (_gst_buffer_chunk);
#ifdef GST_BUFFER_WHERE
_debug_live = g_slist_prepend (_debug_live, buffer);
#endif
g_mutex_unlock (_gst_buffer_chunk_lock); g_mutex_unlock (_gst_buffer_chunk_lock);
GST_INFO (GST_CAT_BUFFER,"creating new subbuffer %p from parent %p (size %u, offset %u)", GST_INFO (GST_CAT_BUFFER,"creating new subbuffer %p from parent %p (size %u, offset %u)",
buffer, parent, size, offset); buffer, parent, size, offset);
@ -208,11 +189,6 @@ gst_buffer_create_sub_loc (GST_WHERE_ARGS_
buffer->pool = NULL; buffer->pool = NULL;
#ifdef GST_BUFFER_WHERE
buffer->file = where_file;
buffer->line = where_line;
#endif
return buffer; return buffer;
} }
@ -229,9 +205,8 @@ gst_buffer_create_sub_loc (GST_WHERE_ARGS_
* Returns: new buffer * Returns: new buffer
*/ */
GstBuffer* GstBuffer*
gst_buffer_append_loc (GST_WHERE_ARGS_ gst_buffer_append (GstBuffer *buffer,
GstBuffer *buffer, GstBuffer *append)
GstBuffer *append)
{ {
guint size; guint size;
GstBuffer *newbuf; GstBuffer *newbuf;
@ -257,7 +232,7 @@ gst_buffer_append_loc (GST_WHERE_ARGS_
} }
// the buffer is used, create a new one // the buffer is used, create a new one
else { else {
newbuf = gst_buffer_new_loc (GST_WHERE_VARS); newbuf = gst_buffer_new ();
newbuf->size = buffer->size+append->size; newbuf->size = buffer->size+append->size;
newbuf->data = g_malloc (newbuf->size); newbuf->data = g_malloc (newbuf->size);
memcpy (newbuf->data, buffer->data, buffer->size); memcpy (newbuf->data, buffer->data, buffer->size);
@ -281,10 +256,9 @@ gst_buffer_destroy (GstBuffer *buffer)
g_return_if_fail (buffer != NULL); g_return_if_fail (buffer != NULL);
GST_INFO (GST_CAT_BUFFER, "freeing %sbuffer %p (%d buffers remain)", GST_INFO (GST_CAT_BUFFER, "freeing %sbuffer %p",
(buffer->parent?"sub":""), (buffer->parent?"sub":""),
buffer, buffer);
GST_BUFFERS_COUNT - 1);
// free the data only if there is some, DONTFREE isn't set, and not sub // free the data only if there is some, DONTFREE isn't set, and not sub
if (GST_BUFFER_DATA (buffer) && if (GST_BUFFER_DATA (buffer) &&
@ -313,61 +287,9 @@ gst_buffer_destroy (GstBuffer *buffer)
// remove it entirely from memory // remove it entirely from memory
g_mutex_lock (_gst_buffer_chunk_lock); g_mutex_lock (_gst_buffer_chunk_lock);
g_mem_chunk_free (_gst_buffer_chunk,buffer); g_mem_chunk_free (_gst_buffer_chunk,buffer);
#ifdef GST_BUFFER_WHERE
_debug_live = g_slist_delete_link (_debug_live,
g_slist_find (_debug_live, buffer));
#endif
g_mutex_unlock (_gst_buffer_chunk_lock); g_mutex_unlock (_gst_buffer_chunk_lock);
} }
#ifdef GST_BUFFER_WHERE
static gint
_compare_buffer (GstBuffer *b1, GstBuffer *b2)
{
if (b1->timestamp == b2->timestamp)
return 0;
else if (b1->timestamp > b2->timestamp)
return 1;
else
return -1;
}
//
// GST_BUFFER_WHERE will be replaced with something better as
// soon as something better is actually implemented. The
// problems with this technique are:
//
// 1. Toggling debugging changes the function prototypes, causing
// a full recompile. Yuk.
//
// 2. The prototypes don't match the documentation. This may cause
// gtk-doc to choak.
//
// 3. Lots of ugly macros make the source code hard to maintain.
//
void gst_buffer_print_live ()
{
GSList *elem;
g_mutex_lock (_gst_buffer_chunk_lock);
_debug_live = g_slist_sort (_debug_live, (GCompareFunc) _compare_buffer);
for (elem = _debug_live; elem; elem = elem->next) {
GstBuffer *buf = elem->data;
g_print ("%sbuffer %p created %s:%d data=%p size=0x%x\n",
buf->parent? "sub":" ",
buf, (!buf->file || buf->file == NULL)? "?" : buf->file,
buf->line, buf->data, buf->size);
}
g_print ("(%d buffers)\n", g_slist_length (_debug_live));
g_mutex_unlock (_gst_buffer_chunk_lock);
}
#endif
/** /**
* gst_buffer_ref: * gst_buffer_ref:
* @buffer: the GstBuffer to reference * @buffer: the GstBuffer to reference
@ -432,7 +354,7 @@ gst_buffer_unref (GstBuffer *buffer)
* Returns: new buffer * Returns: new buffer
*/ */
GstBuffer * GstBuffer *
gst_buffer_copy_loc (GST_WHERE_ARGS_ GstBuffer *buffer) gst_buffer_copy (GstBuffer *buffer)
{ {
GstBuffer *newbuf; GstBuffer *newbuf;
@ -506,8 +428,7 @@ gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2)
*/ */
// FIXME need to think about CoW and such... // FIXME need to think about CoW and such...
GstBuffer * GstBuffer *
gst_buffer_span_loc (GST_WHERE_ARGS_ gst_buffer_span (GstBuffer *buf1, guint32 offset, GstBuffer *buf2, guint32 len)
GstBuffer *buf1, guint32 offset, GstBuffer *buf2, guint32 len)
{ {
GstBuffer *newbuf; GstBuffer *newbuf;
@ -527,13 +448,12 @@ gst_buffer_span_loc (GST_WHERE_ARGS_
// ((buf1->data + buf1->size) == buf2->data)) { // ((buf1->data + buf1->size) == buf2->data)) {
if (gst_buffer_is_span_fast(buf1,buf2)) { if (gst_buffer_is_span_fast(buf1,buf2)) {
// we simply create a subbuffer of the common parent // we simply create a subbuffer of the common parent
newbuf = gst_buffer_create_sub_loc(GST_WHERE_VARS_ newbuf = gst_buffer_create_sub (buf1->parent, buf1->data - (buf1->parent->data) + offset, len);
buf1->parent, buf1->data - (buf1->parent->data) + offset, len);
} }
else { else {
g_print ("slow path taken in buffer_span\n"); g_print ("slow path taken in buffer_span\n");
// otherwise we simply have to brute-force copy the buffers // otherwise we simply have to brute-force copy the buffers
newbuf = gst_buffer_new_loc (GST_WHERE_VARS); newbuf = gst_buffer_new ();
// put in new size // put in new size
newbuf->size = len; newbuf->size = len;
@ -571,10 +491,8 @@ gst_buffer_span_loc (GST_WHERE_ARGS_
* Returns: new buffer that's the concatenation of the source buffers * Returns: new buffer that's the concatenation of the source buffers
*/ */
GstBuffer * GstBuffer *
gst_buffer_merge_loc (GST_WHERE_ARGS_ gst_buffer_merge (GstBuffer *buf1, GstBuffer *buf2)
GstBuffer *buf1, GstBuffer *buf2)
{ {
// we're just a specific case of the more general gst_buffer_span() // we're just a specific case of the more general gst_buffer_span()
return gst_buffer_span_loc (GST_WHERE_VARS_ return gst_buffer_span (buf1, 0, buf2, buf1->size + buf2->size);
buf1, 0, buf2, buf1->size + buf2->size);
} }

View file

@ -57,14 +57,10 @@ extern GType _gst_buffer_type;
#define GST_BUFFER(buf) ((GstBuffer *)(buf)) #define GST_BUFFER(buf) ((GstBuffer *)(buf))
#define GST_IS_BUFFER(buf) (GST_DATA_TYPE(buf) == GST_TYPE_BUFFER) #define GST_IS_BUFFER(buf) (GST_DATA_TYPE(buf) == GST_TYPE_BUFFER)
#define GST_BUFFER_FLAGS(buf) \ #define GST_BUFFER_FLAGS(buf) (GST_BUFFER(buf)->flags)
(GST_BUFFER(buf)->flags) #define GST_BUFFER_FLAG_IS_SET(buf,flag) (GST_BUFFER_FLAGS(buf) & (1<<(flag)))
#define GST_BUFFER_FLAG_IS_SET(buf,flag) \ #define GST_BUFFER_FLAG_SET(buf,flag) G_STMT_START{ (GST_BUFFER_FLAGS(buf) |= (1<<(flag))); }G_STMT_END
(GST_BUFFER_FLAGS(buf) & (1<<(flag))) #define GST_BUFFER_FLAG_UNSET(buf,flag) G_STMT_START{ (GST_BUFFER_FLAGS(buf) &= ~(1<<(flag))); }G_STMT_END
#define GST_BUFFER_FLAG_SET(buf,flag) \
G_STMT_START{ (GST_BUFFER_FLAGS(buf) |= (1<<(flag))); }G_STMT_END
#define GST_BUFFER_FLAG_UNSET(buf,flag) \
G_STMT_START{ (GST_BUFFER_FLAGS(buf) &= ~(1<<(flag))); }G_STMT_END
#define GST_BUFFER_DATA(buf) (GST_BUFFER(buf)->data) #define GST_BUFFER_DATA(buf) (GST_BUFFER(buf)->data)
@ -96,7 +92,6 @@ typedef enum {
} GstBufferFlags; } GstBufferFlags;
typedef struct _GstBuffer GstBuffer; typedef struct _GstBuffer GstBuffer;
@ -107,101 +102,53 @@ typedef GstBuffer *(*GstBufferCopyFunc) (GstBuffer *srcbuf);
#include <gst/gstbufferpool.h> #include <gst/gstbufferpool.h>
struct _GstBuffer { struct _GstBuffer {
GstData data_type; GstData data_type;
/* locking */ /* locking */
GMutex *lock; GMutex *lock;
/* refcounting */ /* refcounting */
#ifdef HAVE_ATOMIC_H #ifdef HAVE_ATOMIC_H
atomic_t refcount; atomic_t refcount;
#define GST_BUFFER_REFCOUNT(buf) (atomic_read(&(GST_BUFFER((buf))->refcount))) #define GST_BUFFER_REFCOUNT(buf) (atomic_read(&(GST_BUFFER((buf))->refcount)))
#else #else
int refcount; int refcount;
#define GST_BUFFER_REFCOUNT(buf) (GST_BUFFER(buf)->refcount) #define GST_BUFFER_REFCOUNT(buf) (GST_BUFFER(buf)->refcount)
#endif #endif
/* flags */ /* flags */
guint16 flags; guint16 flags;
/* pointer to data, its size, and offset in original source if known */ /* pointer to data, its size, and offset in original source if known */
guchar *data; guchar *data;
guint32 size; guint32 size;
guint32 maxsize; guint32 maxsize;
guint32 offset; guint32 offset;
#ifdef GST_BUFFER_WHERE
const gchar *file;
gint line;
#endif
/* timestamp */ /* timestamp */
gint64 timestamp; gint64 timestamp;
gint64 maxage; gint64 maxage;
/* subbuffer support, who's my parent? */ /* subbuffer support, who's my parent? */
GstBuffer *parent; GstBuffer *parent;
/* this is a pointer to the buffer pool (if any) */ /* this is a pointer to the buffer pool (if any) */
GstBufferPool *pool; GstBufferPool *pool;
gpointer pool_private; gpointer pool_private;
/* utility function pointers */ /* utility function pointers */
GstBufferFreeFunc free; // free the data associated with the buffer GstBufferFreeFunc free; // free the data associated with the buffer
GstBufferCopyFunc copy; // copy the data from one buffer to another GstBufferCopyFunc copy; // copy the data from one buffer to another
}; };
#ifdef GST_BUFFER_WHERE
# define GST_WHERE_ARGS const gchar *where_file, gint where_line
# define GST_WHERE_ARGS_ GST_WHERE_ARGS,
# define GST_WHERE_VARS where_file, where_line
# define GST_WHERE_VARS_ where_file, where_line,
# define gst_buffer_new() \
gst_buffer_new_loc(__FILE__, __LINE__)
# define gst_buffer_create_sub(parent, offset, size) \
gst_buffer_create_sub_loc(__FILE__, __LINE__, parent, offset, size)
# define gst_buffer_copy(buffer) \
gst_buffer_copy_loc(__FILE__, __LINE__, buffer)
# define gst_buffer_merge(buf1, buf2) \
gst_buffer_merge_loc(__FILE__, __LINE__, buf1, buf2)
# define gst_buffer_span(buf1, offset, buf2, len) \
gst_buffer_span_loc(__FILE__, __LINE__, buf1, offset, buf2, len)
# define gst_buffer_append(buf, buf2) \
gst_buffer_append_loc(__FILE__, __LINE__, buf, buf2)
#else /* GST_BUFFER_WHERE */
# define GST_WHERE_ARGS
# define GST_WHERE_ARGS_
# define GST_WHERE_VARS
# define GST_WHERE_VARS_
# define gst_buffer_new() \
gst_buffer_new_loc()
# define gst_buffer_create_sub(parent, offset, size) \
gst_buffer_create_sub_loc(parent, offset, size)
# define gst_buffer_copy(buffer) \
gst_buffer_copy_loc(buffer)
# define gst_buffer_merge(buf1, buf2) \
gst_buffer_merge_loc(buf1, buf2)
# define gst_buffer_span(buf1, offset, buf2, len) \
gst_buffer_span_loc(buf1, offset, buf2, len)
# define gst_buffer_append(buf, buf2) \
gst_buffer_append_loc(buf, buf2)
#endif /* GST_BUFFER_WHERE */
/* initialisation */ /* initialisation */
void _gst_buffer_initialize (void); void _gst_buffer_initialize (void);
/* creating a new buffer from scratch */ /* creating a new buffer from scratch */
GstBuffer* gst_buffer_new_loc (GST_WHERE_ARGS); GstBuffer* gst_buffer_new (void);
GstBuffer* gst_buffer_new_from_pool (GstBufferPool *pool, guint32 offset, guint32 size); GstBuffer* gst_buffer_new_from_pool (GstBufferPool *pool, guint32 offset, guint32 size);
/* creating a subbuffer */ /* creating a subbuffer */
GstBuffer* gst_buffer_create_sub_loc (GST_WHERE_ARGS_ GstBuffer* gst_buffer_create_sub (GstBuffer *parent, guint32 offset, guint32 size);
GstBuffer *parent, guint32 offset, guint32 size);
/* refcounting */ /* refcounting */
void gst_buffer_ref (GstBuffer *buffer); void gst_buffer_ref (GstBuffer *buffer);
@ -211,16 +158,12 @@ void gst_buffer_unref (GstBuffer *buffer);
void gst_buffer_destroy (GstBuffer *buffer); void gst_buffer_destroy (GstBuffer *buffer);
/* copy buffer */ /* copy buffer */
GstBuffer* gst_buffer_copy_loc (GST_WHERE_ARGS_ GstBuffer* gst_buffer_copy (GstBuffer *buffer);
GstBuffer *buffer);
/* merge, span, or append two buffers, intelligently */ /* merge, span, or append two buffers, intelligently */
GstBuffer* gst_buffer_merge_loc (GST_WHERE_ARGS_ GstBuffer* gst_buffer_merge (GstBuffer *buf1, GstBuffer *buf2);
GstBuffer *buf1, GstBuffer *buf2); GstBuffer* gst_buffer_span (GstBuffer *buf1,guint32 offset,GstBuffer *buf2,guint32 len);
GstBuffer* gst_buffer_span_loc (GST_WHERE_ARGS_ GstBuffer* gst_buffer_append (GstBuffer *buf, GstBuffer *buf2);
GstBuffer *buf1,guint32 offset,GstBuffer *buf2,guint32 len);
GstBuffer* gst_buffer_append_loc (GST_WHERE_ARGS_
GstBuffer *buf, GstBuffer *buf2);
gboolean gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2); gboolean gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2);

View file

@ -66,13 +66,14 @@ static xmlNodePtr gst_element_save_thyself (GstObject *object, xmlNodePtr paren
GstElement* gst_element_restore_thyself (xmlNodePtr self, GstObject *parent); GstElement* gst_element_restore_thyself (xmlNodePtr self, GstObject *parent);
#endif #endif
GType _gst_element_type = 0;
static GstObjectClass *parent_class = NULL; static GstObjectClass *parent_class = NULL;
static guint gst_element_signals[LAST_SIGNAL] = { 0 }; static guint gst_element_signals[LAST_SIGNAL] = { 0 };
GType gst_element_get_type(void) { GType gst_element_get_type (void)
static GType element_type = 0; {
if (!_gst_element_type) {
if (!element_type) {
static const GTypeInfo element_info = { static const GTypeInfo element_info = {
sizeof(GstElementClass), sizeof(GstElementClass),
(GBaseInitFunc)gst_element_base_class_init, (GBaseInitFunc)gst_element_base_class_init,
@ -84,9 +85,9 @@ GType gst_element_get_type(void) {
0, 0,
(GInstanceInitFunc)gst_element_init, (GInstanceInitFunc)gst_element_init,
}; };
element_type = g_type_register_static(GST_TYPE_OBJECT, "GstElement", &element_info, G_TYPE_FLAG_ABSTRACT); _gst_element_type = g_type_register_static(GST_TYPE_OBJECT, "GstElement", &element_info, G_TYPE_FLAG_ABSTRACT);
} }
return element_type; return _gst_element_type;
} }
static void static void

View file

@ -73,16 +73,22 @@ typedef enum {
#define GST_STATE_PAUSED_TO_READY ((GST_STATE_PAUSED<<8) | GST_STATE_READY) #define GST_STATE_PAUSED_TO_READY ((GST_STATE_PAUSED<<8) | GST_STATE_READY)
#define GST_STATE_READY_TO_NULL ((GST_STATE_READY<<8) | GST_STATE_NULL) #define GST_STATE_READY_TO_NULL ((GST_STATE_READY<<8) | GST_STATE_NULL)
#define GST_TYPE_ELEMENT \ extern GType _gst_element_type;
(gst_element_get_type())
#define GST_ELEMENT(obj) \ #define GST_TYPE_ELEMENT (_gst_element_type)
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ELEMENT,GstElement))
#define GST_ELEMENT_CLASS(klass) \ #define GST_ELEMENT_FAST(obj) ((GstElement*)(obj))
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ELEMENT,GstElementClass)) #define GST_ELEMENT_CLASS_FAST(klass) ((GstElementClass*)(klass))
#define GST_IS_ELEMENT(obj) \ #define GST_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_ELEMENT))
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ELEMENT)) #define GST_IS_ELEMENT_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_ELEMENT))
#define GST_IS_ELEMENT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ELEMENT)) #ifdef GST_TYPE_PARANOID
# define GST_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_ELEMENT, GstElement))
# define GST_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_ELEMENT, GstElementClass))
#else
# define GST_ELEMENT GST_ELEMENT_FAST
# define GST_ELEMENT_CLASS GST_ELEMENT_CLASS_FAST
#endif
typedef enum { typedef enum {
/* element is complex (for some def.) and generally require a cothread */ /* element is complex (for some def.) and generally require a cothread */
@ -124,7 +130,7 @@ typedef enum {
#define GST_ELEMENT_MANAGER(obj) (((GstElement*)(obj))->manager) #define GST_ELEMENT_MANAGER(obj) (((GstElement*)(obj))->manager)
#define GST_ELEMENT_SCHED(obj) (((GstElement*)(obj))->sched) #define GST_ELEMENT_SCHED(obj) (((GstElement*)(obj))->sched)
#define GST_ELEMENT_PADS(obj) ((obj)->pads) #define GST_ELEMENT_PADS(obj) ((obj)->pads)
#define GST_ELEMENT_DPARAM_MANAGER(obj) ((obj)->dpman) #define GST_ELEMENT_DPARAM_MANAGER(obj) ((obj)->dpman)
//typedef struct _GstElement GstElement; //typedef struct _GstElement GstElement;
//typedef struct _GstElementClass GstElementClass; //typedef struct _GstElementClass GstElementClass;
@ -134,33 +140,34 @@ typedef struct _GstElementFactoryClass GstElementFactoryClass;
typedef void (*GstElementLoopFunction) (GstElement *element); typedef void (*GstElementLoopFunction) (GstElement *element);
struct _GstElement { struct _GstElement {
GstObject object; GstObject object;
guint8 current_state;
guint8 pending_state;
/* element state and scheduling */
guint8 current_state;
guint8 pending_state;
GstElement *manager;
GstSchedule *sched;
GstElementLoopFunction loopfunc; GstElementLoopFunction loopfunc;
cothread_state *threadstate; cothread_state *threadstate;
GstPad *select_pad;
guint16 numpads; /* element pads */
guint16 numsrcpads; guint16 numpads;
guint16 numsinkpads; guint16 numsrcpads;
GList *pads; guint16 numsinkpads;
GList *pads;
GstPad *select_pad;
GstElement *manager; GstDParamManager *dpman;
GstSchedule *sched;
GstDParamManager *dpman;
}; };
struct _GstElementClass { struct _GstElementClass {
GstObjectClass parent_class; GstObjectClass parent_class;
/* the elementfactory that created us */ /* the elementfactory that created us */
GstElementFactory *elementfactory; GstElementFactory *elementfactory;
/* templates for our pads */ /* templates for our pads */
GList *padtemplates; GList *padtemplates;
gint numpadtemplates; gint numpadtemplates;
/* signal callbacks */ /* signal callbacks */
void (*state_change) (GstElement *element,GstElementState state); void (*state_change) (GstElement *element,GstElementState state);
@ -172,8 +179,8 @@ struct _GstElementClass {
void (*eos) (GstElement *element); void (*eos) (GstElement *element);
/* local pointers for get/set */ /* local pointers for get/set */
void (*set_property) (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); void (*set_property) (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
void (*get_property) (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); void (*get_property) (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
/* change the element state */ /* change the element state */
GstElementStateReturn (*change_state) (GstElement *element); GstElementStateReturn (*change_state) (GstElement *element);
@ -247,16 +254,13 @@ struct _GstElementDetails {
gchar *copyright; /* copyright details (year, etc.) */ gchar *copyright; /* copyright details (year, etc.) */
}; };
#define GST_TYPE_ELEMENTFACTORY \ #define GST_TYPE_ELEMENTFACTORY (gst_elementfactory_get_type())
(gst_elementfactory_get_type()) #define GST_ELEMENTFACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ELEMENTFACTORY,\
#define GST_ELEMENTFACTORY(obj) \ GstElementFactory))
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ELEMENTFACTORY,GstElementFactory)) #define GST_ELEMENTFACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ELEMENTFACTORY,\
#define GST_ELEMENTFACTORY_CLASS(klass) \ GstElementFactoryClass))
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ELEMENTFACTORY,GstElementFactoryClass)) #define GST_IS_ELEMENTFACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ELEMENTFACTORY))
#define GST_IS_ELEMENTFACTORY(obj) \ #define GST_IS_ELEMENTFACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ELEMENTFACTORY))
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ELEMENTFACTORY))
#define GST_IS_ELEMENTFACTORY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ELEMENTFACTORY))
struct _GstElementFactory { struct _GstElementFactory {
GstPluginFeature feature; GstPluginFeature feature;

View file

@ -459,6 +459,8 @@ gst_default_error_handler (gchar *file, gchar *function,
/***** DEBUG system *****/ /***** DEBUG system *****/
GHashTable *__gst_function_pointers = NULL; GHashTable *__gst_function_pointers = NULL;
// FIXME make this thread specific
static GSList* stack_trace = NULL;
gchar *_gst_debug_nameof_funcptr (void *ptr) __attribute__ ((no_instrument_function)); gchar *_gst_debug_nameof_funcptr (void *ptr) __attribute__ ((no_instrument_function));
@ -479,15 +481,52 @@ _gst_debug_nameof_funcptr (void *ptr)
#ifdef GST_ENABLE_FUNC_INSTRUMENTATION #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) __attribute__ ((no_instrument_function));
void __cyg_profile_func_enter(void *this_fn,void *call_site) { 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)); {
gchar *name = _gst_debug_nameof_funcptr (this_fn);
gchar *site = _gst_debug_nameof_funcptr (call_site);
GST_DEBUG(GST_CAT_CALL_TRACE, "entering function %s from %s\n", name, site);
stack_trace = g_slist_prepend (stack_trace, g_strdup_printf ("%8p in %s from %p (%s)", this_fn, name, call_site, site));
g_free (name);
g_free (site);
} }
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) __attribute__ ((no_instrument_function));
void __cyg_profile_func_exit(void *this_fn,void *call_site) { 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)); {
gchar *name = _gst_debug_nameof_funcptr (this_fn);
GST_DEBUG(GST_CAT_CALL_TRACE, "leaving function %s\n", name);
g_free (stack_trace->data);
stack_trace = g_slist_delete_link (stack_trace, stack_trace);
g_free (name);
}
void
gst_debug_print_stack_trace (void)
{
GSList *walk = stack_trace;
gint count = 0;
if (walk)
walk = g_slist_next (walk);
while (walk) {
gchar *name = (gchar *) walk->data;
g_print ("#%-2d %s\n", count++, name);
walk = g_slist_next (walk);
}
}
#else
void
gst_debug_print_stack_trace (void)
{
} }
#endif /* GST_ENABLE_FUNC_INTSTRUMENTATION */ #endif /* GST_ENABLE_FUNC_INTSTRUMENTATION */

View file

@ -341,6 +341,8 @@ _gst_debug_register_funcptr (void *ptr, gchar *ptrname)
gchar *_gst_debug_nameof_funcptr (void *ptr); gchar *_gst_debug_nameof_funcptr (void *ptr);
void gst_debug_print_stack_trace (void);
#endif /* __GSTINFO_H__ */ #endif /* __GSTINFO_H__ */

View file

@ -43,6 +43,8 @@ enum {
SO_LAST_SIGNAL SO_LAST_SIGNAL
}; };
GType _gst_object_type = 0;
typedef struct _GstSignalObject GstSignalObject; typedef struct _GstSignalObject GstSignalObject;
typedef struct _GstSignalObjectClass GstSignalObjectClass; typedef struct _GstSignalObjectClass GstSignalObjectClass;
@ -65,9 +67,7 @@ static guint gst_object_signals[LAST_SIGNAL] = { 0 };
GType GType
gst_object_get_type (void) gst_object_get_type (void)
{ {
static GType object_type = 0; if (!_gst_object_type) {
if (!object_type) {
static const GTypeInfo object_info = { static const GTypeInfo object_info = {
sizeof (GstObjectClass), sizeof (GstObjectClass),
NULL, NULL,
@ -79,9 +79,9 @@ gst_object_get_type (void)
32, 32,
(GInstanceInitFunc) gst_object_init, (GInstanceInitFunc) gst_object_init,
}; };
object_type = g_type_register_static (G_TYPE_OBJECT, "GstObject", &object_info, G_TYPE_FLAG_ABSTRACT); _gst_object_type = g_type_register_static (G_TYPE_OBJECT, "GstObject", &object_info, G_TYPE_FLAG_ABSTRACT);
} }
return object_type; return _gst_object_type;
} }
static void static void

View file

@ -52,17 +52,22 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
extern GType _gst_object_type;
#define GST_TYPE_OBJECT \ #define GST_TYPE_OBJECT (_gst_object_type)
(gst_object_get_type()) # define GST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OBJECT))
#define GST_OBJECT(obj) \ # define GST_IS_OBJECT_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OBJECT))
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OBJECT,GstObject))
#define GST_OBJECT_CLASS(klass) \ #define GST_OBJECT_FAST(obj) ((GstObject*)(obj))
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OBJECT,GstObjectClass)) #define GST_OBJECT_CLASS_FAST(klass) ((GstObjectClass*)(klass))
#define GST_IS_OBJECT(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OBJECT)) #ifdef GST_TYPE_PARANOID
#define GST_IS_OBJECT_CLASS(obj) \ # define GST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OBJECT, GstObject))
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OBJECT)) # define GST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OBJECT, GstObjectClass))
#else
# define GST_OBJECT GST_OBJECT_FAST
# define GST_OBJECT_CLASS GST_OBJECT_CLASS_FAST
#endif
//typedef struct _GstObject GstObject; //typedef struct _GstObject GstObject;
//typedef struct _GstObjectClass GstObjectClass; //typedef struct _GstObjectClass GstObjectClass;
@ -76,30 +81,29 @@ typedef enum
} GstObjectFlags; } GstObjectFlags;
struct _GstObject { struct _GstObject {
GObject object; GObject object;
gchar *name; gchar *name;
/* have to have a refcount for the object */ /* have to have a refcount for the object */
#ifdef HAVE_ATOMIC_H #ifdef HAVE_ATOMIC_H
atomic_t refcount; atomic_t refcount;
#else #else
int refcount; gint refcount;
#endif #endif
/* locking for all sorts of things (like the refcount) */ /* locking for all sorts of things (like the refcount) */
GMutex *lock; GMutex *lock;
/* this objects parent */ /* this objects parent */
GstObject *parent; GstObject *parent;
guint32 flags; guint32 flags;
}; };
struct _GstObjectClass { struct _GstObjectClass {
GObjectClass parent_class; GObjectClass parent_class;
gchar *path_string_separator; gchar *path_string_separator;
GObject *signal_object; GObject *signal_object;
/* signals */ /* signals */
void (*parent_set) (GstObject *object, GstObject *parent); void (*parent_set) (GstObject *object, GstObject *parent);

View file

@ -29,6 +29,7 @@
#include "gstbin.h" #include "gstbin.h"
#include "gstscheduler.h" #include "gstscheduler.h"
GType _gst_pad_type = 0;
/***** Start with the base GstPad class *****/ /***** Start with the base GstPad class *****/
static void gst_pad_class_init (GstPadClass *klass); static void gst_pad_class_init (GstPadClass *klass);
@ -41,10 +42,9 @@ static xmlNodePtr gst_pad_save_thyself (GstObject *object, xmlNodePtr parent);
static GstObject *pad_parent_class = NULL; static GstObject *pad_parent_class = NULL;
GType GType
gst_pad_get_type(void) { gst_pad_get_type(void)
static GType pad_type = 0; {
if (!_gst_pad_type) {
if (!pad_type) {
static const GTypeInfo pad_info = { static const GTypeInfo pad_info = {
sizeof(GstPadClass), sizeof(GstPadClass),
NULL, NULL,
@ -56,9 +56,9 @@ gst_pad_get_type(void) {
32, 32,
(GInstanceInitFunc)gst_pad_init, (GInstanceInitFunc)gst_pad_init,
}; };
pad_type = g_type_register_static(GST_TYPE_OBJECT, "GstPad", &pad_info, 0); _gst_pad_type = g_type_register_static(GST_TYPE_OBJECT, "GstPad", &pad_info, 0);
} }
return pad_type; return _gst_pad_type;
} }
static void static void
@ -105,15 +105,14 @@ static void gst_real_pad_destroy (GObject *object);
static void gst_pad_push_func (GstPad *pad, GstBuffer *buf); static void gst_pad_push_func (GstPad *pad, GstBuffer *buf);
GType _gst_real_pad_type = 0;
static GstPad *real_pad_parent_class = NULL; static GstPad *real_pad_parent_class = NULL;
static guint gst_real_pad_signals[REAL_LAST_SIGNAL] = { 0 }; static guint gst_real_pad_signals[REAL_LAST_SIGNAL] = { 0 };
GType GType
gst_real_pad_get_type(void) { gst_real_pad_get_type(void) {
static GType pad_type = 0; if (!_gst_real_pad_type) {
if (!pad_type) {
static const GTypeInfo pad_info = { static const GTypeInfo pad_info = {
sizeof(GstRealPadClass), sizeof(GstRealPadClass),
NULL, NULL,
@ -125,9 +124,9 @@ gst_real_pad_get_type(void) {
32, 32,
(GInstanceInitFunc)gst_real_pad_init, (GInstanceInitFunc)gst_real_pad_init,
}; };
pad_type = g_type_register_static(GST_TYPE_PAD, "GstRealPad", &pad_info, 0); _gst_real_pad_type = g_type_register_static(GST_TYPE_PAD, "GstRealPad", &pad_info, 0);
} }
return pad_type; return _gst_real_pad_type;
} }
static void static void
@ -1838,6 +1837,7 @@ gst_pad_get_element_private (GstPad *pad)
/***** ghost pads *****/ /***** ghost pads *****/
GType _gst_ghost_pad_type = 0;
static void gst_ghost_pad_class_init (GstGhostPadClass *klass); static void gst_ghost_pad_class_init (GstGhostPadClass *klass);
static void gst_ghost_pad_init (GstGhostPad *pad); static void gst_ghost_pad_init (GstGhostPad *pad);
@ -1847,9 +1847,7 @@ static GstPad *ghost_pad_parent_class = NULL;
GType GType
gst_ghost_pad_get_type(void) { gst_ghost_pad_get_type(void) {
static GType pad_type = 0; if (!_gst_ghost_pad_type) {
if (!pad_type) {
static const GTypeInfo pad_info = { static const GTypeInfo pad_info = {
sizeof(GstGhostPadClass), sizeof(GstGhostPadClass),
NULL, NULL,
@ -1861,9 +1859,9 @@ gst_ghost_pad_get_type(void) {
8, 8,
(GInstanceInitFunc)gst_ghost_pad_init, (GInstanceInitFunc)gst_ghost_pad_init,
}; };
pad_type = g_type_register_static(GST_TYPE_PAD, "GstGhostPad", &pad_info, 0); _gst_ghost_pad_type = g_type_register_static(GST_TYPE_PAD, "GstGhostPad", &pad_info, 0);
} }
return pad_type; return _gst_ghost_pad_type;
} }
static void static void

View file

@ -44,25 +44,70 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
extern GType _gst_pad_type;
extern GType _gst_real_pad_type;
extern GType _gst_ghost_pad_type;
#define GST_TYPE_PAD (gst_pad_get_type ()) //#define GST_TYPE_PARANOID
#define GST_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PAD, GstPad))
#define GST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PAD, GstPadClass)) /*
* Pad base class
*/
#define GST_TYPE_PAD (_gst_pad_type)
#define GST_PAD_FAST(obj) ((GstPad*)(obj))
#define GST_PAD_CLASS_FAST(klass) ((GstPadClass*)(klass))
#define GST_IS_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PAD)) #define GST_IS_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PAD))
#define GST_IS_PAD_FAST(obj) (G_OBJECT_TYPE(obj) == GST_TYPE_REAL_PAD || \
G_OBJECT_TYPE(obj) == GST_TYPE_GHOST_PAD)
#define GST_IS_PAD_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PAD)) #define GST_IS_PAD_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PAD))
#define GST_TYPE_REAL_PAD (gst_real_pad_get_type ()) #ifdef GST_TYPE_PARANOID
#define GST_REAL_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_REAL_PAD, GstRealPad)) # define GST_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PAD, GstPad))
#define GST_REAL_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_REAL_PAD, GstRealPadClass)) # define GST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PAD, GstPadClass))
#else
# define GST_PAD GST_PAD_FAST
# define GST_PAD_CLASS GST_PAD_CLASS_FAST
#endif
/*
* Real Pads
*/
#define GST_TYPE_REAL_PAD (_gst_real_pad_type)
#define GST_REAL_PAD_FAST(obj) ((GstRealPad*)(obj))
#define GST_REAL_PAD_CLASS_FAST(klass) ((GstRealPadClass*)(klass))
#define GST_IS_REAL_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_REAL_PAD)) #define GST_IS_REAL_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_REAL_PAD))
#define GST_IS_REAL_PAD_FAST(obj) (G_OBJECT_TYPE(obj) == GST_TYPE_REAL_PAD)
#define GST_IS_REAL_PAD_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_REAL_PAD)) #define GST_IS_REAL_PAD_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_REAL_PAD))
#define GST_TYPE_GHOST_PAD (gst_ghost_pad_get_type ()) #ifdef GST_TYPE_PARANOID
#define GST_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GHOST_PAD, GstGhostPad)) # define GST_REAL_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_REAL_PAD, GstRealPad))
#define GST_GHOST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GHOST_PAD, GstGhostPadClass)) # define GST_REAL_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_REAL_PAD, GstRealPadClass))
#else
# define GST_REAL_PAD GST_REAL_PAD_FAST
# define GST_REAL_PAD_CLASS GST_REAL_PAD_CLASS_FAST
#endif
/*
* Ghost Pads
*/
#define GST_TYPE_GHOST_PAD (_gst_ghost_pad_type)
#define GST_GHOST_PAD_FAST(obj) ((GstGhostPad*)(obj))
#define GST_GHOST_PAD_CLASS_FAST(klass) ((GstGhostPadClass*)(klass))
#define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD)) #define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD))
#define GST_IS_GHOST_PAD_FAST(obj) (G_OBJECT_TYPE(obj) == GST_TYPE_GHOST_PAD)
#define GST_IS_GHOST_PAD_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GHOST_PAD)) #define GST_IS_GHOST_PAD_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GHOST_PAD))
#ifdef GST_TYPE_PARANOID
# define GST_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GHOST_PAD, GstGhostPad))
# define GST_GHOST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GHOST_PAD, GstGhostPadClass))
#else
# define GST_GHOST_PAD GST_GHOST_PAD_FAST
# define GST_GHOST_PAD_CLASS GST_GHOST_PAD_CLASS_FAST
#endif
//typedef struct _GstPad GstPad; //typedef struct _GstPad GstPad;
//typedef struct _GstPadClass GstPadClass; //typedef struct _GstPadClass GstPadClass;

View file

@ -1419,11 +1419,11 @@ GST_DEBUG(GST_CAT_SCHEDULING,"there are %d elements in this chain\n",chain->num_
} else { } else {
GST_INFO (GST_CAT_DATAFLOW,"NO ENTRY INTO CHAIN!"); GST_INFO (GST_CAT_DATAFLOW,"NO ENTRY INTO CHAIN!");
//eos = TRUE; eos = TRUE;
} }
} else { } else {
GST_INFO (GST_CAT_DATAFLOW,"NO ENABLED ELEMENTS IN CHAIN!!"); GST_INFO (GST_CAT_DATAFLOW,"NO ENABLED ELEMENTS IN CHAIN!!");
//eos = TRUE; eos = TRUE;
} }
/* /*

View file

@ -33,10 +33,10 @@
* *
* Returns: a new #GstByteStream object * Returns: a new #GstByteStream object
*/ */
GstByteStream* GstByteStream *
gst_bytestream_new (GstPad *pad) gst_bytestream_new (GstPad * pad)
{ {
GstByteStream *bs = g_new(GstByteStream, 1); GstByteStream *bs = g_new (GstByteStream, 1);
bs->pad = pad; bs->pad = pad;
bs->data = NULL; bs->data = NULL;
@ -47,37 +47,37 @@ gst_bytestream_new (GstPad *pad)
} }
void void
gst_bytestream_destroy (GstByteStream *bs) gst_bytestream_destroy (GstByteStream * bs)
{ {
if (bs->data) { if (bs->data) {
g_free(bs->data); g_free (bs->data);
} }
g_free(bs); g_free (bs);
} }
static void static void
gst_bytestream_bytes_fill (GstByteStream *bs, guint64 len) gst_bytestream_bytes_fill (GstByteStream * bs, guint64 len)
{ {
size_t oldlen; size_t oldlen;
GstBuffer *buf; GstBuffer *buf;
while ((bs->index + len) > bs->size) { while ((bs->index + len) > bs->size) {
buf = gst_pad_pull(bs->pad); buf = gst_pad_pull (bs->pad);
oldlen = bs->size - bs->index; oldlen = bs->size - bs->index;
memmove(bs->data, bs->data + bs->index, oldlen); memmove (bs->data, bs->data + bs->index, oldlen);
bs->size = oldlen + GST_BUFFER_SIZE(buf); bs->size = oldlen + GST_BUFFER_SIZE (buf);
bs->index = 0; bs->index = 0;
bs->data = realloc(bs->data, bs->size); bs->data = realloc (bs->data, bs->size);
if (!bs->data) { if (!bs->data) {
fprintf(stderr, "realloc failed: d:%p s:%d\n", bs->data, bs->size); fprintf (stderr, "realloc failed: d:%p s:%d\n", bs->data, bs->size);
} }
memcpy(bs->data + oldlen, GST_BUFFER_DATA(buf), GST_BUFFER_SIZE(buf)); memcpy (bs->data + oldlen, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
} }
g_assert ((bs->index + len) <= bs->size); g_assert ((bs->index + len) <= bs->size);
} }
guint8* guint8 *
gst_bytestream_bytes_peek (GstByteStream *bs, guint64 len) gst_bytestream_bytes_peek (GstByteStream * bs, guint64 len)
{ {
g_return_val_if_fail (len > 0, NULL); g_return_val_if_fail (len > 0, NULL);
@ -86,29 +86,28 @@ gst_bytestream_bytes_peek (GstByteStream *bs, guint64 len)
return gst_bytestream_pos (bs); return gst_bytestream_pos (bs);
} }
guint8* guint8 *
gst_bytestream_bytes_read (GstByteStream *bs, guint64 len) gst_bytestream_bytes_read (GstByteStream * bs, guint64 len)
{ {
guint8 *ptr; guint8 *ptr;
g_return_val_if_fail (len > 0, NULL); g_return_val_if_fail (len > 0, NULL);
gst_bytestream_bytes_fill(bs, len); gst_bytestream_bytes_fill (bs, len);
ptr = gst_bytestream_pos(bs); ptr = gst_bytestream_pos (bs);
bs->index += len; bs->index += len;
return ptr; return ptr;
} }
gboolean gboolean
gst_bytestream_bytes_seek (GstByteStream *bs, guint64 offset) gst_bytestream_bytes_seek (GstByteStream * bs, guint64 offset)
{ {
return FALSE; return FALSE;
} }
void void
gst_bytestream_bytes_flush (GstByteStream *bs, guint64 len) gst_bytestream_bytes_flush (GstByteStream * bs, guint64 len)
{ {
gst_bytestream_bytes_read(bs, len); gst_bytestream_bytes_read (bs, len);
} }

View file

@ -43,10 +43,10 @@ struct _GstByteStream
GstByteStream* gst_bytestream_new (GstPad *pad); GstByteStream* gst_bytestream_new (GstPad *pad);
void gst_bytestream_destroy (GstByteStream *bs); void gst_bytestream_destroy (GstByteStream *bs);
guint8* gst_bytestream_bytes_peek (GstByteStream *bs, guint64 len); gint gst_bytestream_bytes_peek (GstByteStream *bs, guint8 **buf, guint64 len);
guint8* gst_bytestream_bytes_read (GstByteStream *bs, guint64 len); gint gst_bytestream_bytes_read (GstByteStream *bs, guint8 **buf, guint64 len);
gboolean gst_bytestream_bytes_seek (GstByteStream *bs, guint64 offset); gboolean gst_bytestream_bytes_seek (GstByteStream *bs, guint64 offset);
void gst_bytestream_bytes_flush (GstByteStream *bs, guint64 len); gint gst_bytestream_bytes_flush (GstByteStream *bs, guint64 len);
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -41,7 +41,7 @@ noinst_HEADERS = \
gstaggregator.h \ gstaggregator.h \
gstsinesrc.h gstsinesrc.h
CFLAGS += -O2 -Wall CFLAGS += -O2 -Wall -finstrument-functions -DGST_ENABLE_FUNC_INSTRUMENTATION
LDFLAGS += -lm LDFLAGS += -lm
libgstelements_la_LIBADD = $(GHTTP_LIBS) libgstelements_la_LIBADD = $(GHTTP_LIBS)

View file

@ -64,8 +64,8 @@ static void gst_disksrc_set_property (GObject *object, guint prop_id,
static void gst_disksrc_get_property (GObject *object, guint prop_id, static void gst_disksrc_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec); GValue *value, GParamSpec *pspec);
static GstBuffer * gst_disksrc_get (GstPad *pad); static GstBuffer* gst_disksrc_get (GstPad *pad);
static GstBuffer * gst_disksrc_get_region (GstPad *pad,GstRegionType type,guint64 offset,guint64 len); static GstBufferPool* gst_disksrc_get_bufferpool (GstPad *pad);
static GstElementStateReturn static GstElementStateReturn
gst_disksrc_change_state (GstElement *element); gst_disksrc_change_state (GstElement *element);
@ -73,7 +73,7 @@ static GstElementStateReturn
static gboolean gst_disksrc_open_file (GstDiskSrc *src); static gboolean gst_disksrc_open_file (GstDiskSrc *src);
static void gst_disksrc_close_file (GstDiskSrc *src); static void gst_disksrc_close_file (GstDiskSrc *src);
static GstElementClass *parent_class = NULL; static GstElementClass* parent_class = NULL;
//static guint gst_disksrc_signals[LAST_SIGNAL] = { 0 }; //static guint gst_disksrc_signals[LAST_SIGNAL] = { 0 };
GType GType
@ -133,8 +133,8 @@ gst_disksrc_init (GstDiskSrc *disksrc)
// GST_FLAG_SET (disksrc, GST_SRC_); // GST_FLAG_SET (disksrc, GST_SRC_);
disksrc->srcpad = gst_pad_new ("src", GST_PAD_SRC); disksrc->srcpad = gst_pad_new ("src", GST_PAD_SRC);
gst_pad_set_get_function (disksrc->srcpad,gst_disksrc_get); gst_pad_set_get_function (disksrc->srcpad, gst_disksrc_get);
gst_pad_set_getregion_function (disksrc->srcpad,gst_disksrc_get_region); gst_pad_set_bufferpool_function (disksrc->srcpad, gst_disksrc_get_bufferpool);
gst_element_add_pad (GST_ELEMENT (disksrc), disksrc->srcpad); gst_element_add_pad (GST_ELEMENT (disksrc), disksrc->srcpad);
disksrc->filename = NULL; disksrc->filename = NULL;
@ -220,6 +220,56 @@ gst_disksrc_get_property (GObject *object, guint prop_id, GValue *value, GParamS
} }
} }
static GstBuffer*
gst_disksrc_buffer_new (GstBufferPool *pool, gint64 location, gint size, gpointer user_data)
{
GstDiskSrc *src;
GstBuffer *buf;
src = GST_DISKSRC (user_data);
buf = gst_buffer_new ();
g_return_val_if_fail (buf != NULL, NULL);
/* simply set the buffer to point to the correct region of the file */
GST_BUFFER_DATA (buf) = src->map + location;
GST_BUFFER_OFFSET (buf) = location;
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
if ((location + size) > src->size)
GST_BUFFER_SIZE (buf) = src->size - location;
else
GST_BUFFER_SIZE (buf) = size;
GST_DEBUG (0,"map %p, offset %ld (%p), size %d\n", src->map, src->curoffset,
src->map + src->curoffset, GST_BUFFER_SIZE (buf));
return buf;
}
static void
gst_disksrc_buffer_free (GstBuffer *buf)
{
// FIXME do something here
}
static GstBufferPool*
gst_disksrc_get_bufferpool (GstPad *pad)
{
GstDiskSrc *src;
src = GST_DISKSRC (gst_pad_get_parent (pad));
if (!src->bufferpool) {
src->bufferpool = gst_buffer_pool_new ();
gst_buffer_pool_set_buffer_new_function (src->bufferpool, gst_disksrc_buffer_new);
gst_buffer_pool_set_buffer_free_function (src->bufferpool, gst_disksrc_buffer_free);
gst_buffer_pool_set_user_data (src->bufferpool, src);
}
return src->bufferpool;
}
/** /**
* gst_disksrc_get: * gst_disksrc_get:
* @pad: #GstPad to push a buffer from * @pad: #GstPad to push a buffer from
@ -246,28 +296,10 @@ gst_disksrc_get (GstPad *pad)
return buf; return buf;
} }
/* create the buffer */ // FIXME use a bufferpool
// FIXME: should eventually use a bufferpool for this buf = gst_disksrc_buffer_new (NULL, src->curoffset, src->bytes_per_read, src);
buf = gst_buffer_new ();
g_return_val_if_fail (buf != NULL, NULL);
/* simply set the buffer to point to the correct region of the file */
GST_BUFFER_DATA (buf) = src->map + src->curoffset;
GST_BUFFER_OFFSET (buf) = src->curoffset;
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
if ((src->curoffset + src->bytes_per_read) > src->size) {
GST_BUFFER_SIZE (buf) = src->size - src->curoffset;
// FIXME: set the buffer's EOF bit here
} else
GST_BUFFER_SIZE (buf) = src->bytes_per_read;
GST_DEBUG (0,"map %p, offset %ld (%p), size %d\n", src->map, src->curoffset,
src->map + src->curoffset, GST_BUFFER_SIZE (buf));
//gst_util_dump_mem (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); //gst_util_dump_mem (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
src->curoffset += GST_BUFFER_SIZE (buf); src->curoffset += GST_BUFFER_SIZE (buf);
if (src->new_seek) { if (src->new_seek) {
@ -280,61 +312,6 @@ gst_disksrc_get (GstPad *pad)
return buf; return buf;
} }
/**
* gst_disksrc_get_region:
* @src: #GstSrc to push a buffer from
* @offset: offset in file
* @size: number of bytes
*
* Push a new buffer from the disksrc of given size at given offset.
*/
static GstBuffer *
gst_disksrc_get_region (GstPad *pad, GstRegionType type,guint64 offset,guint64 len)
{
GstDiskSrc *src;
GstBuffer *buf;
g_return_val_if_fail (pad != NULL, NULL);
g_return_val_if_fail (type == GST_REGION_OFFSET_LEN, NULL);
src = GST_DISKSRC (gst_pad_get_parent (pad));
g_return_val_if_fail (GST_IS_DISKSRC (src), NULL);
g_return_val_if_fail (GST_FLAG_IS_SET (src, GST_DISKSRC_OPEN), NULL);
/* deal with EOF state */
if (offset >= src->size) {
gst_pad_event (pad, GST_EVENT_EOS, 0LL, 0);
GST_DEBUG (0,"map offset %lld >= size %ld --> eos\n", offset, src->size);
//FIXME
buf = gst_buffer_new();
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_EOS);
return buf;
}
/* create the buffer */
// FIXME: should eventually use a bufferpool for this
buf = gst_buffer_new ();
g_return_val_if_fail (buf != NULL, NULL);
/* simply set the buffer to point to the correct region of the file */
GST_BUFFER_DATA (buf) = src->map + offset;
GST_BUFFER_OFFSET (buf) = offset;
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
if ((offset + len) > src->size) {
GST_BUFFER_SIZE (buf) = src->size - offset;
// FIXME: set the buffer's EOF bit here
} else
GST_BUFFER_SIZE (buf) = len;
GST_DEBUG (0,"map %p, offset %lld, size %d\n", src->map, offset, GST_BUFFER_SIZE (buf));
/* we're done, return the buffer off now */
return buf;
}
/* open the file and mmap it, necessary to go to READY state */ /* open the file and mmap it, necessary to go to READY state */
static gboolean static gboolean
gst_disksrc_open_file (GstDiskSrc *src) gst_disksrc_open_file (GstDiskSrc *src)

View file

@ -64,6 +64,7 @@ struct _GstDiskSrc {
gchar *filename; gchar *filename;
/* fd */ /* fd */
gint fd; gint fd;
GstBufferPool *bufferpool;
/* mapping parameters */ /* mapping parameters */
gulong size; /* how long is the file? */ gulong size; /* how long is the file? */

View file

@ -225,6 +225,7 @@ gst_fakesink_chain (GstPad *pad, GstBuffer *buf)
if (GST_IS_EVENT(buf)) { if (GST_IS_EVENT(buf)) {
g_print("fakesink: have event!\n"); g_print("fakesink: have event!\n");
gst_element_set_state (GST_ELEMENT (fakesink), GST_STATE_PAUSED);
return; return;
} }

View file

@ -335,7 +335,8 @@ gst_fakesrc_get(GstPad *pad)
if (src->num_buffers == 0) { if (src->num_buffers == 0) {
g_print("fakesrc: sending EOS\n"); g_print("fakesrc: sending EOS\n");
return GST_BUFFER(gst_event_empty_new (GST_EVENT_EOS)); gst_element_set_state (GST_ELEMENT (src), GST_STATE_PAUSED);
return GST_BUFFER(gst_event_new (GST_EVENT_EOS));
} }
else { else {
if (src->num_buffers > 0) if (src->num_buffers > 0)
@ -345,7 +346,7 @@ gst_fakesrc_get(GstPad *pad)
if (src->eos) { if (src->eos) {
GST_INFO (0, "fakesrc is setting eos on pad"); GST_INFO (0, "fakesrc is setting eos on pad");
g_print("fakesrc: sending EOS\n"); g_print("fakesrc: sending EOS\n");
return GST_BUFFER(gst_event_empty_new (GST_EVENT_EOS)); return GST_BUFFER(gst_event_new (GST_EVENT_EOS));
} }
buf = gst_buffer_new(); buf = gst_buffer_new();
@ -397,7 +398,7 @@ gst_fakesrc_loop(GstElement *element)
if (src->eos) { if (src->eos) {
GST_INFO (0, "fakesrc is setting eos on pad"); GST_INFO (0, "fakesrc is setting eos on pad");
gst_pad_push(pad, GST_BUFFER(gst_event_empty_new (GST_EVENT_EOS))); gst_pad_push(pad, GST_BUFFER(gst_event_new (GST_EVENT_EOS)));
} }
buf = gst_buffer_new(); buf = gst_buffer_new();

View file

@ -596,6 +596,7 @@ gst_filesrc_close_file (GstFileSrc *src)
{ {
g_return_if_fail (GST_FLAG_IS_SET (src, GST_FILESRC_OPEN)); g_return_if_fail (GST_FLAG_IS_SET (src, GST_FILESRC_OPEN));
g_print ("close\n");
/* close the file */ /* close the file */
close (src->fd); close (src->fd);