Merging gst-plugins-ugly
[platform/upstream/gstreamer.git] / subprojects / gst-plugins-ugly / gst / realmedia / rdtjitterbuffer.h
1 /* GStreamer
2  * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #ifndef __RDT_JITTER_BUFFER_H__
21 #define __RDT_JITTER_BUFFER_H__
22
23 #include <gst/gst.h>
24
25 typedef struct _RDTJitterBuffer RDTJitterBuffer;
26 typedef struct _RDTJitterBufferClass RDTJitterBufferClass;
27
28 #define RDT_TYPE_JITTER_BUFFER             (rdt_jitter_buffer_get_type())
29 #define RDT_JITTER_BUFFER(src)             (G_TYPE_CHECK_INSTANCE_CAST((src),RDT_TYPE_JITTER_BUFFER,RDTJitterBuffer))
30 #define RDT_JITTER_BUFFER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass),RDT_TYPE_JITTER_BUFFER,RDTJitterBufferClass))
31 #define RDT_IS_JITTER_BUFFER(src)          (G_TYPE_CHECK_INSTANCE_TYPE((src),RDT_TYPE_JITTER_BUFFER))
32 #define RDT_IS_JITTER_BUFFER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass),RDT_TYPE_JITTER_BUFFER))
33 #define RDT_JITTER_BUFFER_CAST(src)        ((RDTJitterBuffer *)(src))
34
35 /**
36  * RTPTailChanged:
37  * @jbuf: an #RDTJitterBuffer
38  * @user_data: user data specified when registering
39  *
40  * This callback will be called when the tail buffer of @jbuf changed.
41  */
42 typedef void (*RTPTailChanged) (RDTJitterBuffer *jbuf, gpointer user_data);
43
44 #define RDT_JITTER_BUFFER_MAX_WINDOW 512
45 /**
46  * RDTJitterBuffer:
47  *
48  * A JitterBuffer in the #RTPSession
49  */
50 struct _RDTJitterBuffer {
51   GObject        object;
52
53   GQueue        *packets;
54
55   /* for calculating skew */
56   GstClockTime   base_time;
57   GstClockTime   base_rtptime;
58   guint64        ext_rtptime;
59   gint64         window[RDT_JITTER_BUFFER_MAX_WINDOW];
60   guint          window_pos;
61   guint          window_size;
62   gboolean       window_filling;
63   gint64         window_min;
64   gint64         skew;
65   gint64         prev_send_diff;
66 };
67
68 struct _RDTJitterBufferClass {
69   GObjectClass   parent_class;
70 };
71
72 GType rdt_jitter_buffer_get_type (void);
73
74 /* managing lifetime */
75 RDTJitterBuffer*      rdt_jitter_buffer_new              (void);
76
77 void                  rdt_jitter_buffer_reset_skew       (RDTJitterBuffer *jbuf);
78
79 gboolean              rdt_jitter_buffer_insert           (RDTJitterBuffer *jbuf, GstBuffer *buf,
80                                                           GstClockTime time,
81                                                           guint32 clock_rate,
82                                                           gboolean *tail);
83 GstBuffer *           rdt_jitter_buffer_peek             (RDTJitterBuffer *jbuf);
84 GstBuffer *           rdt_jitter_buffer_pop              (RDTJitterBuffer *jbuf);
85
86 void                  rdt_jitter_buffer_flush            (RDTJitterBuffer *jbuf);
87
88 guint                 rdt_jitter_buffer_num_packets      (RDTJitterBuffer *jbuf);
89 guint32               rdt_jitter_buffer_get_ts_diff      (RDTJitterBuffer *jbuf);
90
91 #endif /* __RDT_JITTER_BUFFER_H__ */