1 /* GStreamer 2 * Copyright (C) 2017 Matthew Waters <matthew@centricular.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 __GST_WEBRTC_BIN_H__ 21 #define __GST_WEBRTC_BIN_H__ 22 23 #include <gst/sdp/sdp.h> 24 #include "fwd.h" 25 #include "gstwebrtcice.h" 26 #include "transportstream.h" 27 28 G_BEGIN_DECLS 29 30 GType gst_webrtc_bin_pad_get_type(void); 31 #define GST_TYPE_WEBRTC_BIN_PAD (gst_webrtc_bin_pad_get_type()) 32 #define GST_WEBRTC_BIN_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_BIN_PAD,GstWebRTCBinPad)) 33 #define GST_IS_WEBRTC_BIN_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_BIN_PAD)) 34 #define GST_WEBRTC_BIN_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_BIN_PAD,GstWebRTCBinPadClass)) 35 #define GST_IS_WEBRTC_BIN_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_BIN_PAD)) 36 #define GST_WEBRTC_BIN_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_BIN_PAD,GstWebRTCBinPadClass)) 37 38 typedef struct _GstWebRTCBinPad GstWebRTCBinPad; 39 typedef struct _GstWebRTCBinPadClass GstWebRTCBinPadClass; 40 41 struct _GstWebRTCBinPad 42 { 43 GstGhostPad parent; 44 45 guint mlineindex; 46 47 GstWebRTCRTPTransceiver *trans; 48 gulong block_id; 49 50 GstCaps *received_caps; 51 }; 52 53 struct _GstWebRTCBinPadClass 54 { 55 GstGhostPadClass parent_class; 56 }; 57 58 GType gst_webrtc_bin_get_type(void); 59 #define GST_TYPE_WEBRTC_BIN (gst_webrtc_bin_get_type()) 60 #define GST_WEBRTC_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_BIN,GstWebRTCBin)) 61 #define GST_IS_WEBRTC_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_BIN)) 62 #define GST_WEBRTC_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_BIN,GstWebRTCBinClass)) 63 #define GST_IS_WEBRTC_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_BIN)) 64 #define GST_WEBRTC_BIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_BIN,GstWebRTCBinClass)) 65 66 struct _GstWebRTCBin 67 { 68 GstBin parent; 69 70 GstElement *rtpbin; 71 GstElement *rtpfunnel; 72 73 GstWebRTCSignalingState signaling_state; 74 GstWebRTCICEGatheringState ice_gathering_state; 75 GstWebRTCICEConnectionState ice_connection_state; 76 GstWebRTCPeerConnectionState peer_connection_state; 77 78 GstWebRTCSessionDescription *current_local_description; 79 GstWebRTCSessionDescription *pending_local_description; 80 GstWebRTCSessionDescription *current_remote_description; 81 GstWebRTCSessionDescription *pending_remote_description; 82 83 GstWebRTCBundlePolicy bundle_policy; 84 GstWebRTCICETransportPolicy ice_transport_policy; 85 86 GstWebRTCBinPrivate *priv; 87 }; 88 89 struct _GstWebRTCBinClass 90 { 91 GstBinClass parent_class; 92 }; 93 94 struct _GstWebRTCBinPrivate 95 { 96 guint max_sink_pad_serial; 97 98 gboolean bundle; 99 GArray *transceivers; 100 GArray *session_mid_map; 101 GArray *transports; 102 GArray *data_channels; 103 /* list of data channels we've received a sctp stream for but no data 104 * channel protocol for */ 105 GArray *pending_data_channels; 106 107 GstWebRTCSCTPTransport *sctp_transport; 108 TransportStream *data_channel_transport; 109 110 GstWebRTCICE *ice; 111 GArray *ice_stream_map; 112 GArray *pending_ice_candidates; 113 114 /* peerconnection variables */ 115 gboolean is_closed; 116 gboolean need_negotiation; 117 118 /* peerconnection helper thread for promises */ 119 GMainContext *main_context; 120 GMainLoop *loop; 121 GThread *thread; 122 GMutex pc_lock; 123 GCond pc_cond; 124 125 gboolean running; 126 gboolean async_pending; 127 128 GList *pending_pads; 129 GList *pending_sink_transceivers; 130 131 /* count of the number of media streams we've offered for uniqueness */ 132 /* FIXME: overflow? */ 133 guint media_counter; 134 135 GstStructure *stats; 136 }; 137 138 typedef void (*GstWebRTCBinFunc) (GstWebRTCBin * webrtc, gpointer data); 139 140 typedef struct 141 { 142 GstWebRTCBin *webrtc; 143 GstWebRTCBinFunc op; 144 gpointer data; 145 GDestroyNotify notify; 146 // GstPromise *promise; /* FIXME */ 147 } GstWebRTCBinTask; 148 149 void gst_webrtc_bin_enqueue_task (GstWebRTCBin * pc, 150 GstWebRTCBinFunc func, 151 gpointer data, 152 GDestroyNotify notify); 153 154 G_END_DECLS 155 156 #endif /* __GST_WEBRTC_BIN_H__ */ 157