void sdp_a_rtpmap_test(void) { int payload = 0; int rate = 0; char encoding[32]; char parameters[64]; assert(0 == sdp_a_rtpmap("96 L8/8000", &payload, encoding, &rate, parameters)); assert(96 == payload && 8000 == rate && 0 == strcmp(encoding, "L8") && '\0' == parameters[0]); assert(0 == sdp_a_rtpmap("97 L16/8000", &payload, encoding, &rate, parameters)); assert(97 == payload && 8000 == rate && 0 == strcmp(encoding, "L16") && '\0' == parameters[0]); assert(0 == sdp_a_rtpmap("98 L16/11025/2", &payload, encoding, &rate, parameters)); assert(98 == payload && 11025 == rate && 0 == strcmp(encoding, "L16") && 0==strcmp("2", parameters)); }
// RFC 6184 RTP Payload Format for H.264 Video // 8.2.1. Mapping of Payload Type Parameters to SDP // m=video 49170 RTP/AVP 98 // a=rtpmap:98 H264/90000 // a=fmtp:98 profile-level-id=42A01E; // packetization-mode=1; // sprop-parameter-sets=<parameter sets data> static void rtsp_media_onattr(void* param, const char* name, const char* value) { int i; int payload = -1; struct rtsp_media_t* media; media = (struct rtsp_media_t*)param; if(name) { if(0 == strcmp("rtpmap", name)) { int rate = 0; char encoding[sizeof(media->avformats[i].encoding)]; if(strlen(value) < sizeof(encoding)) // make sure encoding have enough memory space { sdp_a_rtpmap(value, &payload, encoding, &rate, NULL); for(i = 0; i < media->avformat_count; i++) { if(media->avformats[i].fmt == payload) { media->avformats[i].rate = rate; strlcpy(media->avformats[i].encoding, encoding, sizeof(media->avformats[i].encoding)); break; } } } } else if(0 == strcmp("fmtp", name)) { payload = atoi(value); for(i = 0; i < media->avformat_count; i++) { if(media->avformats[i].fmt == payload) { if(0 == strcmp("H264", media->avformats[i].encoding)) { struct sdp_a_fmtp_h264_t h264; memset(&h264, 0, sizeof(h264)); sdp_a_fmtp_h264(value, &payload, &h264); if(h264.flags & SDP_A_FMTP_H264_SPROP_PARAMETER_SETS) { strlcpy(media->avformats[i].spspps, h264.sprop_parameter_sets, sizeof(media->avformats[i].spspps)); } } else if(0 == strcmp("mpeg4-generic", media->avformats[i].encoding)) { struct sdp_a_fmtp_mpeg4_t mpeg4; memset(&mpeg4, 0, sizeof(mpeg4)); sdp_a_fmtp_mpeg4(value, &payload, &mpeg4); } break; } } } } }