gst-plugins-nuvdemux/nuvdemux/gstnuvdemux.c
branchtrunk
changeset 424 66f318a2f4b2
parent 318 0944bea397f9
child 425 9638cccfa1fe
     1.1 --- a/gst-plugins-nuvdemux/nuvdemux/gstnuvdemux.c	Thu Feb 01 16:56:55 2007 +0000
     1.2 +++ b/gst-plugins-nuvdemux/nuvdemux/gstnuvdemux.c	Wed Mar 21 18:14:11 2007 +0000
     1.3 @@ -356,6 +356,16 @@
     1.4  {
     1.5    nuv->priv = GST_NUV_DEMUX_GET_PRIVATE (nuv);
     1.6    nuv->priv->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink");
     1.7 +
     1.8 +  /* creating adapter */
     1.9 +  nuv->priv->mode = NUV_PUSH_MODE;
    1.10 +  nuv->priv->adapter = gst_adapter_new ();
    1.11 +
    1.12 +  g_debug ("Adapter %p", nuv->priv->adapter);
    1.13 +
    1.14 +  nuv->priv->new_audio_segment = TRUE;
    1.15 +  nuv->priv->new_video_segment = TRUE;
    1.16 +
    1.17    gst_pad_set_activate_function (nuv->priv->sinkpad, gst_nuv_demux_sink_activate);
    1.18    gst_pad_set_activatepull_function (nuv->priv->sinkpad,
    1.19        gst_nuv_demux_sink_activate_pull);
    1.20 @@ -365,16 +375,9 @@
    1.21        GST_DEBUG_FUNCPTR (gst_nuv_demux_chain));
    1.22    gst_pad_set_event_function (nuv->priv->sinkpad,
    1.23        gst_nuv_demux_sink_event);
    1.24 +
    1.25    gst_element_add_pad (GST_ELEMENT (nuv), nuv->priv->sinkpad);
    1.26  
    1.27 -  nuv->priv->new_audio_segment = TRUE;
    1.28 -  nuv->priv->new_video_segment = TRUE;
    1.29 -
    1.30 -  /* creating adapter */
    1.31 -  nuv->priv->mode = NUV_PUSH_MODE;
    1.32 -  nuv->priv->adapter = gst_adapter_new ();
    1.33 -
    1.34 -  gst_nuv_demux_reset (nuv);
    1.35  }
    1.36  
    1.37  static void
    1.38 @@ -382,6 +385,8 @@
    1.39  {
    1.40    GstNuvDemux *nuv = GST_NUV_DEMUX (object);
    1.41  
    1.42 +  g_debug ("NUV DISPOSE");
    1.43 +
    1.44    if (nuv->priv->mpeg_buffer != NULL) {
    1.45      gst_buffer_unref (nuv->priv->mpeg_buffer);
    1.46    }
    1.47 @@ -1080,20 +1085,16 @@
    1.48  {
    1.49    gboolean res = TRUE;
    1.50    GstNuvDemux *nuv = GST_NUV_DEMUX (gst_pad_get_parent (sinkpad));
    1.51 + 
    1.52 +  g_debug ("SINK ACTIVATE");
    1.53  
    1.54    if (gst_pad_check_pull_range (sinkpad)) {
    1.55 -    if (nuv->priv->adapter) {
    1.56 -      gst_adapter_clear (nuv->priv->adapter);
    1.57 -      g_object_unref (nuv->priv->adapter);
    1.58 -      nuv->priv->adapter = NULL;
    1.59 -    }
    1.60 +    g_debug ("PULL");
    1.61 +    gst_adapter_clear (nuv->priv->adapter);
    1.62      res = gst_pad_activate_pull (sinkpad, TRUE);
    1.63    } else {
    1.64 -    if (nuv->priv->adapter) {
    1.65 -      gst_adapter_clear (nuv->priv->adapter);
    1.66 -    } else {
    1.67 -      nuv->priv->adapter = gst_adapter_new ();
    1.68 -    }
    1.69 +    g_debug ("PUSH");
    1.70 +    gst_adapter_clear (nuv->priv->adapter);
    1.71      res = gst_pad_activate_push (sinkpad, TRUE);
    1.72    }
    1.73    
    1.74 @@ -1109,14 +1110,12 @@
    1.75    if (active) {
    1.76      GST_DEBUG_OBJECT (nuv, "activating pull function");
    1.77      nuv->priv->mode = NUV_PULL_MODE;
    1.78 -    if (nuv->priv->adapter) {
    1.79 -      gst_adapter_clear (nuv->priv->adapter);
    1.80 -      g_object_unref (nuv->priv->adapter);
    1.81 -      nuv->priv->adapter = NULL;
    1.82 -    }
    1.83 +    gst_adapter_clear (nuv->priv->adapter);
    1.84 +
    1.85      gst_pad_start_task (sinkpad, (GstTaskFunction) gst_nuv_demux_loop, sinkpad);
    1.86    } else {
    1.87      GST_DEBUG_OBJECT (nuv, "deactivating pull function");
    1.88 +    g_debug ("STOP TASK");
    1.89      gst_pad_stop_task (sinkpad);
    1.90    }
    1.91    gst_object_unref (nuv);
    1.92 @@ -1129,8 +1128,10 @@
    1.93  {
    1.94    GstNuvDemux *nuv = GST_NUV_DEMUX (gst_pad_get_parent (pad));
    1.95  
    1.96 +  if (active) {
    1.97 +    nuv->priv->mode = NUV_PUSH_MODE;
    1.98 +    gst_adapter_clear (nuv->priv->adapter);
    1.99  
   1.100 -  if (active) {
   1.101      GST_DEBUG_OBJECT (nuv, "activating push/chain function");
   1.102    } else {
   1.103      GST_DEBUG_OBJECT (nuv, "deactivating push/chain function");
   1.104 @@ -1163,6 +1164,7 @@
   1.105  
   1.106        gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop);
   1.107        GST_DEBUG_OBJECT (nuv, "got seek, start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT, cur, stop);
   1.108 +      g_debug ("got seek, start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT, cur, stop);
   1.109        break;
   1.110      }
   1.111      case GST_EVENT_NEWSEGMENT:
   1.112 @@ -1176,6 +1178,7 @@
   1.113        gst_event_parse_new_segment (event, &update, &rate, &format, &start, &stop, &time);
   1.114  
   1.115        GST_DEBUG_OBJECT (nuv, "got newsegment, start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT, start, stop);
   1.116 +      g_debug ("got newsegment, start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT, start, stop);
   1.117        nuv->priv->duration_bytes = stop - start;
   1.118        gst_event_unref (event);
   1.119        res = TRUE;
   1.120 @@ -1211,8 +1214,12 @@
   1.121  gst_nuv_demux_chain (GstPad * pad, GstBuffer * buf)
   1.122  {
   1.123    GstFlowReturn ret = GST_FLOW_OK;
   1.124 +  GstNuvDemux *nuv = GST_NUV_DEMUX (gst_pad_get_parent (pad));
   1.125 +  
   1.126 +  if (nuv->priv->mode != NUV_PUSH_MODE)
   1.127 +    return ret;
   1.128  
   1.129 -  GstNuvDemux *nuv = GST_NUV_DEMUX (gst_pad_get_parent (pad));
   1.130 +  g_debug ("CHAIN ADP %p", nuv->priv->adapter);
   1.131  
   1.132    gst_adapter_push (nuv->priv->adapter, buf);  
   1.133    
   1.134 @@ -1222,6 +1229,8 @@
   1.135  
   1.136    nuv->priv->more_data = FALSE;
   1.137    gst_object_unref (nuv);
   1.138 +
   1.139 +  g_debug ("CHAIN END");
   1.140    
   1.141    return ret;
   1.142  }
   1.143 @@ -1237,7 +1246,7 @@
   1.144  {
   1.145    nuv->priv->more_data = FALSE;
   1.146    nuv->priv->state = GST_NUV_DEMUX_START;
   1.147 -  nuv->priv->mode = 0;
   1.148 +  nuv->priv->mode = NUV_PUSH_MODE;
   1.149    nuv->priv->offset = 0;
   1.150    nuv->priv->streamer_offset = 0;
   1.151    nuv->priv->time_start = 0;
   1.152 @@ -1247,9 +1256,7 @@
   1.153    nuv->priv->duration_average = GST_CLOCK_TIME_NONE;
   1.154    gst_segment_init (&nuv->priv->segment, GST_FORMAT_TIME);
   1.155  
   1.156 -  if (nuv->priv->adapter != NULL) {
   1.157 -    gst_adapter_clear (nuv->priv->adapter);
   1.158 -  }
   1.159 +  gst_adapter_clear (nuv->priv->adapter);
   1.160  
   1.161    if (nuv->priv->mpeg_buffer != NULL) {
   1.162      gst_buffer_unref (nuv->priv->mpeg_buffer);
   1.163 @@ -1278,6 +1285,7 @@
   1.164  
   1.165    switch (transition) {
   1.166      case GST_STATE_CHANGE_NULL_TO_READY:
   1.167 +	g_debug ("NULL_TO_READY");
   1.168        gst_nuv_demux_reset (GST_NUV_DEMUX (element));
   1.169        gst_nuv_demux_destoy_src_pad (GST_NUV_DEMUX (element));
   1.170        break;
   1.171 @@ -1292,6 +1300,7 @@
   1.172  
   1.173    switch (transition) {
   1.174      case GST_STATE_CHANGE_READY_TO_NULL:
   1.175 +	g_debug ("READY_TO_NULL");
   1.176        gst_nuv_demux_reset (GST_NUV_DEMUX (element));
   1.177        gst_nuv_demux_destoy_src_pad (GST_NUV_DEMUX (element));
   1.178        break;