mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	gst-source: avoid some memory leaks
This commit is contained in:
		
							parent
							
								
									108a42c6b3
								
							
						
					
					
						commit
						c6079cf7d2
					
				
					 2 changed files with 41 additions and 16 deletions
				
			
		| 
						 | 
					@ -752,10 +752,9 @@ gst_pinos_src_create (GstPushSrc * psrc, GstBuffer ** buffer)
 | 
				
			||||||
    if (pinossrc->current != NULL)
 | 
					    if (pinossrc->current != NULL)
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  pinos_main_loop_unlock (pinossrc->loop);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  *buffer = pinossrc->current;
 | 
					  *buffer = pinossrc->current;
 | 
				
			||||||
  pinossrc->current = NULL;
 | 
					  pinossrc->current = NULL;
 | 
				
			||||||
 | 
					  pinos_main_loop_unlock (pinossrc->loop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return GST_FLOW_OK;
 | 
					  return GST_FLOW_OK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -787,9 +786,12 @@ gst_pinos_src_stop (GstBaseSrc * basesrc)
 | 
				
			||||||
  GstPinosSrc *pinossrc;
 | 
					  GstPinosSrc *pinossrc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pinossrc = GST_PINOS_SRC (basesrc);
 | 
					  pinossrc = GST_PINOS_SRC (basesrc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pinos_main_loop_lock (pinossrc->loop);
 | 
				
			||||||
  if (pinossrc->current)
 | 
					  if (pinossrc->current)
 | 
				
			||||||
    gst_buffer_unref (pinossrc->current);
 | 
					    gst_buffer_unref (pinossrc->current);
 | 
				
			||||||
  pinossrc->current = NULL;
 | 
					  pinossrc->current = NULL;
 | 
				
			||||||
 | 
					  pinos_main_loop_unlock (pinossrc->loop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return TRUE;
 | 
					  return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -120,6 +120,8 @@ setup_pipeline (PinosGstSource *source, GError **error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  priv->pipeline = gst_pipeline_new (NULL);
 | 
					  priv->pipeline = gst_pipeline_new (NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  g_debug ("gst-source %p: setup pipeline", source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gst_bin_add (GST_BIN (priv->pipeline), priv->element);
 | 
					  gst_bin_add (GST_BIN (priv->pipeline), priv->element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  priv->filter = gst_element_factory_make ("capsfilter", NULL);
 | 
					  priv->filter = gst_element_factory_make ("capsfilter", NULL);
 | 
				
			||||||
| 
						 | 
					@ -151,18 +153,6 @@ setup_pipeline (PinosGstSource *source, GError **error)
 | 
				
			||||||
  return TRUE;
 | 
					  return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
destroy_pipeline (PinosGstSource *source)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  PinosGstSourcePrivate *priv = source->priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (priv->pipeline) {
 | 
					 | 
				
			||||||
    gst_element_set_state (priv->pipeline, GST_STATE_NULL);
 | 
					 | 
				
			||||||
    gst_object_unref (priv->pipeline);
 | 
					 | 
				
			||||||
    priv->pipeline = NULL;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
start_pipeline (PinosGstSource *source, GError **error)
 | 
					start_pipeline (PinosGstSource *source, GError **error)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -174,6 +164,8 @@ start_pipeline (PinosGstSource *source, GError **error)
 | 
				
			||||||
  gint port;
 | 
					  gint port;
 | 
				
			||||||
  GstStateChangeReturn ret;
 | 
					  GstStateChangeReturn ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  g_debug ("gst-source %p: starting pipeline", source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ret = gst_element_set_state (priv->pipeline, GST_STATE_PAUSED);
 | 
					  ret = gst_element_set_state (priv->pipeline, GST_STATE_PAUSED);
 | 
				
			||||||
  if (ret == GST_STATE_CHANGE_FAILURE)
 | 
					  if (ret == GST_STATE_CHANGE_FAILURE)
 | 
				
			||||||
    goto paused_failed;
 | 
					    goto paused_failed;
 | 
				
			||||||
| 
						 | 
					@ -185,7 +177,7 @@ start_pipeline (PinosGstSource *source, GError **error)
 | 
				
			||||||
  query = gst_query_new_caps (NULL);
 | 
					  query = gst_query_new_caps (NULL);
 | 
				
			||||||
  gst_element_query (priv->element, query);
 | 
					  gst_element_query (priv->element, query);
 | 
				
			||||||
  gst_query_parse_caps_result (query, &res);
 | 
					  gst_query_parse_caps_result (query, &res);
 | 
				
			||||||
  priv->possible_formats = gst_caps_ref (res);
 | 
					  gst_caps_replace (&priv->possible_formats, res);
 | 
				
			||||||
  gst_query_unref (query);
 | 
					  gst_query_unref (query);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  clock = gst_pipeline_get_clock (GST_PIPELINE (priv->pipeline));
 | 
					  clock = gst_pipeline_get_clock (GST_PIPELINE (priv->pipeline));
 | 
				
			||||||
| 
						 | 
					@ -219,12 +211,34 @@ paused_failed:
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					stop_pipeline (PinosGstSource *source)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  PinosGstSourcePrivate *priv = source->priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  g_debug ("gst-source %p: stopping pipeline", source);
 | 
				
			||||||
 | 
					  gst_element_set_state (priv->pipeline, GST_STATE_NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					destroy_pipeline (PinosGstSource *source)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  PinosGstSourcePrivate *priv = source->priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  g_debug ("gst-source %p: destroy pipeline", source);
 | 
				
			||||||
 | 
					  stop_pipeline (source);
 | 
				
			||||||
 | 
					  g_clear_object (&priv->pipeline);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
set_state (PinosSource      *source,
 | 
					set_state (PinosSource      *source,
 | 
				
			||||||
           PinosSourceState  state)
 | 
					           PinosSourceState  state)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  PinosGstSourcePrivate *priv = PINOS_GST_SOURCE (source)->priv;
 | 
					  PinosGstSourcePrivate *priv = PINOS_GST_SOURCE (source)->priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  g_debug ("gst-source %p: set state %d", source, state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (state) {
 | 
					  switch (state) {
 | 
				
			||||||
    case PINOS_SOURCE_STATE_SUSPENDED:
 | 
					    case PINOS_SOURCE_STATE_SUSPENDED:
 | 
				
			||||||
      gst_element_set_state (priv->pipeline, GST_STATE_NULL);
 | 
					      gst_element_set_state (priv->pipeline, GST_STATE_NULL);
 | 
				
			||||||
| 
						 | 
					@ -406,7 +420,7 @@ create_source_output (PinosSource     *source,
 | 
				
			||||||
                                        prefix,
 | 
					                                        prefix,
 | 
				
			||||||
                                        error);
 | 
					                                        error);
 | 
				
			||||||
  if (output == NULL)
 | 
					  if (output == NULL)
 | 
				
			||||||
    return NULL;
 | 
					    goto no_output;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  g_signal_connect (output,
 | 
					  g_signal_connect (output,
 | 
				
			||||||
                    "notify::socket",
 | 
					                    "notify::socket",
 | 
				
			||||||
| 
						 | 
					@ -416,6 +430,14 @@ create_source_output (PinosSource     *source,
 | 
				
			||||||
  priv->n_outputs++;
 | 
					  priv->n_outputs++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return output;
 | 
					  return output;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* ERRORS */
 | 
				
			||||||
 | 
					no_output:
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (priv->n_outputs == 0)
 | 
				
			||||||
 | 
					       stop_pipeline (s);
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
| 
						 | 
					@ -491,6 +513,7 @@ source_finalize (GObject * object)
 | 
				
			||||||
  PinosGstSourcePrivate *priv = source->priv;
 | 
					  PinosGstSourcePrivate *priv = source->priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  destroy_pipeline (source);
 | 
					  destroy_pipeline (source);
 | 
				
			||||||
 | 
					  g_clear_pointer (&priv->possible_formats, gst_caps_unref);
 | 
				
			||||||
  pinos_properties_free (priv->props);
 | 
					  pinos_properties_free (priv->props);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  G_OBJECT_CLASS (pinos_gst_source_parent_class)->finalize (object);
 | 
					  G_OBJECT_CLASS (pinos_gst_source_parent_class)->finalize (object);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue