diff --git a/channels/chan_sip.c b/channels/chan_sip.c index f91261bf9c5532edb07b85a1919834a9e5be2242..ed4f0162b041bd408b3c041ca3452eccaafaa9e6 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -8881,8 +8881,8 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action ast_codec_choose(&p->prefs, p->jointcaps, 1, &tmp_fmt); ast_format_cap_set(p->owner->nativeformats, &tmp_fmt); - ast_format_cap_joint_copy(p->caps, vpeercapability, p->owner->nativeformats); - ast_format_cap_joint_copy(p->caps, tpeercapability, p->owner->nativeformats); + ast_format_cap_joint_append(p->caps, vpeercapability, p->owner->nativeformats); + ast_format_cap_joint_append(p->caps, tpeercapability, p->owner->nativeformats); ast_set_read_format(p->owner, &p->owner->readformat); ast_set_write_format(p->owner, &p->owner->writeformat); diff --git a/include/asterisk/format_cap.h b/include/asterisk/format_cap.h index 301ec1471e442368bfe1544ac0a028cb517319b0..cdb5421f9be047cf89954dcf99a3d84b662b52fa 100644 --- a/include/asterisk/format_cap.h +++ b/include/asterisk/format_cap.h @@ -191,6 +191,14 @@ struct ast_format_cap *ast_format_cap_joint(const struct ast_format_cap *cap1, c */ int ast_format_cap_joint_copy(const struct ast_format_cap *cap1, const struct ast_format_cap *cap2, struct ast_format_cap *result); +/*! + * \brief Get joint capability structure, append into result capabilities structure + * + * \retval 1, joint capabilities exist + * \retval 0, joint capabilities do not exist + */ +int ast_format_cap_joint_append(const struct ast_format_cap *cap1, const struct ast_format_cap *cap2, struct ast_format_cap *result); + /*! * \brief Find out if capability structures have any joint capabilities without * returning those capabilities. diff --git a/main/format_cap.c b/main/format_cap.c index 1d566050f7fd22372e97be9d0ff7f31c3bb12b84..c8bdd4fa34616eea271e068836683a4a7c6595f4 100644 --- a/main/format_cap.c +++ b/main/format_cap.c @@ -409,7 +409,7 @@ struct ast_format_cap *ast_format_cap_joint(const struct ast_format_cap *cap1, c return NULL; } -int ast_format_cap_joint_copy(const struct ast_format_cap *cap1, const struct ast_format_cap *cap2, struct ast_format_cap *result) +static int joint_copy_helper(const struct ast_format_cap *cap1, const struct ast_format_cap *cap2, struct ast_format_cap *result, int append) { struct ao2_iterator it; struct ast_format *tmp; @@ -417,8 +417,9 @@ int ast_format_cap_joint_copy(const struct ast_format_cap *cap1, const struct as .joint_cap = result, .joint_found = 0, }; - - ast_format_cap_remove_all(result); + if (!append) { + ast_format_cap_remove_all(result); + } it = ao2_iterator_init(cap1->formats, cap2->nolock ? AO2_ITERATOR_DONTLOCK : 0); while ((tmp = ao2_iterator_next(&it))) { data.format = tmp; @@ -433,6 +434,16 @@ int ast_format_cap_joint_copy(const struct ast_format_cap *cap1, const struct as return ao2_container_count(result->formats) ? 1 : 0; } +int ast_format_cap_joint_append(const struct ast_format_cap *cap1, const struct ast_format_cap *cap2, struct ast_format_cap *result) +{ + return joint_copy_helper(cap1, cap2, result, 1); +} + +int ast_format_cap_joint_copy(const struct ast_format_cap *cap1, const struct ast_format_cap *cap2, struct ast_format_cap *result) +{ + return joint_copy_helper(cap1, cap2, result, 0); +} + struct ast_format_cap *ast_format_cap_get_type(const struct ast_format_cap *cap, enum ast_format_type ftype) { struct ao2_iterator it;