diff --git a/ChangeLog b/ChangeLog index 6a67e736db..c362cde068 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-04-30 Wim Taymans + + * 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 * gst/realmedia/realhash.c: diff --git a/gst/realmedia/rtspreal.c b/gst/realmedia/rtspreal.c index 63a4430497..9361963deb 100644 --- a/gst/realmedia/rtspreal.c +++ b/gst/realmedia/rtspreal.c @@ -56,6 +56,7 @@ GST_ELEMENT_DETAILS ("RealMedia RTSP Extension", "Wim Taymans "); #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 976871a8cf..9f7dc423f0 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 {