update for activation changes
authorWim Taymans <wim.taymans@collabora.co.uk>
Mon, 21 Nov 2011 12:36:10 +0000 (13:36 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 21 Nov 2011 12:36:10 +0000 (13:36 +0100)
gst/asfdemux/gstasfdemux.c
gst/realmedia/rademux.c
gst/realmedia/rdtmanager.c
gst/realmedia/rmdemux.c

index e12827a..3d1847b 100644 (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,
     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)
-{
-  GstASFDemux *demux;
-
-  demux = GST_ASF_DEMUX (parent);
-
-  demux->state = GST_ASF_DEMUX_STATE_HEADER;
-  demux->streaming = TRUE;
-
-  return TRUE;
-}
-
-static gboolean
-gst_asf_demux_activate_pull (GstPad * pad, 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);
 
-  if (active) {
-    demux->state = GST_ASF_DEMUX_STATE_HEADER;
-    demux->streaming = FALSE;
+  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 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)
 {
index 844e7f4..de99a09 100644 (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 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;
-
-  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;
+  switch (mode) {
+    case GST_PAD_MODE_PUSH:
+      demux->seekable = FALSE;
+      res = TRUE;
+      break;
+    case GST_PAD_MODE_PULL:
+      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
index 00966f6..990d116 100644 (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,
     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);
-
-    /* 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);
-
-    /* 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);
+  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");
+        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);
+      }
+      break;
+    default:
+      result = FALSE;
+      break;
   }
-
   return result;
 }
 
index d7cf0fb..742fe3d 100644 (file)
@@ -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;
-
-  rmdemux = GST_RMDEMUX (parent);
+  gboolean res;
+  GstRMDemux *demux;
 
-  GST_DEBUG_OBJECT (rmdemux, "activate_push");
+  demux = GST_RMDEMUX (parent);
 
-  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)