diff --git a/include/re_sdp.h b/include/re_sdp.h index 123ba8b..bc3dcd8 100644 --- a/include/re_sdp.h +++ b/include/re_sdp.h @@ -32,6 +32,7 @@ enum sdp_bandwidth { struct sdp_format; +typedef int(sdp_media_enc_h)(struct mbuf *mb, bool offer, void *arg); typedef int(sdp_fmtp_enc_h)(struct mbuf *mb, const struct sdp_format *fmt, bool offer, void *data); typedef bool(sdp_fmtp_cmp_h)(const char *params1, const char *params2, @@ -84,6 +85,8 @@ struct sdp_media; int sdp_media_add(struct sdp_media **mp, struct sdp_session *sess, const char *name, uint16_t port, const char *proto); +void sdp_media_set_encode_handler(struct sdp_media *m, sdp_media_enc_h *ench, + void *arg); void sdp_media_set_disabled(struct sdp_media *m, bool disabled); void sdp_media_set_lport(struct sdp_media *m, uint16_t port); void sdp_media_set_laddr(struct sdp_media *m, const struct sa *laddr); diff --git a/src/sdp/media.c b/src/sdp/media.c index c381b4c..4203ed3 100644 --- a/src/sdp/media.c +++ b/src/sdp/media.c @@ -289,6 +289,24 @@ void sdp_media_align_formats(struct sdp_media *m, bool offer) } +/** + * Set SDP Media line encode handler + * + * @param m SDP Media line + * @param ench Encode handler + * @param arg Encode handler argument + */ +void sdp_media_set_encode_handler(struct sdp_media *m, sdp_media_enc_h *ench, + void *arg) +{ + if (!m) + return; + + m->ench = ench; + m->arg = arg; +} + + /** * Set an SDP Media line to enabled/disabled * diff --git a/src/sdp/msg.c b/src/sdp/msg.c index 8fe45c4..2407ff1 100644 --- a/src/sdp/msg.c +++ b/src/sdp/msg.c @@ -435,6 +435,9 @@ static int media_encode(const struct sdp_media *m, struct mbuf *mb, bool offer) for (le = m->lattrl.head; le; le = le->next) err |= mbuf_printf(mb, "%H", sdp_attr_print, le->data); + if (m->ench) + err |= m->ench(mb, offer, m->arg); + return err; } diff --git a/src/sdp/sdp.h b/src/sdp/sdp.h index 00e29b8..abd7a7d 100644 --- a/src/sdp/sdp.h +++ b/src/sdp/sdp.h @@ -39,6 +39,8 @@ struct sdp_media { int32_t rbwv[SDP_BANDWIDTH_MAX]; char *name; char *proto; + sdp_media_enc_h *ench; + void *arg; enum sdp_dir ldir; enum sdp_dir rdir; bool disabled;