Name: %{_name}
Version: 1.22.8
-Release: 4
+Release: 5
Summary: Streaming-Media Framework Runtime
License: LGPL-2.0+
Group: Multimedia/Framework
+extra_defs = []
+
rtsp_server_sources = files(
'rtsp-address-pool.c',
'rtsp-auth.c',
install : true,
dependencies : gst_rtsp_server_deps)
+extra_defs += ['-DTIZEN_FEATURE_RTSP_SERVER_MODIFICATION']
+
library_def = {'lib': gst_rtsp_server}
pkg_name = 'gstreamer-rtsp-server-' + api_version
pkgconfig.generate(gst_rtsp_server,
libraries : [gst_dep],
subdirs : pkgconfig_subdirs,
+ extra_cflags : extra_defs,
name : 'gstreamer-rtsp-server-1.0',
description : 'GStreamer based RTSP server',
)
GstRTSPContext * ctx);
static gchar *default_make_path_from_uri (GstRTSPClient * client,
const GstRTSPUrl * uri);
+
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
static gboolean default_handle_options_request (GstRTSPClient * client,
GstRTSPContext * ctx, GstRTSPVersion version);
static gboolean default_handle_set_param_request (GstRTSPClient * client,
GstRTSPContext * ctx);
static gboolean default_handle_play_request (GstRTSPClient * client,
GstRTSPContext * ctx);
+#endif
static void client_session_removed (GstRTSPSessionPool * pool,
GstRTSPSession * session, GstRTSPClient * client);
klass->params_set = default_params_set;
klass->params_get = default_params_get;
klass->make_path_from_uri = default_make_path_from_uri;
+
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
klass->handle_options_request = default_handle_options_request;
klass->handle_set_param_request = default_handle_set_param_request;
klass->handle_get_param_request = default_handle_get_param_request;
klass->handle_play_request = default_handle_play_request;
+#endif
klass->pre_options_request = default_pre_signal_handler;
klass->pre_describe_request = default_pre_signal_handler;
}
static gboolean
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
default_handle_get_param_request (GstRTSPClient * client, GstRTSPContext * ctx)
+#else
+handle_get_param_request (GstRTSPClient * client, GstRTSPContext * ctx)
+#endif
{
GstRTSPResult res;
guint8 *data;
}
static gboolean
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
default_handle_set_param_request (GstRTSPClient * client, GstRTSPContext * ctx)
+#else
+handle_set_param_request (GstRTSPClient * client, GstRTSPContext * ctx)
+#endif
{
GstRTSPResult res;
guint8 *data;
}
static gboolean
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
default_handle_play_request (GstRTSPClient * client, GstRTSPContext * ctx)
+#else
+handle_play_request (GstRTSPClient * client, GstRTSPContext * ctx)
+#endif
{
GstRTSPSession *session;
GstRTSPClientClass *klass;
st = make_server_transport (client, media, ctx, ct);
trans_str = gst_rtsp_transport_as_text (st);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
/* FIXME-WFD : Temporarily force to set profile string */
trans_str = g_strjoinv ("RTP/AVP/UDP", g_strsplit (trans_str, "RTP/AVP", -1));
+#endif
gst_rtsp_transport_free (st);
}
static gboolean
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
default_handle_options_request (GstRTSPClient * client, GstRTSPContext * ctx,
+#else
+handle_options_request (GstRTSPClient * client, GstRTSPContext * ctx,
+#endif
GstRTSPVersion version)
{
GstRTSPMethod options;
GstRTSPMessage response = { 0 };
gchar *unsupported_reqs = NULL;
gchar *sessid = NULL, *pipelined_request_id = NULL;
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
GstRTSPClientClass *klass;
klass = GST_RTSP_CLIENT_GET_CLASS (client);
+#endif
if (!(ctx = gst_rtsp_context_get_current ())) {
ctx = &sctx;
ctx->auth = priv->auth;
switch (method) {
case GST_RTSP_OPTIONS:
priv->version = version;
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
klass->handle_options_request (client, ctx, version);
+#else
+ handle_options_request (client, ctx, version);
+#endif
break;
case GST_RTSP_DESCRIBE:
handle_describe_request (client, ctx);
handle_setup_request (client, ctx);
break;
case GST_RTSP_PLAY:
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
klass->handle_play_request (client, ctx);
+#else
+ handle_play_request (client, ctx);
+#endif
break;
case GST_RTSP_PAUSE:
handle_pause_request (client, ctx);
handle_teardown_request (client, ctx);
break;
case GST_RTSP_SET_PARAMETER:
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
klass->handle_set_param_request (client, ctx);
+#else
+ handle_set_param_request (client, ctx);
+#endif
break;
case GST_RTSP_GET_PARAMETER:
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
klass->handle_get_param_request (client, ctx);
+#else
+ handle_get_param_request (client, ctx);
+#endif
break;
case GST_RTSP_ANNOUNCE:
if (version >= GST_RTSP_VERSION_2_0)
} else {
priv->is_ipv6 = g_socket_get_family (read_socket) == G_SOCKET_FAMILY_IPV6;
priv->server_ip = g_strdup ("unknown");
+#ifdef TIZEN_FEATURE_BUG_FIX
g_object_unref (address);
+#endif
}
GST_INFO ("client %p connected to server ip %s, ipv6 = %d", client,
return result;
}
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
/**
* gst_rtsp_client_set_watch_flushing:
* @client: a #GstRTSPClient
gst_rtsp_watch_set_flushing (priv->watch, val);
}
}
+#endif
GstRTSPResult (*params_set) (GstRTSPClient *client, GstRTSPContext *ctx);
GstRTSPResult (*params_get) (GstRTSPClient *client, GstRTSPContext *ctx);
gchar * (*make_path_from_uri) (GstRTSPClient *client, const GstRTSPUrl *uri);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
gboolean (*handle_options_request) (GstRTSPClient * client, GstRTSPContext * ctx, GstRTSPVersion version);
gboolean (*handle_set_param_request) (GstRTSPClient * client, GstRTSPContext * ctx);
gboolean (*handle_get_param_request) (GstRTSPClient * client, GstRTSPContext * ctx);
gboolean (*handle_play_request) (GstRTSPClient * client, GstRTSPContext * ctx);
+#endif
GstRTSPStatusCode (*adjust_play_mode) (GstRTSPClient * client,
GstRTSPContext * context,
GstRTSPTimeRange ** range,
GstRTSPSession *session,
GstRTSPMessage *message);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
GST_RTSP_SERVER_API
void gst_rtsp_client_set_watch_flushing (GstRTSPClient * client, gboolean val);
+#endif
/**
* GstRTSPClientSessionFilterFunc:
* @client: a #GstRTSPClient object
{
g_critical ("can't create uridecodebin element");
gst_object_unref (element);
+#ifdef TIZEN_FEATURE_BUG_FIX
gst_object_unref (topbin);
+#endif
return NULL;
}
}
SIGNAL_TARGET_STATE,
SIGNAL_NEW_STATE,
SIGNAL_HANDLE_MESSAGE,
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
SIGNAL_PREPARING,
SIGNAL_UNPREPARING,
+#endif
SIGNAL_LAST
};
GstMessage * message);
static void finish_unprepare (GstRTSPMedia * media);
static gboolean default_prepare (GstRTSPMedia * media, GstRTSPThread * thread);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
static gboolean default_start_preroll (GstRTSPMedia * media);
+#endif
static gboolean default_unprepare (GstRTSPMedia * media);
static gboolean default_suspend (GstRTSPMedia * media);
static gboolean default_unsuspend (GstRTSPMedia * media);
static gboolean default_setup_sdp (GstRTSPMedia * media, GstSDPMessage * sdp,
GstSDPInfo * info);
static gboolean default_handle_sdp (GstRTSPMedia * media, GstSDPMessage * sdp);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
static gboolean default_start_prepare (GstRTSPMedia * media);
+#endif
static gboolean wait_preroll (GstRTSPMedia * media);
handle_message), NULL, NULL, NULL, G_TYPE_BOOLEAN, 1,
GST_TYPE_MESSAGE);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
gst_rtsp_media_signals[SIGNAL_PREPARING] =
g_signal_new ("preparing", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstRTSPMediaClass, preparing), NULL, NULL,
G_STRUCT_OFFSET (GstRTSPMediaClass, unpreparing), NULL, NULL,
NULL, G_TYPE_NONE, 2, GST_TYPE_RTSP_STREAM,
G_TYPE_UINT);
+#endif
GST_DEBUG_CATEGORY_INIT (rtsp_media_debug, "rtspmedia", 0, "GstRTSPMedia");
klass->handle_message = default_handle_message;
klass->prepare = default_prepare;
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
klass->start_preroll = default_start_preroll;
+#endif
klass->unprepare = default_unprepare;
klass->suspend = default_suspend;
klass->unsuspend = default_unsuspend;
klass->create_rtpbin = default_create_rtpbin;
klass->setup_sdp = default_setup_sdp;
klass->handle_sdp = default_handle_sdp;
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
klass->start_prepare = default_start_prepare;
+#endif
}
static void
priv->blocking_msg_received = 0;
}
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
void
+#else
+static void
+#endif
gst_rtsp_media_set_status (GstRTSPMedia * media, GstRTSPMediaStatus status)
{
GstRTSPMediaPrivate *priv = media->priv;
media);
ret = gst_element_set_state (priv->pipeline, state);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
{
gchar *filename = NULL;
filename = g_strdup_printf ("media_%s", gst_element_state_get_name (state));
g_free (filename);
}
+#endif
return ret;
}
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
GstStateChangeReturn
gst_rtsp_media_set_target_state (GstRTSPMedia * media, GstState state, gboolean do_state)
+#else
+static GstStateChangeReturn
+set_target_state (GstRTSPMedia * media, GstState state, gboolean do_state)
+#endif
{
GstRTSPMediaPrivate *priv = media->priv;
GstStateChangeReturn ret;
};
static gboolean
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
default_start_preroll (GstRTSPMedia * media)
+#else
+start_preroll (GstRTSPMedia * media)
+#endif
{
GstRTSPMediaPrivate *priv = media->priv;
GstStateChangeReturn ret;
/* start blocked since it is possible that there are no sink elements yet */
media_streams_set_blocked (media, TRUE);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
ret = gst_rtsp_media_set_target_state (media, GST_STATE_PAUSED, TRUE);
+#else
+ ret = set_target_state (media, GST_STATE_PAUSED, TRUE);
+#endif
switch (ret) {
case GST_STATE_CHANGE_SUCCESS:
}
static gboolean
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
default_start_prepare (GstRTSPMedia * media)
+#else
+start_prepare (GstRTSPMedia * media)
+#endif
{
GstRTSPMediaPrivate *priv = media->priv;
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
GstRTSPMediaClass *klass;
+#endif
guint i;
GList *walk;
g_signal_connect (priv->rtpbin, "request-fec-decoder",
G_CALLBACK (request_fec_decoder), media);
-
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
klass = GST_RTSP_MEDIA_GET_CLASS (media);
+#endif
/* link streams we already have, other streams might appear when we have
* dynamic elements */
goto join_bin_failed;
}
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
g_signal_emit (media, gst_rtsp_media_signals[SIGNAL_PREPARING], 0, stream,
i, NULL);
+#endif
}
if (priv->rtpbin)
* a second ASYNC state change failing */
priv->is_live = TRUE;
gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_PREPARED);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
} else if (!klass->start_preroll (media)) {
+#else
+ } else if (!start_preroll (media)) {
+#endif
goto preroll_failed;
}
/* do remainder in context */
source = g_idle_source_new ();
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
if (klass->start_prepare)
g_source_set_callback (source, (GSourceFunc) klass->start_prepare,
g_object_ref (media), (GDestroyNotify) g_object_unref);
+#else
+ g_source_set_callback (source, (GSourceFunc) start_prepare,
+ g_object_ref (media), (GDestroyNotify) g_object_unref);
+#endif
g_source_attach (source, context);
g_source_unref (source);
gst_rtsp_stream_leave_bin (stream, GST_BIN (priv->pipeline), priv->rtpbin);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
g_signal_emit (media, gst_rtsp_media_signals[SIGNAL_UNPREPARING], 0, stream,
i, NULL);
+#endif
}
/* remove the pad signal handlers */
goto is_unpreparing;
GST_INFO ("unprepare media %p", media);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
gst_rtsp_media_set_target_state (media, GST_STATE_NULL, FALSE);
+#else
+ set_target_state (media, GST_STATE_NULL, FALSE);
+#endif
success = TRUE;
if (priv->status == GST_RTSP_MEDIA_STATUS_PREPARED
break;
case GST_RTSP_SUSPEND_MODE_PAUSE:
GST_DEBUG ("media %p suspend to PAUSED", media);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
ret = gst_rtsp_media_set_target_state (media, GST_STATE_PAUSED, TRUE);
+#else
+ ret = set_target_state (media, GST_STATE_PAUSED, TRUE);
+#endif
if (ret == GST_STATE_CHANGE_FAILURE)
goto state_failed;
break;
case GST_RTSP_SUSPEND_MODE_RESET:
GST_DEBUG ("media %p suspend to NULL", media);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
ret = gst_rtsp_media_set_target_state (media, GST_STATE_NULL, TRUE);
+#else
+ ret = set_target_state (media, GST_STATE_NULL, TRUE);
+#endif
if (ret == GST_STATE_CHANGE_FAILURE)
goto state_failed;
/* Because payloader needs to set the sequence number as
{
GstRTSPMediaPrivate *priv = media->priv;
gboolean preroll_ok;
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
GstRTSPMediaClass *klass;
klass = GST_RTSP_MEDIA_GET_CLASS (media);
+#endif
switch (priv->suspend_mode) {
case GST_RTSP_SUSPEND_MODE_NONE:
* specific transport parts: all active streams contain at least one sink
* element and it's safe to unblock all blocked streams */
media_streams_set_blocked (media, FALSE);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
if (klass->start_preroll)
if (!klass->start_preroll (media))
goto start_failed;
+#else
+ if (!start_preroll (media))
+ goto start_failed;
+#endif
g_rec_mutex_unlock (&priv->state_lock);
preroll_ok = wait_preroll (media);
gst_rtsp_media_unprepare (media);
} else {
GST_INFO ("state %s media %p", gst_element_state_get_name (state), media);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
gst_rtsp_media_set_target_state (media, state, FALSE);
+#else
+ set_target_state (media, state, FALSE);
+#endif
if (state == GST_STATE_PLAYING) {
/* make sure pads are not blocking anymore when going to PLAYING */
return res;
}
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
GstElement *
gst_rtsp_media_get_pipeline (GstRTSPMedia * media)
{
return priv->rtpbin;
}
+#endif
/* vmethods */
gboolean (*handle_message) (GstRTSPMedia *media, GstMessage *message);
gboolean (*prepare) (GstRTSPMedia *media, GstRTSPThread *thread);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
gboolean (*start_preroll) (GstRTSPMedia *media);
+#endif
gboolean (*unprepare) (GstRTSPMedia *media);
gboolean (*suspend) (GstRTSPMedia *media);
gboolean (*unsuspend) (GstRTSPMedia *media);
GstElement * (*create_rtpbin) (GstRTSPMedia *media);
gboolean (*setup_rtpbin) (GstRTSPMedia *media, GstElement *rtpbin);
gboolean (*setup_sdp) (GstRTSPMedia *media, GstSDPMessage *sdp, GstSDPInfo *info);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
gboolean (*start_prepare) (GstRTSPMedia *media);
+#endif
/* signals */
void (*new_stream) (GstRTSPMedia *media, GstRTSPStream * stream);
gboolean (*handle_sdp) (GstRTSPMedia *media, GstSDPMessage *sdp);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
void (*preparing) (GstRTSPMedia *media, GstRTSPStream * stream, guint idx);
void (*unpreparing) (GstRTSPMedia *media, GstRTSPStream * stream, guint idx);
+#endif
+
/*< private >*/
gpointer _gst_reserved[GST_PADDING_LARGE-1];
};
void gst_rtsp_media_set_pipeline_state (GstRTSPMedia * media,
GstState state);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
GST_RTSP_SERVER_API
GstStateChangeReturn gst_rtsp_media_set_target_state (GstRTSPMedia * media, GstState state, gboolean do_state);
GST_RTSP_SERVER_API
GstElement * gst_rtsp_media_get_rtpbin (GstRTSPMedia * media);
+#endif
GST_RTSP_SERVER_API
gboolean gst_rtsp_media_complete_pipeline (GstRTSPMedia * media, GPtrArray * transports);
GObjectClass parent_class;
GstRTSPClient * (*create_client) (GstRTSPServer *server);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
GSocket * (*create_socket) (GstRTSPServer * server, GCancellable * cancellable, GError ** error);
+#endif
/* signals */
void (*client_connected) (GstRTSPServer *server, GstRTSPClient *client);
NULL, NULL, NULL, G_TYPE_NONE, 1, GST_TYPE_RTSP_CLIENT);
klass->create_client = default_create_client;
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
klass->create_socket = gst_rtsp_server_create_socket;
+#endif
GST_DEBUG_CATEGORY_INIT (rtsp_server_debug, "rtspserver", 0, "GstRTSPServer");
}
GCancellable * cancellable, GError ** error)
{
GstRTSPServerPrivate *priv;
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
GstRTSPServerClass *klass;
GSocket *socket = NULL, *old;
+#else
+ GSocket *socket, *old;
+#endif
GSource *source;
g_return_val_if_fail (GST_IS_RTSP_SERVER (server), NULL);
priv = server->priv;
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
klass = GST_RTSP_SERVER_GET_CLASS (server);
if (klass->create_socket)
socket = klass->create_socket (server, NULL, error);
+#else
+ socket = gst_rtsp_server_create_socket (server, NULL, error);
+#endif
if (socket == NULL)
goto no_socket;
SIGNAL_NEW_RTP_ENCODER,
SIGNAL_NEW_RTCP_ENCODER,
SIGNAL_NEW_RTP_RTCP_DECODER,
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
SIGNAL_RTCP_STATS,
+#endif
SIGNAL_LAST
};
g_signal_new ("new-rtp-rtcp-decoder", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, GST_TYPE_ELEMENT);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
gst_rtsp_stream_signals[SIGNAL_RTCP_STATS] =
g_signal_new ("rtcp-statistics", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_generic,
G_TYPE_NONE, 1, GST_TYPE_STRUCTURE);
+#endif
GST_DEBUG_CATEGORY_INIT (rtsp_stream_debug, "rtspstream", 0, "GstRTSPStream");
dump_structure (stats);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
g_signal_emit (stream, gst_rtsp_stream_signals[SIGNAL_RTCP_STATS], 0,
stats);
+#endif
rtcp_from = gst_structure_get_string (stats, "rtcp-from");
if ((trans = find_transport (stream, rtcp_from))) {
GstStructure *stats;
g_object_get (source, "stats", &stats, NULL);
if (stats) {
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
g_signal_emit (stream, gst_rtsp_stream_signals[SIGNAL_RTCP_STATS], 0,
stats);
+#endif
dump_structure (stats);
gst_structure_free (stats);
return seqnum;
}
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
guint64
gst_rtsp_stream_get_udp_sent_bytes (GstRTSPStream * stream)
{
return bytes;
}
+#endif
/**
* gst_rtsp_stream_transport_filter:
GST_RTSP_SERVER_API
guint16 gst_rtsp_stream_get_current_seqnum (GstRTSPStream *stream);
+#ifdef TIZEN_FEATURE_RTSP_SERVER_MODIFICATION
GST_RTSP_SERVER_API
guint64 gst_rtsp_stream_get_udp_sent_bytes (GstRTSPStream *stream);
+#endif
GST_RTSP_SERVER_API
void gst_rtsp_stream_set_retransmission_time (GstRTSPStream *stream, GstClockTime time);
endif
# TIZEN_BUILD_OPTION
+cdata.set('TIZEN_FEATURE_RTSP_SERVER_MODIFICATION', true)
cdata.set('TIZEN_FEATURE_BUG_FIX', true)
if get_option('tv-profile')