/** * 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; }
/* * Register a codec factory. */ PJ_DEF(pj_status_t) pjmedia_codec_mgr_register_factory( pjmedia_codec_mgr *mgr, pjmedia_codec_factory *factory) { pjmedia_codec_info info[PJMEDIA_CODEC_MGR_MAX_CODECS]; unsigned i, count; pj_status_t status; PJ_ASSERT_RETURN(mgr && factory, PJ_EINVAL); /* Since 2.0 we require codec factory to implement "destroy" op. Please * see: https://trac.pjsip.org/repos/ticket/1294 * * Really! Please do see it. */ PJ_ASSERT_RETURN(factory->op->destroy != NULL, PJ_ENOTSUP); /* Enum codecs */ count = PJ_ARRAY_SIZE(info); status = factory->op->enum_info(factory, &count, info); if (status != PJ_SUCCESS) return status; pj_mutex_lock(mgr->mutex); /* Check codec count */ if (count + mgr->codec_cnt > PJ_ARRAY_SIZE(mgr->codec_desc)) { pj_mutex_unlock(mgr->mutex); return PJ_ETOOMANY; } /* Save the codecs */ for (i=0; i<count; ++i) { pj_memcpy( &mgr->codec_desc[mgr->codec_cnt+i], &info[i], sizeof(pjmedia_codec_info)); mgr->codec_desc[mgr->codec_cnt+i].prio = PJMEDIA_CODEC_PRIO_NORMAL; mgr->codec_desc[mgr->codec_cnt+i].factory = factory; pjmedia_codec_info_to_id( &info[i], mgr->codec_desc[mgr->codec_cnt+i].id, sizeof(pjmedia_codec_id)); } /* Update count */ mgr->codec_cnt += count; /* Re-sort codec based on priorities */ sort_codecs(mgr); /* Add factory to the list */ pj_list_push_back(&mgr->factory_list, factory); pj_mutex_unlock(mgr->mutex); return PJ_SUCCESS; }
/* * Register a codec factory. */ PJ_DEF(pj_status_t) pjmedia_vid_codec_mgr_register_factory( pjmedia_vid_codec_mgr *mgr, pjmedia_vid_codec_factory *factory) { pjmedia_vid_codec_info info[PJMEDIA_CODEC_MGR_MAX_CODECS]; unsigned i, count; pj_status_t status; PJ_ASSERT_RETURN(factory, PJ_EINVAL); if (!mgr) mgr = def_vid_codec_mgr; PJ_ASSERT_RETURN(mgr, PJ_EINVAL); /* Enum codecs */ count = PJ_ARRAY_SIZE(info); status = factory->op->enum_info(factory, &count, info); if (status != PJ_SUCCESS) return status; pj_mutex_lock(mgr->mutex); /* Check codec count */ if (count + mgr->codec_cnt > PJ_ARRAY_SIZE(mgr->codec_desc)) { pj_mutex_unlock(mgr->mutex); return PJ_ETOOMANY; } /* Save the codecs */ for (i=0; i<count; ++i) { pj_memcpy( &mgr->codec_desc[mgr->codec_cnt+i], &info[i], sizeof(pjmedia_vid_codec_info)); mgr->codec_desc[mgr->codec_cnt+i].prio = PJMEDIA_CODEC_PRIO_NORMAL; mgr->codec_desc[mgr->codec_cnt+i].factory = factory; pjmedia_vid_codec_info_to_id( &info[i], mgr->codec_desc[mgr->codec_cnt+i].id, sizeof(pjmedia_codec_id)); } /* Update count */ mgr->codec_cnt += count; /* Re-sort codec based on priorities */ sort_codecs(mgr); /* Add factory to the list */ pj_list_push_back(&mgr->factory_list, factory); pj_mutex_unlock(mgr->mutex); return PJ_SUCCESS; }