gmyth-stream/gmemcoder/src/gmencoder.c
branchtrunk
changeset 647 ceb89d5fc325
parent 617 a76074f53743
child 654 76b9c97faada
     1.1 --- a/gmyth-stream/gmemcoder/src/gmencoder.c	Tue May 01 23:02:19 2007 +0100
     1.2 +++ b/gmyth-stream/gmemcoder/src/gmencoder.c	Mon May 14 19:32:44 2007 +0100
     1.3 @@ -14,6 +14,7 @@
     1.4  #define G_MENCODER_GET_PRIVATE(obj) \
     1.5      (G_TYPE_INSTANCE_GET_PRIVATE ((obj), G_TYPE_MENCODER, GMencoderPrivate))
     1.6  
     1.7 +//#define SUPPORT_MULT_INPUT  0
     1.8  
     1.9  typedef struct _GMencoderPrivate GMencoderPrivate;
    1.10  typedef struct _SetupInfo SetupInfo;
    1.11 @@ -44,6 +45,7 @@
    1.12      GstClockTime videot;
    1.13      GstClockTime audiot;
    1.14      gint fd;
    1.15 +	gint sources;
    1.16  };
    1.17  
    1.18  enum {
    1.19 @@ -473,6 +475,10 @@
    1.20          return;
    1.21      }
    1.22  
    1.23 +    _close_output (self);
    1.24 +    _open_output (self, out_uri);
    1.25 +
    1.26 +	priv->sources = 0;
    1.27      priv->pipe = _create_pipeline (self,
    1.28              video_encode,
    1.29              mux_name,
    1.30 @@ -485,8 +491,6 @@
    1.31              audio_encode_prop,
    1.32              audio_rate);
    1.33  
    1.34 -    _close_output (self);
    1.35 -    _open_output (self, out_uri);
    1.36  }
    1.37  
    1.38  
    1.39 @@ -494,27 +498,40 @@
    1.40  g_mencoder_append_uri (GMencoder *self,
    1.41                       const gchar* uri)
    1.42  {
    1.43 -    GstElement *ap;
    1.44 -    GstElement *vp;
    1.45      GstPad *pad_src;
    1.46      GstPad *pad_sink;
    1.47      GstElement *src;
    1.48      GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (self);
    1.49      gboolean ret = FALSE;
    1.50 +    GstElement *ap = NULL;
    1.51 +    GstElement *vp = NULL;
    1.52 +
    1.53  
    1.54      g_return_val_if_fail (priv->pipe != NULL, FALSE);
    1.55      g_return_val_if_fail (priv->ready == FALSE, FALSE);
    1.56  
    1.57 +#ifndef SUPPORT_MULT_INPUT
    1.58 +	g_return_val_if_fail (priv->sources < 1, FALSE);
    1.59 +#endif
    1.60 +
    1.61      src = _create_source (uri);
    1.62      if (src == NULL) 
    1.63          return FALSE;
    1.64  
    1.65      gst_bin_add (GST_BIN (priv->pipe), src);
    1.66  
    1.67 +#ifdef SUPPORT_MULT_INPUT
    1.68      ap = gst_bin_get_by_name (GST_BIN (priv->pipe), "ap");
    1.69      vp = gst_bin_get_by_name (GST_BIN (priv->pipe), "vp");
    1.70 -    if ((vp == NULL)  || (ap == NULL))
    1.71 +#else
    1.72 +    ap = gst_bin_get_by_name (GST_BIN (priv->pipe), "abin");
    1.73 +    vp = gst_bin_get_by_name (GST_BIN (priv->pipe), "vbin");
    1.74 +#endif
    1.75 +
    1.76 +    if ((vp == NULL)  || (ap == NULL)) {
    1.77 +		g_warning  ("Fail to get output bin");
    1.78          goto error;
    1.79 +	}
    1.80  
    1.81      pad_src = gst_element_get_pad (src, "src_audio");
    1.82      pad_sink = gst_element_get_compatible_pad (ap, 
    1.83 @@ -544,7 +561,9 @@
    1.84          goto error;
    1.85      }
    1.86  
    1.87 +	priv->sources++;
    1.88      ret = TRUE;
    1.89 +	g_debug ("Uri: [%s] OK ", uri);
    1.90  error:
    1.91  
    1.92      if ((src != NULL) && (ret == FALSE)) {
    1.93 @@ -602,6 +621,7 @@
    1.94  
    1.95      GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (self);
    1.96  
    1.97 +	g_debug ("g_mencoder_close_stream");
    1.98      if (priv->pipe != NULL) { 
    1.99          gst_element_set_state (priv->pipe, GST_STATE_NULL);
   1.100          gst_object_unref (priv->pipe);
   1.101 @@ -613,22 +633,6 @@
   1.102      priv->ready = FALSE;
   1.103  }
   1.104  
   1.105 -static void
   1.106 -_sink_handoff_cb (GstElement* object,
   1.107 -                  GstBuffer* buf,
   1.108 -                  GstPad* pad,
   1.109 -                  gpointer user_data)
   1.110 -{
   1.111 -    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (user_data);
   1.112 -    gint size = 0;
   1.113 -
   1.114 -    size = write (priv->fd, GST_BUFFER_DATA (buf),  GST_BUFFER_SIZE (buf));
   1.115 -    if (size == -1) {
   1.116 -        g_signal_emit (user_data, g_mencoder_signals[ERROR], 0, "Fail to write output");
   1.117 -    }
   1.118 -}
   1.119 -
   1.120 -
   1.121  static GstElement*
   1.122  _create_pipeline (GMencoder *self,
   1.123                    const gchar* video_encode,
   1.124 @@ -648,27 +652,34 @@
   1.125      GstElement *mux = NULL;
   1.126      GstElement *abin = NULL;
   1.127      GstElement *vbin = NULL;    
   1.128 +    GstPad *aux_pad = NULL;
   1.129 +    GstPad *mux_pad = NULL;
   1.130 +#ifdef SUPPORT_MULT_INPUT
   1.131      GstElement *ap = NULL;
   1.132      GstElement *vp = NULL;    
   1.133 -    GstPad *aux_pad = NULL;
   1.134 -    GstPad *mux_pad = NULL;
   1.135 +#endif
   1.136 +    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (self);
   1.137  
   1.138  	pipe = gst_pipeline_new ("pipe");
   1.139  
   1.140 -    ap = gst_element_factory_make ("concatmux", "ap");
   1.141 +#ifdef SUPPORT_MULT_INPUT			
   1.142 +	ap = gst_element_factory_make ("concatmux", "ap");
   1.143      vp = gst_element_factory_make ("concatmux", "vp");
   1.144 +	gst_bin_add_many (GST_BIN (pipe), ap, vp, NULL);
   1.145 +#endif
   1.146  
   1.147      mux = gst_element_factory_make ((mux_name ? mux_name : "ffmux_mpeg"), "mux");
   1.148      if (mux == NULL)
   1.149          goto error;
   1.150  
   1.151 -    sink = gst_element_factory_make ("fakesink", "sink");
   1.152 +
   1.153 +    sink = gst_element_factory_make ("fdsink", "sink");
   1.154      if (sink == NULL)
   1.155          goto error;
   1.156  
   1.157      g_object_set (G_OBJECT(sink), 
   1.158 -            "sync", FALSE,
   1.159 -            "signal-handoffs", TRUE, NULL);
   1.160 +			"fd", priv->fd,
   1.161 +            NULL);
   1.162  
   1.163      abin = _create_audio_bin (audio_encode, audio_encode_prop, audio_rate);
   1.164      if (abin == NULL)
   1.165 @@ -679,16 +690,19 @@
   1.166          goto error;
   1.167  
   1.168  	// Finish Pipe
   1.169 -    gst_bin_add_many (GST_BIN (pipe), ap, abin, vp, vbin, mux, sink, NULL);
   1.170 +    gst_bin_add_many (GST_BIN (pipe), abin, vbin, mux, sink, NULL);
   1.171  
   1.172 -    if (gst_element_link (ap, abin) == FALSE) {
   1.173 -        g_warning ("Fail to link concat and abin");
   1.174 -        goto error;
   1.175 -    }
   1.176  
   1.177 -    if (gst_element_link (vp, vbin) == FALSE) {
   1.178 -        g_warning ("Fail to link concat and vbin");
   1.179 -    }
   1.180 +#ifdef SUPPORT_MULT_INPUT	
   1.181 +	if (gst_element_link (ap, abin) == FALSE) {
   1.182 +		g_warning ("Fail to link concat and abin");
   1.183 +		goto error;
   1.184 +	}
   1.185 +
   1.186 +	if (gst_element_link (vp, vbin) == FALSE) {
   1.187 +		g_warning ("Fail to link concat and vbin");
   1.188 +	}
   1.189 +#endif	
   1.190  
   1.191      //Link bins with mux
   1.192      aux_pad = gst_element_get_pad (abin, "src");
   1.193 @@ -725,11 +739,6 @@
   1.194      //Link mux with sink
   1.195      gst_element_link (mux, sink);
   1.196  
   1.197 -    g_signal_connect (G_OBJECT (sink),
   1.198 -				"handoff",
   1.199 -				G_CALLBACK (_sink_handoff_cb),
   1.200 -				self);
   1.201 -
   1.202  	bus = gst_pipeline_get_bus (GST_PIPELINE (pipe));
   1.203  	gst_bus_add_watch (bus, _pipeline_bus_cb, self);
   1.204  	gst_object_unref (bus);
   1.205 @@ -791,8 +800,9 @@
   1.206  
   1.207      bsrc = gst_bin_new (NULL);
   1.208  
   1.209 -	src = gst_element_factory_make ("gnomevfssrc", "src");
   1.210 -    g_object_set (G_OBJECT (src), "location", uri, NULL);
   1.211 +	//src = gst_element_factory_make ("gnomevfssrc", "src");
   1.212 +    //g_object_set (G_OBJECT (src), "location", uri, NULL);
   1.213 +	src = gst_element_make_from_uri (GST_URI_SRC, uri, "src");
   1.214  	if (src == NULL) 
   1.215  		goto error;
   1.216  
   1.217 @@ -948,6 +958,7 @@
   1.218  
   1.219  	caps = gst_pad_get_caps (pad);
   1.220  	str_caps = gst_caps_to_string (caps);
   1.221 +	g_debug ("New pad : %s", str_caps);
   1.222  	if (strstr (str_caps, "audio") != NULL) {
   1.223          sink_element = gst_bin_get_by_name (GST_BIN (user_data), "aqueue");
   1.224  	} else if (strstr (str_caps, "video") != NULL) {