Fixed packing error in rtp header, and sdp validation supports non numeric pt for broken uas

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@199 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjmedia/include/pjmedia/rtp.h b/pjmedia/include/pjmedia/rtp.h
index d58c773..409ad0a 100644
--- a/pjmedia/include/pjmedia/rtp.h
+++ b/pjmedia/include/pjmedia/rtp.h
@@ -70,33 +70,32 @@
  */
 
 
-#pragma pack(1)
 
 /**
  * RTP packet header.
  */
+#pragma pack(1)
 struct pjmedia_rtp_hdr
 {
 #if defined(PJ_IS_BIG_ENDIAN) && (PJ_IS_BIG_ENDIAN!=0)
-    int v:2;		/**< packet type/version	    */
-    int p:1;		/**< padding flag		    */
-    int x:1;		/**< extension flag		    */
-    int cc:4;		/**< CSRC count			    */
-    int m:1;		/**< marker bit			    */
-    int pt:7;		/**< payload type		    */
+    pj_uint16_t v:2;		/**< packet type/version	    */
+    pj_uint16_t p:1;		/**< padding flag		    */
+    pj_uint16_t x:1;		/**< extension flag		    */
+    pj_uint16_t cc:4;		/**< CSRC count			    */
+    pj_uint16_t m:1;		/**< marker bit			    */
+    pj_uint16_t pt:7;		/**< payload type		    */
 #else
-    int cc:4;		/**< CSRC count			    */
-    int x:1;		/**< header extension flag	    */ 
-    int p:1;		/**< padding flag		    */
-    int v:2;		/**< packet type/version	    */
-    int pt:7;		/**< payload type		    */
-    int m:1;		/**< marker bit			    */
+    pj_uint16_t cc:4;		/**< CSRC count			    */
+    pj_uint16_t x:1;		/**< header extension flag	    */ 
+    pj_uint16_t p:1;		/**< padding flag		    */
+    pj_uint16_t v:2;		/**< packet type/version	    */
+    pj_uint16_t pt:7;		/**< payload type		    */
+    pj_uint16_t m:1;		/**< marker bit			    */
 #endif
-    pj_uint16_t seq;	/**< sequence number		    */
-    pj_uint32_t ts;	/**< timestamp			    */
-    pj_uint32_t ssrc;	/**< synchronization source	    */
+    pj_uint16_t seq;		/**< sequence number		    */
+    pj_uint32_t ts;		/**< timestamp			    */
+    pj_uint32_t ssrc;		/**< synchronization source	    */
 };
-
 #pragma pack()
 
 /**
diff --git a/pjmedia/src/pjmedia/rtp.c b/pjmedia/src/pjmedia/rtp.c
index 9fa3123..1901aec 100644
--- a/pjmedia/src/pjmedia/rtp.c
+++ b/pjmedia/src/pjmedia/rtp.c
@@ -43,6 +43,7 @@
 
     /* Check RTP header packing. */
     if (sizeof(struct pjmedia_rtp_hdr) != 12) {
+	unsigned sz = sizeof(struct pjmedia_rtp_hdr);
 	pj_assert(!"Wrong RTP header packing!");
 	return PJMEDIA_RTP_EINPACK;
     }
diff --git a/pjmedia/src/pjmedia/sdp.c b/pjmedia/src/pjmedia/sdp.c
index f46be1e..79f6cd9 100644
--- a/pjmedia/src/pjmedia/sdp.c
+++ b/pjmedia/src/pjmedia/sdp.c
@@ -1148,19 +1148,27 @@
 
 	/* Verify payload type. */
 	for (j=0; j<m->desc.fmt_count; ++j) {
-	    unsigned pt = pj_strtoul(&m->desc.fmt[j]);
 
-	    /* Payload type is between 0 and 127. */
-	    CHECK( pt <= 127, PJMEDIA_SDP_EINPT);
-
-	    /* If port is not zero, then for each dynamic payload type, an
-	     * rtpmap attribute must be specified.
+	    /* Arrgh noo!! Payload type can be non-numeric!!
+	     * RTC based programs sends "null" for instant messaging!
 	     */
-	    if (m->desc.port != 0 && pt >= 96) {
-		const pjmedia_sdp_attr *a;
+	    if (pj_isdigit(*m->desc.fmt[j].ptr)) {
+		unsigned pt = pj_strtoul(&m->desc.fmt[j]);
 
-		a = pjmedia_sdp_media_find_attr(m,&STR_RTPMAP,&m->desc.fmt[j]);
-		CHECK( a != NULL, PJMEDIA_SDP_EMISSINGRTPMAP);
+		/* Payload type is between 0 and 127. 
+		 */
+		CHECK( pt <= 127, PJMEDIA_SDP_EINPT);
+
+		/* If port is not zero, then for each dynamic payload type, an
+		 * rtpmap attribute must be specified.
+		 */
+		if (m->desc.port != 0 && pt >= 96) {
+		    const pjmedia_sdp_attr *a;
+
+		    a = pjmedia_sdp_media_find_attr(m, &STR_RTPMAP, 
+						    &m->desc.fmt[j]);
+		    CHECK( a != NULL, PJMEDIA_SDP_EMISSINGRTPMAP);
+		}
 	    }
 	}
     }