diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2008-04-30 17:16:47 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2008-04-30 17:16:47 +0000 |
commit | dc920d924b0aae4e4fa8c50abfa30163d8bfb72f (patch) | |
tree | f716ae3938426262e301cf48207d1722f0fddb2b | |
parent | a7de0e326a9e5937cb00d63afdf20843617d2273 (diff) |
gst/realmedia/rtspreal.*: Move assembly rule parsing to the place where we parse the SDP as it's also there that we c...
Original commit message from CVS:
* gst/realmedia/rtspreal.c: (rtsp_ext_real_before_send),
(rtsp_ext_real_parse_sdp), (rtsp_ext_real_stream_select):
* gst/realmedia/rtspreal.h:
Move assembly rule parsing to the place where we parse the SDP as it's
also there that we create the MDPR and we need the currently selected
asmrule in order to select the right MTLI.
Fixes #529359.
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | gst/realmedia/rtspreal.c | 70 | ||||
-rw-r--r-- | gst/realmedia/rtspreal.h | 2 |
3 files changed, 47 insertions, 35 deletions
@@ -1,3 +1,13 @@ +2008-04-30 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/realmedia/rtspreal.c: (rtsp_ext_real_before_send), + (rtsp_ext_real_parse_sdp), (rtsp_ext_real_stream_select): + * gst/realmedia/rtspreal.h: + Move assembly rule parsing to the place where we parse the SDP as it's + also there that we create the MDPR and we need the currently selected + asmrule in order to select the right MTLI. + Fixes #529359. + 2008-04-29 Michael Smith <msmith@songbirdnest.com> * gst/realmedia/realhash.c: diff --git a/gst/realmedia/rtspreal.c b/gst/realmedia/rtspreal.c index 63a44304..9361963d 100644 --- a/gst/realmedia/rtspreal.c +++ b/gst/realmedia/rtspreal.c @@ -56,6 +56,7 @@ GST_ELEMENT_DETAILS ("RealMedia RTSP Extension", "Wim Taymans <wim.taymans@gmail.com>"); #define SERVER_PREFIX "RealServer" +#define DEFAULT_BANDWIDTH "10485800" static GstRTSPResult rtsp_ext_real_get_transports (GstRTSPExtension * ext, @@ -121,7 +122,8 @@ rtsp_ext_real_before_send (GstRTSPExtension * ext, GstRTSPMessage * request) } case GST_RTSP_DESCRIBE: { - gst_rtsp_message_add_header (request, GST_RTSP_HDR_BANDWIDTH, "10485800"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_BANDWIDTH, + DEFAULT_BANDWIDTH); gst_rtsp_message_add_header (request, GST_RTSP_HDR_GUID, "00000000-0000-0000-0000-000000000000"); gst_rtsp_message_add_header (request, GST_RTSP_HDR_REGION_DATA, "0"); @@ -268,6 +270,8 @@ rtsp_ext_real_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp, GstBuffer *buf; gchar *opaque_data; gsize opaque_data_len, asm_rule_book_len; + GHashTable *vars; + GString *rules; /* don't bother for non-real formats */ READ_INT (sdp, "IsRealDataType", ctx->isreal); @@ -345,13 +349,19 @@ rtsp_ext_real_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp, WRITE_STRING2 (datap, comment, comment_len); offset += size; + /* fix the hashtale for the rule parser */ + rules = g_string_new (""); + vars = g_hash_table_new (g_str_hash, g_str_equal); + g_hash_table_insert (vars, "Bandwidth", DEFAULT_BANDWIDTH); + /* MDPR */ for (i = 0; i < ctx->n_streams; i++) { const GstSDPMedia *media; - guint16 j, sel; guint32 len; GstRTSPRealStream *stream; gchar *str; + gint rulematches[MAX_RULEMATCHES]; + gint sel, j, n; media = gst_sdp_message_get_media (sdp, i); @@ -391,7 +401,14 @@ rtsp_ext_real_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp, */ READ_STRING (media, "ASMRuleBook", str, asm_rule_book_len); stream->rulebook = gst_asm_rule_book_new (str); - sel = 0; + + n = gst_asm_rule_book_match (stream->rulebook, vars, rulematches); + for (j = 0; j < n; j++) { + g_string_append_printf (rules, "stream=%u;rule=%u,", i, rulematches[j]); + } + + /* get the MLTI for the first matched rules */ + sel = rulematches[0]; READ_BUFFER_M (media, "OpaqueData", opaque_data, opaque_data_len); @@ -527,6 +544,17 @@ rtsp_ext_real_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp, offset += size; } + /* destroy the rulebook hashtable now */ + g_hash_table_destroy (vars); + + /* strip final , if we added some stream rules */ + if (rules->len > 0) { + rules = g_string_truncate (rules, rules->len - 1); + } + + /* and store rules in the context */ + ctx->rules = g_string_free (rules, FALSE); + /* DATA */ size = 18; ENSURE_SIZE (offset + size); @@ -569,14 +597,13 @@ rtsp_ext_real_stream_select (GstRTSPExtension * ext, GstRTSPUrl * url) GstRTSPMessage request = { 0 }; GstRTSPMessage response = { 0 }; gchar *req_url; - GString *rules; - GList *walk; - gint i; - GHashTable *vars; if (!ctx->isreal) return GST_RTSP_OK; + if (!ctx->rules) + return GST_RTSP_OK; + req_url = gst_rtsp_url_get_request_uri (url); /* create SET_PARAMETER */ @@ -586,34 +613,7 @@ rtsp_ext_real_stream_select (GstRTSPExtension * ext, GstRTSPUrl * url) g_free (req_url); - rules = g_string_new (""); - vars = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_insert (vars, "Bandwidth", "300000"); - - for (walk = ctx->streams, i = 0; walk; walk = g_list_next (walk), i++) { - GstRTSPRealStream *stream; - gint rulematches[MAX_RULEMATCHES]; - gint j, n; - - stream = (GstRTSPRealStream *) walk->data; - - n = gst_asm_rule_book_match (stream->rulebook, vars, rulematches); - for (j = 0; j < n; j++) { - g_string_append_printf (rules, "stream=%u;rule=%u,", i, rulematches[j]); - } - } - - g_hash_table_destroy (vars); - - /* strip final , if we added some stream rules */ - if (rules->len > 0) { - rules = g_string_truncate (rules, rules->len - 1); - } - - /* do selection */ - gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SUBSCRIBE, rules->str); - - g_string_free (rules, TRUE); + gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SUBSCRIBE, ctx->rules); /* send SET_PARAMETER */ if ((res = gst_rtsp_extension_send (ext, &request, &response)) < 0) diff --git a/gst/realmedia/rtspreal.h b/gst/realmedia/rtspreal.h index 976871a8..9f7dc423 100644 --- a/gst/realmedia/rtspreal.h +++ b/gst/realmedia/rtspreal.h @@ -74,6 +74,8 @@ struct _GstRTSPReal { guint max_packet_size; guint avg_packet_size; guint duration; + + gchar *rules; }; struct _GstRTSPRealClass { |