summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia/codec.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia/codec.c')
-rw-r--r--pjmedia/src/pjmedia/codec.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/pjmedia/src/pjmedia/codec.c b/pjmedia/src/pjmedia/codec.c
index 647b0b5d..111ad0c7 100644
--- a/pjmedia/src/pjmedia/codec.c
+++ b/pjmedia/src/pjmedia/codec.c
@@ -72,10 +72,19 @@ PJ_DEF(pj_status_t) pjmedia_codec_mgr_init (pjmedia_codec_mgr *mgr,
*/
PJ_DEF(pj_status_t) pjmedia_codec_mgr_destroy (pjmedia_codec_mgr *mgr)
{
+ pjmedia_codec_factory *factory;
unsigned i;
PJ_ASSERT_RETURN(mgr, PJ_EINVAL);
+ /* Destroy all factories in the list */
+ factory = mgr->factory_list.next;
+ while (factory != &mgr->factory_list) {
+ pjmedia_codec_factory *next = factory->next;
+ (*factory->op->destroy)();
+ factory = next;
+ }
+
/* Cleanup all pools of all codec default params */
for (i=0; i<mgr->codec_cnt; ++i) {
if (mgr->codec_desc[i].param) {
@@ -111,6 +120,13 @@ PJ_DEF(pj_status_t) pjmedia_codec_mgr_register_factory( pjmedia_codec_mgr *mgr,
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);