update for activation changes

This commit is contained in:
Wim Taymans 2011-11-21 13:36:10 +01:00
parent 8eca58a50e
commit 03bc286c64
4 changed files with 139 additions and 151 deletions

View file

@ -92,10 +92,8 @@ static gboolean gst_asf_demux_sink_event (GstPad * pad, GstObject * parent,
static GstFlowReturn gst_asf_demux_process_object (GstASFDemux * demux, static GstFlowReturn gst_asf_demux_process_object (GstASFDemux * demux,
guint8 ** p_data, guint64 * p_size); guint8 ** p_data, guint64 * p_size);
static gboolean gst_asf_demux_activate (GstPad * sinkpad, GstObject * parent); static gboolean gst_asf_demux_activate (GstPad * sinkpad, GstObject * parent);
static gboolean gst_asf_demux_activate_push (GstPad * sinkpad, static gboolean gst_asf_demux_activate_mode (GstPad * sinkpad,
GstObject * parent, gboolean active); GstObject * parent, GstPadMode mode, gboolean active);
static gboolean gst_asf_demux_activate_pull (GstPad * sinkpad,
GstObject * parent, gboolean active);
static void gst_asf_demux_loop (GstASFDemux * demux); static void gst_asf_demux_loop (GstASFDemux * demux);
static void static void
gst_asf_demux_process_queued_extended_stream_objects (GstASFDemux * demux); gst_asf_demux_process_queued_extended_stream_objects (GstASFDemux * demux);
@ -281,10 +279,8 @@ gst_asf_demux_init (GstASFDemux * demux)
GST_DEBUG_FUNCPTR (gst_asf_demux_sink_event)); GST_DEBUG_FUNCPTR (gst_asf_demux_sink_event));
gst_pad_set_activate_function (demux->sinkpad, gst_pad_set_activate_function (demux->sinkpad,
GST_DEBUG_FUNCPTR (gst_asf_demux_activate)); GST_DEBUG_FUNCPTR (gst_asf_demux_activate));
gst_pad_set_activatepull_function (demux->sinkpad, gst_pad_set_activatemode_function (demux->sinkpad,
GST_DEBUG_FUNCPTR (gst_asf_demux_activate_pull)); GST_DEBUG_FUNCPTR (gst_asf_demux_activate_mode));
gst_pad_set_activatepush_function (demux->sinkpad,
GST_DEBUG_FUNCPTR (gst_asf_demux_activate_push));
gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad); gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad);
/* set initial state */ /* set initial state */
@ -311,48 +307,48 @@ gst_asf_demux_activate (GstPad * sinkpad, GstObject * parent)
goto activate_push; goto activate_push;
GST_DEBUG_OBJECT (sinkpad, "activating pull"); GST_DEBUG_OBJECT (sinkpad, "activating pull");
return gst_pad_activate_pull (sinkpad, TRUE); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE);
activate_push: activate_push:
{ {
GST_DEBUG_OBJECT (sinkpad, "activating push"); GST_DEBUG_OBJECT (sinkpad, "activating push");
return gst_pad_activate_push (sinkpad, TRUE); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE);
} }
} }
static gboolean static gboolean
gst_asf_demux_activate_push (GstPad * sinkpad, GstObject * parent, gst_asf_demux_activate_mode (GstPad * sinkpad, GstObject * parent,
gboolean active) GstPadMode mode, gboolean active)
{ {
gboolean res;
GstASFDemux *demux; GstASFDemux *demux;
demux = GST_ASF_DEMUX (parent); demux = GST_ASF_DEMUX (parent);
demux->state = GST_ASF_DEMUX_STATE_HEADER; switch (mode) {
demux->streaming = TRUE; case GST_PAD_MODE_PUSH:
demux->state = GST_ASF_DEMUX_STATE_HEADER;
demux->streaming = TRUE;
res = TRUE;
break;
case GST_PAD_MODE_PULL:
if (active) {
demux->state = GST_ASF_DEMUX_STATE_HEADER;
demux->streaming = FALSE;
return TRUE; res = gst_pad_start_task (sinkpad, (GstTaskFunction) gst_asf_demux_loop,
} demux);
} else {
static gboolean res = gst_pad_stop_task (sinkpad);
gst_asf_demux_activate_pull (GstPad * pad, GstObject * parent, gboolean active) }
{ break;
GstASFDemux *demux; default:
res = FALSE;
demux = GST_ASF_DEMUX (parent); break;
if (active) {
demux->state = GST_ASF_DEMUX_STATE_HEADER;
demux->streaming = FALSE;
return gst_pad_start_task (pad, (GstTaskFunction) gst_asf_demux_loop,
demux);
} else {
return gst_pad_stop_task (pad);
} }
return res;
} }
static gboolean static gboolean
gst_asf_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) gst_asf_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
{ {

View file

@ -77,10 +77,8 @@ static gboolean gst_real_audio_demux_src_query (GstPad * pad,
static void gst_real_audio_demux_loop (GstRealAudioDemux * demux); static void gst_real_audio_demux_loop (GstRealAudioDemux * demux);
static gboolean gst_real_audio_demux_sink_activate (GstPad * sinkpad, static gboolean gst_real_audio_demux_sink_activate (GstPad * sinkpad,
GstObject * parent); GstObject * parent);
static gboolean gst_real_audio_demux_sink_activate_push (GstPad * sinkpad, static gboolean gst_real_audio_demux_sink_activate_mode (GstPad * sinkpad,
GstObject * parent, gboolean active); GstObject * parent, GstPadMode mode, gboolean active);
static gboolean gst_real_audio_demux_sink_activate_pull (GstPad * sinkpad,
GstObject * parent, gboolean active);
static void static void
gst_real_audio_demux_finalize (GObject * obj) gst_real_audio_demux_finalize (GObject * obj)
@ -169,10 +167,8 @@ gst_real_audio_demux_init (GstRealAudioDemux * demux)
GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_event)); GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_event));
gst_pad_set_activate_function (demux->sinkpad, gst_pad_set_activate_function (demux->sinkpad,
GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate)); GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate));
gst_pad_set_activatepull_function (demux->sinkpad, gst_pad_set_activatemode_function (demux->sinkpad,
GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate_pull)); GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate_mode));
gst_pad_set_activatepush_function (demux->sinkpad,
GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate_push));
gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad); gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad);
@ -200,45 +196,45 @@ gst_real_audio_demux_sink_activate (GstPad * sinkpad, GstObject * parent)
goto activate_push; goto activate_push;
GST_DEBUG_OBJECT (sinkpad, "activating pull"); GST_DEBUG_OBJECT (sinkpad, "activating pull");
return gst_pad_activate_pull (sinkpad, TRUE); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE);
activate_push: activate_push:
{ {
GST_DEBUG_OBJECT (sinkpad, "activating push"); GST_DEBUG_OBJECT (sinkpad, "activating push");
return gst_pad_activate_push (sinkpad, TRUE); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE);
} }
} }
static gboolean static gboolean
gst_real_audio_demux_sink_activate_push (GstPad * sinkpad, GstObject * parent, gst_real_audio_demux_sink_activate_mode (GstPad * sinkpad, GstObject * parent,
gboolean active) GstPadMode mode, gboolean active)
{ {
gboolean res;
GstRealAudioDemux *demux; GstRealAudioDemux *demux;
demux = GST_REAL_AUDIO_DEMUX (parent); demux = GST_REAL_AUDIO_DEMUX (parent);
demux->seekable = FALSE; switch (mode) {
case GST_PAD_MODE_PUSH:
demux->seekable = FALSE;
res = TRUE;
break;
case GST_PAD_MODE_PULL:
if (active) {
demux->seekable = TRUE;
return TRUE; res = gst_pad_start_task (sinkpad,
} (GstTaskFunction) gst_real_audio_demux_loop, demux);
} else {
static gboolean demux->seekable = FALSE;
gst_real_audio_demux_sink_activate_pull (GstPad * sinkpad, GstObject * parent, res = gst_pad_stop_task (sinkpad);
gboolean active) }
{ break;
GstRealAudioDemux *demux; default:
res = FALSE;
demux = GST_REAL_AUDIO_DEMUX (parent); break;
if (active) {
demux->seekable = TRUE;
return gst_pad_start_task (sinkpad,
(GstTaskFunction) gst_real_audio_demux_loop, demux);
} else {
demux->seekable = FALSE;
return gst_pad_stop_task (sinkpad);
} }
return res;
} }
static GstFlowReturn static GstFlowReturn

