summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--farstream/Makefile.am6
-rw-r--r--farstream/fs-codec.c4
-rw-r--r--farstream/fs-session.c2
-rw-r--r--farstream/fs-session.h2
-rw-r--r--farstream/fs-stream.c2
-rw-r--r--gst/fsrtpconference/fs-rtp-codec-specific.c2
-rw-r--r--gst/fsrtpconference/fs-rtp-discover-codecs.c21
-rw-r--r--gst/fsrtpconference/fs-rtp-session.c4
-rw-r--r--transmitters/nice/fs-nice-stream-transmitter.c48
9 files changed, 74 insertions, 17 deletions
diff --git a/farstream/Makefile.am b/farstream/Makefile.am
index 0e156bb6..510c39c2 100644
--- a/farstream/Makefile.am
+++ b/farstream/Makefile.am
@@ -91,8 +91,10 @@ Farstream_@FS_API_VERSION@_gir_LIBS = libfarstream-@FS_APIVERSION@.la
Farstream_@FS_API_VERSION@_gir_FILES = $(introspection_sources)
Farstream_@FS_API_VERSION@_gir_INCLUDES = GObject-2.0 Gst-@GST_API_VERSION@
Farstream_@FS_API_VERSION@_gir_CFLAGS = $(FS_INTERNAL_CFLAGS)
-Farstream_@FS_API_VERSION@_gir_SCANNERFLAGS = --identifier-prefix=fs_ \
- --identifier-prefix=Fs --add-init-section="gst_init(NULL,NULL);"
+Farstream_@FS_API_VERSION@_gir_SCANNERFLAGS = --symbol-prefix=fs \
+ --identifier-prefix=Fs --add-init-section="gst_init(NULL,NULL);" \
+ --pkg-export=farstream-@FS_APIVERSION@ \
+ $(foreach hdr,$(public_headers),--c-include=$(hdr))
Farstream_@FS_API_VERSION@_gir_LDFLAGS = $(GST_LIBS)
girdir = $(datadir)/gir-1.0
diff --git a/farstream/fs-codec.c b/farstream/fs-codec.c
index dc2c399a..3ee60f4a 100644
--- a/farstream/fs-codec.c
+++ b/farstream/fs-codec.c
@@ -80,13 +80,13 @@ fs_codec_list_get_type (void)
G_DEFINE_BOXED_TYPE (FsCodecParameter,
fs_codec_parameter,
fs_codec_parameter_copy,
- fs_codec_parameter_free);
+ fs_codec_parameter_free)
G_DEFINE_BOXED_TYPE (FsFeedbackParameter,
fs_feedback_parameter,
fs_feedback_parameter_copy,
- fs_feedback_parameter_free);
+ fs_feedback_parameter_free)
/**
* fs_codec_new:
diff --git a/farstream/fs-session.c b/farstream/fs-session.c
index 2289c3e4..8ff6c117 100644
--- a/farstream/fs-session.c
+++ b/farstream/fs-session.c
@@ -184,7 +184,7 @@ struct _FsSessionPrivate
(G_TYPE_INSTANCE_GET_PRIVATE ((o), FS_TYPE_SESSION, FsSessionPrivate))
*/
-G_DEFINE_ABSTRACT_TYPE(FsSession, fs_session, G_TYPE_OBJECT);
+G_DEFINE_ABSTRACT_TYPE(FsSession, fs_session, G_TYPE_OBJECT)
static void fs_session_get_property (GObject *object,
guint prop_id,
diff --git a/farstream/fs-session.h b/farstream/fs-session.h
index 52b62f76..6488c072 100644
--- a/farstream/fs-session.h
+++ b/farstream/fs-session.h
@@ -151,7 +151,7 @@ struct _FsSessionClass
GstStructure *parameters, GError **error);
/*< private >*/
- gpointer _padding[7];
+ gpointer _padding[6];
};
/**
diff --git a/farstream/fs-stream.c b/farstream/fs-stream.c
index 2b05a9c3..1319a860 100644
--- a/farstream/fs-stream.c
+++ b/farstream/fs-stream.c
@@ -145,7 +145,7 @@ struct _FsStreamPrivate
(G_TYPE_INSTANCE_GET_PRIVATE ((o), FS_TYPE_STREAM, FsStreamPrivate))
-G_DEFINE_ABSTRACT_TYPE(FsStream, fs_stream, G_TYPE_OBJECT);
+G_DEFINE_ABSTRACT_TYPE(FsStream, fs_stream, G_TYPE_OBJECT)
static void fs_stream_constructed (GObject *obj);
static void fs_stream_get_property (GObject *object,
diff --git a/gst/fsrtpconference/fs-rtp-codec-specific.c b/gst/fsrtpconference/fs-rtp-codec-specific.c
index f29179dc..20767d18 100644
--- a/gst/fsrtpconference/fs-rtp-codec-specific.c
+++ b/gst/fsrtpconference/fs-rtp-codec-specific.c
@@ -1484,7 +1484,7 @@ param_h264_profile_level_id (const struct SdpParam *sdp_param,
local_level_idc = 0xFF & local_value;
nego_level_idc = MIN (remote_level_idc, local_level_idc);
- g_snprintf (buf, 7, "%02hhX%02hhX%02hhX", local_profile_idc, nego_profile_iop,
+ g_snprintf (buf, 7, "%02X%02X%02X", local_profile_idc, nego_profile_iop,
nego_level_idc);
fs_codec_add_optional_parameter (negotiated_codec, sdp_param->name, buf);
diff --git a/gst/fsrtpconference/fs-rtp-discover-codecs.c b/gst/fsrtpconference/fs-rtp-discover-codecs.c
index ee755335..f02172fd 100644
--- a/gst/fsrtpconference/fs-rtp-discover-codecs.c
+++ b/gst/fsrtpconference/fs-rtp-discover-codecs.c
@@ -86,6 +86,7 @@ static void codec_blueprints_add_caps (FsMediaType media_type);
static GList *list_codec_blueprints[FS_MEDIA_TYPE_LAST+1] = { NULL };
static gint codecs_lists_ref[FS_MEDIA_TYPE_LAST+1] = { 0 };
+G_LOCK_DEFINE_STATIC (codecs_lists);
static void
@@ -225,6 +226,7 @@ fs_rtp_blueprints_get (FsMediaType media_type, GError **error)
GstCaps *caps;
GList *recv_list = NULL;
GList *send_list = NULL;
+ GList *ret = NULL;
if (media_type > FS_MEDIA_TYPE_LAST)
{
@@ -233,6 +235,8 @@ fs_rtp_blueprints_get (FsMediaType media_type, GError **error)
return NULL;
}
+ G_LOCK (codecs_lists);
+
codecs_lists_ref[media_type]++;
/* if already computed just return list */
@@ -242,13 +246,15 @@ fs_rtp_blueprints_get (FsMediaType media_type, GError **error)
g_set_error (error, FS_ERROR, FS_ERROR_NO_CODECS,
"No codecs for media type %s detected",
fs_media_type_to_string (media_type));
- return list_codec_blueprints[media_type];
+ ret = list_codec_blueprints[media_type];
+ goto out;
}
list_codec_blueprints[media_type] = load_codecs_cache (media_type);
if (list_codec_blueprints[media_type]) {
GST_DEBUG ("Loaded codec blueprints from cache file");
- return list_codec_blueprints[media_type];
+ ret = list_codec_blueprints[media_type];
+ goto out;
}
/* caps used to find the payloaders and depayloaders based on media type */
@@ -272,7 +278,7 @@ fs_rtp_blueprints_get (FsMediaType media_type, GError **error)
g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
"Invalid media type given to load_codecs");
codecs_lists_ref[media_type]--;
- return NULL;
+ goto out;
}
recv_list = detect_recv_codecs (caps);
@@ -295,14 +301,17 @@ fs_rtp_blueprints_get (FsMediaType media_type, GError **error)
/* Save the codecs blueprint cache */
save_codecs_cache (media_type, list_codec_blueprints[media_type]);
+ ret = list_codec_blueprints[media_type];
out:
+ G_UNLOCK (codecs_lists);
+
if (recv_list)
codec_cap_list_free (recv_list);
if (send_list)
codec_cap_list_free (send_list);
- return list_codec_blueprints[media_type];
+ return ret;
}
static gboolean
@@ -1059,6 +1068,8 @@ codec_blueprint_destroy (CodecBlueprint *codec_blueprint)
void
fs_rtp_blueprints_unref (FsMediaType media_type)
{
+ G_LOCK (codecs_lists);
+
codecs_lists_ref[media_type]--;
if (!codecs_lists_ref[media_type])
{
@@ -1074,6 +1085,8 @@ fs_rtp_blueprints_unref (FsMediaType media_type)
list_codec_blueprints[media_type] = NULL;
}
}
+
+ G_UNLOCK (codecs_lists);
}
diff --git a/gst/fsrtpconference/fs-rtp-session.c b/gst/fsrtpconference/fs-rtp-session.c
index 8a20180f..a465cfa0 100644
--- a/gst/fsrtpconference/fs-rtp-session.c
+++ b/gst/fsrtpconference/fs-rtp-session.c
@@ -1167,7 +1167,7 @@ _rtpbin_request_encoder (GstElement *rtpbin, guint session_id,
{
FsRtpSession *self = FS_RTP_SESSION (user_data);
- if (self->id == session_id) {
+ if (self->id == session_id && self->priv->srtpenc) {
return gst_object_ref (self->priv->srtpenc);
} else {
return NULL;
@@ -1180,7 +1180,7 @@ _rtpbin_request_decoder (GstElement *rtpbin, guint session_id,
{
FsRtpSession *self = FS_RTP_SESSION (user_data);
- if (self->id == session_id)
+ if (self->id == session_id && self->priv->srtpdec)
return gst_object_ref (self->priv->srtpdec);
else
return NULL;
diff --git a/transmitters/nice/fs-nice-stream-transmitter.c b/transmitters/nice/fs-nice-stream-transmitter.c
index 82bba32b..791d17ac 100644
--- a/transmitters/nice/fs-nice-stream-transmitter.c
+++ b/transmitters/nice/fs-nice-stream-transmitter.c
@@ -66,6 +66,8 @@ enum
PROP_COMPATIBILITY_MODE,
PROP_ASSOCIATE_ON_SOURCE,
PROP_RELAY_INFO,
+ PROP_MIN_PORT,
+ PROP_MAX_PORT,
PROP_DEBUG
};
@@ -77,6 +79,9 @@ struct _FsNiceStreamTransmitterPrivate
guint stream_id;
+ guint min_port;
+ guint max_port;
+
gchar *stun_ip;
guint stun_port;
@@ -361,6 +366,27 @@ fs_nice_stream_transmitter_class_init (FsNiceStreamTransmitterClass *klass)
FALSE,
G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MIN_PORT,
+ g_param_spec_uint (
+ "min-port",
+ "Minimal listen port",
+ "Minimal port number for allocating host candidates."
+ " 0 means use any port",
+ 0, 65535,
+ 0,
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_PORT,
+ g_param_spec_uint (
+ "max-port",
+ "Maximal listen port",
+ "Maximal port number for allocating host candidates."
+ " It should apply that min-port < max-port; otherwise, any port is"
+ " used, just as when the value is 0",
+ 0, 65535,
+ 0,
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
}
static void
@@ -574,6 +600,12 @@ fs_nice_stream_transmitter_set_property (GObject *object,
case PROP_RELAY_INFO:
self->priv->relay_info = g_value_dup_boxed (value);
break;
+ case PROP_MIN_PORT:
+ self->priv->min_port = g_value_get_uint (value);
+ break;
+ case PROP_MAX_PORT:
+ self->priv->max_port = g_value_get_uint (value);
+ break;
case PROP_DEBUG:
if (g_value_get_boolean (value)) {
nice_debug_enable (TRUE);
@@ -1387,6 +1419,17 @@ fs_nice_stream_transmitter_build (FsNiceStreamTransmitter *self,
}
}
+ /* Set a port range if it has been specified. */
+ if (self->priv->min_port && (self->priv->min_port < self->priv->max_port))
+ {
+ gint c;
+ for (c = 1; c <= self->priv->transmitter->components; c++)
+ {
+ nice_agent_set_port_range (self->priv->agent->agent,
+ self->priv->stream_id, c, self->priv->min_port, self->priv->max_port);
+ }
+ }
+
self->priv->state_changed_handler_id = g_signal_connect_object (agent->agent,
"component-state-changed", G_CALLBACK (agent_state_changed), self, 0);
self->priv->gathering_done_handler_id = g_signal_connect_object (agent->agent,
@@ -1697,7 +1740,6 @@ agent_new_candidate (NiceAgent *agent,
}
else
{
- FS_NICE_STREAM_TRANSMITTER_UNLOCK (self);
GST_WARNING ("Could not find local candidate with foundation %s"
" for component %d in stream %d", foundation, component_id,
stream_id);
@@ -1851,7 +1893,7 @@ known_buffer_have_buffer_handler (GstPad *pad, GstPadProbeInfo *info,
GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info);
if (!g_atomic_int_get (&self->priv->associate_on_source))
- return TRUE;
+ return GST_PAD_PROBE_OK;
component_id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (pad),
"component-id"));
@@ -1859,5 +1901,5 @@ known_buffer_have_buffer_handler (GstPad *pad, GstPadProbeInfo *info,
g_signal_emit_by_name (self, "known-source-packet-received", component_id,
buffer);
- return TRUE;
+ return GST_PAD_PROBE_OK;
}