/** * Set codec priority. The codec priority determines the order of * the codec in the SDP created by the endpoint. If more than one codecs * are found with the same codec_id prefix, then the function sets the * priorities of all those codecs. */ PJ_DEF(pj_status_t) pjmedia_codec_mgr_set_codec_priority( pjmedia_codec_mgr *mgr, const pj_str_t *codec_id, pj_uint8_t prio) { unsigned i, found = 0; PJ_ASSERT_RETURN(mgr && codec_id, PJ_EINVAL); pj_mutex_lock(mgr->mutex); /* Update the priorities of affected codecs */ for (i=0; i<mgr->codec_cnt; ++i) { if (codec_id->slen == 0 || pj_strnicmp2(codec_id, mgr->codec_desc[i].id, codec_id->slen) == 0) { mgr->codec_desc[i].prio = (pjmedia_codec_priority) prio; ++found; } } if (!found) { pj_mutex_unlock(mgr->mutex); return PJ_ENOTFOUND; } /* Re-sort codecs */ sort_codecs(mgr); pj_mutex_unlock(mgr->mutex); return PJ_SUCCESS; }
/* * Find codecs by the unique codec identifier. This function will find * all codecs that match the codec identifier prefix. For example, if * "L16" is specified, then it will find "L16/8000/1", "L16/16000/1", * and so on, up to the maximum count specified in the argument. */ PJ_DEF(pj_status_t) pjmedia_codec_mgr_find_codecs_by_id( pjmedia_codec_mgr *mgr, const pj_str_t *codec_id, unsigned *count, const pjmedia_codec_info *p_info[], unsigned prio[]) { unsigned i, found = 0; PJ_ASSERT_RETURN(mgr && codec_id && count && *count, PJ_EINVAL); for (i=0; i<mgr->codec_cnt; ++i) { if (codec_id->slen == 0 || pj_strnicmp2(codec_id, mgr->codec_desc[i].id, codec_id->slen) == 0) { if (p_info) p_info[found] = &mgr->codec_desc[i].info; if (prio) prio[found] = mgr->codec_desc[i].prio; ++found; if (found >= *count) break; } } *count = found; return found ? PJ_SUCCESS : PJ_ENOTFOUND; }
/* Comparison function to find node name substring */ static pj_bool_t substring_match(const pj_xml_node *node, const char *part_name, pj_ssize_t part_len) { pj_str_t end_name; if (part_len < 1) part_len = pj_ansi_strlen(part_name); if (node->name.slen < part_len) return PJ_FALSE; end_name.ptr = node->name.ptr + (node->name.slen - part_len); end_name.slen = part_len; return pj_strnicmp2(&end_name, part_name, part_len)==0; }
/*! * \internal * \brief Implements PJSIP_HEADER 'remove' by finding the specified header and removing it. * * Retrieve the header_datastore from the session. Fail if it doesn't exist. * If the header_name is exactly '*', the entire list is simply destroyed. * Otherwise search the list for the matching header name which may be a partial name. */ static int remove_header(void *obj) { struct header_data *data = obj; size_t len = strlen(data->header_name); struct hdr_list *list; struct hdr_list_entry *le; int removed_count = 0; RAII_VAR(struct ast_datastore *, datastore, ast_sip_session_get_datastore(data->channel->session, header_datastore.type), ao2_cleanup); if (!datastore || !datastore->data) { ast_log(AST_LOG_ERROR, "No headers had been previously added to this session.\n"); return -1; } list = datastore->data; AST_LIST_TRAVERSE_SAFE_BEGIN(list, le, nextptr) { if (data->header_name[len - 1] == '*') { if (pj_strnicmp2(&le->hdr->name, data->header_name, len - 1) == 0) { AST_LIST_REMOVE_CURRENT(nextptr); removed_count++; } } else { if (pj_stricmp2(&le->hdr->name, data->header_name) == 0) { AST_LIST_REMOVE_CURRENT(nextptr); removed_count++; } } } AST_LIST_TRAVERSE_SAFE_END; if (data->buf && data->len) { snprintf(data->buf, data->len, "%d", removed_count); } return 0; }
// // Compare string. // int strnicmp(const char *s, pj_size_t len) const { return pj_strnicmp2(this, s, len); }