Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add API to register custom SDP comparison callback #4286

Merged
merged 2 commits into from
Feb 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 41 additions & 1 deletion pjmedia/include/pjmedia/sdp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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.
*
Expand Down
36 changes: 30 additions & 6 deletions pjmedia/src/pjmedia/sdp_cmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
#include <pj/string.h>


/* 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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
Loading