mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	pipewiresrc: fix refcounting of buffers
This commit is contained in:
		
							parent
							
								
									17cc9d2039
								
							
						
					
					
						commit
						21a79241ed
					
				
					 1 changed files with 17 additions and 10 deletions
				
			
		| 
						 | 
					@ -215,6 +215,7 @@ gst_pipewire_src_finalize (GObject * object)
 | 
				
			||||||
    gst_object_unref (pwsrc->clock);
 | 
					    gst_object_unref (pwsrc->clock);
 | 
				
			||||||
  g_free (pwsrc->path);
 | 
					  g_free (pwsrc->path);
 | 
				
			||||||
  g_free (pwsrc->client_name);
 | 
					  g_free (pwsrc->client_name);
 | 
				
			||||||
 | 
					  g_object_unref(pwsrc->pool);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  G_OBJECT_CLASS (parent_class)->finalize (object);
 | 
					  G_OBJECT_CLASS (parent_class)->finalize (object);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -372,7 +373,7 @@ on_remove_buffer (void *_data, struct pw_buffer *b)
 | 
				
			||||||
  GstBuffer *buf = data->buf;
 | 
					  GstBuffer *buf = data->buf;
 | 
				
			||||||
  GList *walk;
 | 
					  GList *walk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  GST_LOG_OBJECT (pwsrc, "remove buffer");
 | 
					  GST_LOG_OBJECT (pwsrc, "remove buffer %p", buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  GST_MINI_OBJECT_CAST (buf)->dispose = NULL;
 | 
					  GST_MINI_OBJECT_CAST (buf)->dispose = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -386,6 +387,7 @@ on_remove_buffer (void *_data, struct pw_buffer *b)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    walk = next;
 | 
					    walk = next;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  gst_buffer_unref (buf);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					@ -426,11 +428,8 @@ on_process (void *_data)
 | 
				
			||||||
    mem->offset += data->offset;
 | 
					    mem->offset += data->offset;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pwsrc->always_copy)
 | 
					 | 
				
			||||||
    buf = gst_buffer_copy_deep (buf);
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    gst_buffer_ref (buf);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  gst_buffer_ref (buf);
 | 
				
			||||||
  g_queue_push_tail (&pwsrc->queue, buf);
 | 
					  g_queue_push_tail (&pwsrc->queue, buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pw_thread_loop_signal (pwsrc->main_loop, FALSE);
 | 
					  pw_thread_loop_signal (pwsrc->main_loop, FALSE);
 | 
				
			||||||
| 
						 | 
					@ -831,6 +830,7 @@ gst_pipewire_src_create (GstPushSrc * psrc, GstBuffer ** buffer)
 | 
				
			||||||
  GstPipeWireSrc *pwsrc;
 | 
					  GstPipeWireSrc *pwsrc;
 | 
				
			||||||
  GstClockTime pts, dts, base_time;
 | 
					  GstClockTime pts, dts, base_time;
 | 
				
			||||||
  const char *error = NULL;
 | 
					  const char *error = NULL;
 | 
				
			||||||
 | 
					  GstBuffer *buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pwsrc = GST_PIPEWIRE_SRC (psrc);
 | 
					  pwsrc = GST_PIPEWIRE_SRC (psrc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -854,15 +854,24 @@ gst_pipewire_src_create (GstPushSrc * psrc, GstBuffer ** buffer)
 | 
				
			||||||
    if (state != PW_STREAM_STATE_STREAMING)
 | 
					    if (state != PW_STREAM_STATE_STREAMING)
 | 
				
			||||||
      goto streaming_stopped;
 | 
					      goto streaming_stopped;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *buffer = g_queue_pop_head (&pwsrc->queue);
 | 
					    buf = g_queue_pop_head (&pwsrc->queue);
 | 
				
			||||||
    GST_DEBUG ("popped buffer %p", *buffer);
 | 
					    GST_DEBUG ("popped buffer %p", buf);
 | 
				
			||||||
    if (*buffer != NULL)
 | 
					    if (buf != NULL)
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pw_thread_loop_wait (pwsrc->main_loop);
 | 
					    pw_thread_loop_wait (pwsrc->main_loop);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  pw_thread_loop_unlock (pwsrc->main_loop);
 | 
					  pw_thread_loop_unlock (pwsrc->main_loop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  gst_buffer_unref (buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (pwsrc->always_copy) {
 | 
				
			||||||
 | 
					    *buffer = gst_buffer_copy_deep (buf);
 | 
				
			||||||
 | 
					    gst_buffer_unref (buf);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    *buffer = buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pwsrc->is_live)
 | 
					  if (pwsrc->is_live)
 | 
				
			||||||
    base_time = GST_ELEMENT_CAST (psrc)->base_time;
 | 
					    base_time = GST_ELEMENT_CAST (psrc)->base_time;
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
| 
						 | 
					@ -884,8 +893,6 @@ gst_pipewire_src_create (GstPushSrc * psrc, GstBuffer ** buffer)
 | 
				
			||||||
  GST_BUFFER_PTS (*buffer) = pts;
 | 
					  GST_BUFFER_PTS (*buffer) = pts;
 | 
				
			||||||
  GST_BUFFER_DTS (*buffer) = dts;
 | 
					  GST_BUFFER_DTS (*buffer) = dts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  buffer_recycle (GST_MINI_OBJECT_CAST (*buffer));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return GST_FLOW_OK;
 | 
					  return GST_FLOW_OK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
not_negotiated:
 | 
					not_negotiated:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue