libs: cleanups for 0.11

Remove deprecated stuff, fix padding, rearrange methods.
This commit is contained in:
Wim Taymans 2011-02-22 19:09:48 +01:00
parent 5dd9ab1cab
commit 1218511185
8 changed files with 107 additions and 158 deletions

View file

@ -52,6 +52,7 @@ struct _GstAdapter {
/*< private >*/ /*< private >*/
GSList * buflist; GSList * buflist;
GSList * buflist_end;
guint size; guint size;
guint skip; guint skip;
@ -60,14 +61,9 @@ struct _GstAdapter {
guint assembled_size; guint assembled_size;
guint assembled_len; guint assembled_len;
/* ABI added */
/* Remember where the end of our buffer list is to
* speed up the push */
GSList *buflist_end;
GstAdapterPrivate *priv; GstAdapterPrivate *priv;
gpointer _gst_reserved[GST_PADDING - 2]; gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstAdapterClass { struct _GstAdapterClass {

View file

@ -696,14 +696,14 @@ gst_base_sink_init (GstBaseSink * basesink, gpointer g_class)
basesink->pad_mode = GST_ACTIVATE_NONE; basesink->pad_mode = GST_ACTIVATE_NONE;
basesink->preroll_queue = g_queue_new (); basesink->preroll_queue = g_queue_new ();
basesink->abidata.ABI.clip_segment = gst_segment_new (); basesink->clip_segment = gst_segment_new ();
priv->have_latency = FALSE; priv->have_latency = FALSE;
basesink->can_activate_push = DEFAULT_CAN_ACTIVATE_PUSH; basesink->can_activate_push = DEFAULT_CAN_ACTIVATE_PUSH;
basesink->can_activate_pull = DEFAULT_CAN_ACTIVATE_PULL; basesink->can_activate_pull = DEFAULT_CAN_ACTIVATE_PULL;
basesink->sync = DEFAULT_SYNC; basesink->sync = DEFAULT_SYNC;
basesink->abidata.ABI.max_lateness = DEFAULT_MAX_LATENESS; basesink->max_lateness = DEFAULT_MAX_LATENESS;
g_atomic_int_set (&priv->qos_enabled, DEFAULT_QOS); g_atomic_int_set (&priv->qos_enabled, DEFAULT_QOS);
priv->async_enabled = DEFAULT_ASYNC; priv->async_enabled = DEFAULT_ASYNC;
priv->ts_offset = DEFAULT_TS_OFFSET; priv->ts_offset = DEFAULT_TS_OFFSET;
@ -724,7 +724,7 @@ gst_base_sink_finalize (GObject * object)
basesink = GST_BASE_SINK (object); basesink = GST_BASE_SINK (object);
g_queue_free (basesink->preroll_queue); g_queue_free (basesink->preroll_queue);
gst_segment_free (basesink->abidata.ABI.clip_segment); gst_segment_free (basesink->clip_segment);
G_OBJECT_CLASS (parent_class)->finalize (object); G_OBJECT_CLASS (parent_class)->finalize (object);
} }
@ -795,7 +795,7 @@ gst_base_sink_set_max_lateness (GstBaseSink * sink, gint64 max_lateness)
g_return_if_fail (GST_IS_BASE_SINK (sink)); g_return_if_fail (GST_IS_BASE_SINK (sink));
GST_OBJECT_LOCK (sink); GST_OBJECT_LOCK (sink);
sink->abidata.ABI.max_lateness = max_lateness; sink->max_lateness = max_lateness;
GST_OBJECT_UNLOCK (sink); GST_OBJECT_UNLOCK (sink);
} }
@ -820,7 +820,7 @@ gst_base_sink_get_max_lateness (GstBaseSink * sink)
g_return_val_if_fail (GST_IS_BASE_SINK (sink), -1); g_return_val_if_fail (GST_IS_BASE_SINK (sink), -1);
GST_OBJECT_LOCK (sink); GST_OBJECT_LOCK (sink);
res = sink->abidata.ABI.max_lateness; res = sink->max_lateness;
GST_OBJECT_UNLOCK (sink); GST_OBJECT_UNLOCK (sink);
return res; return res;
@ -1564,7 +1564,6 @@ gst_base_sink_commit_state (GstBaseSink * basesink)
case GST_STATE_PLAYING: case GST_STATE_PLAYING:
{ {
GstBaseSinkClass *bclass; GstBaseSinkClass *bclass;
GstStateChangeReturn ret;
bclass = GST_BASE_SINK_GET_CLASS (basesink); bclass = GST_BASE_SINK_GET_CLASS (basesink);
@ -1578,14 +1577,6 @@ gst_base_sink_commit_state (GstBaseSink * basesink)
if (current == GST_STATE_READY) { if (current == GST_STATE_READY) {
post_paused = TRUE; post_paused = TRUE;
} }
/* make sure we notify the subclass of async playing */
if (bclass->async_play) {
GST_WARNING_OBJECT (basesink, "deprecated async_play");
ret = bclass->async_play (basesink);
if (ret == GST_STATE_CHANGE_FAILURE)
goto async_failed;
}
break; break;
} }
case GST_STATE_PAUSED: case GST_STATE_PAUSED:
@ -1670,13 +1661,6 @@ stopping:
GST_OBJECT_UNLOCK (basesink); GST_OBJECT_UNLOCK (basesink);
return FALSE; return FALSE;
} }
async_failed:
{
GST_DEBUG_OBJECT (basesink, "async commit failed");
GST_STATE_RETURN (basesink) = GST_STATE_CHANGE_FAILURE;
GST_OBJECT_UNLOCK (basesink);
return FALSE;
}
} }
static void static void
@ -1803,7 +1787,7 @@ stop_stepping (GstBaseSink * sink, GstSegment * segment,
segment->start = current->start_start; segment->start = current->start_start;
/* the clip segment is used for position report in paused... */ /* the clip segment is used for position report in paused... */
memcpy (sink->abidata.ABI.clip_segment, segment, sizeof (GstSegment)); memcpy (sink->clip_segment, segment, sizeof (GstSegment));
/* post the step done when we know the stepped duration in TIME */ /* post the step done when we know the stepped duration in TIME */
message = message =
@ -2824,7 +2808,7 @@ gst_base_sink_is_too_late (GstBaseSink * basesink, GstMiniObject * obj,
if (G_LIKELY (status != GST_CLOCK_EARLY)) if (G_LIKELY (status != GST_CLOCK_EARLY))
goto in_time; goto in_time;
max_lateness = basesink->abidata.ABI.max_lateness; max_lateness = basesink->max_lateness;
/* check if frame dropping is enabled */ /* check if frame dropping is enabled */
if (max_lateness == -1) if (max_lateness == -1)
@ -3401,7 +3385,7 @@ gst_base_sink_flush_stop (GstBaseSink * basesink, GstPad * pad)
/* we need new segment info after the flush. */ /* we need new segment info after the flush. */
basesink->have_newsegment = FALSE; basesink->have_newsegment = FALSE;
gst_segment_init (&basesink->segment, GST_FORMAT_UNDEFINED); gst_segment_init (&basesink->segment, GST_FORMAT_UNDEFINED);
gst_segment_init (basesink->abidata.ABI.clip_segment, GST_FORMAT_UNDEFINED); gst_segment_init (basesink->clip_segment, GST_FORMAT_UNDEFINED);
} }
GST_OBJECT_UNLOCK (basesink); GST_OBJECT_UNLOCK (basesink);
} }
@ -3471,7 +3455,7 @@ gst_base_sink_event (GstPad * pad, GstEvent * event)
* we need to configure the current clipping segment and insert the event * we need to configure the current clipping segment and insert the event
* in the queue to serialize it with the buffers for rendering. */ * in the queue to serialize it with the buffers for rendering. */
gst_base_sink_configure_segment (basesink, pad, event, gst_base_sink_configure_segment (basesink, pad, event,
basesink->abidata.ABI.clip_segment); basesink->clip_segment);
ret = ret =
gst_base_sink_queue_object_unlocked (basesink, pad, gst_base_sink_queue_object_unlocked (basesink, pad,
@ -3608,7 +3592,7 @@ gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad,
} }
/* for code clarity */ /* for code clarity */
clip_segment = basesink->abidata.ABI.clip_segment; clip_segment = basesink->clip_segment;
if (G_UNLIKELY (!basesink->have_newsegment)) { if (G_UNLIKELY (!basesink->have_newsegment)) {
gboolean sync; gboolean sync;
@ -3933,7 +3917,7 @@ gst_base_sink_perform_seek (GstBaseSink * sink, GstPad * pad, GstEvent * event)
GST_DEBUG_OBJECT (sink, "stop flushing upstream"); GST_DEBUG_OBJECT (sink, "stop flushing upstream");
gst_pad_push_event (pad, gst_event_new_flush_stop ()); gst_pad_push_event (pad, gst_event_new_flush_stop ());
gst_base_sink_flush_stop (sink, pad); gst_base_sink_flush_stop (sink, pad);
} else if (res && sink->abidata.ABI.running) { } else if (res && sink->running) {
/* we are running the current segment and doing a non-flushing seek, /* we are running the current segment and doing a non-flushing seek,
* close the segment first based on the last_stop. */ * close the segment first based on the last_stop. */
GST_DEBUG_OBJECT (sink, "closing running segment %" G_GINT64_FORMAT GST_DEBUG_OBJECT (sink, "closing running segment %" G_GINT64_FORMAT
@ -3961,7 +3945,7 @@ gst_base_sink_perform_seek (GstBaseSink * sink, GstPad * pad, GstEvent * event)
} }
sink->priv->discont = TRUE; sink->priv->discont = TRUE;
sink->abidata.ABI.running = TRUE; sink->running = TRUE;
GST_PAD_STREAM_UNLOCK (pad); GST_PAD_STREAM_UNLOCK (pad);
@ -4393,7 +4377,7 @@ gst_base_sink_pad_activate_pull (GstPad * pad, gboolean active)
format = GST_FORMAT_BYTES; format = GST_FORMAT_BYTES;
gst_segment_init (&basesink->segment, format); gst_segment_init (&basesink->segment, format);
gst_segment_init (basesink->abidata.ABI.clip_segment, format); gst_segment_init (basesink->clip_segment, format);
GST_OBJECT_LOCK (basesink); GST_OBJECT_LOCK (basesink);
basesink->have_newsegment = TRUE; basesink->have_newsegment = TRUE;
GST_OBJECT_UNLOCK (basesink); GST_OBJECT_UNLOCK (basesink);
@ -4403,8 +4387,7 @@ gst_base_sink_pad_activate_pull (GstPad * pad, gboolean active)
if (result) { if (result) {
GST_DEBUG_OBJECT (basesink, GST_DEBUG_OBJECT (basesink,
"setting duration in bytes to %" G_GINT64_FORMAT, duration); "setting duration in bytes to %" G_GINT64_FORMAT, duration);
gst_segment_set_duration (basesink->abidata.ABI.clip_segment, format, gst_segment_set_duration (basesink->clip_segment, format, duration);
duration);
gst_segment_set_duration (&basesink->segment, format, duration); gst_segment_set_duration (&basesink->segment, format, duration);
} else { } else {
GST_DEBUG_OBJECT (basesink, "unknown duration"); GST_DEBUG_OBJECT (basesink, "unknown duration");
@ -4548,7 +4531,7 @@ gst_base_sink_get_position (GstBaseSink * basesink, GstFormat format,
* main segment directly with the new segment values without it having to be * main segment directly with the new segment values without it having to be
* activated by the rendering after preroll */ * activated by the rendering after preroll */
if (basesink->pad_mode == GST_ACTIVATE_PUSH) if (basesink->pad_mode == GST_ACTIVATE_PUSH)
segment = basesink->abidata.ABI.clip_segment; segment = basesink->clip_segment;
else else
segment = &basesink->segment; segment = &basesink->segment;
@ -4943,8 +4926,7 @@ gst_base_sink_change_state (GstElement * element, GstStateChange transition)
GST_DEBUG_OBJECT (basesink, "READY to PAUSED"); GST_DEBUG_OBJECT (basesink, "READY to PAUSED");
basesink->have_newsegment = FALSE; basesink->have_newsegment = FALSE;
gst_segment_init (&basesink->segment, GST_FORMAT_UNDEFINED); gst_segment_init (&basesink->segment, GST_FORMAT_UNDEFINED);
gst_segment_init (basesink->abidata.ABI.clip_segment, gst_segment_init (basesink->clip_segment, GST_FORMAT_UNDEFINED);
GST_FORMAT_UNDEFINED);
basesink->offset = 0; basesink->offset = 0;
basesink->have_preroll = FALSE; basesink->have_preroll = FALSE;
priv->step_unlock = FALSE; priv->step_unlock = FALSE;

View file

@ -80,26 +80,21 @@ struct _GstBaseSink {
/*< protected >*/ /* with STREAM_LOCK */ /*< protected >*/ /* with STREAM_LOCK */
gboolean have_newsegment; gboolean have_newsegment;
GstSegment segment; GstSegment segment;
GstSegment *clip_segment;
/*< private >*/ /* with LOCK */ /*< private >*/ /* with LOCK */
GstClockID clock_id; GstClockID clock_id;
GstClockTime end_time; GstClockTime end_time;
gboolean sync; gboolean sync;
gboolean flushing; gboolean flushing;
gboolean running;
gint64 max_lateness;
/*< private >*/ /*< private >*/
union {
struct {
/* segment used for clipping incoming buffers */
GstSegment *clip_segment;
/* max amount of time a buffer can be late, -1 no limit. */
gint64 max_lateness;
gboolean running;
} ABI;
gpointer _gst_reserved[GST_PADDING_LARGE - 1];
} abidata;
GstBaseSinkPrivate *priv; GstBaseSinkPrivate *priv;
gpointer _gst_reserved[GST_PADDING_LARGE];
}; };
/** /**
@ -146,6 +141,11 @@ struct _GstBaseSinkClass {
/* notify subclass of new caps */ /* notify subclass of new caps */
gboolean (*set_caps) (GstBaseSink *sink, GstCaps *caps); gboolean (*set_caps) (GstBaseSink *sink, GstCaps *caps);
/* fixate sink caps during pull-mode negotiation */
void (*fixate) (GstBaseSink *sink, GstCaps *caps);
/* start or stop a pulling thread */
gboolean (*activate_pull)(GstBaseSink *sink, gboolean active);
/* allocate a new buffer with given caps */ /* allocate a new buffer with given caps */
GstFlowReturn (*buffer_alloc) (GstBaseSink *sink, guint64 offset, guint size, GstFlowReturn (*buffer_alloc) (GstBaseSink *sink, guint64 offset, guint size,
GstCaps *caps, GstBuffer **buf); GstCaps *caps, GstBuffer **buf);
@ -161,33 +161,21 @@ struct _GstBaseSinkClass {
/* unlock any pending access to the resource. subclasses should unlock /* unlock any pending access to the resource. subclasses should unlock
* any function ASAP. */ * any function ASAP. */
gboolean (*unlock) (GstBaseSink *sink); gboolean (*unlock) (GstBaseSink *sink);
/* notify subclass of event, preroll buffer or real buffer */
gboolean (*event) (GstBaseSink *sink, GstEvent *event);
GstFlowReturn (*preroll) (GstBaseSink *sink, GstBuffer *buffer);
GstFlowReturn (*render) (GstBaseSink *sink, GstBuffer *buffer);
/* ABI additions */
/* when an ASYNC state change to PLAYING happens */ /* with LOCK */
GstStateChangeReturn (*async_play) (GstBaseSink *sink);
/* start or stop a pulling thread */
gboolean (*activate_pull)(GstBaseSink *sink, gboolean active);
/* fixate sink caps during pull-mode negotiation */
void (*fixate) (GstBaseSink *sink, GstCaps *caps);
/* Clear a previously indicated unlock request not that unlocking is /* Clear a previously indicated unlock request not that unlocking is
* complete. Sub-classes should clear any command queue or indicator they * complete. Sub-classes should clear any command queue or indicator they
* set during unlock */ * set during unlock */
gboolean (*unlock_stop) (GstBaseSink *sink); gboolean (*unlock_stop) (GstBaseSink *sink);
/* notify subclass of event, preroll buffer or real buffer */
gboolean (*event) (GstBaseSink *sink, GstEvent *event);
GstFlowReturn (*preroll) (GstBaseSink *sink, GstBuffer *buffer);
GstFlowReturn (*render) (GstBaseSink *sink, GstBuffer *buffer);
/* Render a BufferList */ /* Render a BufferList */
GstFlowReturn (*render_list) (GstBaseSink *sink, GstBufferList *buffer_list); GstFlowReturn (*render_list) (GstBaseSink *sink, GstBufferList *buffer_list);
/*< private >*/ /*< private >*/
gpointer _gst_reserved[GST_PADDING_LARGE-5]; gpointer _gst_reserved[GST_PADDING_LARGE];
}; };
GType gst_base_sink_get_type(void); GType gst_base_sink_get_type(void);

View file

@ -436,7 +436,7 @@ gst_base_src_init (GstBaseSrc * basesrc, gpointer g_class)
basesrc->clock_id = NULL; basesrc->clock_id = NULL;
/* we operate in BYTES by default */ /* we operate in BYTES by default */
gst_base_src_set_format (basesrc, GST_FORMAT_BYTES); gst_base_src_set_format (basesrc, GST_FORMAT_BYTES);
basesrc->data.ABI.typefind = DEFAULT_TYPEFIND; basesrc->typefind = DEFAULT_TYPEFIND;
basesrc->priv->do_timestamp = DEFAULT_DO_TIMESTAMP; basesrc->priv->do_timestamp = DEFAULT_DO_TIMESTAMP;
g_atomic_int_set (&basesrc->priv->have_tags, FALSE); g_atomic_int_set (&basesrc->priv->have_tags, FALSE);
@ -457,7 +457,7 @@ gst_base_src_finalize (GObject * object)
g_mutex_free (basesrc->live_lock); g_mutex_free (basesrc->live_lock);
g_cond_free (basesrc->live_cond); g_cond_free (basesrc->live_cond);
event_p = &basesrc->data.ABI.pending_seek; event_p = &basesrc->pending_seek;
gst_event_replace (event_p, NULL); gst_event_replace (event_p, NULL);
if (basesrc->priv->pending_tags) { if (basesrc->priv->pending_tags) {
@ -755,7 +755,7 @@ gst_base_src_new_seamless_segment (GstBaseSrc * src, gint64 start, gint64 stop,
GST_TIME_ARGS (stop), GST_TIME_ARGS (position)); GST_TIME_ARGS (stop), GST_TIME_ARGS (position));
GST_OBJECT_LOCK (src); GST_OBJECT_LOCK (src);
if (src->data.ABI.running && !src->priv->newsegment_pending) { if (src->running && !src->priv->newsegment_pending) {
if (src->priv->close_segment) if (src->priv->close_segment)
gst_event_unref (src->priv->close_segment); gst_event_unref (src->priv->close_segment);
src->priv->close_segment = src->priv->close_segment =
@ -785,7 +785,7 @@ gst_base_src_new_seamless_segment (GstBaseSrc * src, gint64 start, gint64 stop,
GST_OBJECT_UNLOCK (src); GST_OBJECT_UNLOCK (src);
src->priv->discont = TRUE; src->priv->discont = TRUE;
src->data.ABI.running = TRUE; src->running = TRUE;
return res; return res;
} }
@ -1409,7 +1409,7 @@ gst_base_src_perform_seek (GstBaseSrc * src, GstEvent * event, gboolean unlock)
/* send flush stop, peer will accept data and events again. We /* send flush stop, peer will accept data and events again. We
* are not yet providing data as we still have the STREAM_LOCK. */ * are not yet providing data as we still have the STREAM_LOCK. */
gst_pad_push_event (src->srcpad, tevent); gst_pad_push_event (src->srcpad, tevent);
} else if (res && src->data.ABI.running) { } else if (res && src->running) {
/* we are running the current segment and doing a non-flushing seek, /* we are running the current segment and doing a non-flushing seek,
* close the segment first based on the last_stop. */ * close the segment first based on the last_stop. */
GST_DEBUG_OBJECT (src, "closing running segment %" G_GINT64_FORMAT GST_DEBUG_OBJECT (src, "closing running segment %" G_GINT64_FORMAT
@ -1480,7 +1480,7 @@ gst_base_src_perform_seek (GstBaseSrc * src, GstEvent * event, gboolean unlock)
} }
src->priv->discont = TRUE; src->priv->discont = TRUE;
src->data.ABI.running = TRUE; src->running = TRUE;
/* and restart the task in case it got paused explicitly or by /* and restart the task in case it got paused explicitly or by
* the FLUSH_START event we pushed out. */ * the FLUSH_START event we pushed out. */
tres = gst_pad_start_task (src->srcpad, (GstTaskFunction) gst_base_src_loop, tres = gst_pad_start_task (src->srcpad, (GstTaskFunction) gst_base_src_loop,
@ -1624,7 +1624,7 @@ gst_base_src_send_event (GstElement * element, GstEvent * event)
* get activated */ * get activated */
GST_OBJECT_LOCK (src); GST_OBJECT_LOCK (src);
GST_DEBUG_OBJECT (src, "queueing seek"); GST_DEBUG_OBJECT (src, "queueing seek");
event_p = &src->data.ABI.pending_seek; event_p = &src->pending_seek;
gst_event_replace ((GstEvent **) event_p, event); gst_event_replace ((GstEvent **) event_p, event);
GST_OBJECT_UNLOCK (src); GST_OBJECT_UNLOCK (src);
/* assume the seek will work */ /* assume the seek will work */
@ -1795,7 +1795,7 @@ gst_base_src_set_property (GObject * object, guint prop_id,
src->num_buffers = g_value_get_int (value); src->num_buffers = g_value_get_int (value);
break; break;
case PROP_TYPEFIND: case PROP_TYPEFIND:
src->data.ABI.typefind = g_value_get_boolean (value); src->typefind = g_value_get_boolean (value);
break; break;
case PROP_DO_TIMESTAMP: case PROP_DO_TIMESTAMP:
gst_base_src_set_do_timestamp (src, g_value_get_boolean (value)); gst_base_src_set_do_timestamp (src, g_value_get_boolean (value));
@ -1822,7 +1822,7 @@ gst_base_src_get_property (GObject * object, guint prop_id, GValue * value,
g_value_set_int (value, src->num_buffers); g_value_set_int (value, src->num_buffers);
break; break;
case PROP_TYPEFIND: case PROP_TYPEFIND:
g_value_set_boolean (value, src->data.ABI.typefind); g_value_set_boolean (value, src->typefind);
break; break;
case PROP_DO_TIMESTAMP: case PROP_DO_TIMESTAMP:
g_value_set_boolean (value, gst_base_src_get_do_timestamp (src)); g_value_set_boolean (value, gst_base_src_get_do_timestamp (src));
@ -2535,7 +2535,7 @@ pause:
GstEvent *event; GstEvent *event;
GST_DEBUG_OBJECT (src, "pausing task, reason %s", reason); GST_DEBUG_OBJECT (src, "pausing task, reason %s", reason);
src->data.ABI.running = FALSE; src->running = FALSE;
gst_pad_pause_task (pad); gst_pad_pause_task (pad);
if (ret == GST_FLOW_UNEXPECTED) { if (ret == GST_FLOW_UNEXPECTED) {
gboolean flag_segment; gboolean flag_segment;
@ -2699,7 +2699,7 @@ gst_base_src_start (GstBaseSrc * basesrc)
gst_segment_init (&basesrc->segment, basesrc->segment.format); gst_segment_init (&basesrc->segment, basesrc->segment.format);
GST_OBJECT_UNLOCK (basesrc); GST_OBJECT_UNLOCK (basesrc);
basesrc->data.ABI.running = FALSE; basesrc->running = FALSE;
basesrc->priv->newsegment_pending = FALSE; basesrc->priv->newsegment_pending = FALSE;
bclass = GST_BASE_SRC_GET_CLASS (basesrc); bclass = GST_BASE_SRC_GET_CLASS (basesrc);
@ -2748,7 +2748,7 @@ gst_base_src_start (GstBaseSrc * basesrc)
GST_DEBUG_OBJECT (basesrc, "is random_access: %d", basesrc->random_access); GST_DEBUG_OBJECT (basesrc, "is random_access: %d", basesrc->random_access);
/* run typefind if we are random_access and the typefinding is enabled. */ /* run typefind if we are random_access and the typefinding is enabled. */
if (basesrc->random_access && basesrc->data.ABI.typefind && size != -1) { if (basesrc->random_access && basesrc->typefind && size != -1) {
GstCaps *caps; GstCaps *caps;
if (!(caps = gst_type_find_helper (basesrc->srcpad, size))) if (!(caps = gst_type_find_helper (basesrc->srcpad, size)))
@ -2939,8 +2939,8 @@ gst_base_src_activate_push (GstPad * pad, gboolean active)
/* do initial seek, which will start the task */ /* do initial seek, which will start the task */
GST_OBJECT_LOCK (basesrc); GST_OBJECT_LOCK (basesrc);
event = basesrc->data.ABI.pending_seek; event = basesrc->pending_seek;
basesrc->data.ABI.pending_seek = NULL; basesrc->pending_seek = NULL;
GST_OBJECT_UNLOCK (basesrc); GST_OBJECT_UNLOCK (basesrc);
/* no need to unlock anything, the task is certainly /* no need to unlock anything, the task is certainly
@ -3104,7 +3104,7 @@ gst_base_src_change_state (GstElement * element, GstStateChange transition)
basesrc->priv->last_sent_eos = TRUE; basesrc->priv->last_sent_eos = TRUE;
} }
g_atomic_int_set (&basesrc->priv->pending_eos, FALSE); g_atomic_int_set (&basesrc->priv->pending_eos, FALSE);
event_p = &basesrc->data.ABI.pending_seek; event_p = &basesrc->pending_seek;
gst_event_replace (event_p, NULL); gst_event_replace (event_p, NULL);
event_p = &basesrc->priv->close_segment; event_p = &basesrc->priv->close_segment;
gst_event_replace (event_p, NULL); gst_event_replace (event_p, NULL);

View file

@ -101,18 +101,14 @@ struct _GstBaseSrc {
gint num_buffers; gint num_buffers;
gint num_buffers_left; gint num_buffers_left;
/*< private >*/ gboolean typefind;
union { gboolean running;
struct { GstEvent *pending_seek;
/* FIXME: those fields should be moved into the private struct */
gboolean typefind;
gboolean running;
GstEvent *pending_seek;
} ABI;
gpointer _gst_reserved[GST_PADDING_LARGE-1];
} data;
GstBaseSrcPrivate *priv; GstBaseSrcPrivate *priv;
/*< private >*/
gpointer _gst_reserved[GST_PADDING_LARGE];
}; };
/** /**
@ -178,9 +174,8 @@ struct _GstBaseSrcClass {
/* decide on caps */ /* decide on caps */
gboolean (*negotiate) (GstBaseSrc *src); gboolean (*negotiate) (GstBaseSrc *src);
/* called if, in negotiation, caps need fixating */
/* generate and send a newsegment (UNUSED) */ void (*fixate) (GstBaseSrc *src, GstCaps *caps);
gboolean (*newsegment) (GstBaseSrc *src);
/* start and stop processing, ideal for opening/closing the resource */ /* start and stop processing, ideal for opening/closing the resource */
gboolean (*start) (GstBaseSrc *src); gboolean (*start) (GstBaseSrc *src);
@ -196,23 +191,6 @@ struct _GstBaseSrcClass {
/* check if the resource is seekable */ /* check if the resource is seekable */
gboolean (*is_seekable) (GstBaseSrc *src); gboolean (*is_seekable) (GstBaseSrc *src);
/* unlock any pending access to the resource. subclasses should unlock
* any function ASAP. */
gboolean (*unlock) (GstBaseSrc *src);
/* notify subclasses of an event */
gboolean (*event) (GstBaseSrc *src, GstEvent *event);
/* ask the subclass to create a buffer with offset and size */
GstFlowReturn (*create) (GstBaseSrc *src, guint64 offset, guint size,
GstBuffer **buf);
/* additions that change padding... */
/* notify subclasses of a seek */
gboolean (*do_seek) (GstBaseSrc *src, GstSegment *segment);
/* notify subclasses of a query */
gboolean (*query) (GstBaseSrc *src, GstQuery *query);
/* check whether the source would support pull-based operation if /* check whether the source would support pull-based operation if
* it were to be opened now. This vfunc is optional, but should be * it were to be opened now. This vfunc is optional, but should be
* implemented if possible to avoid unnecessary start/stop cycles. * implemented if possible to avoid unnecessary start/stop cycles.
@ -221,19 +199,31 @@ struct _GstBaseSrcClass {
* undesirable. */ * undesirable. */
gboolean (*check_get_range) (GstBaseSrc *src); gboolean (*check_get_range) (GstBaseSrc *src);
/* called if, in negotiation, caps need fixating */
void (*fixate) (GstBaseSrc *src, GstCaps *caps);
/* Clear any pending unlock request, as we succeeded in unlocking */
gboolean (*unlock_stop) (GstBaseSrc *src);
/* Prepare the segment on which to perform do_seek(), converting to the /* Prepare the segment on which to perform do_seek(), converting to the
* current basesrc format. */ * current basesrc format. */
gboolean (*prepare_seek_segment) (GstBaseSrc *src, GstEvent *seek, gboolean (*prepare_seek_segment) (GstBaseSrc *src, GstEvent *seek,
GstSegment *segment); GstSegment *segment);
/* notify subclasses of a seek */
gboolean (*do_seek) (GstBaseSrc *src, GstSegment *segment);
/* unlock any pending access to the resource. subclasses should unlock
* any function ASAP. */
gboolean (*unlock) (GstBaseSrc *src);
/* Clear any pending unlock request, as we succeeded in unlocking */
gboolean (*unlock_stop) (GstBaseSrc *src);
/* notify subclasses of a query */
gboolean (*query) (GstBaseSrc *src, GstQuery *query);
/* notify subclasses of an event */
gboolean (*event) (GstBaseSrc *src, GstEvent *event);
/* ask the subclass to create a buffer with offset and size */
GstFlowReturn (*create) (GstBaseSrc *src, guint64 offset, guint size,
GstBuffer **buf);
/*< private >*/ /*< private >*/
gpointer _gst_reserved[GST_PADDING_LARGE - 6]; gpointer _gst_reserved[GST_PADDING_LARGE];
}; };
GType gst_base_src_get_type (void); GType gst_base_src_get_type (void);

View file

@ -138,7 +138,7 @@ struct _GstBaseTransform {
/*< private >*/ /*< private >*/
GstBaseTransformPrivate *priv; GstBaseTransformPrivate *priv;
gpointer _gst_reserved[GST_PADDING_LARGE - 1]; gpointer _gst_reserved[GST_PADDING_LARGE];
}; };
/** /**
@ -199,8 +199,9 @@ struct _GstBaseTransformClass {
GstElementClass parent_class; GstElementClass parent_class;
/*< public >*/ /*< public >*/
/* virtual methods for subclasses */ gboolean passthrough_on_same_caps;
/* virtual methods for subclasses */
GstCaps* (*transform_caps) (GstBaseTransform *trans, GstCaps* (*transform_caps) (GstBaseTransform *trans,
GstPadDirection direction, GstPadDirection direction,
GstCaps *caps); GstCaps *caps);
@ -208,6 +209,12 @@ struct _GstBaseTransformClass {
void (*fixate_caps) (GstBaseTransform *trans, void (*fixate_caps) (GstBaseTransform *trans,
GstPadDirection direction, GstCaps *caps, GstPadDirection direction, GstCaps *caps,
GstCaps *othercaps); GstCaps *othercaps);
gboolean (*accept_caps) (GstBaseTransform *trans, GstPadDirection direction,
GstCaps *caps);
gboolean (*set_caps) (GstBaseTransform *trans, GstCaps *incaps,
GstCaps *outcaps);
gboolean (*transform_size) (GstBaseTransform *trans, gboolean (*transform_size) (GstBaseTransform *trans,
GstPadDirection direction, GstPadDirection direction,
@ -217,34 +224,24 @@ struct _GstBaseTransformClass {
gboolean (*get_unit_size) (GstBaseTransform *trans, GstCaps *caps, gboolean (*get_unit_size) (GstBaseTransform *trans, GstCaps *caps,
guint *size); guint *size);
gboolean (*set_caps) (GstBaseTransform *trans, GstCaps *incaps,
GstCaps *outcaps);
gboolean (*start) (GstBaseTransform *trans); gboolean (*start) (GstBaseTransform *trans);
gboolean (*stop) (GstBaseTransform *trans); gboolean (*stop) (GstBaseTransform *trans);
gboolean (*event) (GstBaseTransform *trans, GstEvent *event); gboolean (*event) (GstBaseTransform *trans, GstEvent *event);
/* src event */
gboolean (*src_event) (GstBaseTransform *trans, GstEvent *event);
GstFlowReturn (*prepare_output_buffer) (GstBaseTransform * trans,
GstBuffer *input, gint size, GstCaps *caps, GstBuffer **buf);
void (*before_transform) (GstBaseTransform *trans, GstBuffer *buffer);
GstFlowReturn (*transform) (GstBaseTransform *trans, GstBuffer *inbuf, GstFlowReturn (*transform) (GstBaseTransform *trans, GstBuffer *inbuf,
GstBuffer *outbuf); GstBuffer *outbuf);
GstFlowReturn (*transform_ip) (GstBaseTransform *trans, GstBuffer *buf); GstFlowReturn (*transform_ip) (GstBaseTransform *trans, GstBuffer *buf);
/* FIXME: When adjusting the padding, move these to nicer places in the class */
gboolean passthrough_on_same_caps;
GstFlowReturn (*prepare_output_buffer) (GstBaseTransform * trans,
GstBuffer *input, gint size, GstCaps *caps, GstBuffer **buf);
/* src event */
gboolean (*src_event) (GstBaseTransform *trans, GstEvent *event);
void (*before_transform) (GstBaseTransform *trans, GstBuffer *buffer);
gboolean (*accept_caps) (GstBaseTransform *trans, GstPadDirection direction,
GstCaps *caps);
/*< private >*/ /*< private >*/
gpointer _gst_reserved[GST_PADDING_LARGE - 3]; gpointer _gst_reserved[GST_PADDING_LARGE];
}; };
GType gst_base_transform_get_type (void); GType gst_base_transform_get_type (void);

View file

@ -277,7 +277,7 @@ gst_data_queue_locked_flush (GstDataQueue * queue)
gst_data_queue_cleanup (queue); gst_data_queue_cleanup (queue);
STATUS (queue, "after flushing"); STATUS (queue, "after flushing");
/* we deleted something... */ /* we deleted something... */
if (queue->abidata.ABI.waiting_del) if (queue->waiting_del)
g_cond_signal (queue->item_del); g_cond_signal (queue->item_del);
} }
@ -384,9 +384,9 @@ gst_data_queue_set_flushing (GstDataQueue * queue, gboolean flushing)
queue->flushing = flushing; queue->flushing = flushing;
if (flushing) { if (flushing) {
/* release push/pop functions */ /* release push/pop functions */
if (queue->abidata.ABI.waiting_add) if (queue->waiting_add)
g_cond_signal (queue->item_add); g_cond_signal (queue->item_add);
if (queue->abidata.ABI.waiting_del) if (queue->waiting_del)
g_cond_signal (queue->item_del); g_cond_signal (queue->item_del);
} }
GST_DATA_QUEUE_MUTEX_UNLOCK (queue); GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
@ -432,9 +432,9 @@ gst_data_queue_push (GstDataQueue * queue, GstDataQueueItem * item)
/* signal might have removed some items */ /* signal might have removed some items */
while (gst_data_queue_locked_is_full (queue)) { while (gst_data_queue_locked_is_full (queue)) {
queue->abidata.ABI.waiting_del = TRUE; queue->waiting_del = TRUE;
g_cond_wait (queue->item_del, queue->qlock); g_cond_wait (queue->item_del, queue->qlock);
queue->abidata.ABI.waiting_del = FALSE; queue->waiting_del = FALSE;
if (queue->flushing) if (queue->flushing)
goto flushing; goto flushing;
} }
@ -448,7 +448,7 @@ gst_data_queue_push (GstDataQueue * queue, GstDataQueueItem * item)
queue->cur_level.time += item->duration; queue->cur_level.time += item->duration;
STATUS (queue, "after pushing"); STATUS (queue, "after pushing");
if (queue->abidata.ABI.waiting_add) if (queue->waiting_add)
g_cond_signal (queue->item_add); g_cond_signal (queue->item_add);
GST_DATA_QUEUE_MUTEX_UNLOCK (queue); GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
@ -497,9 +497,9 @@ gst_data_queue_pop (GstDataQueue * queue, GstDataQueueItem ** item)
GST_DATA_QUEUE_MUTEX_LOCK_CHECK (queue, flushing); GST_DATA_QUEUE_MUTEX_LOCK_CHECK (queue, flushing);
while (gst_data_queue_locked_is_empty (queue)) { while (gst_data_queue_locked_is_empty (queue)) {
queue->abidata.ABI.waiting_add = TRUE; queue->waiting_add = TRUE;
g_cond_wait (queue->item_add, queue->qlock); g_cond_wait (queue->item_add, queue->qlock);
queue->abidata.ABI.waiting_add = FALSE; queue->waiting_add = FALSE;
if (queue->flushing) if (queue->flushing)
goto flushing; goto flushing;
} }
@ -515,7 +515,7 @@ gst_data_queue_pop (GstDataQueue * queue, GstDataQueueItem ** item)
queue->cur_level.time -= (*item)->duration; queue->cur_level.time -= (*item)->duration;
STATUS (queue, "after popping"); STATUS (queue, "after popping");
if (queue->abidata.ABI.waiting_del) if (queue->waiting_del)
g_cond_signal (queue->item_del); g_cond_signal (queue->item_del);
GST_DATA_QUEUE_MUTEX_UNLOCK (queue); GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
@ -600,7 +600,7 @@ gst_data_queue_limits_changed (GstDataQueue * queue)
g_return_if_fail (GST_IS_DATA_QUEUE (queue)); g_return_if_fail (GST_IS_DATA_QUEUE (queue));
GST_DATA_QUEUE_MUTEX_LOCK (queue); GST_DATA_QUEUE_MUTEX_LOCK (queue);
if (queue->abidata.ABI.waiting_del) { if (queue->waiting_del) {
GST_DEBUG ("signal del"); GST_DEBUG ("signal del");
g_cond_signal (queue->item_del); g_cond_signal (queue->item_del);
} }

View file

@ -128,20 +128,16 @@ struct _GstDataQueue
gpointer *checkdata; gpointer *checkdata;
GMutex *qlock; /* lock for queue (vs object lock) */ GMutex *qlock; /* lock for queue (vs object lock) */
gboolean waiting_add;
GCond *item_add; /* signals buffers now available for reading */ GCond *item_add; /* signals buffers now available for reading */
gboolean waiting_del;
GCond *item_del; /* signals space now available for writing */ GCond *item_del; /* signals space now available for writing */
gboolean flushing; /* indicates whether conditions where signalled because gboolean flushing; /* indicates whether conditions where signalled because
* of external flushing */ * of external flushing */
GstDataQueueFullCallback fullcallback; GstDataQueueFullCallback fullcallback;
GstDataQueueEmptyCallback emptycallback; GstDataQueueEmptyCallback emptycallback;
union { gpointer _gst_reserved[GST_PADDING];
struct {
gboolean waiting_add;
gboolean waiting_del;
} ABI;
gpointer _gst_reserved[GST_PADDING - 2];
} abidata;
}; };
struct _GstDataQueueClass struct _GstDataQueueClass