gstreamer/plugins/elements/gstdataqueue.c

662 lines
19 KiB
C
Raw Normal View History

libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
/* GStreamer
* Copyright (C) 2006 Edward Hervey <edward@fluendo.com>
*
* gstdataqueue.c:
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/**
* SECTION:gstdataqueue
* @short_description: Threadsafe queueing object
*
* #GstDataQueue is an object that handles threadsafe queueing of objects. It
* also provides size-related functionality. This object should be used for
* any #GstElement that wishes to provide some sort of queueing functionality.
*
* Since: 0.10.11
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
*/
#include <gst/gst.h>
#include "string.h"
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
#include "gstdataqueue.h"
#include "gst/glib-compat-private.h"
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
GST_DEBUG_CATEGORY_STATIC (data_queue_debug);
#define GST_CAT_DEFAULT (data_queue_debug)
GST_DEBUG_CATEGORY_STATIC (data_queue_dataflow);
/* Queue signals and args */
enum
{
SIGNAL_EMPTY,
SIGNAL_FULL,
LAST_SIGNAL
};
enum
{
ARG_0,
ARG_CUR_LEVEL_VISIBLE,
ARG_CUR_LEVEL_BYTES,
ARG_CUR_LEVEL_TIME
/* FILL ME */
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
};
#define GST_DATA_QUEUE_MUTEX_LOCK(q) G_STMT_START { \
GST_CAT_LOG (data_queue_dataflow, \
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
"locking qlock from thread %p", \
g_thread_self ()); \
2012-01-19 08:27:04 +00:00
g_mutex_lock (&q->qlock); \
GST_CAT_LOG (data_queue_dataflow, \
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
"locked qlock from thread %p", \
g_thread_self ()); \
} G_STMT_END
#define GST_DATA_QUEUE_MUTEX_LOCK_CHECK(q, label) G_STMT_START { \
GST_DATA_QUEUE_MUTEX_LOCK (q); \
if (q->flushing) \
goto label; \
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
} G_STMT_END
#define GST_DATA_QUEUE_MUTEX_UNLOCK(q) G_STMT_START { \
GST_CAT_LOG (data_queue_dataflow, \
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
"unlocking qlock from thread %p", \
g_thread_self ()); \
2012-01-19 08:27:04 +00:00
g_mutex_unlock (&q->qlock); \
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
} G_STMT_END
#define STATUS(q, msg) \
GST_CAT_LOG (data_queue_dataflow, \
"queue:%p " msg ": %u visible items, %u " \
"bytes, %"G_GUINT64_FORMAT \
" ns, %u elements", \
queue, \
q->cur_level.visible, \
q->cur_level.bytes, \
q->cur_level.time, \
q->queue->length)
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
static void gst_data_queue_finalize (GObject * object);
static void gst_data_queue_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec);
static void gst_data_queue_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec);
static GObjectClass *parent_class = NULL;
static guint gst_data_queue_signals[LAST_SIGNAL] = { 0 };
2009-04-04 08:59:39 +00:00
#define _do_init \
{ \
GST_DEBUG_CATEGORY_INIT (data_queue_debug, "dataqueue", 0, \
"data queue object"); \
GST_DEBUG_CATEGORY_INIT (data_queue_dataflow, "data_queue_dataflow", 0, \
"dataflow inside the data queue object"); \
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
}
2009-04-04 08:59:39 +00:00
G_DEFINE_TYPE_WITH_CODE (GstDataQueue, gst_data_queue, G_TYPE_OBJECT, _do_init);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
static void
gst_data_queue_class_init (GstDataQueueClass * klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
gobject_class->set_property = gst_data_queue_set_property;
gobject_class->get_property = gst_data_queue_get_property;
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
/* signals */
/**
* GstDataQueue::empty:
* @queue: the queue instance
*
* Reports that the queue became empty (empty).
* A queue is empty if the total amount of visible items inside it (num-visible, time,
* size) is lower than the boundary values which can be set through the GObject
* properties.
*/
gst_data_queue_signals[SIGNAL_EMPTY] =
g_signal_new ("empty", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GstDataQueueClass, empty), NULL, NULL,
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
/**
* GstDataQueue::full:
* @queue: the queue instance
*
* Reports that the queue became full (full).
* A queue is full if the total amount of data inside it (num-visible, time,
* size) is higher than the boundary values which can be set through the GObject
* properties.
*/
gst_data_queue_signals[SIGNAL_FULL] =
g_signal_new ("full", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GstDataQueueClass, full), NULL, NULL,
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
/* properties */
g_object_class_install_property (gobject_class, ARG_CUR_LEVEL_BYTES,
g_param_spec_uint ("current-level-bytes", "Current level (kB)",
"Current amount of data in the queue (bytes)",
Define G_PARAM_STATIC_STRINGS if it's undefined (GLib < 2.13.0) and use it everywhere for GParamSpecs that use static... Original commit message from CVS: * docs/pwg/advanced-dparams.xml: * docs/pwg/building-props.xml: * docs/pwg/other-source.xml: * gst/glib-compat.h: * gst/gstbin.c: (gst_bin_class_init): * gst/gstclock.c: (gst_clock_class_init): * gst/gstindex.c: (gst_index_class_init): * gst/gstobject.c: (gst_object_class_init): * gst/gstpad.c: (gst_pad_class_init): * gst/gstpipeline.c: (gst_pipeline_class_init): * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init): * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init): * libs/gst/base/gstbasetransform.c: (gst_base_transform_class_init): * libs/gst/base/gstdataqueue.c: (gst_data_queue_class_init): * libs/gst/check/gstcheck.c: (_gst_check_fault_handler_restore), (_gst_check_fault_handler_sighandler), (_gst_check_fault_handler_setup), (gst_check_init): * libs/gst/controller/gstcontroller.c: (_gst_controller_class_init): * libs/gst/controller/gstlfocontrolsource.c: (gst_lfo_control_source_class_init): * libs/gst/net/gstnetclientclock.c: (gst_net_client_clock_class_init): * libs/gst/net/gstnettimeprovider.c: (gst_net_time_provider_class_init): * plugins/elements/gstcapsfilter.c: (gst_capsfilter_class_init): * plugins/elements/gstfakesink.c: (gst_fake_sink_class_init): * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init): * plugins/elements/gstfdsink.c: (gst_fd_sink_class_init): * plugins/elements/gstfdsrc.c: (gst_fd_src_class_init): * plugins/elements/gstfilesink.c: (gst_file_sink_class_init): * plugins/elements/gstfilesrc.c: (gst_file_src_class_init): * plugins/elements/gstidentity.c: (gst_identity_class_init): * plugins/elements/gstmultiqueue.c: (gst_multi_queue_class_init): * plugins/elements/gstqueue.c: (gst_queue_class_init): * plugins/elements/gsttee.c: (gst_tee_class_init): * plugins/elements/gsttypefindelement.c: (gst_type_find_element_class_init): * plugins/indexers/gstfileindex.c: (gst_file_index_class_init): Define G_PARAM_STATIC_STRINGS if it's undefined (GLib < 2.13.0) and use it everywhere for GParamSpecs that use static strings (i.e. all). This gives us less memory usage, fewer allocations and thus less memory defragmentation. Fixes bug #523806.
2008-03-22 14:56:17 +00:00
0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
g_object_class_install_property (gobject_class, ARG_CUR_LEVEL_VISIBLE,
g_param_spec_uint ("current-level-visible",
"Current level (visible items)",
"Current number of visible items in the queue", 0, G_MAXUINT, 0,
Define G_PARAM_STATIC_STRINGS if it's undefined (GLib < 2.13.0) and use it everywhere for GParamSpecs that use static... Original commit message from CVS: * docs/pwg/advanced-dparams.xml: * docs/pwg/building-props.xml: * docs/pwg/other-source.xml: * gst/glib-compat.h: * gst/gstbin.c: (gst_bin_class_init): * gst/gstclock.c: (gst_clock_class_init): * gst/gstindex.c: (gst_index_class_init): * gst/gstobject.c: (gst_object_class_init): * gst/gstpad.c: (gst_pad_class_init): * gst/gstpipeline.c: (gst_pipeline_class_init): * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init): * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init): * libs/gst/base/gstbasetransform.c: (gst_base_transform_class_init): * libs/gst/base/gstdataqueue.c: (gst_data_queue_class_init): * libs/gst/check/gstcheck.c: (_gst_check_fault_handler_restore), (_gst_check_fault_handler_sighandler), (_gst_check_fault_handler_setup), (gst_check_init): * libs/gst/controller/gstcontroller.c: (_gst_controller_class_init): * libs/gst/controller/gstlfocontrolsource.c: (gst_lfo_control_source_class_init): * libs/gst/net/gstnetclientclock.c: (gst_net_client_clock_class_init): * libs/gst/net/gstnettimeprovider.c: (gst_net_time_provider_class_init): * plugins/elements/gstcapsfilter.c: (gst_capsfilter_class_init): * plugins/elements/gstfakesink.c: (gst_fake_sink_class_init): * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init): * plugins/elements/gstfdsink.c: (gst_fd_sink_class_init): * plugins/elements/gstfdsrc.c: (gst_fd_src_class_init): * plugins/elements/gstfilesink.c: (gst_file_sink_class_init): * plugins/elements/gstfilesrc.c: (gst_file_src_class_init): * plugins/elements/gstidentity.c: (gst_identity_class_init): * plugins/elements/gstmultiqueue.c: (gst_multi_queue_class_init): * plugins/elements/gstqueue.c: (gst_queue_class_init): * plugins/elements/gsttee.c: (gst_tee_class_init): * plugins/elements/gsttypefindelement.c: (gst_type_find_element_class_init): * plugins/indexers/gstfileindex.c: (gst_file_index_class_init): Define G_PARAM_STATIC_STRINGS if it's undefined (GLib < 2.13.0) and use it everywhere for GParamSpecs that use static strings (i.e. all). This gives us less memory usage, fewer allocations and thus less memory defragmentation. Fixes bug #523806.
2008-03-22 14:56:17 +00:00
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
g_object_class_install_property (gobject_class, ARG_CUR_LEVEL_TIME,
g_param_spec_uint64 ("current-level-time", "Current level (ns)",
"Current amount of data in the queue (in ns)", 0, G_MAXUINT64, 0,
Define G_PARAM_STATIC_STRINGS if it's undefined (GLib < 2.13.0) and use it everywhere for GParamSpecs that use static... Original commit message from CVS: * docs/pwg/advanced-dparams.xml: * docs/pwg/building-props.xml: * docs/pwg/other-source.xml: * gst/glib-compat.h: * gst/gstbin.c: (gst_bin_class_init): * gst/gstclock.c: (gst_clock_class_init): * gst/gstindex.c: (gst_index_class_init): * gst/gstobject.c: (gst_object_class_init): * gst/gstpad.c: (gst_pad_class_init): * gst/gstpipeline.c: (gst_pipeline_class_init): * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init): * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init): * libs/gst/base/gstbasetransform.c: (gst_base_transform_class_init): * libs/gst/base/gstdataqueue.c: (gst_data_queue_class_init): * libs/gst/check/gstcheck.c: (_gst_check_fault_handler_restore), (_gst_check_fault_handler_sighandler), (_gst_check_fault_handler_setup), (gst_check_init): * libs/gst/controller/gstcontroller.c: (_gst_controller_class_init): * libs/gst/controller/gstlfocontrolsource.c: (gst_lfo_control_source_class_init): * libs/gst/net/gstnetclientclock.c: (gst_net_client_clock_class_init): * libs/gst/net/gstnettimeprovider.c: (gst_net_time_provider_class_init): * plugins/elements/gstcapsfilter.c: (gst_capsfilter_class_init): * plugins/elements/gstfakesink.c: (gst_fake_sink_class_init): * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init): * plugins/elements/gstfdsink.c: (gst_fd_sink_class_init): * plugins/elements/gstfdsrc.c: (gst_fd_src_class_init): * plugins/elements/gstfilesink.c: (gst_file_sink_class_init): * plugins/elements/gstfilesrc.c: (gst_file_src_class_init): * plugins/elements/gstidentity.c: (gst_identity_class_init): * plugins/elements/gstmultiqueue.c: (gst_multi_queue_class_init): * plugins/elements/gstqueue.c: (gst_queue_class_init): * plugins/elements/gsttee.c: (gst_tee_class_init): * plugins/elements/gsttypefindelement.c: (gst_type_find_element_class_init): * plugins/indexers/gstfileindex.c: (gst_file_index_class_init): Define G_PARAM_STATIC_STRINGS if it's undefined (GLib < 2.13.0) and use it everywhere for GParamSpecs that use static strings (i.e. all). This gives us less memory usage, fewer allocations and thus less memory defragmentation. Fixes bug #523806.
2008-03-22 14:56:17 +00:00
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
gobject_class->finalize = gst_data_queue_finalize;
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
}
static void
gst_data_queue_init (GstDataQueue * queue)
{
queue->cur_level.visible = 0; /* no content */
queue->cur_level.bytes = 0; /* no content */
queue->cur_level.time = 0; /* no content */
queue->checkfull = NULL;
2012-01-19 08:27:04 +00:00
g_mutex_init (&queue->qlock);
g_cond_init (&queue->item_add);
g_cond_init (&queue->item_del);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
queue->queue = g_queue_new ();
GST_DEBUG ("initialized queue's not_empty & not_full conditions");
}
/**
* gst_data_queue_new_full:
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
* @checkfull: the callback used to tell if the element considers the queue full
* or not.
* @fullcallback: the callback which will be called when the queue is considered full.
* @emptycallback: the callback which will be called when the queue is considered empty.
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
* @checkdata: a #gpointer that will be given in the @checkfull callback.
*
* Creates a new #GstDataQueue. The difference with @gst_data_queue_new is that it will
* not emit the 'full' and 'empty' signals, but instead calling directly @fullcallback
* or @emptycallback.
*
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
* Returns: a new #GstDataQueue.
*
* Since: 0.10.26
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
*/
GstDataQueue *
gst_data_queue_new_full (GstDataQueueCheckFullFunction checkfull,
GstDataQueueFullCallback fullcallback,
GstDataQueueEmptyCallback emptycallback, gpointer checkdata)
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
{
GstDataQueue *ret;
g_return_val_if_fail (checkfull != NULL, NULL);
ret = g_object_newv (GST_TYPE_DATA_QUEUE, 0, NULL);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
ret->checkfull = checkfull;
ret->checkdata = checkdata;
ret->fullcallback = fullcallback;
ret->emptycallback = emptycallback;
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
return ret;
}
/**
* gst_data_queue_new:
* @checkfull: the callback used to tell if the element considers the queue full
* or not.
* @checkdata: a #gpointer that will be given in the @checkfull callback.
*
* Returns: a new #GstDataQueue.
*/
GstDataQueue *
gst_data_queue_new (GstDataQueueCheckFullFunction checkfull, gpointer checkdata)
{
return gst_data_queue_new_full (checkfull, NULL, NULL, checkdata);
}
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
static void
gst_data_queue_cleanup (GstDataQueue * queue)
{
while (!g_queue_is_empty (queue->queue)) {
GstDataQueueItem *item = g_queue_pop_head (queue->queue);
/* Just call the destroy notify on the item */
item->destroy (item);
}
queue->cur_level.visible = 0;
queue->cur_level.bytes = 0;
queue->cur_level.time = 0;
}
/* called only once, as opposed to dispose */
static void
gst_data_queue_finalize (GObject * object)
{
GstDataQueue *queue = GST_DATA_QUEUE (object);
GST_DEBUG ("finalizing queue");
gst_data_queue_cleanup (queue);
g_queue_free (queue->queue);
GST_DEBUG ("free mutex");
2012-01-19 08:27:04 +00:00
g_mutex_clear (&queue->qlock);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
GST_DEBUG ("done free mutex");
2012-01-19 08:27:04 +00:00
g_cond_clear (&queue->item_add);
g_cond_clear (&queue->item_del);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
G_OBJECT_CLASS (parent_class)->finalize (object);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
}
static inline void
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
gst_data_queue_locked_flush (GstDataQueue * queue)
{
STATUS (queue, "before flushing");
gst_data_queue_cleanup (queue);
STATUS (queue, "after flushing");
/* we deleted something... */
if (queue->waiting_del)
2012-01-19 08:27:04 +00:00
g_cond_signal (&queue->item_del);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
}
static inline gboolean
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
gst_data_queue_locked_is_empty (GstDataQueue * queue)
{
return (queue->queue->length == 0);
}
static inline gboolean
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
gst_data_queue_locked_is_full (GstDataQueue * queue)
{
return queue->checkfull (queue, queue->cur_level.visible,
queue->cur_level.bytes, queue->cur_level.time, queue->checkdata);
}
/**
* gst_data_queue_flush:
* @queue: a #GstDataQueue.
*
2009-09-22 13:44:31 +00:00
* Flushes all the contents of the @queue. Any call to #gst_data_queue_push and
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
* #gst_data_queue_pop will be released.
* MT safe.
*
* Since: 0.10.11
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
*/
void
gst_data_queue_flush (GstDataQueue * queue)
{
GST_DEBUG ("queue:%p", queue);
GST_DATA_QUEUE_MUTEX_LOCK (queue);
gst_data_queue_locked_flush (queue);
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
}
/**
* gst_data_queue_is_empty:
* @queue: a #GstDataQueue.
*
* Queries if there are any items in the @queue.
* MT safe.
*
* Returns: #TRUE if @queue is empty.
*
* Since: 0.10.11
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
*/
gboolean
gst_data_queue_is_empty (GstDataQueue * queue)
{
gboolean res;
GST_DATA_QUEUE_MUTEX_LOCK (queue);
res = gst_data_queue_locked_is_empty (queue);
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
return res;
}
/**
* gst_data_queue_is_full:
* @queue: a #GstDataQueue.
*
* Queries if @queue is full. This check will be done using the
2009-11-27 14:39:37 +00:00
* #GstDataQueueCheckFullFunction registered with @queue.
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
* MT safe.
*
* Returns: #TRUE if @queue is full.
*
* Since: 0.10.11
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
*/
gboolean
gst_data_queue_is_full (GstDataQueue * queue)
{
gboolean res;
GST_DATA_QUEUE_MUTEX_LOCK (queue);
res = gst_data_queue_locked_is_full (queue);
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
return res;
}
/**
* gst_data_queue_set_flushing:
* @queue: a #GstDataQueue.
* @flushing: a #gboolean stating if the queue will be flushing or not.
*
* Sets the queue to flushing state if @flushing is #TRUE. If set to flushing
* state, any incoming data on the @queue will be discarded. Any call currently
* blocking on #gst_data_queue_push or #gst_data_queue_pop will return straight
* away with a return value of #FALSE. While the @queue is in flushing state,
* all calls to those two functions will return #FALSE.
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
*
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
* MT Safe.
*
* Since: 0.10.11
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
*/
void
gst_data_queue_set_flushing (GstDataQueue * queue, gboolean flushing)
{
GST_DEBUG ("queue:%p , flushing:%d", queue, flushing);
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
GST_DATA_QUEUE_MUTEX_LOCK (queue);
queue->flushing = flushing;
if (flushing) {
/* release push/pop functions */
if (queue->waiting_add)
2012-01-19 08:27:04 +00:00
g_cond_signal (&queue->item_add);
if (queue->waiting_del)
2012-01-19 08:27:04 +00:00
g_cond_signal (&queue->item_del);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
}
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
}
/**
* gst_data_queue_push:
* @queue: a #GstDataQueue.
* @item: a #GstDataQueueItem.
*
* Pushes a #GstDataQueueItem (or a structure that begins with the same fields)
* on the @queue. If the @queue is full, the call will block until space is
* available, OR the @queue is set to flushing state.
* MT safe.
*
* Note that this function has slightly different semantics than gst_pad_push()
* and gst_pad_push_event(): this function only takes ownership of @item and
* the #GstMiniObject contained in @item if the push was successful. If FALSE
* is returned, the caller is responsible for freeing @item and its contents.
*
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
* Returns: #TRUE if the @item was successfully pushed on the @queue.
*
* Since: 0.10.11
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
*/
gboolean
gst_data_queue_push (GstDataQueue * queue, GstDataQueueItem * item)
{
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
g_return_val_if_fail (GST_IS_DATA_QUEUE (queue), FALSE);
g_return_val_if_fail (item != NULL, FALSE);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
GST_DATA_QUEUE_MUTEX_LOCK_CHECK (queue, flushing);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
STATUS (queue, "before pushing");
/* We ALWAYS need to check for queue fillness */
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
if (gst_data_queue_locked_is_full (queue)) {
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
if (G_LIKELY (queue->fullcallback))
queue->fullcallback (queue, queue->checkdata);
else
g_signal_emit (queue, gst_data_queue_signals[SIGNAL_FULL], 0);
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
GST_DATA_QUEUE_MUTEX_LOCK_CHECK (queue, flushing);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
/* signal might have removed some items */
while (gst_data_queue_locked_is_full (queue)) {
queue->waiting_del = TRUE;
2012-01-19 08:27:04 +00:00
g_cond_wait (&queue->item_del, &queue->qlock);
queue->waiting_del = FALSE;
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
if (queue->flushing)
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
goto flushing;
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
}
}
g_queue_push_tail (queue->queue, item);
if (item->visible)
queue->cur_level.visible++;
queue->cur_level.bytes += item->size;
queue->cur_level.time += item->duration;
STATUS (queue, "after pushing");
if (queue->waiting_add)
2012-01-19 08:27:04 +00:00
g_cond_signal (&queue->item_add);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
return TRUE;
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
/* ERRORS */
flushing:
{
GST_DEBUG ("queue:%p, we are flushing", queue);
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
return FALSE;
}
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
}
/**
* gst_data_queue_pop:
* @queue: a #GstDataQueue.
* @item: pointer to store the returned #GstDataQueueItem.
*
* Retrieves the first @item available on the @queue. If the queue is currently
* empty, the call will block until at least one item is available, OR the
* @queue is set to the flushing state.
* MT safe.
*
* Returns: #TRUE if an @item was successfully retrieved from the @queue.
*
* Since: 0.10.11
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
*/
gboolean
gst_data_queue_pop (GstDataQueue * queue, GstDataQueueItem ** item)
{
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
g_return_val_if_fail (GST_IS_DATA_QUEUE (queue), FALSE);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
g_return_val_if_fail (item != NULL, FALSE);
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
GST_DATA_QUEUE_MUTEX_LOCK_CHECK (queue, flushing);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
STATUS (queue, "before popping");
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
if (gst_data_queue_locked_is_empty (queue)) {
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
if (G_LIKELY (queue->emptycallback))
queue->emptycallback (queue, queue->checkdata);
else
g_signal_emit (queue, gst_data_queue_signals[SIGNAL_EMPTY], 0);
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
GST_DATA_QUEUE_MUTEX_LOCK_CHECK (queue, flushing);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
while (gst_data_queue_locked_is_empty (queue)) {
queue->waiting_add = TRUE;
2012-01-19 08:27:04 +00:00
g_cond_wait (&queue->item_add, &queue->qlock);
queue->waiting_add = FALSE;
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
if (queue->flushing)
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
goto flushing;
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
}
}
/* Get the item from the GQueue */
*item = g_queue_pop_head (queue->queue);
/* update current level counter */
if ((*item)->visible)
queue->cur_level.visible--;
queue->cur_level.bytes -= (*item)->size;
queue->cur_level.time -= (*item)->duration;
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
STATUS (queue, "after popping");
if (queue->waiting_del)
2012-01-19 08:27:04 +00:00
g_cond_signal (&queue->item_del);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
return TRUE;
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
/* ERRORS */
flushing:
{
GST_DEBUG ("queue:%p, we are flushing", queue);
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
return FALSE;
}
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
}
/**
* gst_data_queue_drop_head:
* @queue: The #GstDataQueue to drop an item from.
* @type: The #GType of the item to drop.
*
* Pop and unref the head-most #GstMiniObject with the given #GType.
*
* Returns: TRUE if an element was removed.
*
* Since: 0.10.11
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
*/
gboolean
gst_data_queue_drop_head (GstDataQueue * queue, GType type)
{
gboolean res = FALSE;
GList *item;
GstDataQueueItem *leak = NULL;
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
g_return_val_if_fail (GST_IS_DATA_QUEUE (queue), FALSE);
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
GST_DEBUG ("queue:%p", queue);
GST_DATA_QUEUE_MUTEX_LOCK (queue);
for (item = g_queue_peek_head_link (queue->queue); item; item = item->next) {
GstDataQueueItem *tmp = (GstDataQueueItem *) item->data;
if (G_TYPE_CHECK_INSTANCE_TYPE (tmp->object, type)) {
leak = tmp;
break;
}
}
if (!leak)
goto done;
g_queue_delete_link (queue->queue, item);
if (leak->visible)
queue->cur_level.visible--;
queue->cur_level.bytes -= leak->size;
queue->cur_level.time -= leak->duration;
leak->destroy (leak);
res = TRUE;
done:
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
GST_DEBUG ("queue:%p , res:%d", queue, res);
return res;
}
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
/**
* gst_data_queue_limits_changed:
* @queue: The #GstDataQueue
*
* Inform the queue that the limits for the fullness check have changed and that
* any blocking gst_data_queue_push() should be unblocked to recheck the limts.
*
* Since: 0.10.11
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
*/
void
gst_data_queue_limits_changed (GstDataQueue * queue)
{
g_return_if_fail (GST_IS_DATA_QUEUE (queue));
GST_DATA_QUEUE_MUTEX_LOCK (queue);
if (queue->waiting_del) {
GST_DEBUG ("signal del");
2012-01-19 08:27:04 +00:00
g_cond_signal (&queue->item_del);
}
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
}
/**
* gst_data_queue_get_level:
* @queue: The #GstDataQueue
* @level: the location to store the result
*
* Get the current level of the queue.
*
* Since: 0.10.11
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
*/
void
gst_data_queue_get_level (GstDataQueue * queue, GstDataQueueSize * level)
{
memcpy (level, (&queue->cur_level), sizeof (GstDataQueueSize));
libs/gst/base/gstdataqueue.*: Various cleanups. Original commit message from CVS: * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_is_empty), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_limits_changed), (gst_data_queue_get_level): * libs/gst/base/gstdataqueue.h: Various cleanups. Added methods to get the current levels and to inform the queue that the 'full' limits changed. * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_single_queue_flush), (update_time_level), (apply_segment), (apply_buffer), (gst_single_queue_push_one), (gst_multi_queue_item_steal_object), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push), (gst_multi_queue_src_query), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): Keep track of time in the queue by measuring the difference between running_time on input and output. This gives more accurate results and can compensate for segments correctly. Make a queue by default only 5 buffers deep. We will now increase the buffer size depending on the filledness of the other queues. Factor out commong flush code. Make sure we don't add additional refcounts to buffers when we can avoid it. Propagate GstFlowReturn differently. Use GSlice for intermediate GstMultiQueueItems. Keep track of EOS. Resize queues on over and underruns based on filled level of other queues. When checking if the queue is filled, prefer to measure in time if we can and fall back to bytes when no time is known. * plugins/elements/gstqueue.c: Fix return value.
2007-06-15 11:00:32 +00:00
}
libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun... Original commit message from CVS: * libs/gst/base/Makefile.am: * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type), (gst_data_queue_base_init), (gst_data_queue_class_init), (gst_data_queue_init), (gst_data_queue_new), (gst_data_queue_cleanup), (gst_data_queue_finalize), (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty), (gst_data_queue_locked_is_full), (gst_data_queue_flush), (gst_data_queue_is_empty), (gst_data_queue_is_full), (gst_data_queue_set_flushing), (gst_data_queue_push), (gst_data_queue_pop), (gst_data_queue_drop_head), (gst_data_queue_set_property), (gst_data_queue_get_property): * libs/gst/base/gstdataqueue.h: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing functionnality. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: Insert documentation for GstDataQueue * plugins/elements/Makefile.am: * plugins/elements/gstelements.c: * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init), (gst_multi_queue_class_init), (gst_multi_queue_init), (gst_multi_queue_finalize), (gst_multi_queue_set_property), (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad), (gst_multi_queue_release_pad), (gst_single_queue_push_one), (gst_multi_queue_item_destroy), (gst_multi_queue_item_new), (gst_multi_queue_loop), (gst_multi_queue_chain), (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event), (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc), (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps), (gst_multi_queue_src_event), (gst_multi_queue_src_query), (wake_up_next_non_linked), (compute_next_non_linked), (single_queue_overrun_cb), (single_queue_underrun_cb), (single_queue_check_full), (gst_single_queue_new): * plugins/elements/gstmultiqueue.h: New multiqueue element, using GstDataQueue. Used for queuing multiple streams. Closes #344639 and #347785
2006-11-28 12:07:06 +00:00
static void
gst_data_queue_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec)
{
switch (prop_id) {
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_data_queue_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec)
{
GstDataQueue *queue = GST_DATA_QUEUE (object);
GST_DATA_QUEUE_MUTEX_LOCK (queue);
switch (prop_id) {
case ARG_CUR_LEVEL_BYTES:
g_value_set_uint (value, queue->cur_level.bytes);
break;
case ARG_CUR_LEVEL_VISIBLE:
g_value_set_uint (value, queue->cur_level.visible);
break;
case ARG_CUR_LEVEL_TIME:
g_value_set_uint64 (value, queue->cur_level.time);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
}