rtpsource.h 7.76 KB
Newer Older
1
/* GStreamer
2
 * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
 *
 * 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.
 */

#ifndef __RTP_SOURCE_H__
#define __RTP_SOURCE_H__

#include <gst/gst.h>
#include <gst/rtp/gstrtcpbuffer.h>
#include <gst/netbuffer/gstnetbuffer.h>

#include "rtpstats.h"

/* the default number of consecutive RTP packets we need to receive before the
 * source is considered valid */
#define RTP_NO_PROBATION        0
#define RTP_DEFAULT_PROBATION   2

34 35
#define RTP_SEQ_MOD          (1 << 16)

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
typedef struct _RTPSource RTPSource;
typedef struct _RTPSourceClass RTPSourceClass;

#define RTP_TYPE_SOURCE             (rtp_source_get_type())
#define RTP_SOURCE(src)             (G_TYPE_CHECK_INSTANCE_CAST((src),RTP_TYPE_SOURCE,RTPSource))
#define RTP_SOURCE_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass),RTP_TYPE_SOURCE,RTPSourceClass))
#define RTP_IS_SOURCE(src)          (G_TYPE_CHECK_INSTANCE_TYPE((src),RTP_TYPE_SOURCE))
#define RTP_IS_SOURCE_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_SOURCE))
#define RTP_SOURCE_CAST(src)        ((RTPSource *)(src))

/**
 * RTP_SOURCE_IS_ACTIVE:
 * @src: an #RTPSource
 *
 * Check if @src is active. A source is active when it has been validated
 * and has not yet received a BYE packet.
 */
#define RTP_SOURCE_IS_ACTIVE(src)  (src->validated && !src->received_bye)

/**
 * RTP_SOURCE_IS_SENDER:
 * @src: an #RTPSource
 *
 * Check if @src is a sender.
 */
#define RTP_SOURCE_IS_SENDER(src)  (src->is_sender)

/**
 * RTPSourcePushRTP:
 * @src: an #RTPSource
 * @buffer: the RTP buffer ready for processing
 * @user_data: user data specified when registering
 *
 * This callback will be called when @src has @buffer ready for further
 * processing.
 *
 * Returns: a #GstFlowReturn.
 */
74 75
typedef GstFlowReturn (*RTPSourcePushRTP) (RTPSource *src, GstBuffer *buffer, 
	gpointer user_data);
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112

/**
 * RTPSourceClockRate:
 * @src: an #RTPSource
 * @payload: a payload type
 * @user_data: user data specified when registering
 *
 * This callback will be called when @src needs the clock-rate of the
 * @payload.
 *
 * Returns: a clock-rate for @payload.
 */
typedef gint (*RTPSourceClockRate) (RTPSource *src, guint8 payload, gpointer user_data);

/**
 * RTPSourceCallbacks:
 * @push_rtp: a packet becomes available for handling
 * @clock_rate: a clock-rate is requested
 * @get_time: the current clock time is requested
 *
 * Callbacks performed by #RTPSource when actions need to be performed.
 */
typedef struct {
  RTPSourcePushRTP     push_rtp;
  RTPSourceClockRate   clock_rate;
} RTPSourceCallbacks;

/**
 * RTPSource:
 *
 * A source in the #RTPSession
 */
struct _RTPSource {
  GObject       object;

  /*< private >*/
  guint32       ssrc;
113

114 115
  gint          probation;
  gboolean      validated;
116
  gboolean      internal;
117 118 119
  gboolean      is_csrc;
  gboolean      is_sender;

Wim Taymans's avatar
Wim Taymans committed
120 121 122
  guint8       *sdes[9];
  guint         sdes_len[9];

123 124 125
  gboolean      received_bye;
  gchar        *bye_reason;

126 127 128 129 130
  gboolean      have_rtp_from;
  GstNetAddress rtp_from;
  gboolean      have_rtcp_from;
  GstNetAddress rtcp_from;

131
  gint          payload;
132
  GstCaps      *caps;
133
  gint          clock_rate;
134 135
  gint32        seqnum_base;

136 137 138
  GstClockTime  bye_time;
  GstClockTime  last_activity;
  GstClockTime  last_rtp_activity;
139

140
  GstClockTime  last_rtptime;
141
  GstClockTime  last_ntpnstime;
142

143 144 145 146 147
  /* for bitrate estimation */
  guint64       bitrate;
  GstClockTime  prev_ntpnstime;
  guint64       bytes_sent;

148 149
  GQueue       *packets;

150 151 152
  RTPSourceCallbacks callbacks;
  gpointer           user_data;

153 154 155 156 157 158 159 160 161 162
  RTPSourceStats stats;
};

