summaryrefslogtreecommitdiff
path: root/gst/rtpmanager/gstrtpbin.h
blob: 5722a21e0267f4a6217c39d5fd7492db4f7d3e8b (plain)
1
2
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
34
35
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
74
75
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* GStreamer
 * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
 *
 * 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., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef __GST_RTP_BIN_H__
#define __GST_RTP_BIN_H__

#include <gst/gst.h>

#include "rtpsession.h"
#include "gstrtpsession.h"
#include "rtpjitterbuffer.h"

#define GST_TYPE_RTP_BIN \
  (gst_rtp_bin_get_type())
#define GST_RTP_BIN(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_BIN,GstRtpBin))
#define GST_RTP_BIN_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_BIN,GstRtpBinClass))
#define GST_IS_RTP_BIN(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_BIN))
#define GST_IS_RTP_BIN_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_BIN))

typedef enum
{
  GST_RTP_BIN_RTCP_SYNC_ALWAYS,
  GST_RTP_BIN_RTCP_SYNC_INITIAL,
  GST_RTP_BIN_RTCP_SYNC_RTP
} GstRTCPSync;

typedef struct _GstRtpBin GstRtpBin;
typedef struct _GstRtpBinClass GstRtpBinClass;
typedef struct _GstRtpBinPrivate GstRtpBinPrivate;

struct _GstRtpBin {
  GstBin         bin;

  /*< private >*/
  /* default latency for sessions */
  guint           latency_ms;
  guint64         latency_ns;
  gboolean        drop_on_latency;
  gboolean        do_lost;
  gboolean        ignore_pt;
  gboolean        ntp_sync;
  gint            rtcp_sync;
  guint           rtcp_sync_interval;
  RTPJitterBufferMode buffer_mode;
  gboolean        buffering;
  gboolean        use_pipeline_clock;
  GstRtpNtpTimeSource ntp_time_source;
  gboolean        send_sync_event;
  GstClockTime    buffer_start;
  gboolean        do_retransmission;
  GstRTPProfile   rtp_profile;
  gboolean        rtcp_sync_send_time;
  gint            max_rtcp_rtp_time_diff;
  guint32         max_dropout_time;
  guint32         max_misorder_time;
  gboolean        rfc7273_sync;
  guint           max_streams;
  guint64         max_ts_offset_adjustment;
  gint64          max_ts_offset;
  gboolean        max_ts_offset_is_set;

  /* a list of session */
  GSList         *sessions;

  /* a list of clients, these are streams with the same CNAME */
  GSList         *clients;

  /* the default SDES items for sessions */
  GstStructure   *sdes;

  /*< private >*/
  GstRtpBinPrivate *priv;
};

struct _GstRtpBinClass {
  GstBinClass  parent_class;

  /* get the caps for pt */
  GstCaps*    (*request_pt_map)       (GstRtpBin *rtpbin, guint session, guint pt);

  void        (*payload_type_change)  (GstRtpBin *rtpbin, guint session, guint pt);

  void        (*new_jitterbuffer)     (GstRtpBin *rtpbin, GstElement *jitterbuffer, guint session, guint32 ssrc);

  /* action signals */
  void        (*clear_pt_map)         (GstRtpBin *rtpbin);
  void        (*reset_sync)           (GstRtpBin *rtpbin);
  GstElement* (*get_session)          (GstRtpBin *rtpbin, guint session);
  RTPSession* (*get_internal_session) (GstRtpBin *rtpbin, guint session);

  /* session manager signals */
  void     (*on_new_ssrc)       (GstRtpBin *rtpbin, guint session, guint32 ssrc);
  void     (*on_ssrc_collision) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
  void     (*on_ssrc_validated) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
  void     (*on_ssrc_active)    (GstRtpBin *rtpbin, guint session, guint32 ssrc);
  void     (*on_ssrc_sdes)      (GstRtpBin *rtpbin, guint session, guint32 ssrc);
  void     (*on_bye_ssrc)       (GstRtpBin *rtpbin, guint session, guint32 ssrc);
  void     (*on_bye_timeout)    (GstRtpBin *rtpbin, guint session, guint32 ssrc);
  void     (*on_timeout)        (GstRtpBin *rtpbin, guint session, guint32 ssrc);
  void     (*on_sender_timeout) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
  void     (*on_npt_stop)       (GstRtpBin *rtpbin, guint session, guint32 ssrc);

  GstElement* (*request_rtp_encoder)  (GstRtpBin *rtpbin, guint session);
  GstElement* (*request_rtp_decoder)  (GstRtpBin *rtpbin, guint session);
  GstElement* (*request_rtcp_encoder) (GstRtpBin *rtpbin, guint session);
  GstElement* (*request_rtcp_decoder) (GstRtpBin *rtpbin, guint session);

  GstElement* (*request_aux_sender)   (GstRtpBin *rtpbin, guint session);
  GstElement* (*request_aux_receiver) (GstRtpBin *rtpbin, guint session);

  void     (*on_new_sender_ssrc)      (GstRtpBin *rtpbin, guint session, guint32 ssrc);
  void     (*on_sender_ssrc_active)   (GstRtpBin *rtpbin, guint session, guint32 ssrc);

  guint    (*on_bundled_ssrc)         (GstRtpBin *rtpbin, guint ssrc);
};

GType gst_rtp_bin_get_type (void);

#endif /* __GST_RTP_BIN_H__ */