View file

@ -122,8 +122,8 @@ static void gst_rdt_manager_get_property (GObject * object,
static gboolean gst_rdt_manager_query_src (GstPad * pad, GstObject * parent, static gboolean gst_rdt_manager_query_src (GstPad * pad, GstObject * parent,
GstQuery * query); GstQuery * query);
static gboolean gst_rdt_manager_src_activate_push (GstPad * pad, static gboolean gst_rdt_manager_src_activate_mode (GstPad * pad,
GstObject * parent, gboolean active); GstObject * parent, GstPadMode mode, gboolean active);
static GstClock *gst_rdt_manager_provide_clock (GstElement * element); static GstClock *gst_rdt_manager_provide_clock (GstElement * element);
static GstStateChangeReturn gst_rdt_manager_change_state (GstElement * element, static GstStateChangeReturn gst_rdt_manager_change_state (GstElement * element,
@ -301,8 +301,8 @@ activate_session (GstRDTManager * rdtmanager, GstRDTManagerSession * session,
gst_pad_set_element_private (session->recv_rtp_src, session); gst_pad_set_element_private (session->recv_rtp_src, session);
gst_pad_set_query_function (session->recv_rtp_src, gst_rdt_manager_query_src); gst_pad_set_query_function (session->recv_rtp_src, gst_rdt_manager_query_src);
gst_pad_set_activatepush_function (session->recv_rtp_src, gst_pad_set_activatemode_function (session->recv_rtp_src,
gst_rdt_manager_src_activate_push); gst_rdt_manager_src_activate_mode);
gst_pad_set_active (session->recv_rtp_src, TRUE); gst_pad_set_active (session->recv_rtp_src, TRUE);
gst_element_add_pad (GST_ELEMENT_CAST (rdtmanager), session->recv_rtp_src); gst_element_add_pad (GST_ELEMENT_CAST (rdtmanager), session->recv_rtp_src);
@ -556,52 +556,60 @@ gst_rdt_manager_query_src (GstPad * pad, GstObject * parent, GstQuery * query)
} }
static gboolean static gboolean
gst_rdt_manager_src_activate_push (GstPad * pad, GstObject * parent, gst_rdt_manager_src_activate_mode (GstPad * pad, GstObject * parent,
gboolean active) GstPadMode mode, gboolean active)
{ {
gboolean result = TRUE; gboolean result;
GstRDTManager *rdtmanager; GstRDTManager *rdtmanager;
GstRDTManagerSession *session; GstRDTManagerSession *session;
session = gst_pad_get_element_private (pad); session = gst_pad_get_element_private (pad);
rdtmanager = session->dec; rdtmanager = session->dec;
if (active) { switch (mode) {
/* allow data processing */ case GST_PAD_MODE_PUSH:
JBUF_LOCK (session); if (active) {
GST_DEBUG_OBJECT (rdtmanager, "Enabling pop on queue"); /* allow data processing */
/* Mark as non flushing */ JBUF_LOCK (session);
session->srcresult = GST_FLOW_OK; GST_DEBUG_OBJECT (rdtmanager, "Enabling pop on queue");
gst_segment_init (&session->segment, GST_FORMAT_TIME); /* Mark as non flushing */
session->last_popped_seqnum = -1; session->srcresult = GST_FLOW_OK;
session->last_out_time = -1; gst_segment_init (&session->segment, GST_FORMAT_TIME);
session->next_seqnum = -1; session->last_popped_seqnum = -1;
session->eos = FALSE; session->last_out_time = -1;
JBUF_UNLOCK (session); session->next_seqnum = -1;
session->eos = FALSE;
JBUF_UNLOCK (session);
/* start pushing out buffers */ /* start pushing out buffers */
GST_DEBUG_OBJECT (rdtmanager, "Starting task on srcpad"); GST_DEBUG_OBJECT (rdtmanager, "Starting task on srcpad");
gst_pad_start_task (pad, (GstTaskFunction) gst_rdt_manager_loop, pad); result =
} else { gst_pad_start_task (pad, (GstTaskFunction) gst_rdt_manager_loop,
/* make sure all data processing stops ASAP */ pad);
JBUF_LOCK (session); } else {
/* mark ourselves as flushing */ /* make sure all data processing stops ASAP */
session->srcresult = GST_FLOW_WRONG_STATE; JBUF_LOCK (session);
GST_DEBUG_OBJECT (rdtmanager, "Disabling pop on queue"); /* mark ourselves as flushing */
/* this unblocks any waiting pops on the src pad task */ session->srcresult = GST_FLOW_WRONG_STATE;
JBUF_SIGNAL (session); GST_DEBUG_OBJECT (rdtmanager, "Disabling pop on queue");
/* unlock clock, we just unschedule, the entry will be released by /* this unblocks any waiting pops on the src pad task */
* the locking streaming thread. */ JBUF_SIGNAL (session);
if (session->clock_id) /* unlock clock, we just unschedule, the entry will be released by
gst_clock_id_unschedule (session->clock_id); * the locking streaming thread. */
JBUF_UNLOCK (session); if (session->clock_id)
gst_clock_id_unschedule (session->clock_id);
JBUF_UNLOCK (session);
/* NOTE this will hardlock if the state change is called from the src pad /* NOTE this will hardlock if the state change is called from the src pad
* task thread because we will _join() the thread. */ * task thread because we will _join() the thread. */
GST_DEBUG_OBJECT (rdtmanager, "Stopping task on srcpad"); GST_DEBUG_OBJECT (rdtmanager, "Stopping task on srcpad");
result = gst_pad_stop_task (pad); result = gst_pad_stop_task (pad);
}
break;
default:
result = FALSE;
break;
} }
return result; return result;
} }

View file

@ -139,10 +139,8 @@ static GstFlowReturn gst_rmdemux_chain (GstPad * pad, GstObject * parent,
static void gst_rmdemux_loop (GstPad * pad); static void gst_rmdemux_loop (GstPad * pad);
static gboolean gst_rmdemux_sink_activate (GstPad * sinkpad, static gboolean gst_rmdemux_sink_activate (GstPad * sinkpad,
GstObject * parent); GstObject * parent);
static gboolean gst_rmdemux_sink_activate_push (GstPad * sinkpad, static gboolean gst_rmdemux_sink_activate_mode (GstPad * sinkpad,
GstObject * parent, gboolean active); GstObject * parent, GstPadMode mode, gboolean active);
static gboolean gst_rmdemux_sink_activate_pull (GstPad * sinkpad,
GstObject * parent, gboolean active);
static gboolean gst_rmdemux_sink_event (GstPad * pad, GstObject * parent, static gboolean gst_rmdemux_sink_event (GstPad * pad, GstObject * parent,
GstEvent * event); GstEvent * event);
static gboolean gst_rmdemux_src_event (GstPad * pad, GstObject * parent, static gboolean gst_rmdemux_src_event (GstPad * pad, GstObject * parent,
@ -255,10 +253,8 @@ gst_rmdemux_init (GstRMDemux * rmdemux)
GST_DEBUG_FUNCPTR (gst_rmdemux_chain)); GST_DEBUG_FUNCPTR (gst_rmdemux_chain));
gst_pad_set_activate_function (rmdemux->sinkpad, gst_pad_set_activate_function (rmdemux->sinkpad,
GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate)); GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate));
gst_pad_set_activatepull_function (rmdemux->sinkpad, gst_pad_set_activatemode_function (rmdemux->sinkpad,
GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate_pull)); GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate_mode));
gst_pad_set_activatepush_function (rmdemux->sinkpad,
GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate_push));
gst_element_add_pad (GST_ELEMENT (rmdemux), rmdemux->sinkpad); gst_element_add_pad (GST_ELEMENT (rmdemux), rmdemux->sinkpad);
@ -746,7 +742,6 @@ gst_rmdemux_change_state (GstElement * element, GstStateChange transition)
static gboolean static gboolean
gst_rmdemux_sink_activate (GstPad * sinkpad, GstObject * parent) gst_rmdemux_sink_activate (GstPad * sinkpad, GstObject * parent)
{ {
GstQuery *query; GstQuery *query;
gboolean pull_mode; gboolean pull_mode;
@ -764,57 +759,50 @@ gst_rmdemux_sink_activate (GstPad * sinkpad, GstObject * parent)
goto activate_push; goto activate_push;
GST_DEBUG_OBJECT (sinkpad, "activating pull"); GST_DEBUG_OBJECT (sinkpad, "activating pull");
return gst_pad_activate_pull (sinkpad, TRUE); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE);
activate_push: activate_push:
{ {
GST_DEBUG_OBJECT (sinkpad, "activating push"); GST_DEBUG_OBJECT (sinkpad, "activating push");
return gst_pad_activate_push (sinkpad, TRUE); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE);
} }
} }
/* this function gets called when we activate ourselves in push mode.
* We cannot seek (ourselves) in the stream */
static gboolean static gboolean
gst_rmdemux_sink_activate_push (GstPad * pad, GstObject * parent, gst_rmdemux_sink_activate_mode (GstPad * sinkpad, GstObject * parent,
gboolean active) GstPadMode mode, gboolean active)
{ {
GstRMDemux *rmdemux; gboolean res;
GstRMDemux *demux;
rmdemux = GST_RMDEMUX (parent); demux = GST_RMDEMUX (parent);
GST_DEBUG_OBJECT (rmdemux, "activate_push"); switch (mode) {
case GST_PAD_MODE_PUSH:
rmdemux->seekable = FALSE; demux->seekable = FALSE;
res = TRUE;
return TRUE; break;
} case GST_PAD_MODE_PULL:
if (active) {
/* this function gets called when we activate ourselves in pull mode. demux->seekable = TRUE;
* We can perform random access to the resource and we start a task demux->offset = 0;
* to start reading */ demux->loop_state = RMDEMUX_LOOP_STATE_HEADER;
static gboolean demux->data_offset = G_MAXUINT;
gst_rmdemux_sink_activate_pull (GstPad * pad, GstObject * parent, res =
gboolean active) gst_pad_start_task (sinkpad, (GstTaskFunction) gst_rmdemux_loop,
{ sinkpad);
GstRMDemux *rmdemux; } else {
res = gst_pad_stop_task (sinkpad);
rmdemux = GST_RMDEMUX (parent); }
break;
GST_DEBUG_OBJECT (rmdemux, "activate_pull"); default:
res = FALSE;
if (active) { break;
rmdemux->seekable = TRUE;
rmdemux->offset = 0;
rmdemux->loop_state = RMDEMUX_LOOP_STATE_HEADER;
rmdemux->data_offset = G_MAXUINT;
return gst_pad_start_task (pad, (GstTaskFunction) gst_rmdemux_loop, pad);
} else {
return gst_pad_stop_task (pad);
} }
return res;
} }
/* random access mode - just pass over to our chain function */ /* random access mode - just pass over to our chain function */
static void static void
gst_rmdemux_loop (GstPad * pad) gst_rmdemux_loop (GstPad * pad)