summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia/codec.c
blob: 13409d3e3419f244a071acd930c31383fecc0629 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* $Header: /pjproject/pjmedia/src/pjmedia/codec.c 3     4/17/05 11:59a Bennylp $ */
#include <pjmedia/codec.h>
#include <pj/pool.h>
#include <pj/string.h>
#include <pj/log.h>

#define THIS_FILE   "codec.c"

static void enum_all_codecs (pj_codec_mgr *cm)
{
    pj_codec_factory *cf;

    cf = cm->factory_list.next;
    cm->codec_cnt = 0;
    while (cf != &cm->factory_list) {
	pj_codec_id temp[PJ_CODEC_MGR_MAX_CODECS];
	int i, cnt;

	cnt = cf->op->enum_codecs (cf, PJ_CODEC_MGR_MAX_CODECS, temp);
	if (cnt > PJ_CODEC_MGR_MAX_CODECS) {
	    pj_assert(0);
	    PJ_LOG(4, (THIS_FILE, "Too many codecs reported by factory"));
	    cnt = PJ_CODEC_MGR_MAX_CODECS;
	}

	for (i=0; i<cnt && cm->codec_cnt < PJ_CODEC_MGR_MAX_CODECS; ++i) {
	    cm->codecs[cm->codec_cnt++] = temp[i];
	}

	cf = cf->next;
    }
}

PJ_DEF(pj_status_t) pj_codec_mgr_init (pj_codec_mgr *mgr)
{
    pj_list_init (&mgr->factory_list);
    mgr->codec_cnt = 0;
    return 0;
}

PJ_DEF(pj_status_t) pj_codec_mgr_register_factory (pj_codec_mgr *mgr,
						   pj_codec_factory *factory)
{
    pj_list_insert_before (&mgr->factory_list, factory);
    enum_all_codecs (mgr);
    return 0;
}

PJ_DEF(void) pj_codec_mgr_unregister_factory (pj_codec_mgr *mgr, pj_codec_factory *factory)
{
    PJ_UNUSED_ARG(mgr)
    pj_list_erase(factory);
    enum_all_codecs (mgr);
}

PJ_DEF(unsigned)
pj_codec_mgr_enum_codecs (pj_codec_mgr *mgr, unsigned count, const pj_codec_id *codecs[])
{
    unsigned i;

    if (count > mgr->codec_cnt)
	count = mgr->codec_cnt;

    for (i=0; i<count; ++i)
	codecs[i] = &mgr->codecs[i];

    return mgr->codec_cnt;
}

PJ_DEF(pj_codec*) pj_codec_mgr_alloc_codec (pj_codec_mgr *mgr, const struct pj_codec_id *id)
{
    pj_codec_factory *factory = mgr->factory_list.next;
    while (factory != &mgr->factory_list) {
	if ( (*factory->op->match_id)(factory, id) == 0 ) {
	    pj_codec *codec = (*factory->op->alloc_codec)(factory, id);
	    if (codec != NULL)
		return codec;
	}
	factory = factory->next;
    }
    return NULL;
}

PJ_DEF(void) pj_codec_mgr_dealloc_codec (pj_codec_mgr *mgr, pj_codec *codec)
{
    PJ_UNUSED_ARG(mgr)
    (*codec->factory->op->dealloc_codec)(codec->factory, codec);
}