diff --git a/pjmedia/include/pjmedia/sdp.h b/pjmedia/include/pjmedia/sdp.h index e2e325438d..ab25c10123 100644 --- a/pjmedia/include/pjmedia/sdp.h +++ b/pjmedia/include/pjmedia/sdp.h @@ -805,7 +805,13 @@ pjmedia_sdp_session_clone( pj_pool_t *pool, /** - * Compare two SDP session for equality. + * Compare two SDP session for equality, by comparing: + * - the fields origin, subject, connection, time + * - the attributes direction, fmtp, and rtpmap + * - the media descriptions (see #pjmedia_sdp_media_cmp()) + * + * The function will also call the callback + * \a pjmedia_sdp_session_cmp_cb() if registered. * * @param sd1 The first SDP session to compare. * @param sd2 The second SDP session to compare. @@ -814,12 +820,46 @@ pjmedia_sdp_session_clone( pj_pool_t *pool, * @return PJ_SUCCESS when both SDPs are equal, or otherwise * the status code indicates which part of the session * descriptors are not equal. + * If \a pjmedia_sdp_session_cmp_cb() is registered, + * will return the status output parameter of the callback. */ PJ_DECL(pj_status_t) pjmedia_sdp_session_cmp(const pjmedia_sdp_session *sd1, const pjmedia_sdp_session *sd2, unsigned option); +/** + * The declaration of customized SDP session comparison callback. See + * #pjmedia_sdp_session_register_cmp_cb() for more info. + * + * @param sd1 The first SDP session to compare. + * @param sd2 The second SDP session to compare. + * @param option Must be zero for now. + * @param status Status code to be returned for the SDP comparison result + * (PJ_SUCCESS meaning both SDPs are equal). + * On input, it contains the return status of + * #pjmedia_sdp_session_cmp(). + */ +typedef void (*pjmedia_sdp_session_cmp_cb)(const pjmedia_sdp_session *sd1, + const pjmedia_sdp_session *sd2, + unsigned option, + pj_status_t *status); + + +/** + * Register customized SDP session comparison callback. The callback will + * be called by #pjmedia_sdp_session_cmp(). + * To unregister, just call this function with parameter cb set to NULL. + * + * @param cb The customized SDP session comparison callback or + * NULL to unregister the callback. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) +pjmedia_sdp_session_register_cmp_cb(pjmedia_sdp_session_cmp_cb cb); + + /** * Add new attribute to the session descriptor. * diff --git a/pjmedia/src/pjmedia/sdp_cmp.c b/pjmedia/src/pjmedia/sdp_cmp.c index dfa3f33970..1d2151e4d2 100644 --- a/pjmedia/src/pjmedia/sdp_cmp.c +++ b/pjmedia/src/pjmedia/sdp_cmp.c @@ -22,6 +22,9 @@ #include +/* The registered customized SDP session comparison callback */ +static pjmedia_sdp_session_cmp_cb sdp_cmp_cb; + /* Compare connection line. */ static pj_status_t compare_conn(const pjmedia_sdp_conn *c1, const pjmedia_sdp_conn *c2) @@ -218,12 +221,9 @@ PJ_DEF(pj_status_t) pjmedia_sdp_media_cmp( const pjmedia_sdp_media *sd1, return PJ_SUCCESS; } -/* - * Compare two SDP session for equality. - */ -PJ_DEF(pj_status_t) pjmedia_sdp_session_cmp( const pjmedia_sdp_session *sd1, - const pjmedia_sdp_session *sd2, - unsigned option) +static pj_status_t sdp_session_cmp(const pjmedia_sdp_session *sd1, + const pjmedia_sdp_session *sd2, + unsigned option) { unsigned i; pj_status_t status; @@ -295,6 +295,30 @@ PJ_DEF(pj_status_t) pjmedia_sdp_session_cmp( const pjmedia_sdp_session *sd1, return PJ_SUCCESS; } +/* + * Compare two SDP session for equality. + */ +PJ_DEF(pj_status_t) pjmedia_sdp_session_cmp( const pjmedia_sdp_session *sd1, + const pjmedia_sdp_session *sd2, + unsigned option) +{ + pj_status_t status; + + status = sdp_session_cmp(sd1, sd2, option); + if (sdp_cmp_cb) { + (*sdp_cmp_cb)(sd1, sd2, option, &status); + } + + return status; +} + +/* Register customized SDP session comparison callback function. */ +PJ_DEF(pj_status_t) +pjmedia_sdp_session_register_cmp_cb(pjmedia_sdp_session_cmp_cb cb) +{ + sdp_cmp_cb = cb; + return PJ_SUCCESS; +} PJ_DEF(pj_status_t) pjmedia_sdp_conn_cmp(const pjmedia_sdp_conn *conn1, const pjmedia_sdp_conn *conn2,