diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c index 456e2e42de..74858f638a 100644 --- a/libavformat/rtpdec.c +++ b/libavformat/rtpdec.c @@ -531,3 +531,28 @@ void rtp_parse_close(RTPDemuxContext *s) } av_free(s); } + +int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p, + int (*parse_fmtp)(AVStream *stream, + PayloadContext *data, + char *attr, char *value)) +{ + char attr[256]; + char value[4096]; + int res; + + // remove protocol identifier + while (*p && *p == ' ') p++; // strip spaces + while (*p && *p != ' ') p++; // eat protocol identifier + while (*p && *p == ' ') p++; // strip trailing spaces + + while (ff_rtsp_next_attr_and_value(&p, + attr, sizeof(attr), + value, sizeof(value))) { + + res = parse_fmtp(stream, data, attr, value); + if (res < 0) + return res; + } + return 0; +} diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h index 439fcc2b4d..86af2b9d45 100644 --- a/libavformat/rtpdec.h +++ b/libavformat/rtpdec.h @@ -172,6 +172,11 @@ void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler); int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size); ///< from rtsp.c, but used by rtp dynamic protocol handlers. +int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p, + int (*parse_fmtp)(AVStream *stream, + PayloadContext *data, + char *attr, char *value)); + void av_register_rtp_dynamic_payload_handlers(void); #endif /* AVFORMAT_RTPDEC_H */