## multiqueue multiqueue — Asynchronous data queues |

## Synopsis

                        GstMultiQueue;

## Object Hierarchy

      GObject
       +----GstObject
             +----GstElement
                   +----GstMultiQueue

## Properties

      "extra-size-buffers"       guint                 : Read / Write
      "extra-size-bytes"         guint                 : Read / Write
      "extra-size-time"          guint64               : Read / Write
      "max-size-buffers"         guint                 : Read / Write
      "max-size-bytes"           guint                 : Read / Write
      "max-size-time"            guint64               : Read / Write

## Signals

      "overrun"                                        : Run First
      "underrun"                                       : Run First

## Description

Multiqueue is similar to a normal GstQueue with the following additional features:

1. Multiple streamhandling

   - The element handles queueing data on more than one stream at once. To achieve such a feature it has request sink pads (sink_`d`) and 'sometimes' src pads (src_`d`).

     When requesting a given sinkpad with `gst_element_get_request_pad()`, the associated srcpad for that stream will be created. Ex: requesting sink_1 will generate src_1.

2. Non-starvation on multiple streams

   - If more than one stream is used with the element, the streams' queues will be dynamically grown (up to a limit), in order to ensure that no stream is risking data starvation. This guarantees that at any given time there are at least N bytes queued and available for each individual stream.

     If an EOS event comes through a srcpad, the associated queue will be considered as 'not-empty' in the queue-size-growing algorithm.

3. Non-linked srcpads graceful handling

   - In order to better support dynamic switching between streams, the multiqueue (unlike the current GStreamer queue) continues to push buffers on non-linked pads rather than shutting down.

     In addition, to prevent a non-linked stream from very quickly consuming all available buffers and thus 'racing ahead' of the other streams, the element must ensure that buffers and inlined events for a non-linked stream are pushed in the same order as they were received, relative to the other streams controlled by the element. This means that a buffer cannot be pushed to a non-linked pad any sooner than buffers in any other stream which were received before it.

Data is queued until one of the limits specified by the GstMultiQueue:max-size-buffers, GstMultiQueue:max-size-bytes and/or GstMultiQueue:max-size-time properties has been reached. Any attempt to push more buffers into the queue will block the pushing thread until more space becomes available. GstMultiQueue:extra-size-buffers,

GstMultiQueue:extra-size-bytes and GstMultiQueue:extra-size-time are currently unused.

The default queue size limits are 5 buffers, 10MB of data, or two second worth of data, whichever is reached first. Note that the number of buffers will dynamically grow depending on the fill level of other queues.

The GstMultiQueue::underrun signal is emitted when all of the queues are empty. The GstMultiQueue::overrun signal is emitted when one of the queues is filled. Both signals are emitted from the context of the streaming thread.

Last reviewed on 2008-01-25 (0.10.17)

### Element Information

plugin | coreelements
author | Edward Hervey <edward@fluendo.com>
class | Generic

### Element Pads

name | sink%d
direction | sink
presence | request
details | ANY

name | src%d
direction | source
presence | sometimes
details | ANY

## Details

### GstMultiQueue

    typedef struct _GstMultiQueue GstMultiQueue;

Opaque GstMultiQueue structure.

## Property Details

### The "`extra-size-buffers`" property

      "extra-size-buffers"       guint                 : Read / Write

Amount of buffers the queues can grow if one of them is empty (0=disable).

Default value: 5

### The "`extra-size-bytes`" property

      "extra-size-bytes"         guint                 : Read / Write

Amount of data the queues can grow if one of them is empty (bytes, 0=disable).

Default value: 10485760

### The "`extra-size-time`" property

      "extra-size-time"          guint64               : Read / Write

Amount of time the queues can grow if one of them is empty (in ns, 0=disable).

Default value: 3000000000

### The "`max-size-buffers`" property

      "max-size-buffers"         guint                 : Read / Write

Max. number of buffers in the queue (0=disable).

Default value: 5

### The "`max-size-bytes`" property

      "max-size-bytes"           guint                 : Read / Write

Max. amount of data in the queue (bytes, 0=disable).

Default value: 10485760

### The "`max-size-time`" property

      "max-size-time"            guint64               : Read / Write

Max. amount of data in the queue (in ns, 0=disable).

Default value: 2000000000

## Signal Details

### The "overrun" signal

    void                user_function                      (GstMultiQueue *gstmultiqueue,
                                                            gpointer       user_data)          : Run First

`gstmultiqueue` : | the object which received the signal.
`user_data` : | user data set when the signal handler was connected.

### The "underrun" signal

    void                user_function                      (GstMultiQueue *gstmultiqueue,
                                                            gpointer       user_data)          : Run First

`gstmultiqueue` : | the object which received the signal.
`user_data` : | user data set when the signal handler was connected.

## See Also

GstQueue