mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 20:42:30 +00:00
update for activation changes
This commit is contained in:
parent
8eca58a50e
commit
03bc286c64
4 changed files with 139 additions and 151 deletions
|
@ -92,10 +92,8 @@ static gboolean gst_asf_demux_sink_event (GstPad * pad, GstObject * parent,
|
|||
static GstFlowReturn gst_asf_demux_process_object (GstASFDemux * demux,
|
||||
guint8 ** p_data, guint64 * p_size);
|
||||
static gboolean gst_asf_demux_activate (GstPad * sinkpad, GstObject * parent);
|
||||
static gboolean gst_asf_demux_activate_push (GstPad * sinkpad,
|
||||
GstObject * parent, gboolean active);
|
||||
static gboolean gst_asf_demux_activate_pull (GstPad * sinkpad,
|
||||
GstObject * parent, gboolean active);
|
||||
static gboolean gst_asf_demux_activate_mode (GstPad * sinkpad,
|
||||
GstObject * parent, GstPadMode mode, gboolean active);
|
||||
static void gst_asf_demux_loop (GstASFDemux * demux);
|
||||
static void
|
||||
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_pad_set_activate_function (demux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_asf_demux_activate));
|
||||
gst_pad_set_activatepull_function (demux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_asf_demux_activate_pull));
|
||||
gst_pad_set_activatepush_function (demux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_asf_demux_activate_push));
|
||||
gst_pad_set_activatemode_function (demux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_asf_demux_activate_mode));
|
||||
gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad);
|
||||
|
||||
/* set initial state */
|
||||
|
@ -311,48 +307,48 @@ gst_asf_demux_activate (GstPad * sinkpad, GstObject * parent)
|
|||
goto activate_push;
|
||||
|
||||
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:
|
||||
{
|
||||
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
|
||||
gst_asf_demux_activate_push (GstPad * sinkpad, GstObject * parent,
|
||||
gboolean active)
|
||||
gst_asf_demux_activate_mode (GstPad * sinkpad, GstObject * parent,
|
||||
GstPadMode mode, gboolean active)
|
||||
{
|
||||
gboolean res;
|
||||
GstASFDemux *demux;
|
||||
|
||||
demux = GST_ASF_DEMUX (parent);
|
||||
|
||||
demux->state = GST_ASF_DEMUX_STATE_HEADER;
|
||||
demux->streaming = TRUE;
|
||||
switch (mode) {
|
||||
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;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_asf_demux_activate_pull (GstPad * pad, GstObject * parent, gboolean active)
|
||||
{
|
||||
GstASFDemux *demux;
|
||||
|
||||
demux = GST_ASF_DEMUX (parent);
|
||||
|
||||
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);
|
||||
res = gst_pad_start_task (sinkpad, (GstTaskFunction) gst_asf_demux_loop,
|
||||
demux);
|
||||
} else {
|
||||
res = gst_pad_stop_task (sinkpad);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
res = FALSE;
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
gst_asf_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
||||
{
|
||||
|
|
|
@ -77,10 +77,8 @@ static gboolean gst_real_audio_demux_src_query (GstPad * pad,
|
|||
static void gst_real_audio_demux_loop (GstRealAudioDemux * demux);
|
||||
static gboolean gst_real_audio_demux_sink_activate (GstPad * sinkpad,
|
||||
GstObject * parent);
|
||||
static gboolean gst_real_audio_demux_sink_activate_push (GstPad * sinkpad,
|
||||
GstObject * parent, gboolean active);
|
||||
static gboolean gst_real_audio_demux_sink_activate_pull (GstPad * sinkpad,
|
||||
GstObject * parent, gboolean active);
|
||||
static gboolean gst_real_audio_demux_sink_activate_mode (GstPad * sinkpad,
|
||||
GstObject * parent, GstPadMode mode, gboolean active);
|
||||
|
||||
static void
|
||||
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_pad_set_activate_function (demux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate));
|
||||
gst_pad_set_activatepull_function (demux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate_pull));
|
||||
gst_pad_set_activatepush_function (demux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate_push));
|
||||
gst_pad_set_activatemode_function (demux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate_mode));
|
||||
|
||||
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;
|
||||
|
||||
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:
|
||||
{
|
||||
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
|
||||
gst_real_audio_demux_sink_activate_push (GstPad * sinkpad, GstObject * parent,
|
||||
gboolean active)
|
||||
gst_real_audio_demux_sink_activate_mode (GstPad * sinkpad, GstObject * parent,
|
||||
GstPadMode mode, gboolean active)
|
||||
{
|
||||
gboolean res;
|
||||
GstRealAudioDemux *demux;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_real_audio_demux_sink_activate_pull (GstPad * sinkpad, GstObject * parent,
|
||||
gboolean active)
|
||||
{
|
||||
GstRealAudioDemux *demux;
|
||||
|
||||
demux = GST_REAL_AUDIO_DEMUX (parent);
|
||||
|
||||
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);
|
||||
res = gst_pad_start_task (sinkpad,
|
||||
(GstTaskFunction) gst_real_audio_demux_loop, demux);
|
||||
} else {
|
||||
demux->seekable = FALSE;
|
||||
res = gst_pad_stop_task (sinkpad);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
res = FALSE;
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static GstFlowReturn
|
||||
|
|
|
@ -122,8 +122,8 @@ static void gst_rdt_manager_get_property (GObject * object,
|
|||
|
||||
static gboolean gst_rdt_manager_query_src (GstPad * pad, GstObject * parent,
|
||||
GstQuery * query);
|
||||
static gboolean gst_rdt_manager_src_activate_push (GstPad * pad,
|
||||
GstObject * parent, gboolean active);
|
||||
static gboolean gst_rdt_manager_src_activate_mode (GstPad * pad,
|
||||
GstObject * parent, GstPadMode mode, gboolean active);
|
||||
|
||||
static GstClock *gst_rdt_manager_provide_clock (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_query_function (session->recv_rtp_src, gst_rdt_manager_query_src);
|
||||
gst_pad_set_activatepush_function (session->recv_rtp_src,
|
||||
gst_rdt_manager_src_activate_push);
|
||||
gst_pad_set_activatemode_function (session->recv_rtp_src,
|
||||
gst_rdt_manager_src_activate_mode);
|
||||
|
||||
gst_pad_set_active (session->recv_rtp_src, TRUE);
|
||||
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
|
||||
gst_rdt_manager_src_activate_push (GstPad * pad, GstObject * parent,
|
||||
gboolean active)
|
||||
gst_rdt_manager_src_activate_mode (GstPad * pad, GstObject * parent,
|
||||
GstPadMode mode, gboolean active)
|
||||
{
|
||||
gboolean result = TRUE;
|
||||
gboolean result;
|
||||
GstRDTManager *rdtmanager;
|
||||
GstRDTManagerSession *session;
|
||||
|
||||
session = gst_pad_get_element_private (pad);
|
||||
rdtmanager = session->dec;
|
||||
|
||||
if (active) {
|
||||
/* allow data processing */
|
||||
JBUF_LOCK (session);
|
||||
GST_DEBUG_OBJECT (rdtmanager, "Enabling pop on queue");
|
||||
/* Mark as non flushing */
|
||||
session->srcresult = GST_FLOW_OK;
|
||||
gst_segment_init (&session->segment, GST_FORMAT_TIME);
|
||||
session->last_popped_seqnum = -1;
|
||||
session->last_out_time = -1;
|
||||
session->next_seqnum = -1;
|
||||
session->eos = FALSE;
|
||||
JBUF_UNLOCK (session);
|
||||
switch (mode) {
|
||||
case GST_PAD_MODE_PUSH:
|
||||
if (active) {
|
||||
/* allow data processing */
|
||||
JBUF_LOCK (session);
|
||||
GST_DEBUG_OBJECT (rdtmanager, "Enabling pop on queue");
|
||||
/* Mark as non flushing */
|
||||
session->srcresult = GST_FLOW_OK;
|
||||
gst_segment_init (&session->segment, GST_FORMAT_TIME);
|
||||
session->last_popped_seqnum = -1;
|
||||
session->last_out_time = -1;
|
||||
session->next_seqnum = -1;
|
||||
session->eos = FALSE;
|
||||
JBUF_UNLOCK (session);
|
||||
|
||||
/* start pushing out buffers */
|
||||
GST_DEBUG_OBJECT (rdtmanager, "Starting task on srcpad");
|
||||
gst_pad_start_task (pad, (GstTaskFunction) gst_rdt_manager_loop, pad);
|
||||
} else {
|
||||
/* make sure all data processing stops ASAP */
|
||||
JBUF_LOCK (session);
|
||||
/* mark ourselves as flushing */
|
||||
session->srcresult = GST_FLOW_WRONG_STATE;
|
||||
GST_DEBUG_OBJECT (rdtmanager, "Disabling pop on queue");
|
||||
/* this unblocks any waiting pops on the src pad task */
|
||||
JBUF_SIGNAL (session);
|
||||
/* unlock clock, we just unschedule, the entry will be released by
|
||||
* the locking streaming thread. */
|
||||
if (session->clock_id)
|
||||
gst_clock_id_unschedule (session->clock_id);
|
||||
JBUF_UNLOCK (session);
|
||||
/* start pushing out buffers */
|
||||
GST_DEBUG_OBJECT (rdtmanager, "Starting task on srcpad");
|
||||
result =
|
||||
gst_pad_start_task (pad, (GstTaskFunction) gst_rdt_manager_loop,
|
||||
pad);
|
||||
} else {
|
||||
/* make sure all data processing stops ASAP */
|
||||
JBUF_LOCK (session);
|
||||
/* mark ourselves as flushing */
|
||||
session->srcresult = GST_FLOW_WRONG_STATE;
|
||||
GST_DEBUG_OBJECT (rdtmanager, "Disabling pop on queue");
|
||||
/* this unblocks any waiting pops on the src pad task */
|
||||
JBUF_SIGNAL (session);
|
||||
/* unlock clock, we just unschedule, the entry will be released by
|
||||
* the locking streaming thread. */
|
||||
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
|
||||
* task thread because we will _join() the thread. */
|
||||
GST_DEBUG_OBJECT (rdtmanager, "Stopping task on srcpad");
|
||||
result = gst_pad_stop_task (pad);
|
||||
/* NOTE this will hardlock if the state change is called from the src pad
|
||||
* task thread because we will _join() the thread. */
|
||||
GST_DEBUG_OBJECT (rdtmanager, "Stopping task on srcpad");
|
||||
result = gst_pad_stop_task (pad);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
result = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -139,10 +139,8 @@ static GstFlowReturn gst_rmdemux_chain (GstPad * pad, GstObject * parent,
|
|||
static void gst_rmdemux_loop (GstPad * pad);
|
||||
static gboolean gst_rmdemux_sink_activate (GstPad * sinkpad,
|
||||
GstObject * parent);
|
||||
static gboolean gst_rmdemux_sink_activate_push (GstPad * sinkpad,
|
||||
GstObject * parent, gboolean active);
|
||||
static gboolean gst_rmdemux_sink_activate_pull (GstPad * sinkpad,
|
||||
GstObject * parent, gboolean active);
|
||||
static gboolean gst_rmdemux_sink_activate_mode (GstPad * sinkpad,
|
||||
GstObject * parent, GstPadMode mode, gboolean active);
|
||||
static gboolean gst_rmdemux_sink_event (GstPad * pad, GstObject * parent,
|
||||
GstEvent * event);
|
||||
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_pad_set_activate_function (rmdemux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate));
|
||||
gst_pad_set_activatepull_function (rmdemux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate_pull));
|
||||
gst_pad_set_activatepush_function (rmdemux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate_push));
|
||||
gst_pad_set_activatemode_function (rmdemux->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate_mode));
|
||||
|
||||
gst_element_add_pad (GST_ELEMENT (rmdemux), rmdemux->sinkpad);
|
||||
|
||||
|
@ -746,7 +742,6 @@ gst_rmdemux_change_state (GstElement * element, GstStateChange transition)
|
|||
static gboolean
|
||||
gst_rmdemux_sink_activate (GstPad * sinkpad, GstObject * parent)
|
||||
{
|
||||
|
||||
GstQuery *query;
|
||||
gboolean pull_mode;
|
||||
|
||||
|
@ -764,57 +759,50 @@ gst_rmdemux_sink_activate (GstPad * sinkpad, GstObject * parent)
|
|||
goto activate_push;
|
||||
|
||||
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:
|
||||
{
|
||||
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
|
||||
gst_rmdemux_sink_activate_push (GstPad * pad, GstObject * parent,
|
||||
gboolean active)
|
||||
gst_rmdemux_sink_activate_mode (GstPad * sinkpad, GstObject * parent,
|
||||
GstPadMode mode, gboolean active)
|
||||
{
|
||||
GstRMDemux *rmdemux;
|
||||
gboolean res;
|
||||
GstRMDemux *demux;
|
||||
|
||||
rmdemux = GST_RMDEMUX (parent);
|
||||
demux = GST_RMDEMUX (parent);
|
||||
|
||||
GST_DEBUG_OBJECT (rmdemux, "activate_push");
|
||||
|
||||
rmdemux->seekable = FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* this function gets called when we activate ourselves in pull mode.
|
||||
* We can perform random access to the resource and we start a task
|
||||
* to start reading */
|
||||
static gboolean
|
||||
gst_rmdemux_sink_activate_pull (GstPad * pad, GstObject * parent,
|
||||
gboolean active)
|
||||
{
|
||||
GstRMDemux *rmdemux;
|
||||
|
||||
rmdemux = GST_RMDEMUX (parent);
|
||||
|
||||
GST_DEBUG_OBJECT (rmdemux, "activate_pull");
|
||||
|
||||
if (active) {
|
||||
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);
|
||||
switch (mode) {
|
||||
case GST_PAD_MODE_PUSH:
|
||||
demux->seekable = FALSE;
|
||||
res = TRUE;
|
||||
break;
|
||||
case GST_PAD_MODE_PULL:
|
||||
if (active) {
|
||||
demux->seekable = TRUE;
|
||||
demux->offset = 0;
|
||||
demux->loop_state = RMDEMUX_LOOP_STATE_HEADER;
|
||||
demux->data_offset = G_MAXUINT;
|
||||
res =
|
||||
gst_pad_start_task (sinkpad, (GstTaskFunction) gst_rmdemux_loop,
|
||||
sinkpad);
|
||||
} else {
|
||||
res = gst_pad_stop_task (sinkpad);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
res = FALSE;
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/* random access mode - just pass over to our chain function */
|
||||
static void
|
||||
gst_rmdemux_loop (GstPad * pad)
|
||||
|
|
Loading…
Reference in a new issue