- register RFC 2198 as RTP dynamic payload type "red"
authorkukosa <kukosa@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 12 Dec 2007 10:51:09 +0000 (10:51 +0000)
committerkukosa <kukosa@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 12 Dec 2007 10:51:09 +0000 (10:51 +0000)
- display dynamic payload type names inside RFC 2198

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@23846 f5534014-38df-0310-8fa8-9805f1628bb7

epan/dissectors/packet-rtp.c

index 8630ea8e37a89464f359af5ee77169ace8b18c71..b7756bafe0b17d31a712bf42d7765139a3a67585 100644 (file)
@@ -82,7 +82,7 @@
 /* #define DEBUG_FRAGMENTS   1 */
 
 typedef struct _rfc2198_hdr {
-  guint8 pt;
+  unsigned int pt;
   int offset;
   int len;
   struct _rfc2198_hdr *next;
@@ -824,15 +824,21 @@ dissect_rtp_rfc2198(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
        proto_tree *rfc2198_hdr_tree = NULL;
        rfc2198_hdr *hdr_last, *hdr_new;
        rfc2198_hdr *hdr_chain = NULL;
+       struct _rtp_conversation_info *p_conv_data= NULL;
+       gchar *payload_type_str;
+
+       /* Retrieve RTPs idea of a converation */
+       p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
 
-       /* Add try to RFC2198 data */
-       ti = proto_tree_add_text(tree, tvb, offset, -1, "RFC2198: Redundant Audio Data");
+       /* Add try to RFC 2198 data */
+       ti = proto_tree_add_text(tree, tvb, offset, -1, "RFC 2198: Redundant Audio Data");
        rfc2198_tree = proto_item_add_subtree(ti, ett_rtp_rfc2198);
 
        hdr_last = NULL;
        cnt = 0;
        while (hdr_follow) {
                cnt++;
+               payload_type_str = NULL;
 
                /* Allocate and fill in header */
                hdr_new = ep_alloc(sizeof(rfc2198_hdr));
@@ -841,12 +847,21 @@ dissect_rtp_rfc2198(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
                hdr_new->pt = RTP_PAYLOAD_TYPE(octet1);
                hdr_follow = (octet1 & 0x80);
 
+               /* if it is dynamic payload, let use the conv data to see if it is defined */
+               if ((hdr_new->pt > 95) && (hdr_new->pt < 128)) {
+                       if (p_conv_data && p_conv_data->rtp_dyn_payload){
+                               payload_type_str = g_hash_table_lookup(p_conv_data->rtp_dyn_payload, &hdr_new->pt);
+                       }
+               }
                /* Add a subtree for this header and add items */
                ti = proto_tree_add_text(rfc2198_tree, tvb, offset, (hdr_follow)?4:1, "Header %u", cnt);
                rfc2198_hdr_tree = proto_item_add_subtree(ti, ett_rtp_rfc2198_hdr);
                proto_tree_add_item(rfc2198_hdr_tree, hf_rtp_rfc2198_follow, tvb, offset, 1, FALSE );
-               proto_tree_add_item(rfc2198_hdr_tree, hf_rtp_payload_type, tvb, offset, 1, FALSE );
-               proto_item_append_text(ti, ": PT=%s", val_to_str(hdr_new->pt, rtp_payload_type_vals, "Unknown (%u)"));
+               proto_tree_add_uint_format(rfc2198_hdr_tree, hf_rtp_payload_type, tvb,
+                   offset, 1, octet1, "Payload type: %s (%u)",
+                       payload_type_str ? payload_type_str : val_to_str(hdr_new->pt, rtp_payload_type_vals, "Unknown"),
+                       hdr_new->pt);
+               proto_item_append_text(ti, ": PT=%s", payload_type_str ? payload_type_str : val_to_str(hdr_new->pt, rtp_payload_type_vals, "Unknown (%u)"));
                offset += 1;
 
                /* Timestamp offset and block length don't apply to last header */
@@ -1890,6 +1905,8 @@ proto_reg_handoff_rtp(void)
 
        dissector_add_handle("udp.port", rtp_handle);
 
+       dissector_add_string("rtp_dyn_payload_type", "red", rtp_rfc2198_handle);
+
        if (rtp_prefs_initialized) {
                dissector_delete("rtp.pt", rtp_saved_rfc2198_pt, rtp_rfc2198_handle);
        } else {