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 __RTP_JITTER_BUFFER_H__ 21 #define __RTP_JITTER_BUFFER_H__ 22 23 #include <gst/gst.h> 24 #include <gst/rtp/gstrtcpbuffer.h> 25 26 typedef struct _RTPJitterBuffer RTPJitterBuffer; 27 typedef struct _RTPJitterBufferClass RTPJitterBufferClass; 28 typedef struct _RTPJitterBufferItem RTPJitterBufferItem; 29 30 #define RTP_TYPE_JITTER_BUFFER (rtp_jitter_buffer_get_type()) 31 #define RTP_JITTER_BUFFER(src) (G_TYPE_CHECK_INSTANCE_CAST((src),RTP_TYPE_JITTER_BUFFER,RTPJitterBuffer)) 32 #define RTP_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),RTP_TYPE_JITTER_BUFFER,RTPJitterBufferClass)) 33 #define RTP_IS_JITTER_BUFFER(src) (G_TYPE_CHECK_INSTANCE_TYPE((src),RTP_TYPE_JITTER_BUFFER)) 34 #define RTP_IS_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_JITTER_BUFFER)) 35 #define RTP_JITTER_BUFFER_CAST(src) ((RTPJitterBuffer *)(src)) 36 37 /** 38 * RTPJitterBufferMode: 39 * @RTP_JITTER_BUFFER_MODE_NONE: don't do any skew correction, outgoing 40 * timestamps are calculated directly from the RTP timestamps. This mode is 41 * good for recording but not for real-time applications. 42 * @RTP_JITTER_BUFFER_MODE_SLAVE: calculate the skew between sender and receiver 43 * and produce smoothed adjusted outgoing timestamps. This mode is good for 44 * low latency communications. 45 * @RTP_JITTER_BUFFER_MODE_BUFFER: buffer packets between low/high watermarks. 46 * This mode is good for streaming communication. 47 * @RTP_JITTER_BUFFER_MODE_SYNCED: sender and receiver clocks are synchronized, 48 * like #RTP_JITTER_BUFFER_MODE_SLAVE but skew is assumed to be 0. Good for 49 * low latency communication when sender and receiver clocks are 50 * synchronized and there is thus no clock skew. 51 * @RTP_JITTER_BUFFER_MODE_LAST: last buffer mode. 52 * 53 * The different buffer modes for a jitterbuffer. 54 */ 55 typedef enum { 56 RTP_JITTER_BUFFER_MODE_NONE = 0, 57 RTP_JITTER_BUFFER_MODE_SLAVE = 1, 58 RTP_JITTER_BUFFER_MODE_BUFFER = 2, 59 /* FIXME 3 is missing because it was used for 'auto' in jitterbuffer */ 60 RTP_JITTER_BUFFER_MODE_SYNCED = 4, 61 RTP_JITTER_BUFFER_MODE_LAST 62 } RTPJitterBufferMode; 63 64 #define RTP_TYPE_JITTER_BUFFER_MODE (rtp_jitter_buffer_mode_get_type()) 65 GType rtp_jitter_buffer_mode_get_type (void); 66 67 #define RTP_JITTER_BUFFER_MAX_WINDOW 512 68 /** 69 * RTPJitterBuffer: 70 * 71 * A JitterBuffer in the #RTPSession 72 */ 73 struct _RTPJitterBuffer { 74 GObject object; 75 76 GQueue *packets; 77 78 RTPJitterBufferMode mode; 79 80 GstClockTime delay; 81 82 /* for buffering */ 83 gboolean buffering; 84 guint64 low_level; 85 guint64 high_level; 86 87 /* for calculating skew */ 88 gboolean need_resync; 89 GstClockTime base_time; 90 GstClockTime base_rtptime; 91 GstClockTime media_clock_base_time; 92 guint32 clock_rate; 93 GstClockTime base_extrtp; 94 GstClockTime prev_out_time; 95 guint64 ext_rtptime; 96 guint64 last_rtptime; 97 gint64 window[RTP_JITTER_BUFFER_MAX_WINDOW]; 98 guint window_pos; 99 guint window_size; 100 gboolean window_filling; 101 gint64 window_min; 102 gint64 skew; 103 gint64 prev_send_diff; 104 gboolean buffering_disabled; 105 106 GMutex clock_lock; 107 GstClock *pipeline_clock; 108 GstClock *media_clock; 109 gulong media_clock_synced_id; 110 guint64 media_clock_offset; 111 112 gboolean rfc7273_sync; 113 }; 114 115 struct _RTPJitterBufferClass { 116 GObjectClass parent_class; 117 }; 118 119 /** 120 * RTPJitterBufferItem: 121 * @data: the data of the item 122 * @next: pointer to next item 123 * @prev: pointer to previous item 124 * @type: the type of @data, used freely by caller 125 * @dts: input DTS 126 * @pts: output PTS 127 * @seqnum: seqnum, the seqnum is used to insert the item in the 128 * right position in the jitterbuffer and detect duplicates. Use -1 to 129 * append. 130 * @count: amount of seqnum in this item 131 * @rtptime: rtp timestamp 132 * 133 * An object containing an RTP packet or event. 134 */ 135 struct _RTPJitterBufferItem { 136 gpointer data; 137 GList *next; 138 GList *prev; 139 guint type; 140 GstClockTime dts; 141 GstClockTime pts; 142 guint seqnum; 143 guint count; 144 guint rtptime; 145 }; 146 147 GType rtp_jitter_buffer_get_type (void); 148 149 /* managing lifetime */ 150 RTPJitterBuffer* rtp_jitter_buffer_new (void); 151 152 RTPJitterBufferMode rtp_jitter_buffer_get_mode (RTPJitterBuffer *jbuf); 153 void rtp_jitter_buffer_set_mode (RTPJitterBuffer *jbuf, RTPJitterBufferMode mode); 154 155 GstClockTime rtp_jitter_buffer_get_delay (RTPJitterBuffer *jbuf); 156 void rtp_jitter_buffer_set_delay (RTPJitterBuffer *jbuf, GstClockTime delay); 157 158 void rtp_jitter_buffer_set_clock_rate (RTPJitterBuffer *jbuf, guint32 clock_rate); 159 guint32 rtp_jitter_buffer_get_clock_rate (RTPJitterBuffer *jbuf); 160 161 void rtp_jitter_buffer_set_media_clock (RTPJitterBuffer *jbuf, GstClock * clock, guint64 clock_offset); 162 void rtp_jitter_buffer_set_pipeline_clock (RTPJitterBuffer *jbuf, GstClock * clock); 163 164 gboolean rtp_jitter_buffer_get_rfc7273_sync (RTPJitterBuffer *jbuf); 165 void rtp_jitter_buffer_set_rfc7273_sync (RTPJitterBuffer *jbuf, gboolean rfc7273_sync); 166 167 void rtp_jitter_buffer_reset_skew (RTPJitterBuffer *jbuf); 168 169 gboolean rtp_jitter_buffer_insert (RTPJitterBuffer *jbuf, 170 RTPJitterBufferItem *item, 171 gboolean *head, gint *percent); 172 173 void rtp_jitter_buffer_disable_buffering (RTPJitterBuffer *jbuf, gboolean disabled); 174 175 RTPJitterBufferItem * rtp_jitter_buffer_peek (RTPJitterBuffer *jbuf); 176 RTPJitterBufferItem * rtp_jitter_buffer_pop (RTPJitterBuffer *jbuf, gint *percent); 177 178 void rtp_jitter_buffer_flush (RTPJitterBuffer *jbuf, 179 GFunc free_func, gpointer user_data); 180 181 gboolean rtp_jitter_buffer_is_buffering (RTPJitterBuffer * jbuf); 182 void rtp_jitter_buffer_set_buffering (RTPJitterBuffer * jbuf, gboolean buffering); 183 gint rtp_jitter_buffer_get_percent (RTPJitterBuffer * jbuf); 184 185 guint rtp_jitter_buffer_num_packets (RTPJitterBuffer *jbuf); 186 guint32 rtp_jitter_buffer_get_ts_diff (RTPJitterBuffer *jbuf); 187 guint16 rtp_jitter_buffer_get_seqnum_diff (RTPJitterBuffer * jbuf); 188 189 void rtp_jitter_buffer_get_sync (RTPJitterBuffer *jbuf, guint64 *rtptime, 190 guint64 *timestamp, guint32 *clock_rate, 191 guint64 *last_rtptime); 192 193 GstClockTime rtp_jitter_buffer_calculate_pts (RTPJitterBuffer * jbuf, GstClockTime dts, gboolean estimated_dts, 194 guint32 rtptime, GstClockTime base_time); 195 196 gboolean rtp_jitter_buffer_can_fast_start (RTPJitterBuffer * jbuf, gint num_packet); 197 198 #endif /* __RTP_JITTER_BUFFER_H__ */ 199