1 | /* GStreamer |
---|
2 | * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu> |
---|
3 | * 2000 Wim Taymans <wtay@chello.be> |
---|
4 | * |
---|
5 | * gstqueue.h: |
---|
6 | * |
---|
7 | * This library is free software; you can redistribute it and/or |
---|
8 | * modify it under the terms of the GNU Library General Public |
---|
9 | * License as published by the Free Software Foundation; either |
---|
10 | * version 2 of the License, or (at your option) any later version. |
---|
11 | * |
---|
12 | * This library is distributed in the hope that it will be useful, |
---|
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
15 | * Library General Public License for more details. |
---|
16 | * |
---|
17 | * You should have received a copy of the GNU Library General Public |
---|
18 | * License along with this library; if not, write to the |
---|
19 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
---|
20 | * Boston, MA 02111-1307, USA. |
---|
21 | */ |
---|
22 | |
---|
23 | |
---|
24 | #ifndef __GST_QUEUE_H__ |
---|
25 | #define __GST_QUEUE_H__ |
---|
26 | |
---|
27 | |
---|
28 | #include <gst/gstelement.h> |
---|
29 | |
---|
30 | |
---|
31 | G_BEGIN_DECLS |
---|
32 | |
---|
33 | #define GST_TYPE_QUEUE \ |
---|
34 | (gst_queue_get_type()) |
---|
35 | #define GST_QUEUE(obj) \ |
---|
36 | (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QUEUE,GstQueue)) |
---|
37 | #define GST_QUEUE_CLASS(klass) \ |
---|
38 | (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QUEUE,GstQueueClass)) |
---|
39 | #define GST_IS_QUEUE(obj) \ |
---|
40 | (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QUEUE)) |
---|
41 | #define GST_IS_QUEUE_CLASS(obj) \ |
---|
42 | (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QUEUE)) |
---|
43 | |
---|
44 | enum { |
---|
45 | GST_QUEUE_NO_LEAK = 0, |
---|
46 | GST_QUEUE_LEAK_UPSTREAM = 1, |
---|
47 | GST_QUEUE_LEAK_DOWNSTREAM = 2 |
---|
48 | }; |
---|
49 | |
---|
50 | typedef struct _GstQueue GstQueue; |
---|
51 | typedef struct _GstQueueSize GstQueueSize; |
---|
52 | typedef struct _GstQueueClass GstQueueClass; |
---|
53 | |
---|
54 | struct _GstQueueSize { |
---|
55 | guint buffers; /* no. of buffers */ |
---|
56 | guint bytes; /* no. of bytes */ |
---|
57 | guint64 time; /* amount of time */ |
---|
58 | }; |
---|
59 | |
---|
60 | struct _GstQueue { |
---|
61 | GstElement element; |
---|
62 | |
---|
63 | GstPad *sinkpad; |
---|
64 | GstPad *srcpad; |
---|
65 | |
---|
66 | /* the queue of data we're keeping our grubby hands on */ |
---|
67 | GQueue *queue; |
---|
68 | |
---|
69 | GstQueueSize |
---|
70 | cur_level, /* currently in the queue */ |
---|
71 | max_size, /* max. amount of data allowed in the queue */ |
---|
72 | min_threshold; /* min. amount of data required to wake reader */ |
---|
73 | |
---|
74 | /* whether we leak data, and at which end */ |
---|
75 | gint leaky; |
---|
76 | |
---|
77 | /* number of nanoseconds until a blocked queue 'times out' |
---|
78 | * to receive data and returns a filler event. -1 = disable */ |
---|
79 | guint64 block_timeout; |
---|
80 | |
---|
81 | /* it the queue should fail on possible deadlocks */ |
---|
82 | gboolean may_deadlock; |
---|
83 | |
---|
84 | gboolean interrupt; |
---|
85 | gboolean flush; |
---|
86 | |
---|
87 | GMutex *qlock; /* lock for queue (vs object lock) */ |
---|
88 | GCond *item_add; /* signals buffers now available for reading */ |
---|
89 | GCond *item_del; /* signals space now available for writing */ |
---|
90 | GCond *event_done; /* upstream event signaller */ |
---|
91 | |
---|
92 | GTimeVal *timeval; /* the timeout for the queue locking */ |
---|
93 | GQueue *events; /* upstream events get decoupled here */ |
---|
94 | |
---|
95 | GstCaps *negotiated_caps; |
---|
96 | |
---|
97 | GMutex *event_lock; /* lock when handling the events queue */ |
---|
98 | |
---|
99 | gpointer _gst_reserved[GST_PADDING - 1]; |
---|
100 | }; |
---|
101 | |
---|
102 | struct _GstQueueClass { |
---|
103 | GstElementClass parent_class; |
---|
104 | |
---|
105 | /* signals - 'running' is called from both sides |
---|
106 | * which might make it sort of non-useful... */ |
---|
107 | void (*underrun) (GstQueue *queue); |
---|
108 | void (*running) (GstQueue *queue); |
---|
109 | void (*overrun) (GstQueue *queue); |
---|
110 | |
---|
111 | gpointer _gst_reserved[GST_PADDING]; |
---|
112 | }; |
---|
113 | |
---|
114 | GType gst_queue_get_type (void); |
---|
115 | |
---|
116 | G_END_DECLS |
---|
117 | |
---|
118 | |
---|
119 | #endif /* __GST_QUEUE_H__ */ |
---|