mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-09 07:52:36 +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,
|
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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue