diff options
-rw-r--r-- | farstream/Makefile.am | 6 | ||||
-rw-r--r-- | farstream/fs-codec.c | 4 | ||||
-rw-r--r-- | farstream/fs-session.c | 2 | ||||
-rw-r--r-- | farstream/fs-session.h | 2 | ||||
-rw-r--r-- | farstream/fs-stream.c | 2 | ||||
-rw-r--r-- | gst/fsrtpconference/fs-rtp-codec-specific.c | 2 | ||||
-rw-r--r-- | gst/fsrtpconference/fs-rtp-discover-codecs.c | 21 | ||||
-rw-r--r-- | gst/fsrtpconference/fs-rtp-session.c | 4 | ||||
-rw-r--r-- | transmitters/nice/fs-nice-stream-transmitter.c | 48 |
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; } |