struct _RTPSourceClass {
  GObjectClass   parent_class;
};

GType rtp_source_get_type (void);

/* managing lifetime of sources */
Wim Taymans's avatar
Wim Taymans committed
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
RTPSource*      rtp_source_new                 (guint32 ssrc);
void            rtp_source_set_callbacks       (RTPSource *src, RTPSourceCallbacks *cb, gpointer data);

/* properties */
guint32         rtp_source_get_ssrc            (RTPSource *src);

void            rtp_source_set_as_csrc         (RTPSource *src);
gboolean        rtp_source_is_as_csrc          (RTPSource *src);

gboolean        rtp_source_is_active           (RTPSource *src);
gboolean        rtp_source_is_validated        (RTPSource *src);
gboolean        rtp_source_is_sender           (RTPSource *src);

gboolean        rtp_source_received_bye        (RTPSource *src);
gchar *         rtp_source_get_bye_reason      (RTPSource *src);

void            rtp_source_update_caps         (RTPSource *src, GstCaps *caps);
180

Wim Taymans's avatar
Wim Taymans committed
181 182 183 184 185 186 187 188
/* SDES info */
gboolean        rtp_source_set_sdes            (RTPSource *src, GstRTCPSDESType type, 
                                                const guint8 *data, guint len);
gboolean        rtp_source_set_sdes_string     (RTPSource *src, GstRTCPSDESType type,
                                                const gchar *data);
gboolean        rtp_source_get_sdes            (RTPSource *src, GstRTCPSDESType type,
                                                guint8 **data, guint *len);
gchar*          rtp_source_get_sdes_string     (RTPSource *src, GstRTCPSDESType type);
189

Wim Taymans's avatar
Wim Taymans committed
190 191 192
/* handling network address */
void            rtp_source_set_rtp_from        (RTPSource *src, GstNetAddress *address);
void            rtp_source_set_rtcp_from       (RTPSource *src, GstNetAddress *address);
193

194
/* handling RTP */
Wim Taymans's avatar
Wim Taymans committed
195
GstFlowReturn   rtp_source_process_rtp         (RTPSource *src, GstBuffer *buffer, RTPArrivalStats *arrival);
196

Wim Taymans's avatar
Wim Taymans committed
197
GstFlowReturn   rtp_source_send_rtp            (RTPSource *src, GstBuffer *buffer, guint64 ntpnstime);
198 199

/* RTCP messages */
Wim Taymans's avatar
Wim Taymans committed
200 201 202 203 204 205 206
void            rtp_source_process_bye         (RTPSource *src, const gchar *reason);
void            rtp_source_process_sr          (RTPSource *src, GstClockTime time, guint64 ntptime,
                                                guint32 rtptime, guint32 packet_count, guint32 octet_count);
void            rtp_source_process_rb          (RTPSource *src, GstClockTime time, guint8 fractionlost,
                                                gint32 packetslost, guint32 exthighestseq, guint32 jitter,
                                                guint32 lsr, guint32 dlsr);

207
gboolean        rtp_source_get_new_sr          (RTPSource *src, guint64 ntpnstime, guint64 *ntptime,
Wim Taymans's avatar
Wim Taymans committed
208 209 210 211 212 213 214 215 216 217 218
		                                guint32 *rtptime, guint32 *packet_count,
						guint32 *octet_count);
gboolean        rtp_source_get_new_rb          (RTPSource *src, GstClockTime time, guint8 *fractionlost,
                                                gint32 *packetslost, guint32 *exthighestseq, guint32 *jitter,
                                                guint32 *lsr, guint32 *dlsr);

gboolean        rtp_source_get_last_sr         (RTPSource *src, GstClockTime *time, guint64 *ntptime,
                                                guint32 *rtptime, guint32 *packet_count,
						guint32 *octet_count);
gboolean        rtp_source_get_last_rb         (RTPSource *src, guint8 *fractionlost, gint32 *packetslost,
                                                guint32 *exthighestseq, guint32 *jitter,
219
                                                guint32 *lsr, guint32 *dlsr, guint32 *round_trip);
220

221 222
void            rtp_source_reset               (RTPSource * src);

223
#endif /* __RTP_SOURCE_H__ */