rtspclientsink: Use a mutex for protecting against concurrent send/receives
[platform/upstream/gstreamer.git] / gst / rtsp-sink / gstrtspclientsink.h
1 /* GStreamer
2  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
3  *               <2006> Wim Taymans <wim@fluendo.com>
4  *               <2015> Jan Schmidt <jan at centricular dot com>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21 /*
22  * Unless otherwise indicated, Source Code is licensed under MIT license.
23  * See further explanation attached in License Statement (distributed in the file
24  * LICENSE).
25  *
26  * Permission is hereby granted, free of charge, to any person obtaining a copy of
27  * this software and associated documentation files (the "Software"), to deal in
28  * the Software without restriction, including without limitation the rights to
29  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
30  * of the Software, and to permit persons to whom the Software is furnished to do
31  * so, subject to the following conditions:
32  *
33  * The above copyright notice and this permission notice shall be included in all
34  * copies or substantial portions of the Software.
35  *
36  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
37  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
38  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
39  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
40  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
41  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
42  * SOFTWARE.
43  */
44
45 #ifndef __GST_RTSP_CLIENT_SINK_H__
46 #define __GST_RTSP_CLIENT_SINK_H__
47
48 #include <gst/gst.h>
49
50 G_BEGIN_DECLS
51
52 #include <gst/rtsp-server/rtsp-stream.h>
53 #include <gst/rtsp/rtsp.h>
54 #include <gio/gio.h>
55
56 #define GST_TYPE_RTSP_CLIENT_SINK \
57   (gst_rtsp_client_sink_get_type())
58 #define GST_RTSP_CLIENT_SINK(obj) \
59   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTSP_CLIENT_SINK,GstRTSPClientSink))
60 #define GST_RTSP_CLIENT_SINK_CLASS(klass) \
61   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTSP_CLIENT_SINK,GstRTSPClientSinkClass))
62 #define GST_IS_RTSP_CLIENT_SINK(obj) \
63   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTSP_CLIENT_SINK))
64 #define GST_IS_RTSP_CLIENT_SINK_CLASS(klass) \
65   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTSP_CLIENT_SINK))
66 #define GST_RTSP_CLIENT_SINK_CAST(obj) \
67   ((GstRTSPClientSink *)(obj))
68
69 typedef struct _GstRTSPClientSink GstRTSPClientSink;
70 typedef struct _GstRTSPClientSinkClass GstRTSPClientSinkClass;
71
72 #define GST_RTSP_STATE_GET_LOCK(rtsp)    (&GST_RTSP_CLIENT_SINK_CAST(rtsp)->state_rec_lock)
73 #define GST_RTSP_STATE_LOCK(rtsp)        (g_rec_mutex_lock (GST_RTSP_STATE_GET_LOCK(rtsp)))
74 #define GST_RTSP_STATE_UNLOCK(rtsp)      (g_rec_mutex_unlock (GST_RTSP_STATE_GET_LOCK(rtsp)))
75
76 #define GST_RTSP_STREAM_GET_LOCK(rtsp)   (&GST_RTSP_CLIENT_SINK_CAST(rtsp)->stream_rec_lock)
77 #define GST_RTSP_STREAM_LOCK(rtsp)       (g_rec_mutex_lock (GST_RTSP_STREAM_GET_LOCK(rtsp)))
78 #define GST_RTSP_STREAM_UNLOCK(rtsp)     (g_rec_mutex_unlock (GST_RTSP_STREAM_GET_LOCK(rtsp)))
79
80 typedef struct _GstRTSPConnInfo GstRTSPConnInfo;
81
82 struct _GstRTSPConnInfo {
83   gchar              *location;
84   GstRTSPUrl         *url;
85   gchar              *url_str;
86   GstRTSPConnection  *connection;
87   gboolean            connected;
88   gboolean            flushing;
89
90   GMutex              send_lock;
91   GMutex              recv_lock;
92 };
93
94 typedef struct _GstRTSPStreamInfo GstRTSPStreamInfo;
95 typedef struct _GstRTSPStreamContext GstRTSPStreamContext;
96
97 struct _GstRTSPStreamContext {
98   GstRTSPClientSink *parent;
99
100   guint index;
101   /* Index of the SDPMedia in the stored SDP */
102   guint sdp_index;
103
104   GstElement *payloader;
105   guint payloader_block_id;
106   gboolean prerolled;
107
108   /* Stream management object */
109   GstRTSPStream *stream;
110   gboolean joined;
111
112   /* Secure profile key mgmt */
113   GstCaps      *srtcpparams;
114
115   /* per stream connection */
116   GstRTSPConnInfo  conninfo;
117   /* For interleaved mode */
118   guint8        channel[2];
119
120   GstRTSPStreamTransport *stream_transport;
121 };
122
123 /**
124  * GstRTSPNatMethod:
125  * @GST_RTSP_NAT_NONE: none
126  * @GST_RTSP_NAT_DUMMY: send dummy packets
127  *
128  * Different methods for trying to traverse firewalls.
129  */
130 typedef enum
131 {
132   GST_RTSP_NAT_NONE,
133   GST_RTSP_NAT_DUMMY
134 } GstRTSPNatMethod;
135
136 struct _GstRTSPClientSink {
137   GstBin           parent;
138
139   /* task and mutex for interleaved mode */
140   gboolean         interleaved;
141   GstTask         *task;
142   GRecMutex        stream_rec_lock;
143   GstSegment       segment;
144   gint             free_channel;
145
146   /* UDP mode loop */
147   gint             pending_cmd;
148   gint             busy_cmd;
149   gboolean         ignore_timeout;
150   gboolean         open_error;
151
152   /* mutex for protecting state changes */
153   GRecMutex        state_rec_lock;
154
155   GstSDPMessage    *uri_sdp;
156   gboolean         from_sdp;
157
158   /* properties */
159   GstRTSPLowerTrans protocols;
160   gboolean          debug;
161   guint             retry;
162   guint64           udp_timeout;
163   GTimeVal          tcp_timeout;
164   GTimeVal         *ptcp_timeout;
165   guint             latency;
166   gboolean          do_rtsp_keep_alive;
167   gchar            *proxy_host;
168   guint             proxy_port;
169   gchar            *proxy_user;        /* from url or property */
170   gchar            *proxy_passwd;      /* from url or property */
171   gchar            *prop_proxy_id;     /* set via property */
172   gchar            *prop_proxy_pw;     /* set via property */
173   guint             rtp_blocksize;
174   gchar            *user_id;
175   gchar            *user_pw;
176   GstRTSPRange      client_port_range;
177   gint              udp_buffer_size;
178   gboolean          udp_reconnect;
179   gchar            *multi_iface;
180   gboolean          ntp_sync;
181   gboolean          use_pipeline_clock;
182   GstStructure     *sdes;
183   GTlsCertificateFlags tls_validation_flags;
184   GTlsDatabase     *tls_database;
185   GTlsInteraction  *tls_interaction;
186   gint              ntp_time_source;
187   gchar            *user_agent;
188
189   /* state */
190   GstRTSPState       state;
191   gchar             *content_base;
192   GstRTSPLowerTrans  cur_protocols;
193   gboolean           tried_url_auth;
194   gchar             *addr;
195   gboolean           need_redirect;
196   GstRTSPTimeRange  *range;
197   gchar             *control;
198   guint              next_port_num;
199   GstClock          *provided_clock;
200
201   /* supported methods */
202   gint               methods;
203
204   /* session management */
205   GstRTSPConnInfo  conninfo;
206
207   /* Everything goes in an internal
208    * locked-state bin */
209   GstBin          *internal_bin;
210   /* Set to true when internal bin state
211    * >= PAUSED */
212   gboolean        prerolled;
213
214   /* TRUE if we posted async-start */
215   gboolean         in_async;
216
217   /* TRUE when stream info has been collected */
218   gboolean         streams_collected;
219
220   guint            next_pad_id;
221   gint             next_dyn_pt;
222
223   GstElement      *rtpbin;
224
225   GList           *contexts;
226   GstSDPMessage   cursdp;
227
228   GMutex          send_lock;
229
230   GMutex          preroll_lock;
231   GCond           preroll_cond;
232
233   GstClockTime    rtx_time;
234
235   GstRTSPProfile profiles;
236   gchar          *server_ip;
237 };
238
239 struct _GstRTSPClientSinkClass {
240   GstBinClass parent_class;
241 };
242
243 GType gst_rtsp_client_sink_get_type(void);
244
245 G_END_DECLS
246
247 #endif /* __GST_RTSP_CLIENT_SINK_H__ */